// TubeJP (c) 2006

var lat = new Array();
var lng = new Array();
var icon;
var stations;          
var markers = new Array();
var markers_added = new Array();
var st = new Array();

var map = new GMap2(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";
document.getElementById("map").appendChild(tooltip);
tooltip.style.visibility="hidden";


function onLoad(mlat, mlng, mzoom) 
{
	var tilelayers = [new GTileLayer(new GCopyrightCollection("naver"),12,14)];

	//tilelayers[0].getTileUrl = function(a,b) { return "http://tubejp.co.uk/image.php?x="+a.x+"&y="+a.y+"&z="+b }

	tilelayers[0].getTileUrl = function(a,b) { 

		var tile_size = 256;
		var min_x = 0;
		var max_x = 99999999;
		var min_y = -10000000;
		var max_y = 99999999;
		var level = b-4;

		var min_level = 1;
		var max_level = 11;

		var x = a.x * 852939;
                var y = a.y * 431876;

                var distance_per_pixel = Math.pow(2, level-1)*100;

                var x = Math.round((x - min_x)/distance_per_pixel);
		var y = Math.round((y - min_y)/distance_per_pixel);

		var row_image_count = Math.floor((max_x -min_x)  / (Math.pow(2, level-1)* tile_size *100));
		var col_image_count = Math.floor((max_y - min_y) / (Math.pow(2, level-1)* tile_size *100));
		x_index = (row_image_count*(level+1) + x ) % row_image_count;
		y_index = (col_image_count*(level+1) + y ) % col_image_count;

		var image_index = y_index * row_image_count + x_index;
		var dir = Math.floor(image_index / 1000)*1000;

		return "http://imap.local.naver.com/img/" + level + "/" + dir + "/" + image_index +".png?" + x + "+" + y
		//return "http://tubejp.co.uk/image.php?x="+a.x+"&y="+a.y+"&z="+b


	}

	tilelayers[0].getCopyright = function(a,b) {return "Powered by Naver";}
	var custommap = new GMapType(tilelayers, G_NORMAL_MAP.getProjection(), "KOREA",{errorMessage:_mMapError});
	map.addMapType(custommap);
	map.addControl(new GMapTypeControl());
	map.addControl(new GSmallMapControl());
	map.addControl(new GScaleControl());
	map.setCenter(new GLatLng(mlat,mlng),mzoom,G_SATELLITE_TYPE, custommap);

	icon = new GIcon();
	icon.image = "http://tubejp.co.uk/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', 'stations.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")));
				var newMarker = createMarker(i, point, stations[i].getAttribute("name"), stations[i].getAttribute("zone"), stations[i].getAttribute("line"));

				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].point;
		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) 
{
	var style = "<span style='font-family: Verdana, Arial, Helvetica, sans-serif;font-size: 9px;color: black'>";
	var html = style+"<b>" + name+"</b><br>";
	var html2 = "<b>" + name+"</b><br>";
	z = "zone: "+zone+"<br>";
	html = html + 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>";

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

	var marker = new GMarker(point, icon);

	marker.tooltip = html;

	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;

	return marker;
}

function xmlhttp_req(url, div)
{
	var request = GXmlHttp.create();
	request.open('GET', url, true);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			var response = request.responseText;
	    	document.getElementById(div).innerHTML = response;
		}
	}
	request.send(null);
}

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

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 link_to_page()
{
	lat = round_number(map.getCenter().lat(), 6);
	lng = round_number(map.getCenter().lng(), 6);
    document.location="/?ll="+lat+","+lng+"&st1="+escape(document.form0['st1'].options[document.form0['st1'].selectedIndex].value)+"&st2="+escape(document.form0['st2'].options[document.form0['st2'].selectedIndex].value)+"&z="+map.getZoom();
}

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.point,map.getZoom());
	var anchor=marker.icon.iconAnchor;
	var width=marker.icon.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";
}


