// TubeJP (c) 2007

var lat = new Array();
var lng = new Array();
var icon;
var locate_marker = new Array();

var stations;          
var markers = new Array();
var markers_added = new Array();
var st = new Array();

var map = new GMap(document.getElementById('map'));

var lc = new Array();
lc['N'] = "#000000";
lc['C'] = "#ff0000";
lc['V'] = "#50b8ff";
lc['B'] = "#987020";
lc['J'] = "#cccccc";
lc['P'] = "#0000f0";
lc['D'] = "#00aa00";
lc['M'] = "#aa00aa";
lc['O'] = "#f5f500";
lc['H'] = "#ffbbbb";
lc['E'] = "#ffcc00";
lc['W'] = "#88ff88";

var ln = new Array();
ln['N'] = "Northern Line";
ln['C'] = "Central Line";
ln['V'] = "Victoria Line";
ln['B'] = "Bakerloo Line";
ln['J'] = "Jubilee Line";
ln['P'] = "Piccadilly Line";
ln['D'] = "District Line";
ln['M'] = "Metropolitan Line";
ln['O'] = "Circle Line";
ln['H'] = "Hammersmith & City Line";
ln['E'] = "East London Line";
ln['W'] = "Waterloo & City Line";

var tooltip = document.createElement("div");
tooltip.setAttribute("id","div_marker_tooltip");
tooltip.style.border="1px #555555 solid";
tooltip.style.backgroundColor="#ffffff";
tooltip.style.fontWeight="bold";
tooltip.style.fontFamily="Verdana, Arial, Helvetica, sans-serif";
tooltip.style.fontSize="9px";
tooltip.style.opacity="0.7";
tooltip.style.filter="alpha(opacity=70)";
tooltip.style.padding="2px 1ex";
tooltip.style.whiteSpace="nowrap";
tooltip.style.margin="0";
tooltip.style.zIndex=5;
document.getElementById("map").appendChild(tooltip);
tooltip.style.visibility="hidden";

function onLoad(mlat, mlng, mzoom) 
{
	var tilelayers = [new GTileLayer(new GCopyrightCollection("TubeJP: London Tube Network"),12,16)];

	var agent = navigator.userAgent.toLowerCase();
    if ((agent.indexOf("msie") > -1) && (agent.indexOf("opera") < 1)) {
		tilelayers[0].getTileUrl = function(a,b) { return "http://tubejp.com/metazone/map_ie.php?x="+a.x+"&y="+a.y+"&z="+b }
	} else {
		tilelayers[0].getTileUrl = function(a,b) { return "http://tubejp.com/metazone/map.php?x="+a.x+"&y="+a.y+"&z="+b }
	}

	tilelayers[0].getCopyright = function(a,b) { return "London Tube Map: © 2007 <a href='http://tubejp.co.uk'>TubeJP</a>"; }
	
	var tube_map = new GMapType([G_NORMAL_MAP.getTileLayers()[0],tilelayers[0]], G_SATELLITE_MAP.getProjection(), "Tube", G_NORMAL_MAP);
	var tube_hybrid_map = new GMapType([G_SATELLITE_MAP.getTileLayers()[0],G_HYBRID_MAP.getTileLayers()[1],tilelayers[0]], G_SATELLITE_MAP.getProjection(), "Tube Hyrid", G_SATELLITE_MAP);
	var tube_sat_map = new GMapType([G_SATELLITE_MAP.getTileLayers()[0],tilelayers[0]], G_SATELLITE_MAP.getProjection(), "Tube Satellite", G_SATELLITE_MAP);
	map.addMapType(tube_map);
	map.addMapType(tube_sat_map);
	map.addMapType(tube_hybrid_map);
	map.addControl(new GMapTypeControl());
	map.addControl(new GSmallMapControl());
	map.addControl(new GScaleControl());
	map.setCenter(new GLatLng(mlat,mlng),mzoom,tube_map);

	icon = new GIcon();
	icon.image = "./images/trans.png";
	icon.shadow = null;
	icon.iconSize = new GSize(14, 14);
	icon.iconAnchor = new GPoint(10, 10);
	icon.infoWindowAnchor = new GPoint(10, 10);

	var request = GXmlHttp.create();
	request.open('GET', 'stations2.xml', true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var xmlDoc = request.responseXML;
			stations = xmlDoc.documentElement.getElementsByTagName("station");
			for (var i = 0; i < stations.length; i++) {
			  	var point = new GLatLng(parseFloat(stations[i].getAttribute("lat")),
										parseFloat(stations[i].getAttribute("lng")));
				createMarker(i, point, stations[i].getAttribute("name"), stations[i].getAttribute("zone"), stations[i].getAttribute("line"), stations[i].getAttribute("bus"));

				name = stations[i].getAttribute("name");
				name.replace("&amp;","&");
				lat[name] = parseFloat(stations[i].getAttribute("lat"));
				lng[name] = parseFloat(stations[i].getAttribute("lng"));
				st[i] = name;
			}
  		}
	}
	request.send(null);

	GEvent.addListener(map, "moveend", function() { updateMarkers(); });
}


if (window.attachEvent) { 
	window.attachEvent("onresize", function() { map.checkResize()} );
} else {
	window.addEventListener("resize", function() { map.checkResize()} , false);
}    

function updateMarkers()
{
	var bounds = map.getBounds();

	xmax = bounds.getNorthEast().lat();
	xmin = bounds.getSouthWest().lat();
	ymax = bounds.getNorthEast().lng();
	ymin = bounds.getSouthWest().lng();

	var mcount = markers.length;
	for (i=0; i < mcount; i++) {
		var pnt = markers[i].getPoint();
		if (pnt.lat() < xmin || pnt.lat() > xmax ||
		    pnt.lng() < ymin || pnt.lng() > ymax) {
			if (markers_added[i]) {
    			map.removeOverlay(markers[i]);
				markers_added[i] = 0;
			}
		} else {
			if (!markers_added[i]) {
    			map.addOverlay(markers[i]);
				markers_added[i] = 1;
			}
		}
	}
}

function createMarker(n, point, name, zone, line, bus) 
{
	var style = "<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 9px;color: black'>";
	var html = style+"<img src='http://tubejp.co.uk/images/tube_logo3.gif' border='0'> <b>" + name+"</b><br>";
	var html2 = "<img src='http://tubejp.co.uk/images/tube_logo3.gif' border='0'> <b>" + name+"</b><br>";
	z = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zone: "+zone+"<br>";
	html = html + "&nbsp;" +z + "</span>";
	html2 = html2 + z + "<br>";
	t = "<table cellpadding='0' cellspacing='1'>";
	html = html + t;
	html2 = html2 + t;

	for (i=0, len = line.length; i < len; i++) {
		lt = "<tr><td bgcolor='"+lc[line.charAt(i)]+"'>&nbsp;&nbsp;</td><td>&nbsp;"+style+"<b>" + ln[line.charAt(i)]+"</b></span></td></tr>";
		lt2 = "<tr><td bgcolor='"+lc[line.charAt(i)]+"'>&nbsp;&nbsp;</td><td>&nbsp;" + ln[line.charAt(i)]+"</td></tr>";
		html = html + lt; 
		html2 = html2 + lt2; 
	}
	html = html + "</table>";

	html2 = html2 + "</table></span>";

	html2  = html2+"<br><a href='#' style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 13px;' onclick=\"set_station('st1',"+n+"); return false\">Set as departure station</a>";
	html2  = html2+"<br><a href='#' style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 13px;' onclick=\"set_station('st2',"+n+"); return false\">Set as destination station</a><br>";

	if (bus != '') {
		html = html + "<br><table cellpadding='0' cellspacing='1'><tr><td valign='top'>"+style;
		html2 = html2 + "<br><table cellpadding='0' cellspacing='1'><tr><td valign='top'>";
		html = html + "<img src='http://tubejp.co.uk/images/bus_logo.gif' border='0'> "+style+"<b>Bus:&nbsp;</b></span></td><td><b>"+style+bus;
		html2 = html2 + "<img src='http://tubejp.co.uk/images/bus_logo.gif' border='0'> <b>Bus:&nbsp;</b></td><td>"+bus;
		html = html + "</b></span></td></tr></table>";
		html2 = html2 + "</td></tr></table>";
	}

	var marker = new GMarker(point, icon);

	marker.tooltip = "<div class='tooltip'>"+html+"</div>";

	bounds = map.getBounds();
	xmax = bounds.getNorthEast().lat();
	xmin = bounds.getSouthWest().lat();
	ymax = bounds.getNorthEast().lng();
	ymin = bounds.getSouthWest().lng();

	if (point.lat() < xmin || point.lat() > xmax ||
	    point.lng() < ymin || point.lng() > ymax) {
		markers_added[n] = 0;
	} else {
    	map.addOverlay(marker);
		markers_added[n] = 1;
	}

	GEvent.addListener(marker, 'click', function() {
		tooltip.style.visibility="hidden";
		marker.openInfoWindowHtml(html2);
	});
	GEvent.addListener(marker,"mouseover", function() {
		showTooltip(marker);
	});       
	GEvent.addListener(marker,"mouseout", function() {
		tooltip.style.visibility="hidden"
	});        

	markers[n] = marker;
}

function xmlhttp_req(url, div)
{
	var request = GXmlHttp.create();
	request.open('GET', url, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			document.getElementById("searching").style.visibility = "hidden";
			var response = request.responseText.split("|");
	    		document.getElementById(div).innerHTML = response[0];
		}
	}
	request.send(null);
}

function centreStation(i)
{
	s  = st[i];
	if (s != "") {
		point = new GLatLng(lat[s], lng[s]);
		map.setCenter(point, null, null);
	}
	return false;
}

function mapCentre(lat, lng) {	
	map.setCenter(new GLatLng(lat, lng));
}

function set_station(s, i)
{
	document.form0[s].selectedIndex = i;
	map.getInfoWindow().hide();
}

function switch_stations()
{
	tmp = document.form0['st2'].selectedIndex;
	document.form0['st2'].selectedIndex = document.form0['st1'].selectedIndex;
	document.form0['st1'].selectedIndex = tmp;
}

function round_number(f, dp) { 
        return Math.round(f*Math.pow(10, dp))/Math.pow(10, dp);
}

function showTooltip(marker) 
{
	tooltip.innerHTML = marker.tooltip;
	var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;
	var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x + width,- offset.y + point.y +anchor.y)); 
	pos.apply(tooltip);
	tooltip.style.visibility="visible";
}

