/* base global information */
var centerLat = 42.32;
var centerLong = -87.943840;
var listeners = new Array();
var map;
var congestionLayerOverlay = null;
var borderLayerOverlay = null;
var speedLayerOverLay = null;
var layerRefreshNum = 0;
var cadLayerOverlay = null;

/*icon zindex importance order; higher more important*/
var harImport = 10;
var cameraImport = 30;
var roadworkImport = 20;
var incidentImport = 40;



/* base global information */
var defaultZoom = 11;
var minZoom = 10;
var maxZoom = 15;
var midZoom = new Array(11,13);
var tmcInfo = "<div style='margin-top:10px; height: 200px; overflow: auto; font-size: 10pt; font-family:verdana;'><h4>Lake County Traffic Management Center (TMC)</h4><p>The Traffic Management Center is the hub of a transportation management system, where information about the transportation network is collected and combined with other operational and control data to manage the transportation network and to produce traveler information. The TMC communicates transportation-related information to the media and to the public, and serves as a response coordination center for transportation conditions and situations. The TMC links various elements of Intelligent Transportation Systems (ITS) such as variable message signs, closed-circuit video equipment and roadside count stations to enable decision makers to identify and respond to incidents in a timely manner based on real-time data.</div>";

var tmcLatLon = new GLatLng(42.2945234,-87.9635894);
var tmcHash = null;

/* layer checks */
var incidentLayerOn = true;
var roadworkLayerOn = true;
var congestionLayerOn = true;
var harLayerOn = true;
var cameraLayerOn = true;
var tmcLayerOn = false;

/* display checks */
var incidentDisplay = false;
var roadworkDisplay = false;
var harDisplay = false;
var cameraDisplay = false;

var zoomLevel = 1;
var mapControl = null;
var GmapControl = null;
var speedMapControl = null;

var scrollArray = new Object();
var scrollerObj = null;
var mapLayerArray = new Array();

var tmcIcon = new GIcon();
tmcIcon.image = "http://maps.google.com/mapfiles/kml/pal2/icon10.png";
tmcIcon.iconSize = new GSize(24,24);
tmcIcon.iconAnchor = new GPoint(12,12);
tmcIcon.infoWindowAnchor = new GPoint(12,12);

var tmcIconMed = new GIcon();
tmcIconMed.image = "http://maps.google.com/mapfiles/kml/pal2/icon10.png";
tmcIconMed.iconsSize = new GSize(32,32);
tmcIconMed.iconAnchor = new GPoint(12, 12);
tmcIconMed.infoWindowAnchor = new GPoint (12, 12);

var tmcIconLarge = new GIcon();
tmcIconLarge.image = "http://maps.google.com/mapfiles/kml/pal2/icon10.png";
tmcIconLarge.iconsSize = new GSize(48,48);
tmcIconLarge.iconAnchor = new GPoint(15, 15);
tmcIconLarge.infoWindowAnchor = new GPoint (15, 15);



function load() 
{
  if (GBrowserIsCompatible()) 
  {
    map = new GMap2(document.getElementById("map"));
    map.enableScrollWheelZoom();
    GmapControl = new GLargeMapControl();
    map.addControl(GmapControl);
    
    /* create specialized lake county control */
    mapControl = new LakeCountyControl();
    map.addControl(mapControl);
    GEvent.addListener(map, 'maptypechanged', checkOverlayDisplay);
    GEvent.addListener(map, 'zoomend', checkOverlayDisplay);
    var mt = map.getMapTypes();
    for (var i = 0; i < mt.length; i ++)
    {
      mt[i].getMinimumResolution = function() {return minZoom;};
      mt[i].getMaximumResolution = function() {return maxZoom;};
    }
    mapHome();
    createCongestionOverlay();
    createTmcMarker();
  }
  var updater = new Ajax.PeriodicalUpdater('update','jsp/UpdateAjaxNew.jsp',
  {
     evalScripts: true,
     method: 'get', frequency: 120, 
     onSuccess: function (data){
        iconList = data.responseJSON.iconList;
        displayIcons();
     }
   });
  createCameraMarkers();
  setInitControlParams();
  addCameraWindowClose();
}


function createTmcMarker(){
    var  marker = new GMarker(tmcLatLon, {title: "Traffic Management Center", icon:tmcIcon});
    listener = GEvent.addListener(marker, "click", function() {
       marker.openInfoWindowHtml(tmcInfo);
    });
    var markerMed = new GMarker(tmcLatLon, {title: "Traffic Management Center", icon:tmcIconMed});
    listenerMed = GEvent.addListener(markerMed, "click", function() {
          markerMed.openInfoWindowHtml(tmcInfo);
    });
    markerLarge = new GMarker(tmcLatLon, {title: "Traffic Management Center", icon:tmcIconLarge});
    listenerLarge = GEvent.addListener(markerLarge, "click", function() {
          markerLarge.openInfoWindowHtml(tmcInfo);
    });
    map.addOverlay(marker);
    map.addOverlay(markerMed);
    map.addOverlay(markerLarge);
    marker.hide();
    markerMed.show();
    markerLarge.hide();
    tmcHash = new Array();
    tmcHash[0] = marker;
    tmcHash[1] = markerMed;
    tmcHash[2] = markerLarge;
}

function setInitControlParams()
{
     if(incidentLayerOn)
          document.getElementById("legendIncident").checked = true;
     if(roadworkLayerOn)
          document.getElementById("legendClosure").checked = true;
     if(congestionLayerOn)
          document.getElementById("legendCongestion").checked = true;
     if(harLayerOn)
          document.getElementById("legendHar").checked = true;
     if(cameraLayerOn)
          document.getElementById("legendCamera").checked = true;
     checkLayerVisibility();
}

/* creates our wms overlay for the congestion segments */
function createCongestionOverlay()
{
    if (congestionLayerOverlay != null)
    {
     map.removeOverlay(congestionLayerOverlay);
    }
    var congestionLayer = new GWMSTileLayer(map, new GCopyrightCollection("Lake County, IL"),1,10);
    congestionLayer.baseURL="http://www.lakecountypassage.com:80/geoserver/wms?";
    var layers = "lake:roadsegments";
    var styles = "congestion";
    congestionLayer.layers=layers;
    congestionLayer.styles=styles;
    congestionLayerOverlay = new GTileLayerOverlay(congestionLayer);
    map.addOverlay(congestionLayerOverlay); 
    if(!congestionLayerOn)
     congestionLayerOverlay.hide();

}


function checkLayerVisibility() 
{
   var zoom = map.getZoom();
   /* show small markers */
   if(zoom >= minZoom && zoom <= midZoom[0]){
     refreshIconLayers(1);
     if(tmcHash!=null && tmcLayerOn) {
        tmcHash[0].hide();
        tmcHash[1].show();
        tmcHash[2].hide();
    } else {
        if (tmcHash != null){
          for (var i = 0; i < tmcHash.length; i++)
                tmcHash[i].hide();
        }
    }
    zoomLevel = 1;
  /* show medium sized markers */   
  } else if (zoom > midZoom[0] && zoom <= midZoom[1]) {
     refreshIconLayers(2);
     if(tmcHash!=null && tmcLayerOn){
        tmcHash[0].hide();
        tmcHash[1].show();
        tmcHash[2].hide();
     } else {
        if (tmcHash != null) {
            for (var i = 0; i < tmcHash.length; i++)
                tmcHash[i].hide();
          }
     }
     zoomLevel = 2;
   }
   else if (zoom > midZoom[1] && zoom <=maxZoom) {
     refreshIconLayers(3);
     if(tmcHash!=null && tmcLayerOn){
        tmcHash[0].hide();
        tmcHash[1].hide();
        tmcHash[2].show();
     } else {
        if (tmcHash != null) {
            for (var i = 0; i < tmcHash.length; i++)
                tmcHash[i].hide();
          }
     }
     zoomLevel = 3;
   }      
}

function checkOverlayDisplay()
{
     checkLayerVisibility();
     if (!congestionLayerOn && congestionLayerOverlay != null)
     {
          congestionLayerOverlay.hide();
          if(mapControl) mapControl.hideSpeedControl();
        }
        else if (congestionLayerOn && congestionLayerOverlay == null){
             createCongestionOverlay();
            if(mapControl) mapControl.displaySpeedControl();
        }
        else if (congestionLayerOn && congestionLayerOverlay.isHidden()){
             congestionLayerOverlay.show();
          if(mapControl) mapControl.displaySpeedControl();
        }

}
 
 function refreshCongestionLayer(){
          if (congestionLayerOverlay != null){
                congestionLayerOverlay.refresh();
     }     
 }

function importanceOrder(marker, b)
{
     return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
}

var oldIconList = null;
var iconList = null;
var specialEventHash = null;

function displayIcons()
{
   if (oldIconList == null){
     /* first load of icons */
     oldIncidentHash = new Array();
     oldRoadworkHash = new Array();
     oldHarHash = new Array();
     specialEventHash = new Array();
     if(iconList != null){
       createIconLayers(iconList);
     } else {
          oldIconList = null;
          window.setTimeout(displayIcons, 2000);
          return;
     }
   } else {
      if(iconList ==  null){
          window.setTimeout(displayIcons, 2000);
          return;
      }
      iconList.each(function(newIcon){
          var found = false;
          for (var i = 0; i < oldIconList.length; i++)
          {
               if(newIcon.id == oldIconList[i].id)
               {
                    var oldIcon = oldIconList.splice(i, 1);
                    found = true;
                    updateIconLayer(newIcon);
                    handleSpecialEvents(newIcon);
                    return;
               }
          }
          if(!found){ updateIconLayer(newIcon); }
     });
   }
   if(oldIconList != null){
        oldIconList.each(function (oldIcon){
          removeFromIconLayer(oldIcon);
        });
   }
   oldIconList = iconList;
   iconList = null;
   checkLayerVisibility();
   refreshCongestionLayer();
   printDate();
   displaySpecialEventScroller();
}

function createIconLayers(iconList){
   var incidentHash = new Array();
   var roadworkHash = new Array();
   var harHash = new Array();
   iconList.each(function(newIcon){
       if(newIcon.type.toLowerCase() == "incident") incidentHash.push(new incidentIconClass(newIcon));
       else if (newIcon.type.toLowerCase() == "planned") roadworkHash.push(new roadworkIconClass(newIcon));
       else if (newIcon.type.toLowerCase() == "har") harHash.push(new harIconClass(newIcon));
       if(newIcon.type == "Advisory" || (newIcon.specialAlert && newIcon.specialAlert == true )) specialEventHash.push(newIcon);
   });
   mapLayerArray.push(new iconLayerClass("incident",incidentLayerOn,incidentHash,document.getElementById("legendIncident"),incidentIconClass));
   mapLayerArray.push(new iconLayerClass("roadwork",roadworkLayerOn,roadworkHash,document.getElementById("legendClosure"),roadworkIconClass));
   mapLayerArray.push(new iconLayerClass("har",harLayerOn,harHash,document.getElementById("legendHar"),harIconClass)); 
}

function refreshIconLayers(zoomLevel){
    mapLayerArray.each(function (layer){
        layer.determineDisplayState(zoomLevel) 
    });
}

function updateIconLayer(newIcon){
    var layer = mapLayerArray.find(function (layer) {
         if(layer.name.toLowerCase() == newIcon.type.toLowerCase()) return layer;
    });
    if(layer) layer.update(newIcon);
    if(newIcon.type.toLowerCase() == "advisory" || (newIcon.specialAlert || newIcon.special == true))
       handleSpecialEvents(newIcon);
}

function removeFromIconLayer(oldIcon){
    var layer = mapLayerArray.find(function (layer) {
         if(layer.name.toLowerCase() == oldIcon.type.toLowerCase()) return layer;
    });
    if(layer) layer.remove(oldIcon);
    if (oldIcon.type.toLowerCase() == "advisory" || (oldIcon.specialAlert && oldIcon.specialAlert == true))
        removeSpecialAlert(oldIcon);
}

function removeSpecialAlert(icon){
   for (var j = 0; j < specialEventHash.length; j++){
      var oldspecial = specialEventHash[j];
      if(oldspecial.id == icon.id) { specialEventHash.splice(j,1); break;}
   }

}

function handleSpecialEvents(newIcon){
   if(newIcon && null != newIcon){
      if(newIcon.type == "Advisory" || (newIcon.specialAlert && newIcon.specialAlert == true )){
         var foundold = false;
         for (var j = 0; j < specialEventHash.length; j++){
           var oldspecial = specialEventHash[j];
           if(oldspecial.id == newIcon.id){
              specialEventHash[j] = newIcon;
              foundold = true;
              break;
           }
         }
         if(!foundold) specialEventHash.push(newIcon);
      } else if (newIcon.specialAlert == false) {
           removeSpecialAlert(newIcon);
      }
   }
}

function determineIconVisibility(markerObj){
     var zoom = map.getZoom();
     if (zoom <= 11) markerObj.markerSmall.show();
     else if (zoom > 11 && zoom <= 13) markerObj.markerMed.show();
     else if (zoom > 13 && zoom <= maxZoom) markerObj.markerLarge.show();
     else markerObj.markerSmall.show();
}


