
var __g_mapObject = null;
var __g_arrPoints = new Array();
var __g_estabToMarker = new Object();
var __g_obHiddenTypes = new Object();

var HW_MARKER_ESTABLISHMENT = 1;
var HW_MARKER_DAILY_DEAL    = 2;
var HW_MARKER_TOP_RANKED    = 4;
var HW_MARKER_BOTH          = HW_MARKER_DAILY_DEAL | HW_MARKER_TOP_RANKED;

var HW_MARKER_ESTABLISHMENT_ICON    = "estab_marker.gif";
var HW_MARKER_DEAL_ICON             = "deal_marker.gif";
var HW_MARKER_RANKED_ICON           = "ranked_marker.gif";
var HW_MARKER_BOTH_ICON             = "both_marker.gif";
var HW_MARKER_ESTABLISHMENT_ICON_ON = "estab_marker_on.gif";
var HW_MARKER_DEAL_ICON_ON          = "deal_marker_on.gif";
var HW_MARKER_RANKED_ICON_ON        = "ranked_marker_on.gif";
var HW_MARKER_BOTH_ICON_ON          = "both_marker_on.gif";

function markerMouseOver() {
    if ((this.pointObject.markerType & HW_MARKER_ESTABLISHMENT) != 0 && this.panelObjects[HW_MARKER_ESTABLISHMENT]) {
        this.panelObjects[HW_MARKER_ESTABLISHMENT].style.border = "1px solid #ffffff";
    }
    if ((this.pointObject.markerType & HW_MARKER_DAILY_DEAL) != 0 && this.panelObjects[HW_MARKER_DAILY_DEAL]) {
        this.panelObjects[HW_MARKER_DAILY_DEAL].style.border = "1px solid #ffffff";
    }
    if ((this.pointObject.markerType & HW_MARKER_TOP_RANKED) != 0 && this.panelObjects[HW_MARKER_TOP_RANKED]) {
        this.panelObjects[HW_MARKER_TOP_RANKED].style.border = "1px solid #ffffff";
    }
}

function markerMouseOut() {
    if ((this.pointObject.markerType & HW_MARKER_ESTABLISHMENT) != 0 && this.panelObjects[HW_MARKER_ESTABLISHMENT]) {
        this.panelObjects[HW_MARKER_ESTABLISHMENT].style.border = "";
    }
    if ((this.pointObject.markerType & HW_MARKER_DAILY_DEAL) != 0 && this.panelObjects[HW_MARKER_DAILY_DEAL]) {
        this.panelObjects[HW_MARKER_DAILY_DEAL].style.border = "";
    }
    if ((this.pointObject.markerType & HW_MARKER_TOP_RANKED) != 0 && this.panelObjects[HW_MARKER_TOP_RANKED]) {
        this.panelObjects[HW_MARKER_TOP_RANKED].style.border = "";
    }
}

function markerClick() {
    if (this.panelObjects['href']) {
        location.href = this.panelObjects['href'];
    }
}

function addMarker(obCurPoint, pointsIndex) {

    var iMarkerType = obCurPoint.markerType;
    var strIcon     = HW_MARKER_ESTABLISHMENT_ICON;
    var strIconOn   = HW_MARKER_ESTABLISHMENT_ICON_ON;

    switch (iMarkerType) {
        case HW_MARKER_DAILY_DEAL:
            strIcon     = HW_MARKER_DEAL_ICON;
            strIconOn   = HW_MARKER_DEAL_ICON_ON;
            break;
        case HW_MARKER_TOP_RANKED:
            strIcon = HW_MARKER_RANKED_ICON;
            strIconOn = HW_MARKER_RANKED_ICON_ON;
            break;
        case HW_MARKER_BOTH:
            strIcon = HW_MARKER_BOTH_ICON;
            strIconOn = HW_MARKER_BOTH_ICON_ON;
            break;
    }

    if (obCurPoint.latitude == '' || obCurPoint.longitude == '' || parseFloat(obCurPoint.latitude) == 0 || parseFloat(obCurPoint.longitude) == 0)
        return;

    var point = new GLatLng(obCurPoint.latitude, obCurPoint.longitude);
    var obIcon = new GIcon();
    obIcon.image = SGL_JS_IMAGESDIR + "/markers/" + strIcon;
    obIcon.iconSize = new GSize(28,39);
    obIcon.iconAnchor = new GPoint(7,39);
    obIcon.shadow = SGL_JS_IMAGESDIR + "/markers/shadow.png";
    obIcon.shadowSize = new GSize(70,39);

    var obMarker = new GMarker(point, obIcon);
    obMarker.pointObject = obCurPoint;
    obMarker.panelObjects = new Object();
    obCurPoint.markerObject = obMarker;

    __g_estabToMarker[obCurPoint.establishment_id] = new Array(pointsIndex, obMarker);

    if ((iMarkerType & HW_MARKER_ESTABLISHMENT) != 0) {
        obMarker.panelObjects[HW_MARKER_ESTABLISHMENT] = document.getById("deal_" + obCurPoint.establishment_id);
        obMarker.panelObjects['href'] = document.getById("deal_anchor_" + obCurPoint.establishment_id);
        if (obMarker.panelObjects['href'])
            obMarker.panelObjects['href'] = obMarker.panelObjects['href'].href;
    }
    if ((iMarkerType & HW_MARKER_DAILY_DEAL) != 0) {
        obMarker.panelObjects[HW_MARKER_DAILY_DEAL] = document.getById("deal_" + obCurPoint.establishment_id);
        obMarker.panelObjects['href'] = document.getById("deal_anchor_" + obCurPoint.establishment_id);
        if (obMarker.panelObjects['href'])
            obMarker.panelObjects['href'] = obMarker.panelObjects['href'].href;
    }
    if ((iMarkerType & HW_MARKER_TOP_RANKED) != 0) {
        obMarker.panelObjects[HW_MARKER_TOP_RANKED] = document.getById("rank_" + obCurPoint.establishment_id);
        if (iMarkerType == HW_MARKER_TOP_RANKED) {
            obMarker.panelObjects['href'] = document.getById("rank_anchor_" + obCurPoint.establishment_id);
            if (obMarker.panelObjects['href'])
                obMarker.panelObjects['href'] = obMarker.panelObjects['href'].href;
        }
    }

    GEvent.addListener(obMarker, "mouseover", markerMouseOver);
    GEvent.addListener(obMarker, "mouseout", markerMouseOut);
    GEvent.addListener(obMarker, "click", markerClick);

    if (!__g_obHiddenTypes[iMarkerType])
        __g_mapObject.addOverlay(obMarker);
}

function addAllMarkers() {
    for (var i = 0; i < __g_arrPoints.length; ++i) {
        addMarker(__g_arrPoints[i], i);
    }
}

function removeAllMarkers() {
    for (var i = 0; i < __g_arrPoints.length; ++i) {
        __g_mapObject.removeOverlay(__g_arrPoints[i].markerObject);
    }
}

function hideMarkers(iMarkerType) {
    for (var i = 0; i < __g_arrPoints.length; ++i) {
        if (__g_arrPoints[i].markerType == iMarkerType)
            __g_mapObject.removeOverlay(__g_arrPoints[i].markerObject);
    }
    __g_obHiddenTypes[iMarkerType] = true;
}

function showMarkers(iMarkerType) {
    for (var i = 0; i < __g_arrPoints.length; ++i) {
        if (__g_arrPoints[i].markerType == iMarkerType)
            __g_mapObject.addOverlay(__g_arrPoints[i].markerObject);
    }
    __g_obHiddenTypes[iMarkerType] = false;
}

function showHideMarkers(iMarkerType, bShow) {
    if (bShow)
        showMarkers(iMarkerType);
    else
        hideMarkers(iMarkerType);
}

function removeElementsOfType(iMarkerType) {
    __g_estabToMarker = new Object();
    for (var i = 0; i < __g_arrPoints.length; ++i) {
        if (__g_arrPoints[i].markerType == iMarkerType) {
            __g_arrPoints.splice(i, 1);
            --i;
            continue;
        }
        if ((__g_arrPoints[i].markerType & iMarkerType) != 0) {
            __g_arrPoints[i].markerType ^= iMarkerType;
        }
        __g_estabToMarker[__g_arrPoints[i].establishment_id] = new Array(i, __g_arrPoints[i].markerObject);
    }
}

function reloadDailyDealMarkers(arrPoints) {
    __g_mapObject.clearOverlays();
    removeElementsOfType(HW_MARKER_DAILY_DEAL);
    removeElementsOfType(HW_MARKER_ESTABLISHMENT);
    for (var i = 0; i < arrPoints.length; ++i) {

        var obPoint = arrPoints[i];
        obPoint.markerType = (!obPoint.today_price) ? HW_MARKER_ESTABLISHMENT : HW_MARKER_DAILY_DEAL;

        if (__g_estabToMarker[obPoint.establishment_id]) {
            if (obPoint.markerType == HW_MARKER_DAILY_DEAL)
                __g_arrPoints[__g_estabToMarker[obPoint.establishment_id][0]].markerType |= obPoint.markerType;
        }
        else {
            var gIndex  = __g_arrPoints.length;
            __g_arrPoints[gIndex] = obPoint;
        }
    }
    addAllMarkers();
}

function mapHighlight(iEstabId, bOn) {
    if (__g_estabToMarker[iEstabId]) {
        var strImage = SGL_JS_IMAGESDIR + "/markers/";
        switch (__g_arrPoints[__g_estabToMarker[iEstabId][0]].markerType) {
            case HW_MARKER_DAILY_DEAL:
                strImage += (bOn) ? HW_MARKER_DEAL_ICON_ON : HW_MARKER_DEAL_ICON;
                break;
            case HW_MARKER_TOP_RANKED:
                strImage += (bOn) ? HW_MARKER_RANKED_ICON_ON : HW_MARKER_RANKED_ICON;
                break;
            case HW_MARKER_BOTH:
                strImage += (bOn) ? HW_MARKER_BOTH_ICON_ON : HW_MARKER_BOTH_ICON;
                break;
            default:
                strImage += (bOn) ? HW_MARKER_ESTABLISHMENT_ICON_ON : HW_MARKER_ESTABLISHMENT_ICON;
        }
        __g_estabToMarker[iEstabId][1].setImage(strImage);
    }
}

var __g_mapChangeTimeout = null;

function doUpdateMap()
{
    if (document.daily_deals && document.daily_deals.deals_by_day) {
        var obDays = document.daily_deals.deals_by_day;
        var iDay = obDays.options[obDays.options.selectedIndex].value;
        getDailyDeals(iDay);
    }
}

function onMapChange()
{
    if (__g_mapChangeTimeout)
        clearTimeout(__g_mapChangeTimeout);
    __g_mapChangeTimeout = setTimeout(doUpdateMap, 500);
}

function onMapChangeStart()
{
    if (__g_mapChangeTimeout)
        clearTimeout(__g_mapChangeTimeout);
}

function load(v_lat, v_long, arrPoints) {
  if (GBrowserIsCompatible()) {

    var map = new GMap2(document.getById("map"));
    map.setCenter(new GLatLng(v_lat, v_long), 10);
    map.enableDoubleClickZoom();
    map.enableScrollWheelZoom();
    map.addControl(new GLargeMapControl());

    __g_mapObject = map;
    __g_arrPoints = arrPoints;

    //addAllMarkers();

    if (document.daily_deals && document.daily_deals.deals_by_day) {
        var obDays = document.daily_deals.deals_by_day;
        var iDay = obDays.options[obDays.options.selectedIndex].value;
        getClientDailyDeals(iDay);
    }

    GEvent.addListener(map, "movestart", onMapChangeStart);
    GEvent.addListener(map, "moveend", onMapChange);
    GEvent.addListener(map, "zoomend", onMapChange);
  }
}

function geoByPostalCode(strPostal) {
    if (__g_mapObject) {
        var obEst = new Establishment();
        var obRet = obEst.getLatLong(strPostal);
        if (obRet && obRet.latitude && obRet.longitude) {
            var obLatLng = new GLatLng(obRet.latitude, obRet.longitude);
            __g_mapObject.setZoom(14);
            __g_mapObject.panTo(obLatLng);
        }
    }
}