var SDLS_livesearchbox=null;
var SDLS_livesearchhiddentype=null;
var SDLS_livesearchwidth=200;
var SDLS_livesearchattachment="right";
var SDLS_livesearchoffset=0;
var SDLS_livesearchnumentries=0;
var SDLS_livesearchkeystate=0;
var SDLS_livesearchintervalhandler=null;
var SDLS_livesearchentries=[];
var SDLS_livesearchdelayedquery="";
var SDLS_livesearchdelayhandler=null;

var SDLS_hostprefix="http://www.mobmap.de/";

var browserIsIE = (navigator.appName=="Microsoft Internet Explorer");
var browserIsOpera = (navigator.userAgent.search(/Opera/)!=-1);
var browserIsSafari = (navigator.userAgent.search(/Safari/)!=-1);
var browserIsNetscape = (!browserIsSafari && navigator.appName=="Netscape");

function SDLS_attachLiveSearch(textboxid, width, attachment, offset) {
	var textbox=document.getElementById(textboxid);
	if(textbox) {
		SDLS_livesearchbox=textbox;
		SDLS_livesearchwidth=width;
		SDLS_livesearchattachment=attachment;
		SDLS_livesearchoffset=offset;
		SDLS_livesearchbox.onkeyup=SDLS_performLiveSearch;
		SDLS_livesearchbox.onkeydown=SDLS_liveSearchKeyDown;
		SDLS_livesearchbox.onblur=new Function("window.setTimeout(\"SDLS_hideLiveSearchResults()\", 200)");
		SDLS_livesearchbox.autocomplete="off";
		if(browserIsNetscape) SDLS_livesearchbox.setAttribute("autocomplete", "off");
		SDLS_livesearchhiddentype=document.createElement("input");
		SDLS_livesearchhiddentype.type="hidden";
		SDLS_livesearchhiddentype.name="querytype";
		SDLS_livesearchhiddentype.id="querytype";
		SDLS_livesearchhiddentype.value="";
		textbox.parentNode.appendChild(SDLS_livesearchhiddentype);
	}
}

function SDLS_initialize() {
	if(document.getElementById("tooltip0")==null) {
		var h=document.getElementsByTagName("head")[0];
		if(h) {
			var l=document.createElement("link");
			l.type="text/css";
			l.href=SDLS_hostprefix+"css/extlivesearch.css";
			l.rel="stylesheet";
			h.appendChild(l);
			l=document.createElement("script");
			l.src=SDLS_hostprefix+"js/tooltip.js";
			h.appendChild(l);
		}
		var b=document.getElementsByTagName("body")[0];
		if(b) {
			for(var i=0;i<3;i++) {
				var tt=document.createElement("div");
				tt.id="tooltip"+i;
				tt.className="sdtooltip sdtooltipwide";
				tt.style.position="absolute";
				tt.style.zIndex=1000000000;
				tt.style.left="0px";
				tt.style.top="0px";
				tt.style.visibility="hidden";
				var tt_tbl=document.createElement("table");
				tt_tbl.border=0;
				tt_tbl.cellPadding=0;
				tt_tbl.cellSpacing=0;
				tt_tbl.style.tableLayout="auto";
				var tt_tbl_tr=document.createElement("tr");
				var tt_tbl_tr_td=document.createElement("td");
				tt_tbl_tr_td.id="tooltipcontainer"+i;
				tt_tbl_tr.appendChild(tt_tbl_tr_td);
				tt_tbl_tr_td=document.createElement("td");
				tt_tbl_tr_td.className="tooltip-padded";
				tt_tbl_tr_td.style.backgroundPosition="100% 0%";
				tt_tbl_tr.appendChild(tt_tbl_tr_td);
				tt_tbl.appendChild(tt_tbl_tr);
				tt_tbl_tr=document.createElement("tr");
				tt_tbl_tr_td=document.createElement("td");
				tt_tbl_tr_td.className="tooltip-padded";
				tt_tbl_tr_td.style.backgroundPosition="0% 100%";
				tt_tbl_tr_td.appendChild(document.createTextNode(" "));
				tt_tbl_tr.appendChild(tt_tbl_tr_td);
				tt_tbl_tr_td=document.createElement("td");
				tt_tbl_tr_td.className="tooltip-padded";
				tt_tbl_tr_td.style.backgroundPosition="100% 100%";
				tt_tbl_tr_td.appendChild(document.createTextNode(" "));
				tt_tbl_tr.appendChild(tt_tbl_tr_td);
				tt_tbl.appendChild(tt_tbl_tr);
				tt.appendChild(tt_tbl);
				b.appendChild(tt);
			}
		}
	}	
}

function SDLS_performLiveSearch(e) {
	if(!e) e=window.event;
	if(e.keyCode==38 || e.keyCode==40) {
		SDLS_livesearchkeystate=0;
		SDLS_clearLiveSearchIntervalHandler();
		return;
	}
	if(e.keyCode!=13) {
		var query=SDLS_livesearchbox.value;
		if(query.length>=3 && e.keyCode!=27) {
			SDLS_livesearchdelayedquery=query;
			if(SDLS_livesearchdelayhandler!=null) {
				window.clearTimeout(SDLS_livesearchdelayhandler);
				SDLS_livesearchdelayhandler=null;
			}
			SDLS_livesearchdelayhandler=window.setTimeout("SDLS_actuallyPerformLiveSearch()",150);
		} else {
			SDLS_hideLiveSearchResults();
		}
	}
}

function SDLS_actuallyPerformLiveSearch() {
	var query=SDLS_livesearchbox.value;
	if(query.length>=3 && query==SDLS_livesearchdelayedquery) {
		var queryurl=SDLS_hostprefix+"search?mode=livesearch&query="+encodeURIComponent(query);
		SDLS_startAJAXRequest(queryurl);
	}
}

function SDLS_startAJAXRequest(url) {
	var element=document.getElementById("SDLSRequest");
	var h=document.getElementsByTagName("head")[0];
	if(element) h.removeChild(element);
	element=document.createElement("script");
	element.id="SDLSRequest";
	element.type="text/javascript";
	element.src=url;
	h.appendChild(element);
}

function SDLS_liveSearchKeyDown(e) {
	if(!e) e=window.event;
	if(e.keyCode==38 || e.keyCode==40) {
		if(SDLS_livesearchnumentries>0) {
			SDLS_livesearchkeystate=e.keyCode;
			if(browserIsOpera || browserIsNetscape) SDLS_livesearchintervalhandler=window.setInterval("SDLS_performLiveSearchInterval(true)",500);
			SDLS_processLiveSearchKeyboardMovement((e.keyCode==40));
		}
	}
}

function SDLS_clearLiveSearchIntervalHandler() {
	if(SDLS_livesearchintervalhandler!=null) {
		window.clearInterval(SDLS_livesearchintervalhandler);
		SDLS_livesearchintervalhandler=null;
	}
}

function SDLS_performLiveSearchInterval(first) {
	if(SDLS_livesearchkeystate==0) {
		SDLS_clearLiveSearchIntervalHandler();
		return;
	}
	if(first==true) {
		SDLS_clearLiveSearchIntervalHandler();
		SDLS_livesearchintervalhandler=window.setInterval("SDLS_performLiveSearchInterval(false)",30);
	}
	SDLS_processLiveSearchKeyboardMovement((SDLS_livesearchkeystate==40));
}

function SDLS_displayResults(data) {
	var container=document.getElementById("livesearchcontainer");
	var container_table=document.getElementById("livesearchtable");
	if(container==null) {
		container=document.createElement("div");
		container.id="livesearchcontainer";
		SDLS_livesearchbox.parentNode.appendChild(container);
		container_table=SDLS_getTable(SDLS_livesearchwidth,0,1,0);
		container_table.id="livesearchtable";
		container.appendChild(container_table);
	}
	container.width=SDLS_livesearchwidth+"px";
	if(SDLS_livesearchattachment=="left") {
		container.style.left=SDLS_livesearchoffset+"px";	
	} else {
		container.style.right=SDLS_livesearchoffset+"px";
	}
	container_table.width=SDLS_livesearchwidth;
	var parts=data;
	if(parts.length>1) {
		if(parts[0]==SDLS_livesearchbox.value) {
			SDLS_removeAllChilds(container_table);
			var container_tbody=document.createElement("tbody");
			var i=0;
			SDLS_livesearchentries=[];
			for(i=1;i<parts.length;i++) {
				var name=parts[i][0];
				var type=parts[i][1];
				var color=parts[i][2];
				var icon=parts[i][3];
				var tooltip=parts[i][4];
				var url="search?query="+encodeURIComponent(name+" ("+type+")");
				var container_tr=document.createElement("tr");
				container_tr.className="livesearchresult clickable";
				container_tr.id="livesearchresult"+(i-1);
				var container_td=document.createElement("td");
				var container_td_table=SDLS_getTable("100%",0,0,1);
				container_td_table.style.height="24px";
				var container_td_table_tbody=document.createElement("tbody");
				var container_td_table_tr=document.createElement("tr");
				var container_td_table_td=document.createElement("td");
				container_td_table_td.width=22;
				if(icon!="") container_td_table_td.appendChild(SDLS_getItemIcon(icon, url, tooltip, 0, 0, "tiny", true));
				container_td_table_tr.appendChild(container_td_table_td);
				container_td_table_td=document.createElement("td");
				container_td_table_td.vAlign="middle";
				container_td_table_td.align="left";
				var container_td_table_td_div=document.createElement("div");
				container_td_table_td_div.className="q"+((color!="1")?color:"1b");
				var textelement=document.createElement("span");
				textelement.appendChild(document.createTextNode(name));
				if(icon!="") SDLS_addTooltip(textelement, tooltip);
				container_td_table_td_div.appendChild(textelement);
				container_td_table_td.appendChild(container_td_table_td_div);
				container_td_table_tr.appendChild(container_td_table_td);
				container_td_table_td=document.createElement("td");
				container_td_table_td.vAlign="middle";
				container_td_table_td.align="right";
				container_td_table_td.className="livesearchtypetag";
				container_td_table_td.appendChild(document.createTextNode(type));
				container_td_table_tr.appendChild(container_td_table_td);
				container_td_table_tbody.appendChild(container_td_table_tr);
				container_td_table.appendChild(container_td_table_tbody);
				container_td.appendChild(container_td_table);
				container_tr.appendChild(container_td);
				container_tr.onclick=new Function("document.location.href='"+SDLS_hostprefix+url.replace("'","\\'")+"';");
				container_tbody.appendChild(container_tr);
				SDLS_livesearchentries[i-1]=[name, type];
			}
			SDLS_livesearchnumentries=parts.length-1;
			container_table.appendChild(container_tbody);
			container.appendChild(container_table);
			container.style.visibility="visible";
			var tobehidden=document.getElementById("tobehiddenbylivesearch");
			if(tobehidden) tobehidden.style.visibility="hidden";
		} else {
			SDLS_hideLiveSearchResults();
		}
	} else {
		SDLS_hideLiveSearchResults();
	}
}

function SDLS_hideLiveSearchResults() {
	var container=document.getElementById("livesearchcontainer");
	if(container) container.style.visibility="hidden";
	SDLS_livesearchnumentries=0;
	if(SDLS_livesearchhiddentype) SDLS_livesearchhiddentype.value="";
	var tobehidden=document.getElementById("tobehiddenbylivesearch");
	if(tobehidden) tobehidden.style.visibility="visible";
}

function SDLS_processLiveSearchKeyboardMovement(direction) {
	var nextSelected;
	if(direction==true) {
		var currentlySelected=SDLS_getCurrentlySelectedLiveSearchEntry();
		nextSelected=currentlySelected+1;
		if(nextSelected>=SDLS_livesearchnumentries) nextSelected=0;
		SDLS_selectLiveSearchEntry(nextSelected);
	} else {
		var currentlySelected=SDLS_getCurrentlySelectedLiveSearchEntry();
		nextSelected=currentlySelected-1;
		if(nextSelected<0) nextSelected=SDLS_livesearchnumentries-1;
		SDLS_selectLiveSearchEntry(nextSelected);
	}
	SDLS_livesearchbox.value=SDLS_livesearchentries[nextSelected][0];
	SDLS_livesearchhiddentype.value=SDLS_livesearchentries[nextSelected][1];
}

function SDLS_deselectLiveSearchEntries() {
	var i;
	for(i=0;i<SDLS_livesearchnumentries;i++) {
		var entry=document.getElementById("livesearchresult"+i);
		if(entry) entry.className="livesearchresult";
	}
}

function SDLS_selectLiveSearchEntry(id) {
	SDLS_deselectLiveSearchEntries();
	if(id==-1) {
		SDLS_livesearchbox.focus();
	} else {
		var entry=document.getElementById("livesearchresult"+id);
		if(entry) entry.className="livesearchresult livesearchselected";
	}
}

function SDLS_getCurrentlySelectedLiveSearchEntry() {
	var i;
	for(i=0;i<SDLS_livesearchnumentries;i++) {
		var entry=document.getElementById("livesearchresult"+i);
		if(entry) {
			if(entry.className.search(/livesearchselected/)!=-1) return i;
		}
	}
	return -1;
}

function SDLS_processLiveSearchMouseOver(id) {
	SDLS_selectLiveSearchEntry(id);	
}



function SDLS_removeAllChilds(parent) {
	while(parent.firstChild) {
		parent.removeChild(parent.firstChild);	
	}
}

function SDLS_getTable(width, border, cellSpacing, cellPadding) {
	var table=document.createElement("table");
	table.width=width;
	table.border=border;
	table.cellSpacing=cellSpacing;
	table.cellPadding=cellPadding;
	return table;
}

function SDLS_getItemIcon(icon, url, tooltip, mincount, maxcount, size, nopadding, nsoffsetX, nsoffsetY, offsetX, offsetY, edge, tag) {
	if(url!=null) {
		var icon_a=document.createElement("a");
		icon_a.href=url;
	}
	var icon_div=document.createElement("div");
	if(!icon.match(/\//)) icon_div.style.backgroundImage="url(\""+SDLS_hostprefix+"images/wowicons/"+size+"/"+icon+".jpg\")";
	else icon_div.style.backgroundImage="url(\""+icon+"\")";
	icon_div.style.position="relative";
	icon_div.style.left="0px";
	icon_div.style.top="0px";
	if(size=="medium") {
		if(nopadding!=true)	icon_div.className="itemicon iconpadding";
		else icon_div.className="itemicon";		
	}
	if(size=="small") {
		if(nopadding!=true)	icon_div.className="smallitemicon smalliconpadding";
		else icon_div.className="smallitemicon";		
	}
	if(size=="tiny") {
		if(nopadding!=true)	icon_div.className="tinyitemicon tinyiconpadding";
		else icon_div.className="tinyitemicon";		
	}
	var icon_div_border=document.createElement("div");
	icon_div_border.className="border";
	var icon_div_glow=document.createElement("div");
	icon_div_glow.className="noglow";
	if(tooltip!=null) {
		var func;
		if(typeof tooltip == "string") {
			func="this.className='glow'; displayTooltip(event, '"+tooltip.replace(/'/g,'\\\'')+"'";
		} else {
			func="this.className='glow'; displayTooltip(event, "+recreateArray(tooltip);
		}
		if(nsoffsetX!=null) func+=", "+nsoffsetX; else func+=", null";
		if(nsoffsetY!=null) func+=", "+nsoffsetY; else func+=", null";
		if(offsetX!=null) func+=", "+offsetX; else func+=", null";
		if(offsetY!=null) func+=", "+offsetY; else func+=", null";
		if(edge!=null) func+=", "+edge; else func+=", null";
		func+=");";
		icon_div_glow.onmouseover=new Function("event",func);
		icon_div_glow.onmousemove=new Function("event","repositionTooltip(event);");
		icon_div_glow.onmouseout=new Function("this.className='noglow'; hideTooltip();");
	} else {
		icon_div_glow.onmouseover=new Function("event","this.className='glow';");
		icon_div_glow.onmouseout=new Function("this.className='noglow';");
	}
	icon_div_border.appendChild(icon_div_glow);
	icon_div.appendChild(icon_div_border);
	if((mincount!=maxcount || mincount>1) && size!="tiny") {
		var countText=mincount;
		if(mincount!=maxcount) countText=mincount+"-"+maxcount;
		var icon_div_count=document.createElement("div");
		icon_div_count.className="count";
		
		var icon_div_count_text=document.createElement("div");
		icon_div_count_text.appendChild(document.createTextNode(countText));
		icon_div_count_text.className="text";
		icon_div_count.appendChild(icon_div_count_text);
		
		var i;
		for(i=1;i<=8;i++) {
			var icon_div_count_border=document.createElement("div");
			icon_div_count_border.className="textborder"+i;
			icon_div_count_border.appendChild(document.createTextNode(countText));
			icon_div_count.appendChild(icon_div_count_border);
		}
		
		icon_div_glow.appendChild(icon_div_count);
	}
	if(tag!=null) {
		var icon_tag=document.createElement("img");
		icon_tag.src="images/"+tag+"_"+size+".png";
		icon_tag.width=36;
		icon_tag.height=13;
		icon_tag.style.position="absolute";
		icon_tag.style.right="4px";
		icon_tag.style.bottom="-2px";
		icon_div.appendChild(icon_tag);
	}
	if(url!=null) {
		icon_a.appendChild(icon_div);
		return icon_a;
	} else {
		return icon_div;
	}
}

function SDLS_addTooltip(element, tooltip, nsoffsetX, nsoffsetY, offsetX, offsetY, edge) {
	var func;
	if(typeof tooltip == "string") {
		func="displayTooltip(event, '"+tooltip.replace(/'/g,'\\\'')+"'";
	} else {
		func="displayTooltip(event, "+recreateArray(tooltip);
	}
	if(nsoffsetX!=null) func+=", "+nsoffsetX; else func+=", null";
	if(nsoffsetY!=null) func+=", "+nsoffsetY; else func+=", null";
	if(offsetX!=null) func+=", "+offsetX; else func+=", null";
	if(offsetY!=null) func+=", "+offsetY; else func+=", null";
	if(edge!=null) func+=", "+edge; else func+=", null";
	func+=");";
	element.onmouseover=new Function("event",func);
	element.onmousemove=new Function("event","repositionTooltip(event);");
	element.onmouseout=new Function("hideTooltip();");
}
