﻿var gMap;
var gIsAdmin;
var gCurrentPosition;
var gMapInitialized = false;

function GetMap() {
    if (!gMap) {
        gMap = new google.maps.Map2($("#cGoogleMap")[0]);
        google.maps.Event.addListener(gMap, "click", gMap_click);
        google.maps.Event.addListener(gMap, "moveend", function () { DrawUtmLines(gMap) });
        gMap.setMapType(G_HYBRID_MAP);
    }

    return gMap;
}

function ShowMap(pLat, pLong, pZoom) {
    if (GBrowserIsCompatible()) {
        var vMap = GetMap();
        var vCenter = new google.maps.LatLng(pLat, pLong);

        vMap.clearOverlays();
        //DrawUtmLines(gMap);

        //if (gCurrentPosition == null)
        //    gCurrentPosition = SetMarker(pLat, pLong, null, null, CurrentPosition_Changed);

        MoveMap(vCenter);

        if (!gMapInitialized) {
            // TOPO kart
            var vCopyCollection = new GCopyrightCollection('TOPO Norway');
            var vCopyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "©2010 Statens Kartverk");
            vCopyCollection.addCopyright(vCopyright);

            var vTileLayers = [new GTileLayer(vCopyCollection, 3, 19, { tileUrlTemplate: 'http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom={Z}&x={X}&y={Y}', isPng: true, opacity: 1.0 })];
            var vCustomMap = new GMapType(vTileLayers, new GMercatorProjection(20), "Turkart", { errorMessage: "Kartdata er ikke tilgjengelig" });
            gMap.addMapType(vCustomMap);
            vMap.setCenter(vCenter, pZoom, vCustomMap);

            // Sjøkart
            var tileLayerSjoHK2 = new google.maps.TileLayer(new google.maps.CopyrightCollection("Statens Kartverk"), 0, 15);
            tileLayerSjoHK2.getTileUrl = function (t, z) { return getTileUrl('sjo_hovedkart2', t, z); }
            tileLayerSjoHK2.isPng = function () { return true; }
            var mapTypeSjoHK2 = new google.maps.MapType([tileLayerSjoHK2], google.maps.PHYSICAL_MAP.getProjection(), "Sjø");
            vMap.addMapType(mapTypeSjoHK2);

            //gMap.addControl(new GSmallMapControl());
            vMap.setUIToDefault();

            gMapInitialized = true;
        }
    }
}

function getTileUrl(type, tile, zoom) {
    switch (type) {
        case 'sjo_hovedkart2':
            return 'http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=' + type + '&zoom=' + zoom + '&x=' + tile.x + '&y=' + tile.y;
    }
}

function MoveMap(pPos) {
    gMap.setCenter(pPos);
}
        
function SetMarker(pLat, pLong, pToolTip, pImage, pDragCallback, pTitle) {

    var vIcon = new google.maps.Icon(G_DEFAULT_ICON);
    if (pImage) {
        vIcon.iconSize = new GSize(20, 20);
        vIcon.iconAnchor = new GPoint(10, 10);
        vIcon.image = "/images/gps/" + pImage + ".png";
        vIcon.shadow = null;
        vIcon.printImage = "/images/gps/" + pImage + ".png";
        vIcon.printShadow = null;
    }

    var vCenter = new google.maps.LatLng(pLat, pLong);
    var vMap = GetMap();

    var vOptions = {
        title: pToolTip,
        icon: vIcon,
        labelText: pTitle,
        labelClass: "WaypointLabel",
        labelOffset: new GSize(9, -9)
    };
    if (pDragCallback || gIsAdmin)
        vOptions["draggable"] = true;

    var vMarker;
    if (!gIsAdmin)
        vMarker = new LabeledMarker(vCenter, vOptions);
    else
        vMarker = new GMarker(vCenter, vOptions);

    if (pDragCallback)
        google.maps.Event.addListener(vMarker, "dragend", pDragCallback);
    else if (gIsAdmin)
        google.maps.Event.addListener(vMarker, "dragend", Marker_DragEnd);

    google.maps.Event.addListener(vMarker, "click", function () {
        ShowMarker(this, $(this).data("Waypoint"));
    });

    vMap.addOverlay(vMarker);

    return vMarker;
}

function gMap_click(overlay, latlng, overlaylatlng) {
    if (latlng) {
        ShowPosition(latlng);
    }
    else if (overlaylatlng) {
        //ShowPosition(overlaylatlng);
    }
}

function CurrentPosition_Changed(pPos) {
    ShowPosition(pPos);
}


var gUtmLines = new Array();
function DrawUtmLines(pMap) {

    while (gUtmLines.length > 0) {
        var vLine = gUtmLines.pop();
        pMap.removeOverlay(vLine);
    }

    if (pMap.getZoom() <= 8)
        return;

    //            var vSouthWest = pMap.fromContainerPixelToLatLng(new google.maps.Point(0, pMap.getSize().height)); // vBounds.getSouthWest();
    //            var vNorthEast = pMap.fromContainerPixelToLatLng(new google.maps.Point(pMap.getSize().width, 0)); // vBounds.getNorthEast();

    var vBounds = pMap.getBounds();
    var vSouthWest = vBounds.getSouthWest();
    var vNorthEast = vBounds.getNorthEast();

    $.ajax({
        type: 'POST',
        url: "AjaxHandler.ashx",
        data: {
            Method: "GetUtmLines",
            SouthWest: JSON.stringify(vSouthWest),
            NorthEast: JSON.stringify(vNorthEast),
            Zoom: pMap.getZoom()
        },
        success: function (pData) {
            for (var i = 0; i < pData.length; i++) {
                var vUtmLine = pData[i];
                var vLine = new google.maps.Polyline(
                            [
                                new GLatLng(vUtmLine.From.Latitude, vUtmLine.From.Longitude),
                                new GLatLng(vUtmLine.To.Latitude, vUtmLine.To.Longitude)
                            ],
                            vUtmLine.Major ? "#0000FF" : "#3366FF",
                            vUtmLine.Major ? 1 : 1,
                            vUtmLine.Major ? 0.8 : 0.4
                        );

                gUtmLines.push(vLine);
                pMap.addOverlay(vLine);

                var vIcon = new google.maps.Icon(G_DEFAULT_ICON);
                vIcon.iconSize = new GSize(1, 1);
                vIcon.image = "/images/blank.png";
                vIcon.printImage = "/images/blank.png";
                vIcon.shadow = null;
                vIcon.printShadow = null;

                var vOptions = {
                    title: vUtmLine.Label,
                    labelText: vUtmLine.Label,
                    labelClass: "UtmLabel",
                    labelOffset: new GSize(-8, -7),
                    icon: vIcon
                };
                var vMarker = new LabeledMarker(new GLatLng(vUtmLine.LabelPosition.Latitude, vUtmLine.LabelPosition.Longitude), vOptions);
                gUtmLines.push(vMarker);
                pMap.addOverlay(vMarker);
            }
        },
        error: Ajax_Error,
        dataType: 'json'
    });
}

