﻿var map;
var trafficInfo = null;

// JScript File
function IgnoreZeroLatLongs(bIgnore)
{
   //Check if there is any visible pushpin on map.
   var cnt = 0;
   bounds = new GLatLngBounds();
   for (var i = 0; i < markers.getLength(); i++)
   {
      var ignoremarker = false;
      var point1 = markers.markers[i].getPoint();
      if (bIgnore)
      {
         if ((point1.x == 0) && (point1.y == 0))
         {
            ignoremarker = true;
         }
      }

      if (!ignoremarker)
      {
         if (!markers.markers[i].isHidden())
         {
            bounds.extend(markers.markers[i].getPoint());
            //Increment visible pushpin count
            cnt++;
         }
      }
   }

   var iZoomLevel = map.getBoundsZoomLevel(bounds);
   var point = bounds.getCenter();

   map.setZoom(iZoomLevel);
   map.setCenter(point);
}

function ShowFullScreenMap()
{
   var objButton = document.getElementById('btnFullScreen');

   if (objButton.value == 'Full Screen')
   {
      var objMap = document.getElementById('GoogleMap_Div');
      var objDiv = document.getElementById('GoogleMap_Div_Container');
      objMap.style.width = '100%';
      objMap.style.height = '100%';

      objDiv.style.position = 'absolute';
      objDiv.style.left = '0px';
      objDiv.style.top = '0px';
      objDiv.style.width = '99%';
      objDiv.style.height = '95%';
      objDiv.style.backgroundColor = 'LightGrey';

      objButton.value = 'Close Fullscreen';
      DrawGoogleMap();
   }
   else
   {
      var objMap = document.getElementById('GoogleMap_Div');
      var objDiv = document.getElementById('GoogleMap_Div_Container');
      objMap.style.width = '<%=GoogleMapObject.Width %>';
      objMap.style.height = '<%=GoogleMapObject.Height %>';

      objDiv.style.position = '';
      objDiv.style.left = '';
      objDiv.style.top = '';
      objDiv.style.width = '';
      objDiv.style.height = '';

      objButton.value = 'Full Screen';
      //DrawGoogleMap();
   }
}

//function fListeners()
//{
//    this.listeners = new Array();
//    this.getLength = function() { return this.listeners.length; };
//    this.pushValue = function(v) { this.listeners.push(v); }
//    this.getValue = function(i)  { return this.listeners[i]; }
//}
function fMarkers()
{
   this.markers = new Array();
   this.getLength = function() { return this.markers.length; };
   this.pushValue = function(v) { this.markers.push(v); }
   this.getValue = function(i) { return this.markers[i]; }
   this.getLastValue = function() { return this.markers[this.markers.length - 1]; }
   this.getValueById = function(ID)
   {
      var i;
      for (i = 0; i < this.markers.length; i++)
      {
         if (this.markers[i].value == ID)
         {
            // alert('marker found : '+this.markers[i].value);
            return this.markers[i];
         }
      }
      return null;
   }

   this.removeValueById = function(ID)

   {
      var i;
      for (i = 0; i < this.markers.length; i++)
      {
         if (this.markers[i].value == ID)
         {
            // alert('marker found : '+this.markers[i].value);
            this.markers.splice(i, 1);
            //alert('changed marker removed');
         }
      }
      return null;
   }
}

function fPolylines()
{
   this.polylines = new Array();
   this.polylinesID = new Array();
   this.getLength = function() { return this.polylines.length; };
   this.pushValue = function(v, ID) { this.polylines.push(v); this.polylinesID.push(ID); }
   this.getValue = function(i) { return this.polylines[i]; }
   this.getLastValue = function() { return this.polylines[this.polylines.length - 1]; }
   this.getValueById = function(ID)
   {
      var i;
      for (i = 0; i < this.polylinesID.length; i++)
      {
         if (this.polylinesID[i] == ID)
         {
            // alert('polyline found : '+this.polylines[i].value);
            return this.polylines[i];
         }
      }
      return null;
   }

   this.removeValueById = function(ID)

   {
      var i;
      for (i = 0; i < this.polylinesID.length; i++)
      {
         if (this.polylinesID[i] == ID)
         {
            this.polylines.splice(i, 1);
            this.polylinesID.splice(i, 1);
         }
      }
      return null;
   }
}

function fPolygons()
{
   this.polygons = new Array();
   this.polygonsID = new Array();
   this.getLength = function() { return this.polygons.length; };
   this.pushValue = function(v, ID) { this.polygons.push(v); this.polygonsID.push(ID); }
   this.getValue = function(i) { return this.polygons[i]; }
   this.getLastValue = function() { return this.polygons[this.polygons.length - 1]; }
   this.getValueById = function(ID)
   {
      var i;
      for (i = 0; i < this.polygonsID.length; i++)
      {
         if (this.polygonsID[i] == ID)
         {
            return this.polygons[i];
         }
      }
      return null;
   }

   this.removeValueById = function(ID)

   {
      var i;
      for (i = 0; i < this.polygonsID.length; i++)
      {
         if (this.polygonsID[i] == ID)
         {
            this.polygons.splice(i, 1);
            this.polygonsID.splice(i, 1);
         }
      }
      return null;
   }
}

if (GBrowserIsCompatible())
{
   map = new GMap2(document.getElementById("GoogleMap_Div"));
   map.enableScrollWheelZoom();
   var xx = map.scrollWheelZoomEnabled;

   var markers = new fMarkers();
   var polylines = new fPolylines();
   var polygons = new fPolygons();
   //var myEventListeners = new fListeners();

   function CreateMarker(point, icon1, InfoHTML, bDraggable, sTitle)
   {
      var marker;
      marker = new GMarker(point, { icon: icon1, draggable: bDraggable, title: sTitle });
      if (InfoHTML != '')
      {
         GEvent.addListener(marker, "click", function() { this.openInfoWindowHtml(InfoHTML); });
      }
      GEvent.addListener(marker, "dragend", function() { GService.SetLatLon(this.value, this.getLatLng().y, this.getLatLng().x); RaiseEvent('PushpinMoved', this.value); });
      return marker;
   }

   function OpenInfoWindow(id, InfoHTML)
   {
      var marker = markers.getValueById(id);
      if (marker != null)
      {
         marker.openInfoWindowHtml(InfoHTML);
      }
   }

   function CreatePolyline(points, color, width, isgeodesic)
   {
      var polyline;
      if (!isgeodesic)
      {
         polyline = new GPolyline(points, color, width);
      }
      else
      {
         var polyOptions = { geodesic: true };
         polyline = new GPolyline(points, color, width, 1, polyOptions);
      }
      return polyline;
   }

   function CreatePolygon(points, strokecolor, strokeweight, strokeopacity, fillcolor, fillopacity)
   {
      var polygon;

      var polygon = new GPolygon(points, strokecolor, strokeweight, strokeopacity, fillcolor, fillopacity);
      return polygon;
   }

   function fGetGoogleObject(result, userContext)
   {
      map.setCenter(new GLatLng(result.CenterPoint.Latitude, result.CenterPoint.Longitude), result.ZoomLevel);

      if (result.ShowMapTypesControl)
      {
         map.addControl(new GMapTypeControl());
      }

      if (result.ShowZoomControl)
      {
         map.addControl(new GLargeMapControl());
      }

      map.setMapType(eval(result.MapType));

      var i;
      if (markers != null)
      {
         for (i = 0; i < markers.getLength(); i++)
         {
            var cmark = markers.getValue(i);
            if (cmark != null)
            {
               map.removeOverlay(cmark);
            }
         }
      }
      //    if(myEventListeners!=null)
      //    {
      //        for(i=0;i<myEventListeners.getLength();i++)
      //        {
      //            var lisnr = myEventListeners.getValue(i);
      //            if(lisnr!=null)
      //            {
      //                GEvent.removeListener(lisnr);
      //            }
      //        }
      //    }  
      markers = new fMarkers();
      //    myEventListeners = new fListeners();

      for (i = 0; i < result.Points.length; i++)
      {
         var myIcon_google;

         var myPoint = new GLatLng(result.Points[i].Latitude, result.Points[i].Longitude);

         myIcon_google = null;
         if (result.Points[i].IconImage != '')
         {
            myIcon_google = new GIcon(G_DEFAULT_ICON);
            markerOptions = { icon: myIcon_google };

            myIcon_google.iconSize = new GSize(result.Points[i].IconImageWidth, result.Points[i].IconImageHeight);
            myIcon_google.image = result.Points[i].IconImage;
            myIcon_google.shadow = result.Points[i].IconShadowImage;
            myIcon_google.shadowSize = new GSize(result.Points[i].IconShadowWidth, result.Points[i].IconShadowHeight);
            myIcon_google.iconAnchor = new GPoint(result.Points[i].IconAnchor_posX, result.Points[i].IconAnchor_posY);
            myIcon_google.infoWindowAnchor = new GPoint(result.Points[i].InfoWindowAnchor_posX, result.Points[i].InfoWindowAnchor_posY);
         }

         var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
         marker.value = result.Points[i].ID;
         markers.pushValue(marker);
         map.addOverlay(markers.getLastValue());
      }
      //Add polylines
      // alert('adding polyline');

      polylines = new fPolylines();
      for (i = 0; i < result.Polylines.length; i++)
      {
         var polypoints = new Array();
         var j;
         for (j = 0; j < result.Polylines[i].Points.length; j++)
         {
            polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
         }
         var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
         polylines.pushValue(polyline, result.Polylines[i].ID);
         map.addOverlay(polylines.getLastValue());
      }
      // var polypoints = new Array();
      // polypoints.push(new GLatLng(43.65669, -79.44268));
      // polypoints.push(new GLatLng(43.66619, -79.44268));
      // var poly = CreatePolyline(polypoints,"#66FF00",10,true);
      // map.addOverlay(poly);

      // var polypoints = new Array();
      // polypoints.push(new GLatLng(43.65669, -79.44268));
      // polypoints.push(new GLatLng(43.66619, -79.44268));
      // polypoints.push(new GLatLng(43.67619, -79.44268));
      // var directions = new GDirections(map,document.getElementById("directions_canvas")); 
      //Clear the mapa nd directions of any old information
      //directions.clear();

      //Load the map and directions from the specified waypoints
      //directions.loadFromWaypoints(polypoints);

      polygons = new fPolygons();
      for (i = 0; i < result.Polygons.length; i++)
      {
         var polypoints = new Array();
         var j;
         for (j = 0; j < result.Polygons[i].Points.length; j++)
         {
            polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
         }
         var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
         polygons.pushValue(polygon, result.Polygons[i].ID);
         map.addOverlay(polygons.getLastValue());
      }

      if (result.ShowTraffic)
      {
         trafficInfo = new GTrafficOverlay();
         map.addOverlay(trafficInfo);
      }
      if (result.AutomaticBoundaryAndZoom)
      {
         RecenterAndZoom(true, result);
      }
   }

   function DrawGoogleMap()
   {
      if (GBrowserIsCompatible())
      {
         map = new GMap2(document.getElementById("GoogleMap_Div"));
         geocoder = new GClientGeocoder();

         GService.GetGoogleObject(fGetGoogleObject);
      }
   }

   function fGetGoogleObjectOptimized(result, userContext)
   {
      if (result.RecenterMap)
      {
         map.setCenter(new GLatLng(result.CenterPoint.Latitude, result.CenterPoint.Longitude), result.ZoomLevel);
         GService.RecenterMapComplete();
      }

      map.setMapType(eval(result.MapType));

      if (result.ShowTraffic)
      {
         trafficInfo = new GTrafficOverlay();
         map.addOverlay(trafficInfo);
      }
      else
      {
         if (trafficInfo != null)
         {
            map.removeOverlay(trafficInfo);
            trafficInfo = null;
         }
      }

      var i;
      for (i = 0; i < result.Points.length; i++)
      {
         //Create icon
         var myIcon_google;

         var myPoint = new GLatLng(result.Points[i].Latitude, result.Points[i].Longitude);

         myIcon_google = null;
         if (result.Points[i].IconImage != '')
         {
            myIcon_google = new GIcon(G_DEFAULT_ICON);
            markerOptions = { icon: myIcon_google };

            myIcon_google.iconSize = new GSize(result.Points[i].IconImageWidth, result.Points[i].IconImageHeight);
            myIcon_google.image = result.Points[i].IconImage;
            myIcon_google.shadow = result.Points[i].IconShadowImage;
            myIcon_google.shadowSize = new GSize(result.Points[i].IconShadowWidth, result.Points[i].IconShadowHeight);
            myIcon_google.iconAnchor = new GPoint(result.Points[i].IconAnchor_posX, result.Points[i].IconAnchor_posY);
            myIcon_google.infoWindowAnchor = new GPoint(result.Points[i].InfoWindowAnchor_posX, result.Points[i].InfoWindowAnchor_posY);
         }

         //Existing marker, but changed.
         if (result.Points[i].PointStatus == 'C')
         {
            var marker = markers.getValueById(result.Points[i].ID);
            if (marker != null)
            {
               markers.removeValueById(result.Points[i].ID);
               map.removeOverlay(marker);
            }
            var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
            marker.value = result.Points[i].ID;
            markers.pushValue(marker);
            map.addOverlay(markers.getLastValue());
         }

         //New Marker
         if (result.Points[i].PointStatus == 'N')
         {
            var marker = CreateMarker(myPoint, myIcon_google, result.Points[i].InfoHTML, result.Points[i].Draggable, result.Points[i].ToolTip);
            marker.value = result.Points[i].ID;
            markers.pushValue(marker);
            map.addOverlay(markers.getLastValue());
         }

         //Existing marker, but deleted.
         if (result.Points[i].PointStatus == 'D')
         {
            var marker = markers.getValueById(result.Points[i].ID);
            if (marker != null)
            {
               markers.removeValueById(result.Points[i].ID);
               map.removeOverlay(marker);
            }
         }
      }

      //Get Polylines
      for (i = 0; i < result.Polylines.length; i++)
      {
         //Existing marker, but changed.
         if (result.Polylines[i].LineStatus == 'C')
         {
            var polyline = polylines.getValueById(result.Polylines[i].ID);
            if (polyline != null)
            {
               polylines.removeValueById(result.Polylines[i].ID);
               map.removeOverlay(polyline);
            }

            var polypoints = new Array();
            var j;
            for (j = 0; j < result.Polylines[i].Points.length; j++)
            {
               polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
            }

            var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
            polylines.pushValue(polyline, result.Polylines[i].ID);
            map.addOverlay(polylines.getLastValue());
         }

         //New Marker
         if (result.Polylines[i].LineStatus == 'N')
         {
            var polypoints = new Array();
            var j;
            for (j = 0; j < result.Polylines[i].Points.length; j++)
            {
               polypoints.push(new GLatLng(result.Polylines[i].Points[j].Latitude, result.Polylines[i].Points[j].Longitude));
            }
            var polyline = CreatePolyline(polypoints, result.Polylines[i].ColorCode, result.Polylines[i].Width, result.Polylines[i].Geodesic);
            polylines.pushValue(polyline, result.Polylines[i].ID);
            map.addOverlay(polylines.getLastValue());
         }

         //Existing marker, but deleted.
         if (result.Polylines[i].LineStatus == 'D')
         {
            var polyline = polylines.getValueById(result.Polylines[i].ID);
            if (polyline != null)
            {
               polylines.removeValueById(result.Polylines[i].ID);
               map.removeOverlay(polyline);
            }
         }
      }

      //Get Polygons
      for (i = 0; i < result.Polygons.length; i++)
      {
         //Existing marker, but changed.
         if (result.Polygons[i].Status == 'C')
         {
            var polygon = polygons.getValueById(result.Polygons[i].ID);
            if (polygon != null)
            {
               polygons.removeValueById(result.Polygons[i].ID);
               map.removeOverlay(polygon);
            }

            var polypoints = new Array();
            var j;
            for (j = 0; j < result.Polygons[i].Points.length; j++)
            {
               polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
            }
            var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
            polygons.pushValue(polygon, result.Polygons[i].ID);
            map.addOverlay(polygons.getLastValue());
         }

         //New Marker
         if (result.Polygons[i].Status == 'N')
         {
            var polypoints = new Array();
            var j;
            for (j = 0; j < result.Polygons[i].Points.length; j++)
            {
               polypoints.push(new GLatLng(result.Polygons[i].Points[j].Latitude, result.Polygons[i].Points[j].Longitude));
            }
            var polygon = CreatePolygon(polypoints, result.Polygons[i].StrokeColor, result.Polygons[i].StrokeWeight, result.Polygons[i].StrokeOpacity, result.Polygons[i].FillColor, result.Polygons[i].FillOpacity);
            polygons.pushValue(polygon, result.Polygons[i].ID);
            map.addOverlay(polygons.getLastValue());
         }

         //Existing marker, but deleted.
         if (result.Polygons[i].Status == 'D')
         {
            var polygon = polygons.getValueById(result.Polygons[i].ID);
            if (polygon != null)
            {
               polygons.removeValueById(result.Polygons[i].ID);
               map.removeOverlay(polygon);
            }
         }
      }
      if (result.AutomaticBoundaryAndZoom)
      {
         RecenterAndZoom(true, result);
      }
   }
}

//This function causes Recentering of map. It finds all visible markers on map and decides center point and zoom level based on these markers.
function RecenterAndZoom(bRecenter, result)
{
   if (bRecenter)
   {
      //Check if there is any visible pushpin on map.
      var cnt = 0;
      bounds = new GLatLngBounds();
      var objIgnore = document.getElementById('chkIgnoreZero');
      var bIgnore = false;
      if (objIgnore != null)
      {
         bIgnore = objIgnore.checked;
      }
      bIgnore = result.IgnoreZeroLatLngs;
      for (var i = 0; i < markers.getLength(); i++)
      {
         var ignoremarker = false;
         if (bIgnore)
         {
            var point1 = markers.markers[i].getPoint();
            if ((point1.x == 0) && (point1.y == 0))
            {
               ignoremarker = true;
            }
         }
         if (!ignoremarker)
         {
            if (!markers.markers[i].isHidden())
            {
               bounds.extend(markers.markers[i].getPoint());
               //Increment visible pushpin count
               cnt++;
            }
         }
      }

      var iZoomLevel = map.getBoundsZoomLevel(bounds);
      var point = bounds.getCenter();

      if (iZoomLevel > 14)
      {
         iZoomLevel = 14;
      }

      if (cnt <= 0)
      {
         point = new GLatLng(result.CenterPoint.Latitude, result.CenterPoint.Longitude);
         iZoomLevel = result.ZoomLevel;
      }
      map.setZoom(iZoomLevel);
      map.setCenter(point);
   }
}

function endRequestHandler(sender, args)
{
   GService.GetOptimizedGoogleObject(fGetGoogleObjectOptimized);
}

function pageLoad()
{
   if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack())
      Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
}