var G_GMAP2_MARKS = {};

var defaultLongitude = null;
var defaultLatitude = null;

function getMapMark(key) {
    return G_GMAP2_MARKS[key];
}

function setMapMark(key, mark) {
    G_GMAP2_MARKS[key] = mark;
}

function createGIcon(imageURL) {
    var icon = new GIcon(G_DEFAULT_ICON);

    icon.image = imageURL;
    icon.iconSize = new GSize(20, 32);
    icon.iconAnchor = new GPoint(9, 34);

    return icon;
}

function trim(string) {
    if(string == null) {
        return null;
    } else {
        return string.replace(/(^\s*)|(\s*$)/g, "");
    }
}

function createXMLDOM(text) {
    var dom = null;

    try {
        dom = new ActiveXObject("Microsoft.XMLDOM");

        dom.async = "false";
        dom.loadXML(text);
    } catch(e) {
        try {
            dom = new DOMParser().parseFromString(text, "application/xml");
        } catch(e) {
            dom = null;
        }
    }

    return dom;
}

function createXMLHttpRequest() {
    var request = null;

    if(window.XMLHttpRequest) {
        request = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
            }
        }
    }

    return request;
}

function getNodeValue(xml, name) {
    var elements = xml.getElementsByTagName(name);

    if(elements.length > 0) {
        var node = elements[0];

        if(node.childNodes.length > 0) {
            return trim(node.childNodes[0].nodeValue);
        }
    }

    return null;
}

function getNodeValues(xml, name) {
    var values = new Array(0);

    var elements = xml.getElementsByTagName(name);

    if(elements.length > 0) {
        for(var i = 0, x = 0; i < elements.length; i++) {
            var node = elements[i];

            if(node.childNodes.length > 0) {
                var value = trim(node.childNodes[0].nodeValue);

                if(value != "") {
                    values[x] = value;
                    x++;
                }
            }
        }
    }

    return values;
}

function doHttpRequest(url, parameters, handler, preprocessor) {
    var request = createXMLHttpRequest();

    if(request == null) {
        alert("Your browser does not support XMLHTTP.");
        return;
    }

    request.open("POST", url, true);
    request.setRequestHeader("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
    request.onreadystatechange = function() {
        if(request.readyState == 4) {
            if(preprocessor) {
                preprocessor();
            }

            if(request.status == 200) {
                var xml = null;

                if(request.responseText) {
                    xml = createXMLDOM(request.responseText);
                } else if(request.responseXML) {
                    xml = request.responseXML;
                }

                if(xml == null) {
                    alert("Your browser does not support XMLDOM.");
                    return;
                }

                if(handler) {
                    handler(xml);
                }
            } else {
                alert("There was a problem with the request. (Code: " + request.status + ")");
            }
        }
    }
    request.send(parameters);
}

function responseHandler(xml) {
    var elements = xml.getElementsByTagName("point");

    var message_div = document.getElementById("google_map_message");

    if(elements.length == 0) {
        message_div.innerHTML = "<font color='red'>" + JSlang.THERE_ARE_NO_DISTRIBUTOR_OL + "</font>";

        return;
    } else {
        message_div.innerHTML = "";
    }

    for(var i = 0; i < elements.length; i++) {
        var longitude = getNodeValue(elements[i], "longitude");
        var latitude = getNodeValue(elements[i], "latitude");
        var title = getNodeValue(elements[i], "title");
        var address = getNodeValue(elements[i], "address");

        var key = longitude + "+" + latitude;

        if(getMapMark(key) == null) {
            setMapMark(key, addGMarker(longitude, latitude, title, address));
        }
    }
}

function addGMarker(longitude, latitude, title, address) {
    var html = title + "<br>" + address;
    var point = new GLatLng(latitude, longitude);

    if(longitude == defaultLongitude && latitude == defaultLatitude) {
        var marker = new GMarker(point, {icon: createGIcon("images/purple-dot.png")});
    } else {
        var marker = new GMarker(point, {icon: createGIcon("images/blue-dot.png")});
    }

    GEvent.addListener(marker, "click", function() {
	document.getElementById("google_map_message").innerHTML = title + " : " + address;
    });

    map.addOverlay(marker);

    return marker;
}

