﻿// 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');
    var objMap = document.getElementById('GoogleMap_Div');
    var objDiv = document.getElementById('GoogleMap_Div_Container');

    if (objButton.value == 'Full Screen') {
        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 {
        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();
    }
}

var map;
var trafficInfo = null;

//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;
    }
}

function GBrowserIsCompatible() {
    return true;
}

if (GBrowserIsCompatible()) {

    map = new GMap2(document.getElementById("GoogleMap_Div"));

    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 = 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++) {
            polypoints = new Array();

            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);
                }
                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') {
                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') {
                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));
                }
                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') {
                polypoints = new Array();

                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));
                }
                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') {
                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);
                }
                polypoints = new Array();

                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));
                }
                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') {
                polypoints = new Array();

                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));
                }
                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') {
                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);
}