/*
 *	__GamersGate_Search__
 *	Requires Prototype framework and Script.aculo.us Effects library
 *	Author: Johan Lingvall
 */

 var ggSearch = {
	timer : "",
	selectedItem : 0,
	totItems : 0,
	searchStr : "",
	keyUp : function(e) {
		
		ev = (e) ? e : ((event) ? event : null);
		var keyCode = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
		if (keyCode == 38) { // Arrow up
			if (ggSearch.selectedItem > 0) {
				ggSearch.selectItem(ggSearch.selectedItem - 1);
				ggSearch.fetchSelected();
			}
		} else if (keyCode == 40) { // Arrow down
			if (ggSearch.totItems == 0) {
				clearTimeout(ggSearch.timer);
				ggSearch.timer = setTimeout("ggSearch.initSuggestion()",200);
			} else if (ggSearch.selectedItem < ggSearch.totItems) {
				ggSearch.selectItem(ggSearch.selectedItem + 1);
				ggSearch.fetchSelected();
			}
		} else if (keyCode == 27 || keyCode == 37) { // Escape & Left arrow
			ggSearch.deselect();
			ggSearch.hide();
		} else if (keyCode == 13) { // Enter
			var str = ggSearch.fetchSelected();
			window.location.href = "/all?q=" + str;
			return false;
		} else if (keyCode == 39) { // Right arraw
			ggSearch.fetchSelected();
			ggSearch.hide();
		} else {
			clearTimeout(ggSearch.timer);
			ggSearch.searchStr = $F("ggSearchInput");
			ggSearch.timer = setTimeout("ggSearch.initSuggestion()",200);
		}
		return true;
	}, 
	selectItem : function(itemId) {
		ggSearch.deselect(itemId);
		if (itemId) {
			var a_block = $("ggSearchItem_" + itemId);
			a_block.addClassName("selected");
			ggSearch.selectedItem = itemId;
		} else {
			$("ggSearchInput").value = ggSearch.searchStr;
		}
	},
	deselect : function(void_element) {
		var el = $('suggestionContainer').getElementsByClassName("selected");
		for (var i=0; i < el.length; i++) {
			if ($(el[i]).id != "ggSearchItem_"+void_element) {
				$(el[i]).removeClassName('selected');
			}
		}
		ggSearch.selectedItem = 0;
	},
	fetchSelected : function() {
		var str = $("ggSearchItem_" + ggSearch.selectedItem).innerHTML;
		$("ggSearchInput").value = html_entity_decode(str);
		return str;
	},
	initSuggestion : function() {
		var input = $("ggSearchInput");
		if (input.value.length) {
			var url = "/ajaxdata/ggsearch/data?q=" + input.value;
			new Ajax.Request(url, 
			{ 
				method: 'get',
				onSuccess: function(req) {
					var xmlDoc = req.responseXML.documentElement;
					var html = "";
					var items =  0;
					
					// Products
					var cnt = xmlDoc.getElementsByTagName("product").length;
					if (cnt > 0) {
						html += "<h2>Products</h2>\n";
						html += "<ul>\n";
						for ( x=0; x<cnt; x=x+1 ) {
							items = items + 1;
							var product_el = xmlDoc.getElementsByTagName("product")[x];
							var title = product_el.firstChild.nodeValue;
							var state = product_el.getAttribute("state");
							var url = product_el.getAttribute("url");
							html += '<li><a href="' + url + '" ';
							html += 'id="ggSearchItem_' + items + '" ';
							html += 'onmouseover="ggSearch.selectItem(' + items + ');">';
							html += title;
							html += '</a></li>';
						}
						html += "</ul>\n";
					} 
					
					// Categories
					var cnt = xmlDoc.getElementsByTagName("category").length;
					if (cnt > 0) {
						html += "<h2>Categories</h2>\n";
						html += "<ul>\n";
						for ( x=0; x<cnt; x=x+1 ) {
							items = items + 1;
							var product_el = xmlDoc.getElementsByTagName("category")[x];
							var title = product_el.firstChild.nodeValue;
							var url = product_el.getAttribute("url");
							html += '<li><a href="' + url + '" ';
							html += 'id="ggSearchItem_' + items + '" ';
							html += 'onmouseover="ggSearch.selectItem(' + items + ');">';
							html += title;
							html += '</a></li>';
						}
						html += "</ul>\n";
					} 
					
					// Publishers
					var cnt = xmlDoc.getElementsByTagName("publisher").length;
					if (cnt > 0) {
						html += "<h2>Publishers</h2>\n";
						html += "<ul>\n";
						for ( x=0; x<cnt; x=x+1 ) {
							items = items + 1;
							var product_el = xmlDoc.getElementsByTagName("publisher")[x];
							var title = product_el.firstChild.nodeValue;
							var url = product_el.getAttribute("url");
							html += '<li><a href="' + url + '" ';
							html += 'id="ggSearchItem_' + items + '" ';
							html += 'onmouseover="ggSearch.selectItem(' + items + ');">';
							html += title;
							html += '</a></li>';
						}
						html += "</ul>\n";
					} 
					
                    // Info
					var cnt = xmlDoc.getElementsByTagName("info").length;
					if (cnt > 0) {
						html += "<h2>Info</h2>\n";
						html += "<ul>\n";
						for ( x=0; x<cnt; x=x+1 ) {
							items = items + 1;
							var product_el = xmlDoc.getElementsByTagName("info")[x];
							var title = product_el.firstChild.nodeValue;
							var url = product_el.getAttribute("url");
							html += '<li><a href="' + url + '" ';
							html += 'id="ggSearchItem_' + items + '" ';
							html += 'onmouseover="ggSearch.selectItem(' + items + ');">';
							html += title;
							html += '</a></li>';
						}
						html += "</ul>\n";
					} 
                    
					ggSearch.totItems = items;
					
					if (items == 0) {
						// Hide suggestion container
						ggSearch.hide();
					} else {
						// Update and show suggestion container
						var suggestionContainer = $("suggestionContainer");
						suggestionContainer.update(html);
						ggSearch.show();
					}
				}
			});
		} else {
			ggSearch.hide();
		}
	},
	show : function() {
		if ($("suggestionContainer")) {
			var el = $("suggestionContainer");
			if (el.getStyle("display") == "none" || el.getStyle("opacity") == "0") {
				var parent_el = $("ggSearchInput");
				var posLeft = (findPosX(parent_el)+10) + "px";
				var posTop = (findPosY(parent_el)+parent_el.getHeight()) + "px";
				el.setStyle({opacity: 0, left: posLeft, top: posTop, display: "block"});
				new Effect.Opacity(el, { from: 0, to: 1, duration: 0.1 });
			}
		}
	},
	hide : function() {
		if ($("suggestionContainer")) {
			var el = $("suggestionContainer");
			if (el.getStyle("display") != "none") {
				new Effect.Opacity(el, 
				{ 
					from: 1,  
					to: 0,  
					duration: 0.1,  
					afterFinish: function() { 
						$("suggestionContainer").update(""); 
					} 
				});
			}
			ggSearch.totItems = 0;
			ggSearch.selectedItem = 0;
		}
	}
 }
 

document.observe("dom:loaded", function() {
	// alert("test");
	var el = $('ggSearchInput');
	el.observe('keyup', function(event){
		ggSearch.keyUp(event);
	});
	
	el.observe('blur', function(event){
		t = setTimeout('ggSearch.hide()',200);
	});
	
});