﻿var map;
var cameraOverlays = new Array();
var overlays = new Array();
var zoomCheckbox;
var zoomOverlays = new Array();
var zoomLevels = new Array();
var chunkedCount;
var parms = new Object();
var timer;
var cpl;
var cplnl;
var timestampControl;
var oTrafficFlowLayer

function Load() {
	if (!GBrowserIsCompatible()) {
		return;
	}

    _initParms();

	map = new GMap2(document.getElementById("map"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	
	map.enableScrollWheelZoom();
    
    _centerMap();

	GEvent.addListener(map, "addoverlay", function(overlay) {
   		var label;
		if(overlay instanceof GPolyline) {
               GEvent.addListener(overlay, 'click', function() { } );
        }
		if(overlay instanceof GMarker) {
		    icon = overlay.getIcon();
		    if (icon.image.search("camera") >=0 )
		        cameraOverlays.push( overlay );
			if (overlay.resize != true) {
               GEvent.addListener(overlay, 'click', function() { 
                htmlText = overlay.description; 
                if( htmlText.search( "Width500" ) < 0 )    
                    IWclass = "TRIPInfoWindow"; 
                else 
                    IWclass = "TRIPInfoWindow500"; 
                    
                      overlay.openExtInfoWindow(
                      map,
                      IWclass,
                      overlay.description,
                      { paddingX: 30, 
                        paddingY: 30  }
                    ); 
                  });

				GEvent.addListener( overlay, "mouseover",function( ) {
				    overlay.resize = false;
	    			label = new ELabel(overlay.getPoint(), overlay.name, "markerHoverText", new GSize(0,0), 0 );
		    		map.addOverlay( label );
				} );
				
				GEvent.addListener( overlay, "mouseout",function( ) {
                    overlay.resize = true;
				if( label != null )
	    			map.removeOverlay( label );
				} );
				GEvent.addListener( overlay, "remove",function( ) {
                    overlay.resize = true;
				if( label != null )
	    			map.removeOverlay( label );
				} );
			}
		}
	});

}
function jumpToCamera(selectbox) {
	var parentinput = selectbox.parentNode.parentNode.getElementsByTagName("input")[0];
	if(!parentinput.checked) {
	    cameraOverlays = new Array();
		parentinput.click();
		GEvent.addListener(parentinput.geoxml, "load", function() {
			jump(selectbox);
		});
	}
	else {
		jump(selectbox);
	}
}
function jump(selectbox) {
	var selecteditem = selectbox.options[selectbox.selectedIndex];
    var lat = selecteditem.getAttribute('latitude');
    var lon = selecteditem.getAttribute('longitude');
	map.setCenter(new GLatLng( lat, lon) );
	if( map.getZoom() < 12 )
	    map.setZoom( 12 );
	if(selecteditem.value == '')
		return;
	for(var i = 0; i < cameraOverlays.length; i++) {
		if(cameraOverlays[i].getLatLng().lat() == round( lat, 6) && cameraOverlays[i].getLatLng().lng() == round( lon, 6)) {
			GEvent.trigger(cameraOverlays[i], "click");
		}
	}
}
function toggleControlPanel() {
	var currentcenterpoint = map.fromLatLngToContainerPixel(map.getCenter());
	var controlPanel_TD = document.getElementById("controlPanelTD");
	var controlPanel_Toggle = document.getElementById("controlPanelToggle");
	if(controlPanel_TD.attributes["class"].value == 'controlPanelTD_Open') {
		controlPanel_TD.attributes["class"].value = 'controlPanelTD_Closed';
		controlPanel_Toggle.attributes["class"].value = 'controlPanelToggle_Closed';
		currentcenterpoint.x -= 191;
	}
	else {
		controlPanel_TD.attributes["class"].value = 'controlPanelTD_Open';
		controlPanel_Toggle.attributes["class"].value = 'controlPanelToggle_Open';
		currentcenterpoint.x += 191;
	}
	map.setCenter(map.fromContainerPixelToLatLng(currentcenterpoint));
}
function layerOnClick(thisCheckbox) {

	setChildInputControl(thisCheckbox);
	toggleLegend(thisCheckbox);
	toggleLayer(thisCheckbox);
	if(thisCheckbox.type == 'radio') {
		switchRadioGroup(thisCheckbox);
	}
	
}
function getParentElementsByTagName(element, tagName) {
	if(element.parentNode == null)
		return null;
	if(element.parentNode.nodeName == tagName)
		return element.parentNode;
	else
		return getParentElementsByTagName(element.parentNode, tagName);
}
function setChildInputControl(thisControl) {
	if(thisControl.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("table").length > 0) {
	//if(getParentElementsByTagName(thisControl, "DIV").getElementsByTagName("table").length > 0) {
		if(thisControl.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("input").length > 1) {
			var childInput = thisControl.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("input")[1];
			switch(childInput.type) {
				case 'radio':
					setChildRadio(thisControl);
					break;
				case 'checkbox':
					setChildCheckboxes(thisControl);
					break;
				default:
					break;
			}
		}
	}
}
function setParentInputControl(thisControl) {
	switch(thisControl.type) {
		case 'radio':
			setParentRadio(thisControl);
			break;
		case 'checkbox':
			setParentCheckbox(thisControl);
			break;
		default:
			break;
	}
}
function setChildCheckboxes(thisCheckbox) {
	if(thisCheckbox.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("table").length > 0) {
		var childCheckbox = thisCheckbox.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("input");
		if(childCheckbox.length > 1) {
			if(childCheckbox[1].type == 'radio') {
				childCheckbox[1].checked = thisCheckbox.checked;
				setChildCheckboxes(childCheckbox[1]);
				toggleLegend(childCheckbox[1]);
				toggleLayer(childCheckbox[1]);
				return;
			}
		}
		for(var i = 1; i < childCheckbox.length; i++) {
			if(childCheckbox[i].checked != thisCheckbox.checked) {
				childCheckbox[i].checked = thisCheckbox.checked;
				setChildCheckboxes(childCheckbox[i]);
 				toggleLegend(childCheckbox[i]);
				toggleLayer(childCheckbox[i]);
			}
		}
	}
}
function setParentCheckbox(thisCheckbox) {
	var root = thisCheckbox.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
	if(root.id == 'controlPanel')
		return;
	var checkboxes = root.getElementsByTagName("input");
	var checked = true;
	for(var i = 1; i < checkboxes.length; i++) {
		if(!checkboxes[i].checked) {
			checked = false;
			break;
		}
	}
	checkboxes[0].checked = checked;
	setParentCheckbox(checkboxes[0]);
}
function setChildRadio(parentControl) {
	var childControl = parentControl.parentNode.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("input")[1];
	if(parentControl.checked) {
		childControl.click();
	}
	else {
		deselectRadioGroup(childControl);
	}
}
function setParentRadio(thisRadio) {
	var root = thisRadio.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
	if(root.id == 'controlPanel')
		return;
	var rootinput = root.getElementsByTagName("input")[0];
	if(rootinput.checked != thisRadio.checked) {
		rootinput.checked = thisRadio.checked;
	}
}
function toggleLayer(thisCheckbox) {
	if(thisCheckbox.value == '')
		return;

	if(thisCheckbox.checked) {
		if(thisCheckbox.geoxml == null) {
			cpl.attributes["class"].value = "on";
 			loadLayer( thisCheckbox );
		}
	}
	else {
	    if( thisCheckbox.manualRefresh == "true" )
	        toggleTimestampControl( thisCheckbox ); 
		unloadLayer( thisCheckbox );
	}
}
function enableRefresh( thisCheckbox ) {
    if( ! thisCheckbox.canRefresh ) {
        thisCheckbox.canRefresh = true;
        overlays.push( thisCheckbox ); 
        if( timer == null )
            timer = self.setTimeout("refreshLayers()", 60000 );
    }  
}
function refreshLayers() {
    var  i=0;
    for( i=0; i<=overlays.length;i++) {
      try {  
            if( overlays[i].geoxml != null ) {  
                unloadLayer( overlays[i] );
                loadLayer( overlays[i] ); 
             }
        }
        catch(err)  { }    
    }
    timer = self.setTimeout("refreshLayers()", 60000 );
}
function turnonLayer( parentCheckbox, checkboxName ) {
    var layer = document.getElementById( checkboxName );
    if( ! layer.checked && parentCheckbox.checked ) { 
        layer.checked = true;  
        loadLayer( layer );
        toggleLegend( layer);
    }  
}
function loadLayer( thisCheckbox ) {
    var chunkedOverlays = new Array();
    if( thisCheckbox.splitFiles ) {
            for( var j=1;j<=chunkedCount;j++) {
                chunkedOverlays[j] = new GGeoXml( thisCheckbox.value.replace(".kml", String( j)+".kml") );
                map.addOverlay( chunkedOverlays[j] );
                GEvent.addListener( chunkedOverlays[j], "load", function() {
			                cpl.attributes["class"].value = "off";
	                });
                }
            thisCheckbox.geoxml = chunkedOverlays;
            }
    else {
        if( thisCheckbox.zoomBased && zoomLevels.length > 0 ) {
            thisCheckbox.value = zoomOverlays[0];
            var cur = map.getZoom();
            for( var i=0;i<zoomLevels.length;i++){
                if( zoomLevels[i] > cur )
                    break;
                thisCheckbox.value = zoomOverlays[i];
            } 
        }

        var gXML = new GGeoXml( thisCheckbox.value );
	    map.addOverlay( gXML );
        thisCheckbox.geoxml = gXML;
        
        GEvent.addListener( thisCheckbox.geoxml, "load", function() {
                cpl.attributes["class"].value = "off";
        });

    }
}
function unloadLayer( thisCheckbox ) {
    if( thisCheckbox.splitFiles ) {
            var chunkedOverlays = thisCheckbox.geoxml;
            for( var j=1;j<=chunkedCount;j++) {
            	map.removeOverlay( chunkedOverlays[j]);
                }
            }
    else {
		map.removeOverlay(thisCheckbox.geoxml);
	}
	map.closeExtInfoWindow()
	thisCheckbox.geoxml = null;
}

function initChunkedOverlays( thisCheckbox )
{
   // Read the data from example.xml
      var request = GXmlHttp.create();

      var manifest = thisCheckbox.value.replace( ".kml",".xml" );

      request.open("GET", manifest, false );
      request.send(null );
      var xmlDoc = GXml.parse(request.responseText);
      // obtain the array of markers and loop through it
      var node = xmlDoc.getElementsByTagName("FileCount");
      chunkedCount = GXml.value( node[0] ); 
      thisCheckbox.splitFiles = true;
}


function initZoomOverlays( thisCheckbox )
{
    thisCheckbox.zoomBased = true;
    zoomOverlays = new Array();
    zoomLevels = new Array();
    zoomCheckbox = thisCheckbox;
}
function pushZoomOverlays( zoomLevel, overlay ) { 
    zoomOverlays.push( overlay );
    zoomLevels.push( zoomLevel );  
    if( zoomOverlays.length == 1 ) {
        GEvent.addListener( map , "zoomend", function(oldLevel,newLevel) {
                unloadLayer( zoomCheckbox );
                loadLayer( zoomCheckbox ); 
        });
    }
}

function toggleLegend(thisCheckbox) {
	if(thisCheckbox.value == '')
		return;
	document.getElementById(thisCheckbox.id.replace('cb', 'l')).style.display = thisCheckbox.checked ? '' : 'none';
}
function toggleIncludes(thisControl) {
	
}
function deselectRadioGroup(thisControl) {
	var group = document.getElementsByName(thisControl.name);
	for(var i = 0; i < group.length; i++) {
		if(group[i].checked) {
			group[i].checked = false;
			toggleLegend(group[i]);
			toggleLayer(group[i]);
			break;
		}
	}
}
function switchRadioGroup(thisControl) {
	var group = document.getElementsByName(thisControl.name);
	for(var i = 0; i < group.length; i++) {
		if(!group[i].checked && group[i].geoxml != null) {
			//group[i].checked = false;
			toggleLegend(group[i]);
			toggleLayer(group[i]);
			//break;
		}
	}
}

function round(number, places) {
	return Math.round(number * Math.pow(10, places)) / Math.pow(10, places);
}

function _initParms( ) {
 // For each matched query string pair, add that pair to the URL struct using the pre-equals value as the key.
    window.location.search.replace( new RegExp( "([^?=&]+)(=([^&]*))?", "g" ), function( $0, $1, $2, $3 ){ parms[ $1 ] = $3; } );
    cpl = document.getElementById("controlPanelLoading");
    cplnl = document.getElementById("controlPanelNumLoading");
}

function _centerMap() {
    var ll = new Array();
    var lat = 43.9;
    var lng = -80.1;
    var z = 7;      
  if( parms["ll"] != null ) {
    ll = String( parms[ "ll" ] ).split( "," ); 
    if( parseFloat( ll[0] ) != NaN )
        lat = parseFloat( ll[0] );    
    if( parseFloat( ll[1] ) != NaN )
        lng = parseFloat( ll[1] );    
    }
  if( parms["z"] != null ) {
    if( parseInt( parms[ "z" ].toString() ) != NaN )
        z = parseInt( parms[ "z" ].toString() );
    }  
	moveMap( lat, lng, z );
}

function centerMap( thisControl, lat, lng, z ) {
    if( thisControl.checked ) {
			moveMap( lat, lng, z );
	    }
}

function centerMap( thisControl, lat, lng, z, SWlat, SWlng, NElat, NElng ) {
    if( thisControl.checked ) {
		var bounds = new GLatLngBounds( new GLatLng( SWlat,SWlng) , new GLatLng( NElat, NElng ) );
		if( ! bounds.containsBounds( map.getBounds() ) ) 
			moveMap( lat, lng, z );
	    }
}

function moveMap( lat, lng, z ) {
		map.closeExtInfoWindow();
		map.setCenter(new GLatLng(lat,lng), z ); 
}

function toggleTimestampControl( thisCheckbox ) {
     if( thisCheckbox.manualRefresh == "true" ) {
        map.removeControl( timestampControl );
        thisCheckbox.manualRefresh = null;	
       timestampControl = null; 
      }
    else {
        refreshTrafficFlow();  
        thisCheckbox.manualRefresh = "true";	
       oTrafficFlowLayer = thisCheckbox; 
    }  
}

function TimestampControl(opt_no_style){
  this.noStyle = opt_no_style;
};

function refreshTrafficFlow() {
        if( timestampControl != null ) {
       map.removeControl( timestampControl ); 
                unloadLayer( oTrafficFlowLayer );
                loadLayer( oTrafficFlowLayer ); 
        } 

        displayTimestampControl();
        timestampControl = new TimestampControl();
  	    map.addControl( timestampControl );
  	    
}

function displayTimestampControl() {
   // Read the data from example.xml
      var request = GXmlHttp.create();
      var manifest = "/kml/trafficflow.xml";
      request.open("GET", manifest, false );
      request.send(null );
      var xmlDoc = GXml.parse(request.responseText);
      // obtain the array of markers and loop through it
      var node = xmlDoc.getElementsByTagName("LastUpdated");

        TimestampControl.prototype = new GControl();
        TimestampControl.prototype.initialize = function(map) {
                  var display = document.createElement("div");
                  map.getContainer().appendChild(display);
                
                    if( window.location.pathname.indexOf( "french" ) >=0 ) {
                          display.innerHTML = "Cartes de circulation pour le Grand Toronto <br/>(<a href='javascript:refreshTrafficFlow();'>Actualiser</a>) Mise à jour  "+ GXml.value( node[0] ); 
                      }
                     else {
                          display.innerHTML = "GTA Traffic Flow (<a href='javascript:refreshTrafficFlow();'>Refresh</a>)<br/>As of: "+ GXml.value( node[0] ); 
                    } 

                  display.className = "timestamp-display";
                    display.style.fontFamily = "Arial, sans-serif";
                    display.style.fontSize = "12px";
                    display.style.color = "#000000";  
                    display.style.padding = "3px";
                    display.style.fontWeight = "700";  
                    display.style.backgroundColor = "#FFFFFF";  
                    display.style.opacity = ".80";  
                    display.style.filter = "alpha(opacity=80)";  
                    display.style.borderStyle = "solid";  
                    display.style.border = "1";  
                  this.htmlElement = display;
                  return display;
                }
        TimestampControl.prototype.getDefaultPosition = function() {
              return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(3, 38));
            }

 }