var map = null;
var routes = [];
var oldhighlight = -1;
var hlref = "";
var as_str = "10 Downing Street, London, UK";
	
var colors = ["#0000cc", "#00cc00", "#000000", "#cccc00", "#cc00cc", "#00cccc", "#ff6600"];

function load() {
	if (GBrowserIsCompatible()) {	
	  	var publisher_id = "partner-pub-1379345221605809";
		
		//fix
		var mapOptions = {
		googleBarOptions : {
		  style : "new",
		  adsOptions: {
			client: publisher_id,
			channel: "WhatBus",
			adsafe: "high",
			language: "en"
		  }
		}
		}
		map = new GMap2(document.getElementById("map_canvas"), mapOptions);
		map.setCenter(new GLatLng(51.500, -0.126), 14);
		map.setUIToDefault();
		
		var adsManagerOptions = {
		  maxAdsOnMap : 1,
		  style: 'adunit',
		  channel: '3469010044'
		};

		adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
		adsManager.enable();
		
		map.enableGoogleBar();
		GEvent.addListener(map,"zoomend", function(){showUser();});
	}
}

function initialize() {
	if (map == null) {
		load();
	}
	GEvent.addListener(map,"dragend", function(){showUser();});
	showUser();
}
var xmlHttp

function showUser()
{
	var zl = map.getZoom();
	if (zl > 13) {
		xmlHttp=GetXmlHttpObject();
		if (xmlHttp==null) {
			alert ("Browser does not support HTTP Request");
			return;
		}
		document.getElementById("routes").innerHTML = "<img src=\"/images/loading.gif\" width=\"16\" height=\"16\" alt=\"\"/> Loading...";
		var url="/getroutes.php";
		var bounds = map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		url=url+"?x="+Math.round(southWest.lng() * 10000) / 10000+","+Math.round(northEast.lng() * 10000) / 10000+"&y="+Math.round(southWest.lat()*10000) / 10000+","+Math.round(northEast.lat()*10000) / 10000;
		url=url+"&r="+new Date().getTime();
		xmlHttp.onreadystatechange=stateChanged;
		xmlHttp.open("GET",url,true);
		xmlHttp.send(null);
	} else {
		//alert("Please zoom in");//fix could get annoying
		document.getElementById("routes").innerHTML="Zoom in to see routes.";
	}
}

function highlight(ref)
{
	if (oldhighlight != -1) {
		routes[oldhighlight][4].setStrokeStyle({color:colors[routes[oldhighlight][5]], weight:5, opacity:0.7});
	}
	checkit(ref, true);
	routes[ref][4].setStrokeStyle({color:"#FF0000", weight:7, opacity:0.7});
	oldhighlight = ref;
	hlref = routes[ref][1];
}

function clearchecks()
{
	for (i = 0; i < routes.length; i++) {
		if (document.checks.checkbox[i].checked) {
			routes[i][3] = 2;
			(routes[i][4]).hide();			
			document.checks.checkbox[i].checked = false;
		}
	}
}

function checkit(ref, override)
{
	if (override || document.checks.checkbox[ref].checked)
	{
		switch (routes[ref][3]) {
			case 0:
			{
			//0000FF
				var polyline = new GPolyline.fromEncoded({color:colors[routes[ref][5]], weight: 5, opacity:0.7, points: routes[ref][0], levels: "BBB", zoomFactor: 16, numLevels: 3});
				polyline.route_ref = routes[ref][1];
				polyline.id = ref;
				map.addOverlay(polyline);
				routes[ref][4] = polyline;
			}
			break;
			case 1:
			if (!override) {
				alert("error");
			}
			break;
			case 2:
			(routes[ref][4]).show();
			break;
		};
		routes[ref][3] = 1;
	} else {
		if (routes[ref][3] != 1) {
			alert("error");
		}
		routes[ref][3] = 2;
		(routes[ref][4]).hide();
	}
}

function showList() {
	var checks = "<small>Click a line on the map or select below to highlight routes.<br \/>[ <a href=\"#\" onclick=\"clearchecks();return false;\">clear</a> ]<\/small><br /><form name=\"checks\">";
	routes.sort(sortfunction);
	for (var i = 0; i < routes.length; i++) {
		var checked = "";
		var rchecked = "";
		if (routes[i][2]) {
			var colorval = colors[routes[i][5]];
			var weightval = 5;
			if (hlref == routes[i][1]) {
				colorval = "#FF0000";
				weightval = 7;
				rchecked = " checked=\"checked\"";
				oldhighlight = i;
			}
			var polyline = new GPolyline.fromEncoded({color: colorval, weight: weightval, opacity:0.7, points: routes[i][0], levels: "BBB", zoomFactor: 16, numLevels: 3});
			polyline.route_ref = routes[i][1];
			polyline.id = i;
			map.addOverlay(polyline);
			routes[i][3] = 1;
			routes[i][4] = polyline;
			checked = " checked=\"checked\"";
		}
		checks += "<input name=\"radio\" type=\"radio\""+rchecked+" onclick=\"highlight("+i+")\"/><input name=\"checkbox\" type=\"checkbox\""+checked+" onclick=\"checkit("+i+", false)\"/> <a href=\"/UK/london/london/1/map/route/"+routes[i][1]+"\">"+routes[i][1]+"</a><br />\n";
	}		
	document.getElementById("routes").innerHTML = checks + "<\/form>";
}

function sortfunction(a, b){	
	if (a[2] == b[2]) {
		if (a[1] > b[1]) {
			return 1;
		} else {
			return -1;
		}
	} else {
		if (a[2]) {
			return -1;
		} else {
			return 1;
		}
	}
}

function stateChanged()
{
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
		if(xmlHttp.responseXML == null) {
			load();//fix
			return;
		}
		map.clearOverlays();

		var li = xmlHttp.responseXML.getElementsByTagName("rt");
		var listw = "";
		var cumu = 0;
		//fix decide to show or not over here		
		routes.length = 0;
		for (var i = 0; i < li.length; i++) {
			//fix more error checking required?
			var cd = li[i].getElementsByTagName("cd")[0].firstChild.nodeValue;
			var rr = li[i].getElementsByTagName("rr")[0].firstChild.nodeValue;
			var ri = li[i].getElementsByTagName("ri")[0].firstChild.nodeValue;
			var thisroute = [cd, rr, (i < 10) || (rr == hlref), 0, 0, ri];			
			routes.push(thisroute);
		}
		showList();
		GEvent.addListener(map, "click", function(overlay, latlng, overlaylatlng) {
			if (overlay) {
				if (overlay.id) {
					//fix set radio selection?
					if (oldhighlight != -1) {
						routes[oldhighlight][4].setStrokeStyle({color:colors[routes[oldhighlight][5]], weight:5, opacity:0.7});
						//fix document.checks.radio[oldhighlight].checked = 0;
					}
					overlay.setStrokeStyle({color:"#FF0000", weight:7, opacity:0.7});
					var myHtml = "<div>Route "+overlay.route_ref+" (<a href=\"/UK/london/london/1/map/route/"+overlay.route_ref+"\">More Info</a>)<\/div>";
					map.openInfoWindow(overlaylatlng, myHtml);
					oldhighlight = overlay.id;
					hlref = routes[oldhighlight][1];
					//fix! document.checks.radio[ref].checked = 1;
				}
			}
		});
	}
}

function state2Changed()
{
	if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
		if(xmlHttp.responseXML == null) {
			return;
		}
		document.getElementById("routes").innerHTML="";
		var si = xmlHttp.responseXML.getElementsByTagName("stat");
		var ei = si[0].getElementsByTagName("err");
		if(ei.length > 0) {
			error = 123;			
			alert("Search returned error " + error + " " + (ei[0].firstChild.nodeValue).toString());//fix
			return;
		} else { 
			try {
				var pa = (si[0].getElementsByTagName("lat")[0].firstChild.nodeValue);
				var po = (si[0].getElementsByTagName("long")[0].firstChild.nodeValue);
				var dest = new GLatLng(pa,po);			
				map.setCenter(dest, 14);			
				showUser();
			} catch(e) {
			}
		}
	}
}

function getMethod() {
	var geturl="/getadd.php";
	geturl=geturl+"?a="+as_str+"&r="+new Date().getTime();
	delete xmlHttp;
	try {xmlHttp = GetXmlHttpObject();
	xmlHttp.onreadystatechange=state2Changed
	xmlHttp.open("GET",geturl,true)
	xmlHttp.send(null)}
	catch (e) {}
}

function notEmpty(){
	var myTextField = document.getElementById('myText');
	if(myTextField.value != ""){
	//as_str = myTextField.value;
	as_str = (myTextField.value.toLowerCase()).replace(/\s/g,'')+",London";	
	document.getElementById("routes").innerHTML="<img src=\"/images/loading.gif\" alt=\"\" height=\"16\"/ width=\"16\"/> Loading...";
	getMethod();
	}
}

function GetXmlHttpObject()
{
	if(xmlHttp!=null) {
	delete xmlHttp;
	xmlHttp = null;
	}
	try {
	// Firefox, Opera 8.0+, Safari
	xmlHttp=new XMLHttpRequest();
	} catch (e) {
	//Internet Explorer
	try {
	xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
	xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	}
	return xmlHttp;
	}