﻿var map;
var bbox;
var zoom;
var currentMarker = null;

function load() {
    if (GBrowserIsCompatible()) {
        resizeApp();
	    map = new GMap2(document.getElementById("map"));
        map.addControl(new GLargeMapControl());
	    map.enableContinuousZoom();
	    map.enableDoubleClickZoom();
	    map.addControl(new GMapTypeControl());
	    map.addControl(new GOverviewMapControl());
	    map.setCenter(new GLatLng(-37.814123, 144.931640), 12);
	    GEvent.addListener(map, "moveend", function() { drawLayers(); });
	    GEvent.addListener(map, "click", function(overlay, point) { /*clicked at  point.y , point.x */ });
        var bbox = "minx="+map.getBounds().getSouthWest().lng()+ "&miny=" + map.getBounds().getSouthWest().lat() + "&maxx=" + map.getBounds().getNorthEast().lng() + "&maxy=" + map.getBounds().getNorthEast().lat();
        e('bbox').value = bbox;
    }
    else
	{
		e("map").innerHTML = 'Could not load Map, browser not supported..';
	}    
}

function e(id) {
    return document.getElementById(id);
}
      
function getWindowHeight() {
    if (window.self && self.innerHeight) {  
        return self.innerHeight;
    }
    if (document.documentElement && document.documentElement.clientHeight)
    {
        return document.documentElement.clientHeight;
    }
    return 0;
}

function resizeApp() {
    var offsetTop = 0;
    var mapElem = e("map");
    for (var elem = mapElem; elem != null; elem = elem.offsetParent) 
    {
        offsetTop += elem.offsetTop;
    }
    var height = getWindowHeight() - offsetTop - 10;
    if (height >= 0) {
        mapElem.style.height = height + "px";
        e("panel").style.height = (height + 4) + "px";
    }
}

function moveMap()
{
	var cstr = e('gisParams').value;
	var cp = cstr.split(':');
	var co = cp[1].split(',');
	var zm = co[2];
    map.panTo(new GLatLng(co[1], co[0]));    
}


function moveEndEvt()
{
    var cstr = e('gisParams').value;
	var cp = cstr.split(':');
	var co = cp[1].split(',');
	var zm = co[2];
	//future: deal with map.setZoom(parseInt(zm,10));
	//TODO: plot layers here..
}
	
function drawLayers()
{
    var bbox = "minx="+map.getBounds().getSouthWest().lng()+ "&miny=" + map.getBounds().getSouthWest().lat() + "&maxx=" + map.getBounds().getNorthEast().lng() + "&maxy=" + map.getBounds().getNorthEast().lat();
    e('bbox').value = bbox;    
}				
				
function getStations()
{
    var bbox = e('bbox').value;
    setMsg("Loading layer..");
    GDownloadUrl("gis-webservices/st/?"+bbox, statToMr);
}

function getProperties()
{
    var bbox = e('bbox').value;
    setMsg("Loading layer..");
    GDownloadUrl("gis-webservices/pr/?"+bbox, propToMr);
}

function propToMr(data, responseCode) 
{
    setMsg("");//set by responseCode
    addMarkers(data, responseCode);
}


function statToMr(data, responseCode) 
{
    setMsg("");//set by responseCode
    addMarkers(data, responseCode);
}

function getTraffic()
{
    var bbox = e('bbox').value;
    setMsg("Loading layer..");
    GDownloadUrl("gis-webservices/tr/?"+bbox, trafToMr);
}

function trafToMr(data, responseCode) 
{
    setMsg("");//set by responseCode
    var xml = GXml.parse(data);
    var seg = xml.documentElement.getElementsByTagName("segment");
    var str = "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?><Layer type='tr'>";
    for (var i = 0; i < seg.length; i++) {
        var segPrms = (seg[i].getAttribute("dir")+":"+seg[i].getAttribute("status")).split(":");
        var segCen = seg[i].getElementsByTagName("center")[0];
        if (segCen.getAttribute("lat") != null && segCen.getAttribute("lon") != null)
        {
            str = str + "<st ic='tr"+ segPrms[0]+ segPrms[2] +"' id='"+ segPrms[1] + /* get from dir.. seg[i].getAttribute("name") +*/ "' lon='"+ segCen.getAttribute("lon") +"' lat='" + segCen.getAttribute("lat") + "' name='"+ seg[i].getAttribute("name")+ "' /> " ;
        }
    }
    str = str + "</Layer>";
    
    addMarkers(str, responseCode);
    //return str;
}




function getRes()
{
    //var bbox = e('bbox').value;
    //setMsg("Loading layer..");
    //GDownloadUrl("gis-webservices/pr/?"+bbox, resToMr);    
}    
    
function resToMr(data, responseCode)
{
    setMsg("");//set by responseCode
    alert(data);
    //addMarkers(data, responseCode);
}    
    
function setMsg(text)
{
    e('msg').innerHTML = text;
}
function getIcForStr(str)
{
    var trs = new GIcon();
    trs.image = "images/icons/"+str+".gif";
    //tri.shadow = "images/icons/trs_s.gif";
    trs.iconSize = new GSize(16,16);  
    //tri.shadowSize = new GSize(0,0);
    trs.iconAnchor = new GPoint(8,16);
    trs.infoWindowAnchor = new GPoint(5, 1);
    //trs.infoShadowAnchor = new GPoint(9, 2);
    trs.infoAnchor = new GPoint(9, 2);
    return trs;
}

function addMarkers(data, responseCode) 
{
    var xml = GXml.parse(data);
    var lType = xml.documentElement.getAttribute("type"); 
    var st = xml.documentElement.getElementsByTagName("st");
    for (var i = 0; i < st.length; i++) {
        //TODO: ic for each mr cahce
        var ic = st[i].getAttribute("ic");
        var trs = getIcForStr(ic+"s");
        var tri = getIcForStr(ic+"i");       
        addMarker(parseFloat(st[i].getAttribute("lat")), parseFloat(st[i].getAttribute("lon")), st[i].getAttribute("id"), st[i].getAttribute("name"), tri, trs, lType)
    }
}

function addMarker(lat, lon, mId, mDesc, icon, sel_icon, mType)
{
	var options = new Object();
	options.title = mDesc;
	options.clickable = true;
    var point = new GLatLng(lat, lon);		
    var marker = new GMarker(point, icon);
	GEvent.addListener(marker, "mouseover", function() {
		map.removeOverlay(currentMarker);		
		var point = new GLatLng(lat, lon);
		var options = new Object();
		options.clickable = false;
		currentMarker = addSelectedMarker(point, mId, mDesc, sel_icon, mType)
		map.addOverlay(currentMarker, options);
	});			
	map.addOverlay(marker, options);	
}

function addSelectedMarker(point, mId, mDesc, giconFocus, mType) 
{
	var selectedMarker = new GMarker(point, giconFocus);
	GEvent.addListener(selectedMarker, "click", function() {
		selectedMarker.openInfoWindowHtml(showInfo(mType + ":" + mId, mDesc));
	});
	return selectedMarker;
}

function showInfo(mi, md)
{
    var htmlSeg = "<div id='infoBuble'>Loading content for "+ md +"..</div>";
    GDownloadUrl("gis-webservices/content/?id="+mi+"&desc="+md, drawContent);
    return htmlSeg;
}

function drawContent(data, responseCode)
{
    var xml = GXml.parse(data);
    e('infoBuble').innerHTML = data;//content.documentElement.getElementsByTagName("content").item(0).v;
}
