﻿/**
* AreaMap scripts to choose Google Maps location
*
* @copyright (c) 2004-2007, SWsoft
*/
var SHOW_MARKERS = 10;
var SHOW_ZOOM = true;
var SHOW_TYPE = true;
var FINDE_MARKERS = 20;
var SearchTableID = '';
var AddressID = '';
var MapID = '';
var MarkerContainerId = '';
var Inits = new Array();
var Edit = true;
var ErrorLabelId = '';

var selectedIcon = null;
try {
    selectedIcon = new GIcon();
    selectedIcon.image = "";
    selectedIcon.shadow = "";
    selectedIcon.iconSize = new GSize(16, 27);
    selectedIcon.shadowSize = new GSize(30, 28);
    selectedIcon.iconAnchor = new GPoint(8, 27);
    selectedIcon.infoWindowAnchor = new GPoint(5, 1);
}
catch (e) { }

var Localization = new Array();
try {
    Localization["UnableAddress"] = SbGetLocaleByKey('UnableAddress');
    Localization["MarkersLimit"] = SbGetLocaleByKey('MarkersLimit');
    Localization["InvalidKey"] = SbGetLocaleByKey('InvalidKey');
    Localization["NotSupported"] = SbGetLocaleByKey('NotSupported');
    Localization["Save"] = SbGetLocaleByKey('Save');
    Localization["Delete"] = SbGetLocaleByKey('Delete');
    Localization["Direction"] = SbGetLocaleByKey('Direction');
    Localization["Title"] = SbGetLocaleByKey('Title');
    Localization["Address"] = SbGetLocaleByKey('Address');
}
catch (e) { }

var unselectedIcon = null;
try {
    unselectedIcon = new GIcon(selectedIcon);
    unselectedIcon.image = "";
}
catch (e) { }

var Markers = new Array();

function Init(center, zoom, type, key) {
    this.Center = center;
    this.Zoom = zoom;
    this.Type = type;
    this.Key = key;
}

function Marker(marker, title, enable, address) {
    this.ID = marker["id"];
    this.Enable = enable;
    this.Title = title;
    this.Marker = marker;
    this.Address = address;
}

function Address(streetAddress, city, region, country) {
    this.StreetAddress = streetAddress;
    this.City = city;
    this.Region = region;
    this.Country = country;
}

function SaveMarkers() {
    var container = document.getElementById(MarkerContainerId);
    if (container) {
        if (map) {
            container.value = GetEscapedMarkersString();
        } else {
            container.value = 'google_not_supported';
        }
    }
}

function CountItems(collection, enable) {
    var count = 0;
    for (var key in collection) {
        if ('undefined' != typeof (collection[key].Marker)) {
            if (enable != null) {
                if (collection[key].Enable == enable) {
                    count++;
                }
            }
            else {
                count++;
            }
        }
    }
    return count;
}

function PrintObject(obj) {
    var str = "";
    var i = 0;
    for (var key in obj) {
        str += key + '=>' + obj[key];
        if (i > 10) {
            str += "\n";
        } else {
            str += " | ";
        }
    }
    alert(str);
}

function GetChar(index) {
    var ret = "";
    switch (index) {
        case 10:
            ret = 'a';
            break;
        case 11:
            ret = 'b';
            break;
        case 12:
            ret = 'c';
            break;
        case 13:
            ret = 'd';
            break;
        case 14:
            ret = 'e';
            break;
        case 15:
            ret = 'f';
            break;
        default:
            ret = index.toString();
            break;
    }
    return ret;
}

function GetNewId() {
    var id = "Marker";
    for (var i = 0; i < 32; i++) {
        var index = Math.floor(Math.random() * 16);
        id += GetChar(index);
    }
    return id;
}

function ShowAddress() {
    SetWarningMessage("", false, true, false);
    var address = document.getElementById(AddressID);
    try {
        gs.execute(address.value);
    }
    catch (e) {
        SetWarningMessage(Localization["UnableAddress"], false, true, false);
    }
}


var map = null;
var gs = null;

function RemoveMarker(id) {
    map.removeOverlay(Markers[id].Marker);
    delete Markers[id];
    map.closeInfoWindow();
    SaveMarkers();
}

function SaveMarker(id, title, address) {
    var pos = Markers[id].Marker.getPoint();
    var mapId = Markers[id].Marker["mapId"];
    var adr = Markers[id].Address;
    if (CountItems(Markers, true) == SHOW_MARKERS) {
        SetWarningMessage(Localization["MarkersLimit"], false, true, false);
    }
    else {
        RemoveMarker(id);
        CreateMarker(pos, true, id, address.value, title.value, mapId);
    }

    Markers[id].Title = title.value;
    Markers[id].Address = address.value;
    map.closeInfoWindow();
}

function ReplaceQuote(str) {
    while (str.match(/\'/ig) != null) {
        str = str.replace(/\'/ig, "&#39;");
    }
    return str;
}

function GetTitle(id) {
    var result = "";
    try {
        result = Markers[id].Title;
    } catch (e) { }
    return result;
}

function GetAddress(id) {
    var result = "";
    try {
        result = Markers[id].Address;
    } catch (e) { }
    return result;
}

function GetAddressFormatted(address) {
    var result = "";
    if (address == null) {
        return result; //Markers[id].Marker.getPoint();
    }
    if (address.StreetAddress != "") {
        result += address.StreetAddress;
    }
    if (address.City != "") {
        result += ", ";
        result += address.City;
    }
    if (address.Region != "") {
        result += ", ";
        result += address.Region;
    }
    return result;
}

function GetDirection(id, from) {
    var str = "http://www.google.com/maps?source=uds";
    var point = Markers[id].Marker.getPoint();
    str += "&saddr=" + from.value;
    str += "&daddr=" + point.lat() + "," + point.lng();
    window.open(str);
}

function GetPreviewUrl() {
    var div = document.getElementById(MapID);
    var container = div.childNodes[0].childNodes[0].childNodes[1].childNodes[0];
    var imgs = container.childNodes;
    var index = 0;
    var point = map.fromLatLngToDivPixel(map.getCenter());
    for (var i = 0; i < imgs.length; i++) {

        var x = parseInt(imgs[i].style.left);
        var y = parseInt(imgs[i].style.top);
        if ((x + 256) >= point.x && x < point.x && (y + 256) >= point.y && y < point.y) {
            index = i;
            break;
        }
    }
    return imgs[index].src;
}

function GetEscapedMarkersString() {
    var str = "{";
    str += "\"Map\":{";
    str += "\"zoom\":\"" + escapeQuote(map.getZoom()) + "\",";
    str += "\"center_lat\":\"" + escapeQuote(map.getCenter().lat()) + "\",";
    str += "\"center_lng\":\"" + escapeQuote(map.getCenter().lng()) + "\",";
    str += "\"preview_url\":\"" + escapeQuote(GetPreviewUrl()) + "\",";
    str += "\"type\":\"" + escapeQuote(map.getCurrentMapType().getName()) + "\"";
    str += "},";
    str += "\"Markers\":[";
    for (var key in Markers) {
        if (('undefined' != typeof (Markers[key].Marker)) && (Markers[key].Enable)) {
            var item = "{\"marker_id\":\"" + escapeQuote(Markers[key].ID) + "\",\"title\":\"" + escapeQuote(Markers[key].Title) + "\",\"point_lat\":\"" + escapeQuote(Markers[key].Marker.getPoint().lat()) + "\",\"point_lng\":\"" + escapeQuote(Markers[key].Marker.getPoint().lng()) + "\",\"address\":\"" + escapeQuote(Markers[key].Address) + "\"}";
            str += item;
            str += ",";
        }
    }
    if (str.substr(str.length - 1, 1) == ",") {
        str = str.substr(0, str.length - 1);
    }
    str += "]}";
    return str;
}

function escapeQuote(str) {
    try {
        str = str.replace(/\\/ig, '\\\\');
        str = str.replace(/\"/ig, '\\"');
    } catch (e) { }
    return str;
}

function _htmlSpecialChars(str) {
    try {
        str = str.replace(/&/ig, '&amp;');
        str = str.replace(/\?/ig, '&#63;');
        str = str.replace(/</ig, '&lt;');
        str = str.replace(/>/ig, '&gt;');
        str = str.replace(/\'/ig, '&#39;');
        str = str.replace(/\"/ig, '&#34;');
    } catch (e) { }

    return str;
}

function _unHtmlSpecialChars(str) {
    try {
        str = str.replace(/&#34;/ig, '\"');
        str = str.replace(/&#39;/ig, "'");
        str = str.replace(/&gt;/ig, '>');
        str = str.replace(/&lt;/ig, '<');
        str = str.replace(/&#63;/ig, '?');
        str = str.replace(/&amp;/ig, '&');
    } catch (e) { }

    return str;
}

function GetInfoHtml(id, markAddress) {
    var str = "";
    var title = _htmlSpecialChars(GetTitle(id));
    var address = _htmlSpecialChars(GetAddress(id));

    if (Edit) {
        str += "<table width='150px' border='0' cellpadding='2' cellspacing='0'><tr><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: black;'>";
        str += Localization["Title"];
        str += "</td>";
        str += "<td>";
        str += "<input id='Title" + id + "' value='" + title + "' style='border: 1px solid #999EA1; color: black; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;'/>";
        if (markAddress == true && address != "") {
            str += "</td></tr><tr bgcolor='#FFD9D9'><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: black;'>";
        }
        else {
            str += "</td></tr><tr><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: black;'>";
        }
        str += Localization["Address"];
        str += "</td>";
        str += "<td>";
        str += "<input id='Address" + id + "' value='" + address + "' style='border: 1px solid #999EA1; color: black; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;'/>"
        str += "</td></tr><tr><td>";
        str += "</td>";
        str += "<td align='right'>";
        str += "<span style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: blue; text-decoration: underline; cursor: pointer;' onclick=\"SaveMarker('" + id + "', document.getElementById('Title" + id + "'), document.getElementById('Address" + id + "'));\">" + Localization["Save"] + "</span>  <span  style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: blue; text-decoration: underline; cursor: pointer;' onclick=\"RemoveMarker('" + id + "');\">" + Localization["Delete"] + "</span>";
        str += "</td></tr></table>";
    }
    else {

        str += "<table width='100px' border='0'>";
        if (title != "") {
            str += "<tr><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000;'>" + Localization["Title"];
            str += "</td><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000;'>";
            str += title + "</td></tr>";
        }
        if (address != "") {
            str += "<tr><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000;'>" + Localization["Address"];
            str += "</td><td style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: #000000;'>";
            str += address + "</td></tr>"
        }
        str += "<tr><td><span style='font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; color: blue; text-decoration: underline; cursor: pointer;' onclick=\"GetDirection('" + id + "', document.getElementById('From" + id + "'));\">" + Localization["Direction"] + "</span></td><td><input id='From" + id + "' value='' style='border: 1px solid #999EA1; color: black; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;'/></td></tr>";
        str += "</table>";
    }
    return str;
}
// Creates a marker at the given point with the given number label
function CreateMarker(point, activ, oldId, address, title, mapId) {
    var marker = null;
    var enable = false;
    if (CountItems(Markers, true) == SHOW_MARKERS) {
        enable = false;
        activ = false
        SetWarningMessage(Localization["MarkersLimit"], false, true, false);
    }
    var currentIcon = unselectedIcon;
    if (activ == true) {
        currentIcon = selectedIcon;
        enable = true;
    }

    if (Edit) {
        marker = new GMarker(point, { draggable: true, icon: currentIcon });
    }
    else {
        marker = new GMarker(point);
    }
    var id = GetNewId();
    if (oldId != null) {
        id = oldId;
    }
    marker["id"] = id;
    if (mapId != null) {
        marker["mapId"] = mapId;
    }
    GEvent.addListener(marker, "click", function () {
        marker.openInfoWindowHtml(GetInfoHtml(marker["id"], false));

    });
    GEvent.addListener(marker, "dragstart", function () {
        map.closeInfoWindow();
    });

    GEvent.addListener(marker, "dragend", function () {
        if (GetAddress(marker["id"]) != "") {
            marker.openInfoWindowHtml(GetInfoHtml(marker["id"], true));
        }
    });

    if (address == null || address == undefined) address = "";
    if (title == null || title == undefined) title = "";
    Markers[id] = new Marker(marker, title, enable, address);
    map.addOverlay(marker);
    SaveMarkers();
    return marker;
}


function ClearMarkers() {
    for (var key in Markers) {
        if (('undefined' != typeof (Markers[key].Marker)) && (Markers[key].Enable == false)) {
            RemoveMarker(key);
        }
    }
}


var markers = null;
function SetMarkers() {
    ClearMarkers();
    var markers = new Array();
    var addresses = new Array();
    var bestResultUrl = null;
    if (gs.results && gs.results.length > 0) {
        for (var i = 0; i < gs.results.length && i < FINDE_MARKERS; i++) {
            var result = gs.results[i];
            markers.push(new GSmapscLocalResult(this, result, i));
            addresses.push(new Address(result.streetAddress, result.city, result.region, result.country));
        }


        map.setCenter(markers[0], 13);
        for (var i = 0; i < markers.length; i++) {
            if (!IfExists(markers, markers[i], i) && !IfExists(Markers, markers[i])) {
                var marker = CreateMarker(markers[i], false, null, GetAddressFormatted(addresses[i]), null, MapID);
            }
        }
    }
    else {
        SetWarningMessage(Localization["UnableAddress"], false, true, false);
    }
}

function IfExists(collection, pos, index) {
    var result = false;
    if (index != null) {
        for (var i = 0; i < collection.length; i++) {
            if (collection[i].lat() == pos.lat() && collection[i].lng() == pos.lng() && i != index) {
                result = true;
                break;
            }
        }
    }
    else {
        for (var key in collection) {
            if (('undefined' != typeof (Markers[key].Marker)) &&
				(collection[key].Marker.getPoint().lat() == pos.lat() && collection[key].Marker.getPoint().lng() == pos.lng())) {
                result = true;
                break;
            }
        }
    }

    return result;
}

function GSmapscLocalResult(gsmsc, result, index) {
    latLng = new GLatLng(parseFloat(result.lat), parseFloat(result.lng));

    return latLng;
}

function Load(mapId, tableId, addressId, errorLabelId) {
    SearchTableID = tableId;
    AddressID = addressId;
    ErrorLabelId = errorLabelId;
    MapID = mapId;

    if (typeof (GlocalSearch) == "undefined") {
        SetWarningMessage(Localization["InvalidKey"], true, true, false);
        return;
    }

    if (GBrowserIsCompatible()) {
        var p = document.getElementById(SearchTableID);
        if (p) {
            p.style.display = "";
        }
        gs = new GlocalSearch();
        gs.setResultSetSize(GSearch.LARGE_RESULTSET);
        gs.setSearchCompleteCallback(this, SetMarkers, [null]);

        var container = document.getElementById(mapId);

        for (var i in document.styleSheets) {
            if (document.styleSheets[i].rules && document.styleSheets[i].rules.length > 0) {
                for (var j in document.styleSheets[i].rules) {
                    if ('IMG' == document.styleSheets[i].rules[j].selectorText) {
                        document.styleSheets[i].removeRule(j);
                    }
                }
            }
        }

        map = new GMap2(container);

        if (Edit) {
            GEvent.addListener(map, "click", function (marker, point) {
                if (!marker) {
                    var marker = CreateMarker(point, false, null, null, null, mapId);
                    if (marker != null) {
                        marker.openInfoWindowHtml(GetInfoHtml(marker["id"], false));
                    }
                }
            });
        }

        if (SHOW_ZOOM) {
            map.addControl(new GSmallMapControl());
        }
        if (SHOW_TYPE) {
            map.addControl(new GMapTypeControl());
        }

        if (Inits[mapId].Center == null) {
            try {
                gs.execute("1600 Amphitheatre Pky, Mountain View, CA");
            }
            catch (e) {
                SetWarningMessage(Localization["UnableAddress"], false, true, false);
            }

        }
        else {
            map.setCenter(Inits[mapId].Center);
            for (var key in Markers) {
                if (('undefined' != typeof (Markers[key].Marker)) && (Markers[key].Marker["mapId"] == mapId)) {
                    CreateMarker(Markers[key].Marker.getPoint(), Markers[key].Enable, Markers[key].ID, Markers[key].Address, Markers[key].Title, mapId);
                }
            }
        }

        if (Inits[mapId].Zoom != null) {
            map.setZoom(Inits[mapId].Zoom);
        }
        if (Inits[mapId].Type != null) {
            var types = map.getMapTypes();
            for (var i = 0; i < types.length; i++) {
                if (types[i].getName() == Inits[mapId].Type) {
                    map.setMapType(types[i]);
                    break;
                }
            }
        }
    }
    else {
        SetWarningMessage(Localization["NotSupported"], true, true, false);
    }
}

function SetWarningMessage(message, showInDiv, ShowInBar, showAlert) {
    if (ShowInBar) {
        if (ErrorLabelId != '') {
            var bar = document.getElementById(ErrorLabelId);
            if (bar) {
                bar.innerHTML = message;
            }
        }
        else {
            if (message != '') {
                alert(message);
            }
        }
    }
    if (showInDiv) {
        var div = document.getElementById(MapID);
        div.innerHTML = message;
    }
    if (showAlert) {
        if (message != '') {
            alert(message);
        }
    }
}

function AddEvent(el, evname, func) {
    if (document.all) {
        el.attachEvent("on" + evname, func);
    } else {
        el.addEventListener(evname, func, true);
    }
};

function OnOk() {
    SaveMarkers();
}
