﻿/// <reference path="jquery-1.2.6-intellisense.js" />

var OverlayType = { Marker: 0, Polyline: 1, Polygon: 2 };
var originalStyle = null;
var geocoder;
var infoWindowWidth = 400;

function PostRender(map) {
    map.removeMapType(G_SATELLITE_MAP);
    map.addMapType(G_PHYSICAL_MAP);
    geocoder = new GClientGeocoder();
    infoWindowWidth = GetInfoWindowWidth();
    //http://code.google.com/apis/maps/documentation/reference.html#GEvent
    //http://code.google.com/apis/maps/documentation/services.html#ReverseGeocoding
    //context menu: http://groups.google.com/group/Google-Maps-API/msg/96dc8acf4c36d9fa
    //GEvent.addListener(map, "singlerightclick", function() { alert("right click"); }); //function(latlng,src,overlay); 
}
function ZoomToFitMap(map) {
    var bounds = new GLatLngBounds();
    
    for (var i = 0; i < reimers.map.GMap.Overlays.length; i++) {
        var o = reimers.map.GMap.Overlays[i];
        var oprops = GetOverlayEntryProperties(o);
        if (oprops.Type == OverlayType.Marker) {
            bounds.extend(o.getLatLng());
        }
        else {
            for (var j = 0; j < o.getVertexCount(); j++) {
                bounds.extend(o.getVertex(j));
            }
        }
    }
    map.setZoom(map.getBoundsZoomLevel(bounds));
    map.setCenter(bounds.getCenter());
}
function EnableRightClickMenu(map) {
    GEvent.addListener(map, "singlerightclick", rightClick);
}

function rightClick(point, src, overlay) {
    if (typeof overlay.ID != "undefined") {
        oProps = GetOverlayEntryProperties(overlay);
        if (oProps.Type == OverlayType.Marker) {
            
//            $.ajax({
//                type: "POST",
//                contentType: "application/json; charset=utf-8",
//                url: "/WebServices/MapWebService.asmx/DeleteGeo",
//                data: "{'geoId':" + oProps.GeoId + "}",
//                dataType: "text"//,
//                //success: function() { alert('success'); }
            //            });
            geocoder.getLocations(overlay.getLatLng(), function(response) { 
                showAddress(response, overlay, oProps.GeoId); });
            //overlay.openInfoWindow("right click", { maxWidth: 400 });
        }
        //overlay.hide();
    }
}

function deleteGeo(geoId) {
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "/WebServices/MapWebService.asmx/DeleteGeo",
        data: "{'geoId':" + geoId + "}",
        dataType: "text",
        success: function() { hideMarker(geoId); }
    });
}

function hideMarker(geoId) {
    var marker = FindOverlay(geoId);
    marker.closeInfoWindow();
    marker.hide();
}

function showAddress(response, marker, geoId) {
    //map.clearOverlays();
    if (!response || response.Status.code != 200) {
        alert("Status Code:" + response.Status.code);
    } else {
        place = response.Placemark[0];
        //point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
        //marker = new GMarker(point);
        //map.addOverlay(marker);
        marker.openInfoWindowHtml(
        //'<b>orig latlng:</b>' + response.name + '<br/>' +
        //'<b>latlng:</b>' + place.Point.coordinates[0] + "," + place.Point.coordinates[1] + '<br>' +
        //'<b>Status Code:</b>' + response.Status.code + '<br>' +
        //'<b>Status Request:</b>' + response.Status.request + '<br>' +
        '<b>Address: </b>' + place.address + '<br><br>' +
        //'<b>Accuracy:</b>' + place.AddressDetails.Accuracy + '<br>' +
        //'<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode
        '<a href="javascript:deleteGeo(' + geoId + ');">Delete Marker</a>'
        , { maxWidth: infoWindowWidth });
    }
}

function openMarkerInfoWindow(entryId) {
    var map = reimers.map.GMap;
    var markers = FindOverlays(entryId, OverlayType.Marker);

    for (var j = 0; j < markers.length; j++) {
        var o = markers[j];
        //map.panTo(o.getLatLng());
        GEvent.trigger(o, "click");
    }
}

function PolylineMouseOver(polyline, c, w, o) {
    originalStyle = { color: polyline.color, weight: polyline.weight, opacity: polyline.opacity };
    var style = { color: c, weight: w, opacity: o };
    var props = GetOverlayEntryProperties(polyline);

    var projectOverlays = FindOverlays(props.EntryId, OverlayType.Polyline);

    for (var j = 0; j < projectOverlays.length; j++) {
        var o = projectOverlays[j];
        o.setStrokeStyle(style);
    }
}
function PolylineMouseOut(polyline) {//, c, w, o) {
    var style = originalStyle;//{ color: c, weight: w, opacity: o };
    var props = GetOverlayEntryProperties(polyline);

    var projectOverlays = FindOverlays(props.EntryId, OverlayType.Polyline);

    for (var j = 0; j < projectOverlays.length; j++) {
        var o = projectOverlays[j];
        o.setStrokeStyle(style);
    }
}
function PolylineClick(map, point, html) {
    map.openInfoWindowHtml(point, html, { maxWidth: infoWindowWidth })
}
function MarkerClick(marker, map) {
    var markerProperties = GetOverlayEntryProperties(marker);
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "/WebServices/MapWebService.asmx/GetInfoWindowHTML",
        //data: "entryId=" + markerProperties.EntryId,
        data: "{'entryId':" + markerProperties.EntryId + ",'parserType':" + GetMapFeatureParser() + "}",
        dataType: "text",
        success: function(data) { MarkerClickCallback(marker, map, data); },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("request:" + XMLHttpRequest + ", status: " + textStatus + ", error: " + errorThrown);
            for (var property in XMLHttpRequest) {
                window.alert(property + ": " + XMLHttpRequest[property]);
            }
        }
    });
}

function MarkerClickCallback(marker, map, data) {
    //alert(infoWindowWidth);
    marker.openInfoWindow(data, { maxWidth: infoWindowWidth });
}
//function MarkerDragEnd(marker, map) {
//    
//}

//function HideOverlay(id) {
//    reimers.map.getItem(id, reimers.map.GMap.Overlays).hide();
//}
//function ShowOverlay(id) {
//    reimers.map.getItem(id, reimers.map.GMap.Overlays).show();
//}
function ToggleDisplayOfOverlaysByKind(kindId, show) {
    if (typeof show == "undefined")
        show = true;

        var overlays = FindOverlaysByKind(kindId);
        for (var j = 0; j < overlays.length; j++) {
        var o = overlays[j];
        if (show) {
            o.show();
        }
            else {
            o.hide();
        }
    }
}
function FindOverlay(geoId) {
    var overlay;
    for (var i = 0; i < reimers.map.GMap.Overlays.length; i++) {
        var o = reimers.map.GMap.Overlays[i];
        var oprops = GetOverlayEntryProperties(o);
        if (oprops.GeoId == geoId) {
            overlay = o;
        }
    }
    return overlay;
}
function FindOverlays(entryId, overlayType) {
    if (typeof overlayType == "undefined")
        overlayType = null;

    var overlays = new Array();
    for (var i = 0; i < reimers.map.GMap.Overlays.length; i++) {
        var o = reimers.map.GMap.Overlays[i];
        var oprops = GetOverlayEntryProperties(o);
        if (overlayType == null || oprops.Type == overlayType) {//OverlayType.Polyline) {
            if (oprops.EntryId == entryId) {
                overlays.push(o);
            }
        }
    }
    return overlays;
}
function FindOverlaysByKind(kindId, overlayType) {
    if (typeof overlayType == "undefined")
        overlayType = null;

    var overlays = new Array();
    for (var i = 0; i < reimers.map.GMap.Overlays.length; i++) {
        var o = reimers.map.GMap.Overlays[i];
        var oprops = GetOverlayEntryProperties(o);
        if (overlayType == null || oprops.Type == overlayType) {
            if (oprops.KindId == kindId) {
                overlays.push(o);
            }
        }
    }
    return overlays;
}

/*Helper Methods*/
function GetOverlayType(id) {
    if (id.indexOf("polyline") > -1)
    {
        return OverlayType.Polyline;
    }
    else if (id.indexOf("polygon") > -1)
    {
        return OverlayType.Polygon;
    }
    else
    {
        return OverlayType.Marker;
    }
}
function GetOverlayEntryProperties(o) {
    var id = o.ID;
    id = id.substr(id.lastIndexOf("GMap"));
    var props = id.split("_");
    var entryProperties = {
        Type: GetOverlayType(props[0]),
        KindId: props[1].slice(3),
        EntryId: props[2].slice(3),
        GeoId: props[3].slice(3)
    };
    return entryProperties;
}
