// JavaScript Document

//map applic object
var $mapApplic=function(){
	//private vars
	var $serverListUrl="http://master.dolumar.be/serverlist/list/";
	var $usetest=false;
	var $testfile="http://daedeloth.no-ip.org/dolumar/api/ranking?output=xml";
	var $default={
		server:6,
		serverUrl:""
	}
	var $current={
		server:$default["server"],
		serverUrl:$default["serverUrl"]
	};
	var $servers=Array();
	var $players=Array();
	var $clans=Array();
	var $ids=Array();
	var $edge=0;
	var $leg=0;
	var $minsize=6;
	var $maxscore=0;
	var $startUnitX=0;
	var $startUnitY=0;
	var $divAlert;
	var $zoom=1;
	//private methods
	function noDefaultEvent(e){
		e.returnValue = false;
		if(e.preventDefault)
			e.preventDefault();
		return false;
	}
	function getData(transport){
		var $xml=transport.responseXML;
		var $player=$xml.getElementsByTagName("players")[0].getElementsByTagName("player");
		var $clan=$xml.getElementsByTagName("clans")[0].getElementsByTagName("clan");
		setAlert("Building Player Data...");
		setPlayer($player);
		setClan($clan);
		setAlert();
		buildMap();
		buildSearch();
	}
	function setZval(){
		var $oZval=document.getElementById("zoomval");
		$oZval.value=Math.round($zoom*100);
	}
	function setUval(){
		var $oUX=document.getElementById("unitX");
		var $oUY=document.getElementById("unitY");
		$oUX.value=$startUnitX;
		$oUY.value=$startUnitY;
	}
	function changeZoom(e){
		var $el=e.element();
		switch($el.id){
			case "zoomin":
				$zoom+=0.2;
			break;
			case "zoomout":
				if(($zoom-0.2)>0.1)
					$zoom-=0.2;
			break;
		}
		buildMap();
		setZval();
	}
	function changeZVal(e){
		var $el=e.element();
		var $val=Math.round(parseInt($el.value));
		if($val>10 && $val<=10000){
		   $zoom=$val/100;
		   buildMap();
		}
		setZval();		   
	}
	function changeUVal(e){
		var $el=e.element();
		var $val=Math.round(parseInt($el.value));
		switch($el.id){
			case "unitX":
				$startUnitX=$val;
			break;
			case "unitY":
				$startUnitY=$val;
			break;
		}
		buildMap();
		setUval();		   
	}
	function buildSearch(){
		document.getElementById("search").innerHTML="";
		var $oZin=document.getElementById("zoomin");
		var $oZout=document.getElementById("zoomout");
		var $oZval=document.getElementById("zoomval");
		var $oUX=document.getElementById("unitX");
		var $oUY=document.getElementById("unitY");
		setZval();
		setUval();
		Event.observe($oZin,"click",noDefaultEvent);
		Event.observe($oZout,"click",noDefaultEvent);
		Event.observe($oZin,"click",changeZoom);
		Event.observe($oZout,"click",changeZoom);
		Event.observe($oZval,"change",changeZVal);
		Event.observe($oUX,"change",changeUVal);
		Event.observe($oUY,"change",changeUVal);
		var $selectClan=document.createElement("select");
		$selectClan.setAttribute("multiple",true);
		$selectClan.setAttribute("size",15);
		var $option=document.createElement("option");
		var $txt="Full Map";
		var $oTxt=document.createTextNode($txt);
		$option.appendChild($oTxt);
		$selectClan.appendChild($option);
		var $opt=document.createElement("optgroup");
		var $txt="Clans";
		$opt.setAttribute("label",$txt);
		$selectClan.appendChild($opt);
		for(var $i=0;$i<$clans.length;$i++){
			var $option=document.createElement("option");
			var $txt=$clans[$i].name;
			$option.setAttribute("value",$i);
			$option.style.color=$clans[$i].color;
			var $oTxt=document.createTextNode($txt);
			$option.appendChild($oTxt);
			$opt.appendChild($option);
		}
		Event.observe($selectClan,"change",showClanonmap);
		document.getElementById("search").appendChild($selectClan);
	}
	function showClanonmap(e){
		var $el=e.element();
		var $bool=new Array();
		for(var $i=0;$i<$el.length;$i++){
			if($el[$i].selected==true)
				$bool[$el[$i].value]=true;
		}
		buildMap($bool);
	}
	function changeServer(e){
		var $el=e.element();
		for(var $i=0;$i<$el.length;$i++){
			if($el[$i].selected==true){
				$current["server"]=$el[$i].getAttribute("value");
			}
		}
		$players=Array();
		$clans=Array();
		$ids=Array();
		setServer($current["server"]);
	}
	function setServer($id){
		$current["serverUrl"]=$servers[$id];
		new Ajax.Request("proxy.php",{
			onSuccess: getData,
			parameters: {url: $servers[$id]+"api/ranking/?output=xml",file:"serverData_"+$id}
		});
	}
	function setPlayer($player){
		var $mY=0;
		var $mX=0;
		for(var $i=0;$i<$player.length;$i++){
			var $loc=$player[$i].getElementsByTagName("locations")[0].getElementsByTagName("location");
			var $name=$player[$i].getElementsByTagName("name")[0].firstChild.nodeValue;
			var $id=parseInt($player[$i].getElementsByTagName("member_id")[0].firstChild.nodeValue);
			var $sum=0;
			var $towns=Array();
			for(var $j=0;$j<$loc.length;$j++){
				$sum+=parseInt($loc[$j].getElementsByTagName("score")[0].firstChild.nodeValue);
				if(!$players[$id]){
					$towns[$towns.length]={
						name:$loc[$j].getElementsByTagName("name")[0].firstChild.nodeValue,
						score:parseInt($loc[$j].getElementsByTagName("score")[0].firstChild.nodeValue),
						X:parseInt($loc[$j].getElementsByTagName("loc-x")[0].firstChild.nodeValue),
						Y:parseInt($loc[$j].getElementsByTagName("loc-y")[0].firstChild.nodeValue)
					}
				}else{
					$towns=$players[$id].towns;
					$towns[$towns.length]={
						name:$loc[$j].getElementsByTagName("name")[0].firstChild.nodeValue,
						score:parseInt($loc[$j].getElementsByTagName("score")[0].firstChild.nodeValue),
						X:parseInt($loc[$j].getElementsByTagName("loc-x")[0].firstChild.nodeValue),
						Y:parseInt($loc[$j].getElementsByTagName("loc-y")[0].firstChild.nodeValue)
					}
					$players[$id].towns=$towns;
				}
				if(Math.abs($towns[$towns.length-1].X)>$mX)
					$mX=Math.abs($towns[$towns.length-1].X);
				if(Math.abs($towns[$towns.length-1].Y)>$mY)
					$mY=Math.abs($towns[$towns.length-1].Y);
				if($towns[$towns.length-1].score>$maxscore)
					$maxscore=$towns[$towns.length-1].score;
				$edge=$mX;
				if($mY>$mX)
					$edge=$mY;
			}
			$ids[$ids.length]=$id;
			if(!$players[$id]){
				$players[$id]={
					score:$sum,
					player:$name,
					towns:$towns,
					clan:-1
				}
			}
		}
	}
	function setClan($clan){
		var $h=new Array();
		for(var $i=0;$i<$clan.length;$i++){
			var $member=$clan[$i].getElementsByTagName("members")[0].getElementsByTagName("member");
			var $name=$clan[$i].getElementsByTagName("name")[0].firstChild.nodeValue;
			var $score=$clan[$i].getElementsByTagName("score")[0].firstChild.nodeValue;
			$h[1]=(16*(($i%16)+1)-1).toString(16);
			$h[2]=(64*(($i%4)+1)-1).toString(16);
			$h[3]=(8*((31-$i%32)+1)-1).toString(16);
			if($h[1].length<2)
				$h[1]="0"+$h[1];
			if($h[2].length<2)
				$h[2]="0"+$h[2];
			if($h[3].length<2)
				$h[3]="0"+$h[3];
			var $color="#"+$h[($i%3+1)%3+1]+$h[($i%3+2)%3+1]+$h[($i%3+3)%3+1];
			$clans[$i]={
				name:$name,
				score:parseInt($score),
				ids:Array(),
				color:$color
			};
			for(var $k=0;$k<$member.length;$k++){
				var $id=parseInt($member[$k].getElementsByTagName("member_id")[0].firstChild.nodeValue);
				if($players[$id]){
					$clans[$clans.length-1].ids[$k]=$id;
					$players[$id].clan=($clans.length-1);
				}
			}
		}
	}
	function checkArguments($arguments,$key){
		if($arguments.length>0){
			var $filter_clan=$arguments[0];
		}
		$bool=true;
		if($filter_clan && $filter_clan.length>0 && $filter_clan[$players[$ids[$key]].clan]!=true)
			$bool=false;
		return $bool;
	}
	function buildMap(){
		setAlert("Building Map...");
		//1px=$unit * 1coordinate
		var $unit=($edge*2)/($leg-12);
		var $maxsize=Math.abs(Math.floor(Math.sqrt(900)/$unit));
		if($maxsize<$minsize){
			$unit=($unit/$minsize)*$maxsize;
			$maxsize=$minsize;
		}
		$unit=$unit/$zoom;
		if($zoom<1)
			$maxsize=Math.abs(Math.floor(Math.sqrt(900)/$unit));
		var $parent=document.getElementById("map");
		if(arguments.length==0)
			$parent.innerHTML="";
		else{
			var $el=$parent.select('[class="town"]');
			for(var $i=0;$i<$el.length;$i++){
				$el[$i].remove();
			}
		}
			//alert('url(http://testing.neuroninteractive.com/image/world?x='+($startUnitX-$edge)+'&y='+($startUnitY+$edge)+'&width='+(2*$edge)+'&height='+(2*$edge)+")");
		for(var $j=0;$j<$ids.length;$j++){
			if(checkArguments(arguments,$j)){
				$towns=$players[$ids[$j]].towns;
				if($players[$ids[$j]].clan!=-1)
					var $color=$clans[$players[$ids[$j]].clan].color;
				else
					var $color="gray";
				for(var $i=0;$i<$towns.length;$i++){
					var $left=Math.ceil(($towns[$i].X/$unit)-$startUnitX/$unit+$leg/2);
					var $top=Math.ceil($leg/2-($towns[$i].Y/$unit)+$startUnitY/$unit);
					var $size=Math.sqrt(($towns[$i].score/$maxscore)*Math.pow($maxsize,2));
					if($size<3)
						$size=3;
					if($left<$leg-$minsize && $top<$leg-$minsize && $left>=0 && $top>=0){
						var $div=document.createElement("div");
						$div.className="town";
						$div.setAttribute("id","twn_"+$ids[$j]+"-"+$i);
						$div.style.left=$left+"px";
						$div.style.top=$top+"px";
						$div.style.width=$size+"px";
						$div.style.height=$size+"px";
						$div.style.backgroundColor=$color;
						Event.observe($div,"mouseover", hoverAction);
						Event.observe($div,"dblclick", dblAction);
						$parent.appendChild($div);
					}
				}
			}
		}
		if(arguments.length==0){
			setAlert("Building Background...");
			// Build the background images
			// our images are 250 pixels width & 250 pixel heigh
			var imagesize = 250;
			
			// The center is ($startUnixX, $startUnitY);
			
			// We must addapt the image size to the width
			var imagesize_zoom = imagesize/$unit;
			
			// Calculate how much images we'll need for one line
			// +1 to make sure it doesn't show a half image.
			var imagesToLoad = Math.ceil ($leg / imagesize_zoom)+1;
			
			// Now let's calculate what the upper left corner is:
			var start_coor = 
			{ 
				'x' : Math.floor ((($startUnitX/$unit) - ($leg / 2)) / imagesize_zoom),
				'y' : Math.ceil ((-($startUnitY/$unit) - ($leg / 2)) / imagesize_zoom)
			};
			
			// Now start moving from upper left to bottom right and
			// draw one image every imagesize_zoom pixels
			for (var x = 0; x < imagesToLoad; x ++)
			{
				for (var y = 0; y < imagesToLoad; y ++)
				{
					var img = $(document.createElement ('img'));
					
					var cx = (start_coor.x + x);
					var cy = (start_coor.y + y);
					
					// load this image
					img.src = $current["serverUrl"]+'image/world/?x='+cx+'&y='+cy+'&width='+imagesize+'&height='+imagesize;
					
					cx *= imagesize;
					cy *= imagesize;
					
					var $left = Math.ceil((cx/$unit)-$startUnitX/$unit+$leg/2);
					var $top = Math.ceil($leg/2-(cy/$unit)+$startUnitY/$unit);
					
					img.style.position = 'absolute';
					img.style.left = $left + 'px';
					img.style.top = $top + 'px';
					
					img.style.width = Math.ceil(imagesize_zoom) + 'px';
					img.style.height = Math.ceil(imagesize_zoom) + 'px';
					
					img.className = 'backgroundmap';
					
					$parent.appendChild (img);
				}
			}
		}
		setAlert();
	}
	function dblAction(e){
		var $el=e.element();
		var $split=$el.getAttribute("id").split("_")[1];
		var $id=$split.split("-");
		for(var $key in $players[$id[0]]){
			if($key=="towns")
				$txt="#"+$players[$id[0]].towns[$id[1]].X+","+$players[$id[0]].towns[$id[1]].Y;
		}
		newwindow=window.open($current["serverUrl"]+$txt);
		if (window.focus) {newwindow.focus()}
		return false;
	}
	function hoverAction(e){
		var $el=e.element();
		var $split=$el.getAttribute("id").split("_")[1];
		var $id=$split.split("-");
		if(!document.getElementById("display")){
			var $oDiv=document.createElement("div");
			$oDiv.setAttribute("id","display");
		}else
			var $oDiv=document.getElementById("display");
		$oDiv.innerHTML="";
		for(var $key in $players[$id[0]]){
			if($key=="towns"){
				$txt="town: "+$players[$id[0]].towns[$id[1]].name;
			}else if($key=="clan" && $players[$id[0]][$key]>-1){
				$txt=$key+": "+$clans[$players[$id[0]][$key]].name;
			}else if($key!="clan"){
				$txt=$key+": "+$players[$id[0]][$key];
			}else
				$txt="";
			var $br=document.createElement("br");
			var $oTxt=document.createTextNode($txt);
			$oDiv.appendChild($oTxt);
			$oDiv.appendChild($br);
			$oDiv.normalize();
		}
		document.getElementById("map").appendChild($oDiv);
	}
	function getServers(transport){
		setAlert("Building Serverlist...");
		$xml=transport.responseXML;
		$server=$xml.getElementsByTagName("servers")[0].getElementsByTagName("server");
		var $optgroup=document.createElement("optgroup");
		$optgroup.setAttribute("label","Pick a server");
		for(var $i=0;$i<$server.length;$i++){
			if(!$usetest)
				$url=$server[$i].getElementsByTagName("game_url")[0].firstChild.nodeValue;
			else
				$url=$testfile;
			var $id=$server[$i].getElementsByTagName("id")[0].firstChild.nodeValue;
			var $name=$server[$i].getElementsByTagName("name")[0].firstChild.nodeValue;
			var $txt=document.createTextNode($name);
			var $opt=document.createElement("option");
			$opt.appendChild($txt);
			$opt.setAttribute("value",$id);
			if($id==$current["server"]){
				$opt.setAttribute("selected",true);
			}
			$optgroup.appendChild($opt);
			$servers[$id]=$url;
		}
		setAlert();
		if($server.length==0)
			setAlert("Could not find server in list. [F5]");
		else{
			document.getElementById("server").appendChild($optgroup);
			Event.observe(document.getElementById("server"),"change",changeServer);
			setServer($current["server"]);
		}
	}
	function setAlert($message){
		$divAlert.innerHTML="";
		if($message){
			var $txt=document.createTextNode($message);
			$divAlert.appendChild($txt);
			$divAlert.className="vis";
		}else
			$divAlert.className="invis";
	}
	return{
		//public vars
		
		//public methods
		init_map: function(e){
			$divAlert=document.getElementById("alert");
			$leg=document.getElementById("map").getDimensions().width;
			Ajax.Responders.register({
			  onCreate: function() {
				setAlert("Loading External Data...");
			  },
			  onComplete: function() {
				setAlert();
			  }
			});
			new Ajax.Request("proxy.php",{
				onSuccess: getServers,
				parameters: {url: $serverListUrl,file: "serverList"}
			});
		}
	}
}();
Event.observe(window,"load", $mapApplic.init_map);
