/*@cc_on @*/
AirportURL="airport.1?";
AirportSearchURL="airport-search.1?";
RouteURL="route.1?";

var searchTableHeadings=[{name:"id",heading:"Code"},
												{name:"shortname",heading:"Name"},
												{name:"name",heading:"Place"},
												{name:"country",heading:"Country"}];


function airportDetails(inp) {
	if (visibleAirport && visibleAirport.domNode) {
		visibleAirport.domNode.style.display="none";
	}
	for (i in Airports) {
		var airp=Airports[i];
		if (airp && airp.domNode) {
			if (airp.domNode.className=='airportSmall') {
				airp.domNode.style.display='none';
			}
		}
	}
	var val=inp.value;
	if (val.length>2) {
		getAirport(inp.value,airportDetailsCallback);
	} else {
		var airp=document.getElementById('currentAirport');
		airp.innerHTML="<span class=warning>At least 3 letters required for search</span>";
	}
}

function updateCarriers() {
	var inp=document.forms[0].elements['airport'];
	inp.onchange();
}

function airportDetailsCallback(airports) {
	var airp=document.getElementById('currentAirport');
	if (airports.length==0) {
		airp.innerHTML='<span class=warning>No airport found, perhaps try searching for <strong>londo</strong> rather than <em>london heathrow airport</em></span>';
		var tbl=document.getElementById('airportTable');
		tbl.innerHTML='';
	}
	if (airports.length==1) {
		var	airport=airports[0];
		airp.innerHTML=airport.shortname+(airport.shortname.length>0 ? ', ' : '')+airport.name+', '+airport.country;
		var tbl=document.getElementById('airportTable');
		drawAirport(airport,"airport");
		airport.domNode.onclick=getRoutesFunc(airport.id);
		tbl.innerHTML='';
		getRoutes(airport.id);
	}
	if (airports.length>1) {
		airp.innerHTML="Select Airport";
		var dataTable=outputTable(airports,searchTableHeadings,'airportTableList','selectStartAirport');
		/*@if (@_jscript_version >= 5)
			dataTable='<div id=_popup style="position:absolute;top:0;left:0"><div style="filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=2, MakeShadow=true, ShadowOpacity=0.50);position:absolute;top:0;left:0;border:1px solid black;color:red;cursor:default;padding:4px;width:expression((this.nextSibling.offsetWidth-8)+\'px\');background-color:white;height:expression((this.nextSibling.offsetHeight-8)+\'px\')">&nbsp;</div><div id=airportTableListIE style="position:absolute;top:0;left:0;border:1px solid black;padding:0px;background-color:white;">'+dataTable+'</div></div>';
		@end @*/
		for (var i=0;i<airports.length;i++) {
			var airp=airports[i];
			drawAirport(airports[i],"airportSmall");
			airp.domNode.onclick=airportSelection(airp.id);
		}
		var tbl=document.getElementById('airportTable');
		tbl.innerHTML=dataTable;
	}
}
function airportSelection(id) {
	return function() {
		selectStartAirport(id);
	}
}
function airportRouteSelection(ida,idb) {
	return function() {
		selectRouteAirport(ida,idb);
	}
}
function getRoutesFunc(id) {
	return function() {
		getRoutes(id);
	}
}

function getRoutes(id) {
	var airp=Airports[id];
	if (!airp.routes) {
		getRoutesSrvr(id,getRoutesCallBack);
	} else {
		getRoutesCallBack(Airports[id]);
	}
}

function getCarrierRE() {
	var str=[];
	if (document.forms[0].oneworld.checked) {
		str.push('oneworld');
	}
	if (document.forms[0].star.checked) {
		str.push('star');
	}
	if (str.length>0) {
		return new RegExp(''+str.join('|')+'',"gim");
	} else {
		return /chicken/gim;
	}
}

function getRoutesCallBack(airp) {
	var r=airp.routes;
	var re=getCarrierRE();
	for (var i=0;i<r.length;i++) {
		var ri=r[i];
		var rid=ri.toAirport;
		var ric=ri.carrier;
		var airport=Airports[rid];
		if (ric.match(re)) {
			drawAirport(airport,"airportSmall");
			airport.domNode.onclick=airportRouteSelection(airp.id,rid);
		}
	}
}
function getRoutesSrvr(id,callback) {
	var xmlhttp=new HTTP();
	xmlhttp.open("GET",RouteURL+id,true);
	//	xmlhttp.setRequestHeader("Content-Type","text/x-json");
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==4) {
			if (xmlhttp.status==200) {
				var local=new Function("return "+xmlhttp.responseText)();

				var cpLocal=loadArray(Airports,local.airports);
				Airports[local.from].routes=makeHash(local.routes);
				if (callback) {
					callback(Airports[local.from]);
				}
			} else {
				callback([]);
			}
		}
	}
	xmlhttp.send(null);
}
function makeHash(arr) {
	for (var i=0;i<arr.length;i++) {
		arr[arr[i].toAirport]=arr[i];
	}
	return arr;
}
Airports={};
Route=[];
function loadArray(hash,newArr) {
	var cpArr=[];
	var newl=newArr.length;
	for (var i=0;i<newl;i++) {
		var item=newArr[i];
		var id=item.id.toUpperCase();
		if (!hash[id]) {
			hash[id]=item;
			cpArr.push(item);
		} else {
			cpArr.push(hash[id]);
		}
	}
	return cpArr;
}

offsetSizes={'airport':10,'airportSmall':5,'airportSelected':10};
function drawAirport(item,className) {
	if (!item.domNode) {
		var ap=document.getElementById('airportSymbol');
		var newAp=ap.cloneNode(true);
		newAp.id='airport-'+item.id;
		newAp.title=item.shortname+(item.shortname.length>0 ? ', ' : '')+item.name+', '+item.country
		newAp.style.left=lonToScale(item.lon,offsetSizes[className])+'px';
		newAp.style.top=latToScale(item.lat,offsetSizes[className])+'px';
		newAp.style.display="block";
		ap.parentNode.appendChild(newAp);
		item.domNode=newAp;
	} else {
		if (item.domNode.className=='airportSelected') {
			if (className!='airport') {
				className='airportSelected';
			}
		}
		var nde=item.domNode.style;
		nde.left=lonToScale(item.lon,offsetSizes[className])+'px';
		nde.top=latToScale(item.lat,offsetSizes[className])+'px';
		nde.display='block';
	}
	if (className) {
		item.domNode.className=className;
	}
	visibleAirport=item;
}
visibleAirport=null;

//function getWidth() {
//	winWidth=600;
//	var	d=document;
//	if (typeof window.innerWidth!='undefined') {
//		var winWidth = window.innerWidth;
//	} else {
//		if (d.documentElement && 
//				typeof d.documentElement.clientWidth!='undefined' && 
//				d.documentElement.clientWidth!=0) {
//			var winWidth = d.documentElement.clientWidth;
//		} else {
//			if (d.body && 
//					typeof d.body.clientWidth!='undefined') {
//				var winWidth = d.body.clientWidth;
//			}
//		}
//	}
//	return winWidth;
//}

//mapWidth=getWidth()-25;
//mapHeight=Math.floor(mapWidth/2);

mapWidth=750;
mapHeight=550;

	function latToScale(lat,offset) {
	return (-1*((lat-90)/180))*mapHeight-offset;
}
	function lonToScale(lon,offset) {

	return (((lon+180)/360))*mapWidth-offset+mapWidth/2;

}
airportCodeRE=/^[a-z]{3}$/gim;

function getAirportIATACode(airport,callback) {
	if (Airports[airport]) {
		if (callback) {
			callback([Airports[airport]]);
		}
		return Airports[airport];
	}
	var xmlhttp=new HTTP();
	xmlhttp.open("GET",AirportURL+airport,true);
	//	xmlhttp.setRequestHeader("Content-Type","text/x-json");
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==4) {
			if (xmlhttp.status==200) {
				var local=new Function("return "+xmlhttp.responseText)();
				var cpLocal=loadArray(Airports,local);
				if (callback) {
					callback(cpLocal);
				}
			} else {
				//Not Found perform an airport search instead.
				getAirportSearch(airport,callback);
			}
		}
	}
	xmlhttp.send(null);
}

function getAirportSearch(airport,callback) {
	var xmlhttp=new HTTP();
	xmlhttp.open("GET",AirportSearchURL+airport,true);
	//	xmlhttp.setRequestHeader("Content-Type","text/x-json");
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==4) {
			if (xmlhttp.status==200) {
				var local=new Function("return "+xmlhttp.responseText)();
				var cpLocal=loadArray(Airports,local);
				if (callback) {
					callback(cpLocal)
				}
			} else {
				callback([]);
			}
		}
	}
	xmlhttp.send(null);
}

function getAirport(airport,callback) {
	if (airport.match(airportCodeRE)) {
		getAirportIATACode(airport,callback);
	} else {
		getAirportSearch(airport,callback);
	}
}

function selectStartAirport(iataCode) {
	var inp=document.forms[0].elements['airport'];
	inp.value=iataCode;
	inp.onchange();
	Route=[];
	drawRouteTable(Airports[iataCode]);
}

function selectRouteAirport(iataCodeRoute,iataCodeNew) {
	var route=Airports[iataCodeRoute];
	if (Route.length==0 || route.domNode.className=="airport") {
		route.domNode.className="airportSelected";
		Route.push(route);
		drawRouteTable(Airports[iataCodeNew]);
		var inp=document.forms[0].elements['airport'];
		inp.value=iataCodeNew;
		inp.onchange();
	} else {
		showPopup("Not a valid route",Airports[iataCodeNew])
	}
}

routeTableHeadings=[{name:"id",heading:"Code"},
	{name:"shortname",heading:"Name"},
	{name:"name",heading:"Place"},
	{name:"country",heading:"Country"},
	{name:"miles",heading:"Miles"},
	{name:"totalmiles",heading:"Total"},
	{name:"carrier",heading:"Carrier"}
];

function drawRouteTable(last) {
	var newR=Route.concat(last);
	var a=newR[0];
	var routeTable=[{name:a.name,shortname:a.shortname,country:a.country,id:a.id,miles:0,totalmiles:0,carrier:""}];
	var prev=a;
	var totalMiles=0;
	for (var i=1;i<newR.length;i++) {
		var a=newR[i];
		var entry={name:a.name,shortname:a.shortname,country:a.country,id:a.id};
		var routePrevious=prev.routes[a.id];
		if (routePrevious) {
			entry.miles=routePrevious.miles;
			entry.carrier=routePrevious.carrier;
			totalMiles+=entry.miles;
			entry.totalmiles=totalMiles;
			routeTable.push(entry);
			prev=a;
		}
	}
	var dataTable=outputTable(routeTable,routeTableHeadings,'routeTableList','deleteRouteTable');
	var tbl=document.getElementById('routeTable');

		/*@if (@_jscript_version >= 5)
			dataTable='<div id=_popup style="position:absolute;top:0;left:0"><div style="filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=2, MakeShadow=true, ShadowOpacity=0.50);position:absolute;top:0;left:0;border:1px solid black;color:red;cursor:default;padding:4px;width:expression((this.nextSibling.offsetWidth-8)+\'px\');background-color:white;height:expression((this.nextSibling.offsetHeight-8)+\'px\')">&nbsp;</div><div id=airportTableListIE style="position:absolute;top:0;left:0;border:1px solid black;padding:0px;background-color:white;">'+dataTable+'</div></div>';
		@end @*/
	tbl.innerHTML=dataTable;
}

function deleteRouteTable(id) {
	var newRoute=[];
	var old=false;
	for (var i=0;i<Route.length;i++) {
		if (Route[i].id==id) {
			old=Route[i];
			i=Route.length;
		} else {
			newRoute.push(Route[i]);
		}
	}
	for (i=0;i<Route.length;i++) {
		Route[i].domNode.className='airport';
		Route[i].domNode.style.display="none";
	}
	for (i=0;i<newRoute.length;i++) {
		Route[i].domNode.className='airportSelected';
		Route[i].domNode.style.display="block";
	}
	Route=newRoute;
	if (!old) {
		old=Airports[id];
		for (i=0;i<Route.length;i++) {
			Route[i].domNode.className='airport';
			Route[i].domNode.style.display="none";
		}
		Route=[];
	}
	old.domNode.style.display="block";
	drawRouteTable(old);
	var inp=document.forms[0].elements['airport'];
	inp.value=id;
	inp.onchange();
	getRoutes(id);
}
function zoom(factor) {
	var diffWidth=mapWidth;
	mapWidth=Math.floor(mapWidth*factor);
	diffWidth-=mapWidth;
	var diffHeight=mapHeight;
	mapHeight=Math.floor(mapHeight*factor);
	diffHeight-=mapHeight;
	var emap=document.getElementById('earthMap');
	emap.style.width=mapWidth+'px';
	emap.style.height=mapHeight+'px';
	var img=document.getElementById('mover');
	img.style.top=(img.offsetTop+Math.floor(diffHeight/2))+'px'
	img.style.left=(img.offsetLeft+Math.floor(diffWidth/2))+'px'

	for (i in Airports) {
		var airp=Airports[i];
		if (airp && airp.domNode) {
			airp.domNode.style.left=lonToScale(airp.lon,offsetSizes[airp.domNode.className])+'px';
			airp.domNode.style.top=latToScale(airp.lat,offsetSizes[airp.domNode.className])+'px';
		}
	}

}

function zoomOut() {
	zoom(1/1.2);
}

function zoomIn() {
	zoom(1.2);
}







function HTTP() {
 var xmlhttp
 /*@if (@_jscript_version >= 5)
   try {
   xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
  } catch (e) {
   try {
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
   } catch (E) {
    xmlhttp=false
   }
  }
 @else
  xmlhttp=false
 @end @*/
 if (!xmlhttp) {
  try {
   xmlhttp = new XMLHttpRequest();
  } catch (e) {
		xmlhttp=false;
  }
 }
 return xmlhttp;
}
try {
	if (new HTTP()) {
		document.getElementById('scriptWarning').style.display="none";
	}
} catch (E) {}

function getDragParent(el) {
	var oldEl=el;
	while (el) {
		el=el.parentNode;
		if (el.id=="maptable" || el.nodeName.toUpperCase()=='BODY') {
			return oldEl;
		}
		oldEl=el;
	}
}

var offsetX,offsetY,draggingThing;
function startDrag(e) {
	draggingThing=getDragParent(e.srcElement || e.target); 
	offsetX=e.clientX-draggingThing.offsetLeft;
	offsetY=e.clientY-draggingThing.offsetTop;
	document.body.onmousemove=moveDrag;
	document.body.onmouseup=endDrag;
	document.onselectstart=nullFunc;
}

function nullFunc(e) {
	return false;
}
function moveDrag(e) {
	e=e || event;
	if (draggingThing) {
		draggingThing.style.top=(e.clientY-offsetY)+'px';
		draggingThing.style.left=(e.clientX-offsetX)+'px';
		return true;
	}
}
function endDrag(e) {
	draggingThing=null;
	document.body.onmousemove=null;
	document.body.onmouseend=null;
	document.onselectstart=null;
}

function outputTable(arr,headings,tableID,selectFunc) {
	var arrl=arr.length;
	var table=[];
	var item=arr[0];
	table.push('<table id="'+tableID+'"><tr onmousedown="startDrag(event)">');
	var headingsl=headings.length;
	for (var j=0;j<headingsl;j++) {
		var head=headings[j];
		sortType=(parseFloat(item[head.name])==item[head.name]);
		table.push('<th sortType='+sortType+'><a href="#" onclick="sortTable(this);return false;">'+head.heading+'</a></th>');
	}
	table.push('</tr>');
	for (var i=0;i<arrl;i++) {
		var item=arr[i];
		table.push('<tr onmouseenter="highlight(this)" onmouseleave="highlightOff(this)" onclick="'+selectFunc+'(this.firstChild.firstChild.nodeValue)">');
		for (var j=0;j<headingsl;j++) {
			var head=headings[j];
			sortVal=item[head.name];
			sortType=(parseFloat(sortVal)==sortVal);
			if (sortType) {
				outVal=(sortVal*1).toFixed(1);
			} else {
				outVal=sortVal;
			}
			table.push('<td sortvalue="'+sortVal+'">'+outVal+'</td>');
		}
		table.push('</tr>');
	}
	table.push('</table>');
	return table.join('');
}

function getTH(el) {
	while (el) {
		if (el.nodeName.toUpperCase()=='TH') {
			return el;
		}
		el=el.parentNode;
	}
}
function sortFuncAsc(a,b) {
	if (a.val>b.val) {
		return 1;
	}
	if (a.val<b.val) {
		return -1;
	}
	return 0;
}
function sortFuncDesc(a,b) {
	if (a.val<b.val) {
		return 1;
	}
	if (a.val>b.val) {
		return -1;
	}
	return 0;
}
function sortTable(el) {
	var th=getTH(el);
	var direction=th.direction;
	var row=th.parentNode;
	var rows=row.parentNode;
	var rowsParent=rows.parentNode;
	var cellIndex=th.cellIndex;
	var sortIndexes=[];
	var rcNl=rows.childNodes.length;
	for (var j=1;j<rcNl;j++) {
		var myrow=rows.childNodes[j];
		var sortVal=myrow.childNodes[cellIndex].getAttribute("sortvalue");
		sortIndexes.push({val:sortVal,row:myrow});
	}
	if (direction=='desc') {
		sortIndexes.sort(sortFuncDesc);
		th.direction='asc';
	} else {
		sortIndexes.sort(sortFuncAsc);
		th.direction='desc';
	}
	var newRows=rows.cloneNode(false);
	newRows.appendChild(row);
	var sIl=sortIndexes.length;
	for (var j=0;j<sIl;j++) {
		newRows.appendChild(sortIndexes[j].row);
	}
	rowsParent.removeChild(rows);
	rowsParent.appendChild(newRows);
}

function highlight(el) {
	el.className="highlight";
}

function highlightOff(el) {
	el.className="";
}


function showPopup(str,el) {
		/*@if (@_jscript_version >= 5)
			str='<div id=_popup style="position:absolute;top:0;left:0"><div style="filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=2, MakeShadow=true, ShadowOpacity=0.50);position:absolute;top:0;left:0;border:1px solid black;color:red;cursor:default;padding:0px;width:expression((this.nextSibling.offsetWidth)+\'px\');background-color:white;height:expression((this.nextSibling.offsetHeight-8)+\'px\')">&nbsp;</div><div style="position:absolute;top:0;left:0;border:1px solid black;padding:0px;background-color:white;">'+str+'</div></div>';
		@end @*/
	var tbl=document.createElement('div');
	tbl.innerHTML=str;
	tbl.style.position="absolute";
	tbl.style.top=el.domNode.style.top;
	tbl.style.left=el.domNode.style.left;
	document.getElementById('mover').appendChild(tbl);
	setTimeout(function() { document.getElementById('mover').removeChild(tbl) },2000);
}

function closeHelp() {
	document.getElementById('help').style.display="none";
}
function sizer() {
	var mt=document.getElementById('maptable').style;
	mt.height=mapHeight+"px";
	mt.width=mapWidth+"px";
	mt.clip="rect(0px "+mapHeight+"px "+mapWidth+"px 0px)";
}
function showHelp() {
	document.getElementById('help').style.display="block";
}
function initial() {
	if (!symbolSupported(9992)) {
		document.getElementById('airportSymbol').innerHTML="&#x2B;";
	}
	closeHelp();
	sizer();
	document.getElementById('maptable').style.display="block";
	document.getElementById('routeTable').style.top=mapHeight;
}
function symbolSupported(testChr) {
	var testDiv=document.createElement('div');
	testDiv.style.display="block";
	testDiv.innerHTML="<span class=airport style='font-size:10em;'>&#983040;&#983040;&#983040;&#983040;&#983040;&#983040;&#983040;&#983040;&#983040;&#983040;</span><span class=airport style='font-size:10em;'>"+repeatStr("&#x"+testChr.toString(16)+";",10)+"</span>";
	document.body.appendChild(testDiv);
	var supported=!(testDiv.firstChild.offsetWidth*testDiv.firstChild.offsetHeight==testDiv.lastChild.offsetWidth*testDiv.lastChild.offsetHeight);
	document.body.removeChild(testDiv);
	return supported;

}

function repeatStr(str,n) {
	var out=[];
	for (i=0;i<n;i++) {
		out.push(str);
	}
	return out.join("");
}
window.onload=initial;

		/*@if (@_jscript_version >= 5)
obj=window.attachEvent("onload",ieonloadFunc);
function ieonloadFunc() {
var helpObj=document.getElementById('help');
helpObj.innerHTML='<div style="filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=2, MakeShadow=true, ShadowOpacity=0.50);position:absolute;top:0;left:0;border:1px solid black;color:red;cursor:default;padding:0px;width:expression((this.nextSibling.offsetWidth)+\'px\');background-color:white;height:expression((this.nextSibling.offsetHeight)+\'px\')">&nbsp;</div><div style="position:absolute;top:0;left:0;border:0px solid black;padding:0px;background-color:white;">'+helpObj.innerHTML+'</div>';
}
		@end @*/
