var SDMAPS_LINKS_HEIGHT=20;
var SDMAPS_HEADER_HEIGHT=80;
var SDMAPS_DIVIDER_HEIGHT=24;
var SDMAPS_RESULTS_WIDTH=400;
var SDMAPS_WINDOW_HEIGHT=0;
var SDMAPS_WINDOW_WIDTH=0;

var sdMapsResultsToggleState=false;

function resizeSDMaps() {
	SDMAPS_WINDOW_WIDTH=getWindowWidth();
	SDMAPS_WINDOW_HEIGHT=getWindowHeight();
	
	var linksdiv=document.getElementById("sdmaps_linkdiv");
	var searchdiv=document.getElementById("sdmaps_searchdiv");
	var resultsdiv=document.getElementById("sdmaps_resultsdiv");
	var mapdiv=document.getElementById("sdmaps_mapdiv");
	var map=document.getElementById("sdmaps_map");
	var results=document.getElementById("sdmaps_results");
	
	linksdiv.style.height=SDMAPS_LINKS_HEIGHT+"px";
	linksdiv.style.width=SDMAPS_WINDOW_WIDTH+"px";
	linksdiv.style.left="0px";
	linksdiv.style.top="0px";
	
	searchdiv.style.height=SDMAPS_HEADER_HEIGHT+"px";
	searchdiv.style.width=SDMAPS_WINDOW_WIDTH+"px";
	searchdiv.style.left="0px";
	searchdiv.style.top=SDMAPS_LINKS_HEIGHT+"px";
	
	resultsdiv.style.height=(SDMAPS_WINDOW_HEIGHT-SDMAPS_HEADER_HEIGHT-SDMAPS_LINKS_HEIGHT)+"px";
	resultsdiv.style.width=(sdMapsResultsToggleState?SDMAPS_RESULTS_WIDTH:0)+"px";
	resultsdiv.style.left="0px";
	resultsdiv.style.top=(SDMAPS_HEADER_HEIGHT+SDMAPS_LINKS_HEIGHT)+"px";
	
	mapdiv.style.height=(SDMAPS_WINDOW_HEIGHT-SDMAPS_HEADER_HEIGHT-SDMAPS_LINKS_HEIGHT)+"px";
	mapdiv.style.width=(SDMAPS_WINDOW_WIDTH-(sdMapsResultsToggleState?SDMAPS_RESULTS_WIDTH:0))+"px";
	mapdiv.style.left=(sdMapsResultsToggleState?SDMAPS_RESULTS_WIDTH:0)+"px";
	mapdiv.style.top=(SDMAPS_HEADER_HEIGHT+SDMAPS_LINKS_HEIGHT)+"px";
	
	map.style.height=(SDMAPS_WINDOW_HEIGHT-SDMAPS_HEADER_HEIGHT-SDMAPS_DIVIDER_HEIGHT-SDMAPS_LINKS_HEIGHT)+"px";
	results.style.height=(SDMAPS_WINDOW_HEIGHT-SDMAPS_HEADER_HEIGHT-SDMAPS_DIVIDER_HEIGHT-SDMAPS_LINKS_HEIGHT)+"px";
}

function toggleSDMapsResults() {
	sdMapsResultsToggleState=!sdMapsResultsToggleState;
	var button=document.getElementById("sdmaps_resulttoggle");
	if(sdMapsResultsToggleState) button.src="images/sdmaps_toggle_in.png";
	else button.src="images/sdmaps_toggle_out.png";
	resizeSDMaps();
}

function insertSDMapsFlash(continentid) {
	var flashdiv=document.getElementById("sdmaps_map");
	var flashparams="mode=world&continentid="+continentid;
	if(!browserIsIE) {
		flashdiv.innerHTML="<embed src=\"mapviewer/SDMapViewer.swf\" FlashVars=\""+flashparams+"\" quality=\"high\" bgcolor=\"#DFDFDF\" width=\"100%\" height=\"100%\" name=\"SDMapViewer\" id=\"SDMapViewer\" align=\"middle\" play=\"true\" loop=\"false\" quality=\"high\" allowScriptAccess=\"sameDomain\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.adobe.com/go/getflashplayer\"></embed>";
	} else {
		if(browserIsIE) {
			flashdiv.innerHTML="<object type=\"application/x-shockwave-flash\" id=\"SDMapViewer\" width=\"100%\" height=\"100%\" data=\"mapviewer/SDMapViewer.swf\"><param name=\"movie\" value=\"mapviewer/SDMapViewer.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#DFDFDF\" /><param name=\"allowScriptAccess\" value=\"sameDomain\" /><param name=\"FlashVars\" value=\""+flashparams+"\"></object>";
		} else {
			flashdiv.innerHTML="<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" id=\"SDMapViewer\" width=\"100%\" height=\"100%\"><param name=\"movie\" value=\"mapviewer/SDMapViewer.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#DFDFDF\" /><param name=\"allowScriptAccess\" value=\"sameDomain\" /><param name=\"FlashVars\" value=\""+flashparams+"\"></object>";
		}
	}
}

function changeSDMapsContinent() {
	var continentid=document.getElementById("continent").value;	
	selectSDMapsContinent(continentid);
	sdMapsClearResults(false);
	if(sdMapsResultsToggleState) toggleSDMapsResults();
}

function selectSDMapsContinent(continentid) {
	var continent=document.getElementById("continent");
	selectValueInList(continent, continentid);
	insertSDMapsFlash(continentid);
}

function sdMapsClearResults(showLoadingAnimation) {
	var resultsdiv=document.getElementById("sdmaps_results");
	removeAllChilds(resultsdiv);
	
	var img=document.getElementById("sdmaps_loading");	
	if(showLoadingAnimation) {
		img.style.left=(SDMAPS_RESULTS_WIDTH/2-50)+"px";
		img.style.top=((SDMAPS_WINDOW_HEIGHT-SDMAPS_HEADER_HEIGHT-SDMAPS_DIVIDER_HEIGHT)/2-50)+"px";
		img.style.display="block";
	} else {
		img.style.display="none";
	}
}

function sdMapsEnterQuery(event) {
	if(event.keyCode==13) sdMapsQuery();	
}

function sdMapsQuery() {
	var continent=document.getElementById("continent").value;
	var query=document.getElementById("query").value;
	sdMapsClearResults(true);
	sdMapsFlashInitMarkings(continent, query);
	startAJAXRequest("maps?action=search&continent="+continent+"&query="+encodeURIComponent(query), handleSDMapsResults);
}

var sdmaps_result=null;
var sdmaps_error=null;
var SDMAPS_RESULTS_PER_PAGE=10;
var SDMAPS_NPC_IMAGE_WIDTH=50;

var SDMAPS_COLORS=["#ffffff", "#ff0000", "#00ff00", "#0000ff", "#ff8000", "#9223dc", "#800000", "#008000", "#000080", "#804000"];

function handleSDMapsResults(data) {
	sdMapsClearResults(false);
	if(data.charAt(0)!=" ") {
		sdmaps_result=null;
		sdmaps_error=data;
		displaySDMapsResults(0);		
	} else {
		sdmaps_error=null;
		sdmaps_result=eval('('+data+')');
		sdMapsFlashInitMarkings();
		displaySDMapsResults(0);
	}
	if(!sdMapsResultsToggleState) toggleSDMapsResults();
}

function switchSDMapsResultsPage(page) {
	displaySDMapsResults(page);
}

function createErrorMessage(message, container) {
	var div=document.createElement("div");
	div.className="sdmaps_results_error";
	div.appendChild(document.createTextNode(message));
	container.appendChild(div);
}

function displaySDMapsResults(page) {
	var container=document.getElementById("sdmaps_results");
	removeAllChilds(container);
	sdMapsFlashClearDisplay();
	if(sdmaps_result==null) {
		if(sdmaps_error!=null) {
			createErrorMessage(sdmaps_error);
		}
		return;
	}
	
	if(sdmaps_result.resultcount==0) {
		createErrorMessage("Die Suche verlief leider ergebnislos.", container);
		return;
	}
	
	container.appendChild(createSDMapsPageControl(page, sdmaps_result.resultcount, sdmaps_result.moreresults, document.getElementById("query").value, true));
	
	var table=getTable("100%", 0, 4, 0);
	table.id="sdmaps_resultstable";
	var tbody=document.createElement("tbody");
	
	var i,k;
	var start=page*SDMAPS_RESULTS_PER_PAGE;
	for(i=start;i<start+SDMAPS_RESULTS_PER_PAGE;i++) {
		if(i>=sdmaps_result.resultcount) break;
		
		var result=sdmaps_result.results[i];
		var color=SDMAPS_COLORS[i%SDMAPS_RESULTS_PER_PAGE];
		
		sdMapsFlashAddToDisplay(result.tag, color);		
		
		var tr=document.createElement("tr");
		var td=document.createElement("td");
		
		var colorbox=document.createElement("div");
		colorbox.className="sdmaps_result_colorbox";
		colorbox.style.background=color;
		
		var dblink=null;
		if(result.dblink && result.dblink!="") {
			var dblinkimg=document.createElement("img");
			dblinkimg.src="images/sdmaps_dblink.gif";
			dblinkimg.width=12;
			dblinkimg.height=12;
			dblinkimg.border=0;
			dblink=getLinkElement(dblinkimg, result.dblink);
			dblink.className="sdmaps_result_dblink"+(result.type=="npc"?" sdmaps_floatleft":"");
			dblink.target="_blank";
		}
	
		if(result.type=="npc") {
			if(result.image) {
				var image=document.createElement("img");
				image.className="sdmaps_result_npc_image";
				image.src=result.image;
				var scaling=SDMAPS_NPC_IMAGE_WIDTH/result.imagewidth;
				if(scaling>1) scaling=1;
				image.width=Math.round(result.imagewidth*scaling);
				image.height=Math.round(result.imageheight*scaling);
				td.appendChild(image);
			}
			td.appendChild(colorbox);
			var span=getSpan("sdmaps_result_npc_name"+(dblink!=null?" sdmaps_floatleft":""));
			getLinkElement(result.name, "javascript:sdMapsHighlight('"+result.tag+"')", span);
			td.appendChild(span);
			if(dblink) td.appendChild(dblink);
			span=getSpan("sdmaps_result_npc_level");
			var levelString="???";
			if(result.minlevel>0 && result.maxlevel>0) {
				if(result.minlevel!=result.maxlevel) levelString=result.minlevel+" - "+result.maxlevel;
				else levelString=result.minlevel;
			}
			if((result.flags&(1<<0))!=0) {
				levelString+=" Boss";
			} else if((result.flags&(1<<2))!=0) {
				levelString+=" Rar";
			} else if((result.flags&(1<<1))!=0) {
				levelString+=" Elite";
			}
			span.appendChild(document.createTextNode(levelString));
			td.appendChild(span);
			span=getSpan("sdmaps_result_npc_subtitle sdmaps_floatleft");
			if(result.subtitle) span.appendChild(document.createTextNode(result.subtitle));
			td.appendChild(span);
			span=getSpan("sdmaps_result_npc_type");
			span.appendChild(document.createTextNode(result.creaturetype));
			td.appendChild(span);
			if(result.zones && result.zones.length>0) {
				span=getSpan("sdmaps_result_npc_zones");
				span.appendChild(document.createTextNode("zu finden in: "));
				var parts=result.zones.split("#");
				for(k=0;k<parts.length;k++) {
					var subparts=parts[k].split("|");
					if(k>0) span.appendChild(document.createTextNode(", "));
					if(subparts.length==3) getLinkElement(subparts[0], "javascript:sdMapsJumpTo("+subparts[1]+","+subparts[2]+")", span);
					else span.appendChild(document.createTextNode(subparts[0]));
				}
				td.appendChild(span);
			}
			span=getSpan("sdmaps_result_npc_flags");
			for(k=3;k<=10;k++) {
				if((result.flags&(1<<k))!=0) {
					var img=document.createElement("img");
					switch(k) {
					case 3:
						img.src="images/sdmaps_lootable.png";
						img.alt="Dieser NPC kann geplündert werden";
						break;
					case 4:
						img.src="images/sdmaps_gatherable.png";
						img.alt="Von diesem NPC können Kräuter gesammelt werden";
						break;
					case 5:
						img.src="images/sdmaps_skinnable.png";
						img.alt="Dieser NPC kann gekürschnert werden";
						break;
					case 6:
						img.src="images/sdmaps_minable.png";
						img.alt="Von diesem NPC können Erze gewonnen werden";
						break;
					case 7:
						img.src="images/sdmaps_queststart.png";
						img.alt="Dieser NPC ist ein Questgeber";
						break;
					case 8:
						img.src="images/sdmaps_questend.png";
						img.alt="Bei diesem NPC enden Quests";
						break;
					case 9:
						img.src="images/sdmaps_merchant.png";
						img.alt="Dieser NPC ist ein Händler";
						break;
					case 10:
						img.src="images/sdmaps_trainer.png";
						img.alt="Dieser NPC ist ein Trainer";
						break;
					}
					img.width=16;
					img.height=16;
					span.appendChild(img);
				}
			}
			td.appendChild(span);
		}
		
		
		if(result.type=="object") {
			if(result.image) {
				var image=document.createElement("img");
				image.className="sdmaps_result_npc_image";
				image.src=result.image;
				var scaling=SDMAPS_NPC_IMAGE_WIDTH/result.imagewidth;
				if(scaling>1) scaling=1;
				image.width=Math.round(result.imagewidth*scaling);
				image.height=Math.round(result.imageheight*scaling);
				td.appendChild(image);
			}
			td.appendChild(colorbox);
			var span=getSpan("sdmaps_result_npc_name"+(dblink!=null?" sdmaps_floatleft":""));
			getLinkElement(result.name, "javascript:sdMapsHighlight('"+result.tag+"')", span);
			td.appendChild(span);
			if(dblink) td.appendChild(dblink);
			if(result.zones && result.zones.length>0) {
				span=getSpan("sdmaps_result_npc_zones");
				span.appendChild(document.createTextNode("zu finden in: "));
				var parts=result.zones.split("#");
				for(k=0;k<parts.length;k++) {
					var subparts=parts[k].split("|");
					if(k>0) span.appendChild(document.createTextNode(", "));
					if(subparts.length==3) getLinkElement(subparts[0], "javascript:sdMapsJumpTo("+subparts[1]+","+subparts[2]+")", span);
					else span.appendChild(document.createTextNode(subparts[0]));
				}
				td.appendChild(span);
			}
			span=getSpan("sdmaps_result_npc_flags");
			for(k=3;k<=10;k++) {
				if((result.flags&(1<<k))!=0) {
					var img=document.createElement("img");
					switch(k) {
					case 3:
						img.src="images/sdmaps_merchant.png";
						img.alt="Dieser NPC kann geplündert werden";
						break;
					case 4:
						img.src="images/sdmaps_gatherable.png";
						img.alt="Von diesem NPC können Kräuter gesammelt werden";
						break;
					case 6:
						img.src="images/sdmaps_minable.png";
						img.alt="Von diesem NPC können Erze gewonnen werden";
						break;
					case 7:
						img.src="images/sdmaps_queststart.png";
						img.alt="Dieser NPC ist ein Questgeber";
						break;
					case 8:
						img.src="images/sdmaps_questend.png";
						img.alt="Bei diesem NPC enden Quests";
						break;
					}
					img.width=16;
					img.height=16;
					span.appendChild(img);
				}
			}
			td.appendChild(span);
		}
		
		
		if(result.type=="poi") {
			td.appendChild(colorbox);
			var span=getSpan("sdmaps_result_npc_name"+(dblink!=null?" sdmaps_floatleft":""));
			getLinkElement(result.name, "javascript:sdMapsHighlight('"+result.tag+"')", span);
			td.appendChild(span);
			if(dblink) td.appendChild(dblink);
			span=getSpan("sdmaps_result_npc_subtitle sdmaps_clearfloatleft");
			if(result.subtitle) span.appendChild(document.createTextNode(result.subtitle));
			td.appendChild(span);
			if(result.zones && result.zones.length>0) {
				span=getSpan("sdmaps_result_npc_zones");
				span.appendChild(document.createTextNode("zu finden in: "));
				var parts=result.zones.split("#");
				for(k=0;k<parts.length;k++) {
					var subparts=parts[k].split("|");
					if(k>0) span.appendChild(document.createTextNode(", "));
					if(subparts.length==3) getLinkElement(subparts[0], "javascript:sdMapsJumpTo("+subparts[1]+","+subparts[2]+")", span);
					else span.appendChild(document.createTextNode(subparts[0]));
				}
				td.appendChild(span);
			}
		}
		
		tr.appendChild(td);
		tbody.appendChild(tr);
	}
	
	
	
	table.appendChild(tbody);
	container.appendChild(table);
	
	container.appendChild(createSDMapsPageControl(page, sdmaps_result.resultcount, sdmaps_result.moreresults, document.getElementById("query").value, false));
	
	sdMapsFlashSetDisplay();
}

function createSDMapsPageControl(page, resultcount, moreresults, query, isTop) {
	var pagecontrol=document.createElement("div");
	pagecontrol.className="sdmaps_resultscontrol_"+(isTop?"top":"bottom");
	var pagecount=Math.ceil(resultcount/SDMAPS_RESULTS_PER_PAGE);
	var resultcounttext=resultcount+" Ergebnisse - Seite "+(page+1)+" von "+pagecount;
	var span=getSpan(null, "sdmaps_resultscontrol_count_"+(isTop?"top":"bottom"));
	span.appendChild(document.createTextNode(resultcounttext));
	pagecontrol.appendChild(span);
	span=getSpan("sdmaps_resultscontrol_navigation_"+(isTop?"top":"bottom"));
	if(page>0) getLinkElement("vorherige", "javascript:switchSDMapsResultsPage("+(page-1)+")", span);
	else span.appendChild(document.createTextNode("vorherige"));
	span.appendChild(document.createTextNode(" - "));
	var pcstart=page-5;
	var pcend=page+5;
	if(pcstart<0) { pcend+=0-pcstart; pcstart=0; }
	if(pcend>=pagecount) { pcstart-=pcend-pagecount; pcend=pagecount-1; }
	if(pcstart<0) pcstart=0;
	for(i=pcstart;i<=pcend;i++) {
		if(i!=page) getLinkElement(String(i+1), "javascript:switchSDMapsResultsPage("+i+")", span);
		else span.appendChild(document.createTextNode(String(i+1)));
		span.appendChild(document.createTextNode(" "));
	}
	span.appendChild(document.createTextNode("- "));
	if(page<pagecount-1) getLinkElement("nächste", "javascript:switchSDMapsResultsPage("+(page+1)+")", span);
	else span.appendChild(document.createTextNode("nächste"));	
	pagecontrol.appendChild(span);
	if(!isTop && moreresults>0) {
		span=getSpan("sdmaps_resultscontrol_moreresults");
		getLinkElement("MobMap kennt noch "+moreresults+" weitere Ergebnisse zu dieser Anfrage!", "search?query="+encodeURIComponent(query), span, "_blank");
		pagecontrol.appendChild(span);
	}
	return pagecontrol;
}

var sdMapsTags="";
var sdMapsColors="";
var sdMapsRequest="";

function sdMapsFlashAddToDisplay(tag,color) {
	sdMapsTags+=tag+"|";
	sdMapsColors+=tag+"|"+color+"|";
}

function sdMapsFlashClearDisplay() {
	sdMapsTags="";
	sdMapsColors="";
	sdMapsFlashSetDisplay();
}

function sdMapsFlashSetDisplay() {
	var sdmaps=document.getElementById("SDMapViewer");
	if(sdmaps) {
		try {
			sdmaps.externalSetDisplay(sdMapsTags, sdMapsColors);
		} catch(e) {}
	}
}

function sdMapsFlashInitMarkings(continent, query) {
	var sdmaps=document.getElementById("SDMapViewer");
	if(query) sdMapsRequest="maps?action=search&xml=true&continent="+continent+"&query="+encodeURIComponent(query);
	if(sdmaps && sdMapsRequest) {
		try {
			sdmaps.externalInitMarkings(sdMapsRequest);
		} catch(e) {
			sdMapsRequest=null;	
		}
	}
	sdMapsFlashSetDisplay();
}

function externalIsReady() {
	sdMapsFlashSetDisplay();
}

function externalMarkingsLoaded() {
	if(sdmaps_result!=null && sdmaps_result.results.length>0) {
		var first=sdmaps_result.results[0];
		sdMapsHighlight(first.tag);
	}
}

function sdMapsJumpTo(x, y) {
	var sdmaps=document.getElementById("SDMapViewer");
	try {
		sdmaps.externalJumpToPos(x, y);
	} catch(e) {}
}

function sdMapsHighlight(tag) {
	var sdmaps=document.getElementById("SDMapViewer");
	try {
		sdmaps.externalJumpToTag(tag);
	} catch(e) {}
}
