/* GLOBALS */
var _DEBUG = (window.location.hostname.indexOf('.dev') != -1);
var _CS_URL = "http://www.cadsymbols.nl/gettree.asp";

/* elements */
var _cMAIN = $('#main'),
	_sFORM = $('#find-symbol-form'),
	_sLANG_CSS = "#LAN",
	_sFILTER_CSS = "#FILTER",
	_sFILTER_DEFAULT = $(_sFILTER_CSS).val(),
	_sSORT_CSS = "#sort",
	_sSORT_DEFAULT = $(_sSORT_CSS).val(),
	_sSUBMIT = _sFORM.find('input[type="submit"]'),
	_sRESULTS = $("#search-results"),
	_sTREE_CSS =  "#search-results ul.filetree",
	_sALLBTN_CSS = "#showAllBtn";

/* ===============================================================================
	CADsymbols GLOBAL JAVASCRIPT:
	All these functions are needed globally
==================================================================================
	NOTES:
	- Minified with YUICOMPRESSOR
	- Org files are supplied with the .min.js versions
================================================================================*/

// Load minified other scripts:
/* jquery.inputempty.min.js - jQuery Input Empty on Focus plugin 1.0  */
if(typeof jQuery!="undefined"){(function(a){jQuery.fn.emptyonfocus=function(b){var c={validInputsSelector:":visible:enabled:text, :visible:enabled:password, textarea:visible:enabled",getAllInputsIfEmpty:true,focusClassName:"focused"},b=a.extend(c,b);return this.each(function(){var e=a(this);if(e.is(b.validInputsSelector)){var d=a(elements)}else{if(e.is("form")){var d=e.find(b.validInputsSelector)}else{if(b.getAllInputsIfEmpty){var d=a(b.validInputsSelector)}}}if(d){d.focus(function(){if(a(this).val()===this.defaultValue){a(this).val("")}a(this).addClass(b.focusClassName)}).blur(function(){if(!a(this).val()){a(this).val(this.defaultValue)}a(this).removeClass(b.focusClassName)})}})}})(jQuery)};
/* jquery.replacemail.min.js - jQuery Replace Mail link plugin 1.0 */
if(typeof jQuery!="undefined"){(function(a){jQuery.fn.replacemail=function(b){var c={atSymbol:" [AT] ",domain:window.location.domain,domainString:"this domain",className:"email"},b=a.extend(c,b);return this.each(function(){var k=a(this);var i=k.text().toLowerCase();var d=b.atSymbol.toLowerCase();if(i.indexOf(d)>0){var j=i.substring(0,i.indexOf(d)).replace(/^\s+|\s+$/g,"");var f=i.substring(i.length,(i.indexOf(d)+d.length)).replace(/^\s+|\s+$/g,"");var h=b.domain;if(f!==window.location.domain&&f!==b.domainString){h=f}var e=j+"&#64;"+h;var g="<a href='mailto:"+e+"' class='"+b.className+"'>"+e+"</a>";k.replaceWith(g)}})}})(jQuery)};
/* jquery.simplecollapse.min.js - jQuery Simple Collapse plugin 1.0 */
if(typeof jQuery!="undefined"){(function(a){jQuery.fn.simplecollapse=function(b){var c={togglerSelector:".toggler",collapsibleSelector:".expandable",openedClassName:"open",toggleSpeed:"fast"},b=a.extend(c,b);return this.each(function(){var d=a(this);var e=d.find(b.togglerSelector);var f=d.find(b.collapsibleSelector);if(e.length>0&&f.length>0){f.each(function(){if(!d.hasClass(b.openedClassName)){a(this).hide()}});e.click(function(g){f.slideToggle(b.toggleSpeed);a(this).toggleClass(b.openedClassName);alert(g.currentTarget.nodeName);g.stop()})}else{if(this.tagName.toLowerCase()=="dl"){d.find("dd").each(function(){if(!a(this).parent().find("dt").hasClass(b.openedClassName)){a(this).hide()}});d.find("dt").each(function(){var g=a(this);g.click(function(){g.parent().find("dd").slideToggle(b.toggleSpeed);g.toggleClass(b.openedClassName)})})}}})}})(jQuery)};

// Helper function to dedupe Aray of text
Array.prototype.unique = function() { var a = []; var l = this.length; for(var i=0; i<l; i++) { for(var j=i+1; j<l; j++) { if (this[i] === this[j]) j = ++i; } a.push(this[i]); } return a; };

// Function after submit of Tree form
function submitForm(e){
	e.preventDefault();
	updateTree();
}

// Update the Tree with AJAX
function updateTree(){
	toggleIndicator("search", "on"); // Start indicator
	var term = $(_sFILTER_CSS).val();

	if (term != "" && term != _sFILTER_DEFAULT) {
		// console.log('updateTree non-default term');
		// check everything and do AJAX call
		var AJAX = true;
		var uid = new Date().getTime(); // Unique ID, prevents caching in IE
		var AJAX_URL = _CS_URL+'?uid='+uid+'&AJAX='+AJAX+'&'+_sFORM.serialize();
		if(_DEBUG) { AJAX_URL = 'http://cadsymbols.dev/includes/tmp_ajax_proxy.php?'+uid; }
		
		$.get(AJAX_URL, function(xhr_data, xhr_status, xhr_obj) {
			$(_sTREE_CSS).html(xhr_data);
			drawTree(true, false, false);
			toggleIndicator("search", "off"); // End indicator
		});
		// Now add 'Show ALL' node on top
		addCompleteTreeButton();
	} else {
		// Reload only the top-level
		// console.log('updateTree default term');
		reloadTopLevel();
		// Don't do an AJAX call if your searchterm is "" or the default "Symbol, product, producer"
		toggleIndicator("search", "off"); // End indicator
	}
}

// Adds a button to show all top-level nodes when a search is done
function addCompleteTreeButton(){
	// Set Language of Button:
	var msg = ($(_sLANG_CSS).val().toLowerCase() == "en") ? "Show all CAD symbols" : "Bekijk alle CAD symbols";
 	// Does the button exist already?
	var btn_exists = !!$(_sALLBTN_CSS).length;
	// .. if not: create it
	if (!btn_exists) {
		$('<a rel="external" href="#" id="showAllBtn">'+msg+'</a>').
		prependTo(_sRESULTS).
		click(function(e){
			e.preventDefault();
			$(_sFILTER_CSS).val(_sFILTER_DEFAULT);
			$(this).remove();
			reloadTopLevel();
		});
	}
}

function reloadTopLevel(){
	$(_sTREE_CSS).remove();
	$('<ul class="filetree"></ul>').appendTo(_sRESULTS.find('.inner'));
	drawTree(true, false, true);
	hijackTreeLinks();
}

// Initialize and Hijax the Search Symbol form
function initSearchSymbol(){
	// Hide submit/search button (in P)
	// ssForm.find('input[type="submit"]').parent().hide();

	// Hijax search form
	_sFORM.submit(submitForm);
	// onChange submit form
	_sFORM.change(function(){_sFORM.submit();});
	
	hijackTreeLinks();
}

// Hijax links in file-tree: open in #main
function hijackTreeLinks(){
	// We use Event 'delegation' because the .filetree is populated by AJAX
	$(_sTREE_CSS).delegate('a', 'click', function(e){
		e.preventDefault();
		if ($(this).attr('href')[0] !== "#") {
			toggleIndicator("content", "on");
			$.get($(this).attr('href'), function(xhr_data){
				_cMAIN.html(xhr_data);
				toggleIndicator("content", "off");
			});
		}
	});
}

// Initialize FAQ dropdown (definition-) lists
function initFaq(){
	var faqs = $('.faq'),
	fDescs = faqs.find('dd'),
	fTitles = faqs.find('dt a');
	// hide all descriptions (DD)
	faqs.css({'margin-bottom':'1em'});
	fDescs.hide();
	// handle onclick
	fTitles.click(function(e){
		e.preventDefault();
		var cHref = $(this).attr('href'),
			cFragment = cHref.substring((cHref.indexOf('#')), cHref.length)
		$(cFragment).slideToggle();
	});
}
function setupIndicators(){
	search_indicator = $('<img src="/static/img/indicator.gif" id="search-indicator" />')
	.prependTo($("#search-results .inner"))
	.css({'float':'right','margin':'10px 10px 0 0'})
	.hide();
	link_indicator = $('<img src="/static/img/indicator-big.gif" id="link-indicator" />')
	.appendTo($("#content"))
	.css({'position':'absolute', 'top': '60%', 'left': '50%'})
	.hide();
}

function toggleIndicator(source, state){
	// Toggles an AJAX indicator on/off
	// source: STRING ["search", "link"]
	if(source && state){
		curr_indicator = (source == "search") ? $("#search-indicator") : $("#link-indicator");
		state === "off" ? curr_indicator.hide() : curr_indicator.show();
	}
}

// Checks if a hyperlink is external
function is_external(lnk){ return (lnk.hostname != location.hostname || $(lnk).attr('rel') == "external" ); }
// Checks if a hyperlink is an #anchor
function is_anchor(lnk){ return !(lnk.href.indexOf('#') == -1); }
// Checks if a hyperlink is an email link
function is_email(lnk){ return lnk.href.match(/^mailto\:/); }
// Checks if a hyperlink is a file
function is_file(lnk){ return lnk.href.match(/\.(zip|dwg|xls|mdb|ppt|pdf|exe)$/i); }

// Check all of the above, separately so we can use them stand-alone too
function load_with_AJAX(lnk){ return (!is_external(lnk) && !is_anchor(lnk) && !is_email(lnk) && !is_file(lnk)); }

// Hijack clicks on internal links (Navigation, sidebar, etc). Load only content in #main
function hijackNavigation(){
	$('#main-navigation li, #main, #tertiary').delegate('a', 'click', function(e){
		if ( load_with_AJAX(this) ) {
			e.preventDefault();
			var curr_href = $(this).attr('href');
			var content_only_href = curr_href+"&template=false";
			toggleIndicator("content", "on");
			$.get(content_only_href, function(xhr_data){
				_cMAIN.html(xhr_data);
				initFaq();
				toggleIndicator("content", "off");
			});
			// For #main-navigation links set .active state
			if (curr_href.indexOf('PID=') != -1) {
				var pageID = curr_href.substring((curr_href.indexOf('PID=')+4), curr_href.length);
				var activeLiCSS = "#main-navigation li#"+"PID"+pageID;
				$('#main-navigation li').removeClass('active');
				$(activeLiCSS).addClass('active');
			}
		}
	});
}

function setupAutoComplete(){
	// First get-and-parse XML datasource for autocompletion
	var _current_filter = ($(_sFILTER_CSS).val() == _sFILTER_DEFAULT) ? "" : $(_sFILTER_CSS).val();
	var _current_lang = $(_sLANG_CSS).val();
	var _format = 'csv'; // "xml" or "csv"
	var _csv_separator = ';'; // ";" or "," or " "
	var _XML_URL = _CS_URL+'?FILTER='+_current_filter+'&LAN='+_current_lang+'&'+_format+'=true';
	if(_DEBUG) { _XML_URL = '/static/js/tree-complete.'+_format; } // DEV TESTING

	$.ajax({
		type: "GET",
		url: _XML_URL,
		// dataType: "html",
		success: function(data) {
			if(_format == 'xml'){
				var autocomplete_data = [];
				$(data).find('desc').each(function(i){ autocomplete_data[i] = $(this).text(); });
			}else{
				// We use .unique() (a new method on Array) to dedupe.
				// Should NOT be necessary if deduping is done serverside
				var autocomplete_data = data.split(_csv_separator).unique();
			}
			$(_sFILTER_CSS).autocomplete(autocomplete_data);
		},
		error: function(){
			// Error with autocomplete: show submit button
			_sSUBMIT.parent().show();
		}
	});
	// Bind event to 'completed' Autocomplete action
	$(_sFILTER_CSS).result(submitForm);
}


function drawTree(be_collapsed, be_prerendered, top_level_only){
	// console.log('be_collapsed: '+be_collapsed+' be_prerendered: '+be_prerendered+' top_level_only: '+top_level_only);
	// var start = (new Date).getTime();

	var _current_lang = $(_sLANG_CSS).val();
	var _JSON_INIT_URL = _CS_URL+'?xml=false&main=false&'+_sFORM.serialize();
	if(_DEBUG) { _JSON_INIT_URL = '/includes/top-level-json.php'; } // DEV TESTING

	// Init the jQuery Treeview plugin
	var tree_settings = {
		animated: "fast",
		collapsed: true,
		unique: false,
		collapsed: be_collapsed,
		prerendered: be_prerendered
	}
	// Add "url" parameter for initial AJAX top-level-nodes-only view...
	if (top_level_only) { tree_settings["url"] = _JSON_INIT_URL };
	
	$(_sTREE_CSS).treeview(tree_settings);
	// alert('Duration: '+((new Date).getTime() - start)/ 1000+' seconds ..');
	return $(_sTREE_CSS);
}

// EXECUTING AT DOCUMENT READY
function init(){
	// Adds AJAX indicators to source
	setupIndicators();
	toggleIndicator("search", "on");

	// RENDER FIRST TIME collapsed [1] and not 'prerendered'[2] and as top-level-AJAX-nodes only[3]
	drawTree(true, false, true);

	// Hijack the Search Symbol form
	initSearchSymbol();

	// Hijack clicks on Navigation links
	hijackNavigation();

	// Setup Autocompletion
	setupAutoComplete();

	// Stop Spinner and Show the Filetree (it should be complete by now)
	// $(_sTREE_CSS).show(); // Not needed anymore
	toggleIndicator("search", "off");

	// Convert hidden email addresses to proper email links
	$('.email').replacemail({domain:'cadsymbols.nl'});

	// Automagically hide/show default input text onFocus
	_sFORM.emptyonfocus();

	// COLLAPSIBLE: default = DL, DT = toggler, DD = expandable
	$('.collapsible').simplecollapse();
	// Options: All element could be togglers or expandables! check this out...
	// $('.wrapper').simplecollapse({'togglerSelector':'#logo','collapsibleSelector':'#secondary .submenu', 'speed':'slow'});

	// Initialize FAQ lists (if any)
	initFaq();
}

/* ===============================================================================
	On Document Ready: load init()
================================================================================*/
$(document).ready(init);
