﻿var map = [];
var modalMap;
var modalGeoCoder;
var markersCollection = [];
var modalMapMarkersCollection = [];
var defaultMarkerImage = 'http://www.activitravel.com/Resources/Icons/MapIcons/peg_red.png';
var baseIcon;
var zIndex = 0;
var markerTimeout = 1000;
var currentMarker;
var suggestMarker;

function initiateMap(mapID, typeControlEnabled)
{
    map[mapID] = new GMap2(document.getElementById(mapID));
    markersCollection[mapID] = [];

    baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.shadow = "http://www.activitravel.com/Resources/Icons/MapIcons/shadow.png";
    baseIcon.iconSize = new GSize(17, 40);
    baseIcon.shadowSize = new GSize(30, 40);
    baseIcon.iconAnchor = new GPoint(9, 40);
    baseIcon.infoWindowAnchor = new GPoint(17, 40); 

    //if (GBrowserIsCompatible())
    //{
    map[mapID].addControl(new GSmallMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(2, 2)));
    map[mapID].addControl(new GScaleControl());
    //        map[mapID].addControl(new GOverviewMapControl());

    if (typeControlEnabled)
        map[mapID].addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(2, 2)));

    map[mapID].addMapType(G_PHYSICAL_MAP);
    map[mapID].setMapType(G_PHYSICAL_MAP);
    map[mapID].enableScrollWheelZoom();
    map[mapID].setCenter(new GLatLng(0, 0), 0);
    //}

    $("#" + mapID).append("<div class='corner topLeftCorner'></div>");
    $("#" + mapID).append("<div class='corner topRightCorner'></div>");
    $("#" + mapID).append("<div class='corner bottomLeftCorner'></div>");
    $("#" + mapID).append("<div class='corner bottomRightCorner'></div>");

    MapInfoWindow.prototype = new GOverlay();

    GMarker.prototype.highlight = highlightMarker;
}

function initDestMap(mapID, typeControlEnabled)
{
    var infoDiv = $("#destinationInfoDiv");
    var id = $(infoDiv).children("#locID").val();
    var lat = $(infoDiv).children("#lat").val().replace(",", ".");
    var lng = $(infoDiv).children("#lng").val().replace(",", ".");

    if (!mapID)
        mapID = "DestMap";

    if (!typeControlEnabled)
        typeControlEnabled = false;

    initiateMap(mapID, typeControlEnabled);
    //(mapID, id, lat, lng, html, highlighted, drag, listID, listed)
    addDestMarker(mapID, id, lat, lng, null);
}

function initDestClusterMap(mapID, typeControlEnabled)
{
    var infoDiv = $("#destinationInfoDiv");
    var id = $(infoDiv).children("#locID").val();
    var lat = $(infoDiv).children("#lat").val().replace(",", ".");
    var lng = $(infoDiv).children("#lng").val().replace(",", ".");
    var cluster = $(infoDiv).children("#cluster").val() == "True";
    var html = $(infoDiv).children("#html").val();

    if (!mapID)
        mapID = "DestMap";

    if (!typeControlEnabled)
        typeControlEnabled = false;

    initiateMap(mapID, typeControlEnabled);
    //(mapID, id, lat, lng, html, highlighted, drag, listID, listed)
    var centerMarker = addClusterMapMarker(mapID, id, lat, lng, cluster, html);

    if ($("#clusterPoints").length > 0)
    {
        $("#clusterPoints").find(".infoDiv").each(function ()
        {
            var id2 = $(this).children("#locID").val();
            lat = $(this).children("#lat").val().replace(",", ".");
            lng = $(this).children("#lng").val().replace(",", ".");
            cluster = $(this).children("#cluster").val() == "True";
            html = $(this).children("#html").val();

            addClusterMapMarker(mapID, id2, lat, lng, cluster, html);
        });

        //zoomMapToFitMarkers(mapID, 0);
    }

    centerOnMarker(mapID, id, 8);
    hoverMarker(centerMarker);
    setInfowindowTimeout(3000);
}

function highlightMarker(highlight, cluster)
{
    if (highlight)
    {
        if (this.isHighlighted == false)
        {
            this.map.removeOverlay(this);
            this.map.addOverlay(this);
            this.isHighlighted = true;
            this.setImage('http://www.activitravel.com/Resources/Icons/MapIcons/peg_green.png');
        }
    }
    else if (this.isHighlighted)
    {
        this.isHighlighted = false;
        var image = defaultMarkerImage;
        this.setImage(image);
    }
}

function initiateModalMap()
{
    modalMap = new GMap2(document.getElementById('modalMapDiv'));
    modalGeoCoder = modalGeoCoder || new GClientGeocoder();

    if (GBrowserIsCompatible())
    {
        modalMap.addControl(new GSmallMapControl(), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(2, 26)));
        modalMap.addControl(new GScaleControl());
        modalMap.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(2, 2)));
        modalMap.addMapType(G_PHYSICAL_MAP);
        modalMap.setMapType(G_PHYSICAL_MAP);
        modalMap.enableScrollWheelZoom();
        modalMap.setCenter(new GLatLng(0, 0), 1);
    }

    GEvent.addListener(modalMap, "click", function(overlay, latlng)
    {
        if (getSetSuggLocID() == -1)
        {
            callAction("/Destination/GeoQuery/", { "ctryCode": getSetSuggCtryCode(), "lat": latlng.lat(), "lng": latlng.lng() }, setSuggMapMove);
        }
    });

    $("#modalMapDiv").append("<div class='corner topLeftCorner'></div>");
    $("#modalMapDiv").append("<div class='corner topRightCorner'></div>");
    $("#modalMapDiv").append("<div class='corner bottomLeftCorner'></div>");
    $("#modalMapDiv").append("<div class='corner bottomRightCorner'></div>");

    setBaseCountryCode(getSetSuggCtryCode());
}

function getSetSuggActID(actID)
{
    return $("#comboActDiv .dropDownList").getSetSSValue(actID);
}
function getSetSuggCtryCode(ctryCode)
{
    return $("#comboCtryDiv .dropDownList").getSetSSValue(ctryCode);
}
function setBaseCountryCode(ctryCode)
{
    if (!ctryCode)
        ctryCode = null;

    var changed = ctryCode != modalGeoCoder.getBaseCountryCode();

    modalGeoCoder.setBaseCountryCode(ctryCode);

    return changed;
}
function getSetSuggLocID(locID)
{
    return $("#comboDestDiv .dropDownList").getSetSSValue(locID);
}

function addSuggestMarker(point, unDraggable)
{
    if (!point)
        point = new GLatLng($("#suggLatDiv :hidden").get(0).value, $("#suggLngDiv :hidden").get(0).value);

    $("#suggLatDiv :hidden").get(0).value = point.lat();
    $("#suggLngDiv :hidden").get(0).value = point.lng();

    if (suggestMarker)
        suggestMarker.remove();

    // Create a marker
    var pin = new GIcon(baseIcon);
    pin.image = "http://www.activitravel.com/Resources/Icons/MapIcons/peg_red.png";
    var markerOptions = { bouncy: true, draggable: !unDraggable, icon: pin };
    suggestMarker = new GMarker(point, markerOptions);

    suggestMarker.id = "suggMarker";

    GEvent.addListener(suggestMarker, 'dragend', function(latlng)
    {
        callAction("/Destination/GeoQuery/", { "ctryCode": getSetSuggCtryCode(), "lat": latlng.lat(), "lng": latlng.lng() }, setSuggMapMove);
    });

    // Add the marker to map
    modalMap.addOverlay(suggestMarker);

    // Center the map on marker
    var zoom = modalMap.getZoom();
    modalMap.setCenter(point, (zoom != 1) ? zoom : 4);
}

function removeSuggestMarker()
{
    if (suggestMarker)
    {
        suggestMarker.remove();
        modalMap.setCenter(new GLatLng(0, 0), 1);
    }
}

function setSuggMapSearch(result)
{
    if (result)
    {
        if (result.Success)
        {
            var point = new GLatLng(parseFloat(result.Lat), parseFloat(result.Lng));
            addSuggestMarker(point, false);
            showMessage("Possible map position found.");
        }
        else if (result.ServiceAvailable == false)
            showMessage("The search service is currently unavailable..", "red");
        else
            showMessage("No map position found.", "red");
    }
    else
        alertError('setSuggMapSearch');
}

function setSuggMapCountryCenter(result)
{
    if (result)
    {
        if (result.Success)
        {
            var point = new GLatLng(parseFloat(result.Lat), parseFloat(result.Lng));
            addSuggestMarker(point, false);
        }
        else if (result.ServiceAvailable == false)
            addSuggestMarker(new GLatLng(0, 0), false);
        else
            showMessage("An error occured while centering map on country!", "red");
    }
    else
        alertError('setSuggMapCountryCenter');
}

function setSuggMapMove(result)
{
    if (result)
    {
        if (result.Success || result.ServiceAvailable == false)
        {
            var point = new GLatLng(parseFloat(result.Lat), parseFloat(result.Lng));
            addSuggestMarker(point, false);
        }
        else
        {
            showMessage("Marker must be placed in " + $("#comboCtryDiv .dropDownList :selected").text() + "!", "red");
            addSuggestMarker(null, false);
        }
    }
    else
        alertError('setSuggMapMove');
}

function addMarker(mapID, id, lat, lng, html, highlighted, drag, listID, listed, unClickable)
{
    var markerExists = getMarker(mapID, id);

    if (markerExists != null)
    {
        markerExists.highlight(true, markerExists.cluster);
        return;
    }

    var point = new GLatLng(lat, lng);
    var pin = new GIcon(baseIcon);
    pin.image = "http://www.activitravel.com/Resources/Icons/MapIcons/peg_red.png";
    var markerOptions = { bouncy: true, draggable: drag, zIndexProcess: getZIndex, icon: pin };
    var marker = new GMarker(point, markerOptions);
    marker.id = id;
    marker.map = map[mapID];
    marker.isHighlighted = false;
    marker.cluster = false;

    GEvent.addListener(marker, 'dragend', function()
    {
        var currentPoint = marker.getPoint();
    });

    if (!unClickable)
    {
        GEvent.addListener(marker, 'click', function()
        {
            if (!clickSelectedDest())
                gotoDest(this.id);
        });
    }

    if ($("#" + listID).is(".destinationList"))
    {
        GEvent.addListener(marker, 'mouseover', function()
        {
            var row = $("#" + listID).find("#loc" + id).closest(".listItemRow");
            pauseTimer(listID);

            if (this.isHighlighted == false)
            {
                destListSelect(listID, row, true, false);
                this.highlight(true, this.cluster);
            }
        });

        GEvent.addListener(marker, 'mouseout', function()
        {
            if (this.isHighlighted)
                resumeTimer(listID, defaultTimerInterval);
        });
    }
    else if ($("#" + listID).is(".destinationListMap"))
    {
        GEvent.addListener(marker, 'mouseover', function()
        {
            if (this.isHighlighted)
                clearInfowindowTimeout();
            if (this.isHighlighted == false)
            {
                this.highlight(true, this.cluster);

                if (html)
                {
                    if (typeof MapInfoWindow !== 'undefined')
                    {
                        clearInfowindow();
                        currentMarker = this;
                        this.overlay = new MapInfoWindow(this, html);
                        _infoWindow = this.overlay;

                        map[mapID].addOverlay(this.overlay);

                        preventBubbling($(".mapInfoWindow").get(0));
                    }
                    else
                        marker.openInfoWindowHtml(html);
                }
            }
        });

        GEvent.addListener(marker, 'mouseout', function()
        {
            if (this.isHighlighted)
                setInfowindowTimeout(markerTimeout);
        });
    }

    markersCollection[mapID].push(marker);
    map[mapID].addOverlay(marker);
}

function addClusterMapMarker(mapID, id, lat, lng, cluster, html)
{
    var markerExists = getMarker(mapID, id);

    if (markerExists != null)
    {
        markerExists.highlight(true, markerExists.cluster);
        return;
    }

    var point = new GLatLng(lat, lng);
    var pin = new GIcon(baseIcon);
    pin.image = defaultMarkerImage;
    var markerOptions = { bouncy: false, draggable: false, zIndexProcess: getZIndex, icon: pin };
    var marker = new GMarker(point, markerOptions);
    marker.id = id;
    marker.map = map[mapID];
    marker.cluster = cluster;
    marker.isHighlighted = false;
    marker.html = html;

    GEvent.addListener(marker, 'mouseover', function ()
    {
        hoverMarker(this);
    });

    GEvent.addListener(marker, 'mouseout', function ()
    {
        if (this.isHighlighted)
            setInfowindowTimeout(markerTimeout);
    });

    markersCollection[mapID].push(marker);
    map[mapID].addOverlay(marker);

    return marker;
}

function hoverMarker(marker)
{
    if (marker.isHighlighted)
        clearInfowindowTimeout();
    if (marker.isHighlighted == false)
    {
        marker.highlight(true, marker.cluster);

        if (marker.html)
        {
            if (typeof MapInfoWindow !== 'undefined')
            {
                clearInfowindow();
                currentMarker = marker;
                marker.overlay = new MapInfoWindow(marker, marker.html);
                _infoWindow = marker.overlay;

                marker.map.addOverlay(marker.overlay);

                preventBubbling($(".mapInfoWindow").get(0));
            }
            else
                marker.openInfoWindowHtml(marker.html);
        }
    }
}

function getZIndex()
{
    zIndex++;
    return zIndex;
}

function getMarker(mapID, id)
{
    try
    {
        if (markersCollection[mapID] != null && markersCollection[mapID].length > 0)
        {
            for (var i = 0; i < markersCollection[mapID].length; i++)
            {
                if (markersCollection[mapID][i].id == id)
                    return markersCollection[mapID][i];
            }
        }
    }
    catch (err)
        {
            alertError('getMarker');
    }
}

function removeMarker(mapID, id)
{
    try
    {
        if (markersCollection[mapID] != null && markersCollection[mapID].length > 0)
        {
            for (var i = 0; i < markersCollection[mapID].length; i++)
            {
                if (markersCollection[mapID][i].id == id)
                {
                    markersCollection[mapID][i].remove();
                    markersCollection[mapID][i] = {};
                    return;
                }
            }
        }
    }
    catch (err)
    {
        alertError('removeMarker');
    }
}

function moveMarker(mapID, id, lat, lng)
{
    var marker = getMarker(mapID, id);
    if (marker != null)
        marker.setLatLng(new GLatLng(lat, lng));
}

function centerOnMarker(mapID, id, zoomLevel, highlight)
{
    var marker = getMarker(mapID, id);
    if (marker != null)
    {
        if (zoomLevel < 0)
            map[mapID].setCenter(marker.getLatLng());
        else
            map[mapID].setCenter(marker.getLatLng(), zoomLevel);

        //        map[mapID].removeOverlay(marker);
        //        map[mapID].addOverlay(marker);

        if (highlight)
            marker.highlight(highlight, marker.cluster);
    }
}

function highlightMapMarker(mapID, id, highlight)
{
    try
    {
        var marker = getMarker(mapID, id);

        if (marker != null)
            marker.highlight(highlight, marker.cluster);
    }
    catch (err)
    {
        alertError('highlightMapMarker');
    }
}

function showHideMarker(mapID, id, visible)
{
    var marker = getMarker(mapID, id);

    if (marker != null)
    {
        if (visible)
            marker.show();
        else
            marker.hide();
    }
}

function zoomMapToFitMarkers(mapID, maxZoomLevel)
{
    var bounds = new GLatLngBounds();
    for (var i = 0; i < markersCollection[mapID].length; i++)
    {
        if (markersCollection[mapID][i].isHidden() == false)
            bounds.extend(markersCollection[mapID][i].getLatLng());
    }

    var zoom = map[mapID].getBoundsZoomLevel(bounds);
    if (zoom > maxZoomLevel)
        map[mapID].setZoom(zoom);
    else
        map[mapID].setZoom(maxZoomLevel);

    map[mapID].setCenter(bounds.getCenter());
}

function zoomMapToMarker(mapID, id, maxZoomLevel)
{
    var bounds = new GLatLngBounds();
    bounds.extend(markersCollection[mapID][id].getLatLng());

    if (maxZoomLevel >= 0) // Means zoom level should remain unchanged
    {
        var zoom = map[mapID].getBoundsZoomLevel(bounds);
        if (zoom < maxZoomLevel)
            map[mapID].setZoom(zoom);
        else
            map[mapID].setZoom(maxZoomLevel);
    }

    map[mapID].setCenter(bounds.getCenter());
}

function clearMarkers(mapID, exceptFirst, exceptID)
{
    var exceptMarker = null;

    if (exceptFirst)
        exceptMarker = markersCollection[mapID][0];
    else if (exceptID)
        exceptMarker = getMarker(mapID, exceptID);

    map[mapID].clearOverlays()
    markersCollection[mapID] = [];

    if (exceptMarker != null)
    {
        markersCollection[mapID][0] = exceptMarker;
        map[mapID].addOverlay(exceptMarker);
    }
}

function addDestMarker(mapID, id, lat, lng, html)
{
    addMarker(mapID, id, lat, lng, html, false, false, null, false, true);
    centerOnMarker(mapID, id, 8);
}

function initListMap(listID, pageNo, typeControlEnabled)
{
    var mapID = $("#" + listID).attr("mapid");

    initiateMap(mapID, typeControlEnabled);
    clearMarkers(mapID, false);

    if (!pageNo && pageNo != 0)
        pageNo = getCurrentSlidePage(listID);

    if ($("#" + listID).is(".destinationList"))
    {
        $("#" + listID).find("#page" + pageNo + " .infoDiv").each(function()
        {
            processInfoDiv(this, mapID, listID);
        });
    }
    else if ($("#" + listID).is(".destinationListMap"))
    {
        $("#" + listID).find(".infoDiv").each(function()
        {
            processInfoDiv(this, mapID, listID);
        });
    }

    zoomMapToFitMarkers(mapID, 0);
}

function processInfoDiv(infoDiv, mapID, listID)
{
    var id = $(infoDiv).children("#locID").val();
    var lat = $(infoDiv).children("#lat").val().replace(",", ".");
    var lng = $(infoDiv).children("#lng").val().replace(",", ".");
    var html = $(infoDiv).children("#html").val();
    var listed = $(infoDiv).children("#listed").val() == "True";

    if ($(infoDiv).children("#cluster").length > 0)
    {
        var cluster = $(infoDiv).children("#cluster").val() == "True";
        addClusterMapMarker(mapID, id, lat, lng, cluster, html);
    }
    else
        addMarker(mapID, id, lat, lng, html, true, false, listID, listed);
}

