﻿var overlay = null;
function initMap(kml) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map_canvas"));
        var docElem = kml.documentElement;
        var italy = getNodeByIDs(['Italy'], docElem);
        var marker = null;
        var coordinates = null;
        var title = null;
        var street = null;
        var streetnum = null;
        var phone = null;
        var email = null;
        var placemarks = kml.getElementsByTagName('Placemark');
        var coordinatesNode = null;
        map.setUIToDefault();
        for (var i = 0; i < placemarks.length; i++) {
            coordinatesNode = placemarks[i].getElementsByTagName('coordinates')[0];
            coordinates = getTagTextContent(coordinatesNode).split(",");
            marker = new GMarker(new GLatLng(0 + coordinates[1], 0 + coordinates[0]));
            title = getTagTextContent(placemarks[i].getElementsByTagName('name')[0]);
            street = placemarks[i].getAttribute('street');
            streetnum = placemarks[i].getAttribute('streetnum');
            phone = placemarks[i].getAttribute('phone');
            email = placemarks[i].getAttribute('email');
            marker.bindInfoWindowHtml(getBallonHtml(title, streetnum, street, phone, email));
            map.addOverlay(marker);
        }
    } else {
        alert("Map can not be loaded");
    }
}

function getTagTextContent(node) {
    if (node.textContent) {
        return node.textContent;
    } else {
        return node.text;
    }
}

function getBallonHtml(title, streetnum, street, phone, email) {
   var html = '<div style="color:black; font-size:12pt; font-weight:bold; margin-top:0.6em; text-align:left">' 
   html += title
   html += '</div>';
   html += '<div style="text-align:left; color:black;">';
   html += streetnum;
   html += '<br/>';
   html += street;
   html += '<br/>';
   html += phone && phone != '' ? 'Tel.: ' + phone + '<br/>' : '';
   html += email && email != '' ? 'Email: ' + email + '<br/>' : '';
   html += '</div>';
   return html

}

var kml = null;
function initSelector() {
    var italy = getNodeByIDs(['Italy']);
    centrateMapByNode(italy, 5);
    var val = null
    var jRegions = $(cc.regionsDdl);
    jRegions.removeOption(/./);
    jRegions.addOption('regions', 'Select Region', true);
    jRegions.bind('change', {"sender": cc.regionsDdl}, onSelectorChange);
    for (i = 0; i < italy.childNodes.length; i++) {
            val = italy.childNodes[i].getAttribute('id');
            jRegions.addOption(val, val, false);
    }
    var jProvinces = $(cc.provincesDdl);
    jProvinces.removeOption(/./);
    jProvinces.addOption('provinces', 'Select Province', true);
    jProvinces.bind('change', { "sender": cc.provincesDdl }, onSelectorChange);


    var jLocality = $(cc.localitiesDdl);
    jLocality.removeOption(/./);
    jLocality.addOption('localities', 'Select Locality', true);
    jLocality.bind('change', { "sender": cc.localitiesDdl }, onSelectorChange);
}

function getNodeByIDs(ids, startNode) {
    var node = null;
    if (startNode) {
        node = startNode;
    } else { 
        node = kml.documentElement;
    }
    for (i in ids) {
        node = getElementsByAttribute('id', ids[i], node)[0];
    }
    return node;
}

function centrateMapByNode(node, zoomLevel) {
    var lat = node.getAttribute('lat');
    var lng = node.getAttribute('long');
   
    map.setCenter(new GLatLng(lat, lng), zoomLevel);
}


function onSelectorChange(eventObj) {
    var italy = getNodeByIDs(['Italy'], kml.documentElement);
    
    var jRegions = $(cc.regionsDdl);
    var selectedRegionName = null;
    var selectedRegion = null;
    
    var jProvinces = $(cc.provincesDdl);
    var selectedProvinceName = null;
    var selectedProvince = null;
    
    var jLocalities = $(cc.localitiesDdl);
    var selectedLocalityName = null;
    var selectedLocality = null;
    switch (eventObj.data.sender) {
        case cc.regionsDdl:
            selectedRegionName = jRegions.selectedValues()[0];

            if (selectedRegionName == "regions") {
                jProvinces.removeOption(/./);
                jProvinces.addOption('provinces', 'Select Province', true);

                jLocalities.removeOption(/./);
                jLocalities.addOption('localities', 'Select Locality', true);
                centrateMapByNode(italy, 5);
                return;
            }


            selectedRegion = getNodeByIDs([selectedRegionName], italy);
            var provinces = [];
            var pc = 0;
            var province = null;
            for (pc; pc < selectedRegion.childNodes.length; pc++) {
                province = selectedRegion.childNodes[pc].getAttribute('id');
                provinces[province] = province;
            }
            jProvinces.removeOption(/./);
            if (pc > 1) {
                centrateMapByNode(selectedRegion, 7);
                jProvinces.addOption("provinces", "Select Province", true);
                jProvinces.addOption(provinces, false);
            } else {
                jProvinces.addOption(provinces, true);
            }
        case cc.provincesDdl:
            selectedProvinceName = jProvinces.selectedValues()[0];
            if (!selectedRegion) {
                selectedRegionName = jRegions.selectedValues()[0];
                selectedRegion = getNodeByIDs([selectedRegionName], italy);
            }

            if (selectedProvinceName == "provinces") {
                jLocalities.removeOption(/./);
                jLocalities.addOption('localities', 'Select Locality', true);
                centrateMapByNode(selectedRegion, 7);
                return;
            }

            selectedProvince = getNodeByIDs([selectedProvinceName], selectedRegion);
            var localities = [];
            var lc = 0;
            var localityName = null;
            for (lc; lc < selectedProvince.childNodes.length; lc++) {
                localityName = selectedProvince.childNodes[lc].getAttribute('id');
                localities[localityName] = localityName;
            }
            jLocalities.removeOption(/./);
            if (lc > 1) {
                centrateMapByNode(selectedProvince, 8);
                jLocalities.addOption("localities", "Select Locality", true);
                jLocalities.addOption(localities, false);
            } else {
                jLocalities.addOption(localities, true);
            }
        case cc.localitiesDdl:
            selectedLocalityName = jLocalities.selectedValues()[0];
            if (!selectedRegion) {
                selectedRegionName = jRegions.selectedValues()[0];
                selectedRegion = getNodeByIDs([selectedRegionName], italy);
            }

            if (!selectedProvince) {
                selectedProvinceName = jProvinces.selectedValues()[0];
                selectedProvince = getNodeByIDs([selectedProvinceName], selectedRegion);
            }

            if (selectedLocalityName == "localities") {
                centrateMapByNode(selectedProvince, 8);
                return;
            }

            selectedLocality = getNodeByIDs([selectedLocalityName], selectedProvince);
            centrateMapByNode(selectedLocality, 12);
            break;
    }
}

//function getProvinces(regionStr) {
//    var region = getNodeByIDs(['Italy', regionStr]);
//    var provinces = [];
//    for (j = 0; j < region.childNodes.length; j++) {
//        var province = region.childNodes[j].getAttribute('id');
//        provinces[j] = province;
//    }
//    return provinces;
//}


function getElementsByAttribute(the_attribute, the_value, the_node) {
    if (the_node == null)
        the_node = document;
    var node_tags = the_node.getElementsByTagName('*');
    var results = new Array();
    for (i = 0, j = 0; i < node_tags.length; i++) {
        var attrVal = node_tags[i].getAttribute(the_attribute);
        if (attrVal == the_value) {
            results[j] = node_tags[i];
            j++;
        }
    } 
    return results;
}

function getElementsByAttributeA(oElm, strTagName, strAttributeName, strAttributeValue) {
    var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    var oAttributeValue = (typeof strAttributeValue != "undefined") ? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
    var oCurrent;
    var oAttribute;
    for (var i = 0; i < arrElements.length; i++) {
        oCurrent = arrElements[i];
        oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
        if (typeof oAttribute == "string" && oAttribute.length > 0) {
            if (typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))) {
                arrReturnElements.push(oCurrent);
            }
        }
    }
    return arrReturnElements;
}


function AddListener(sender, eventName, fn) {
    eventName = (eventName.substring(0, 2) == 'on') ? eventName.substring(2) : eventName;
    if (document.addEventListener)
        sender.addEventListener(eventName, fn, false);
    else
        sender.attachEvent('on' + eventName, fn);
}

function newXmlDocument(rootTagName, namespaceURL) {
    if (!rootTagName) rootTagName = "";
    if (!namespaceURL) namespaceURL = "";

    if (document.implementation && document.implementation.createDocument) {
        // This is the W3C standard way to do it
        return document.implementation.createDocument(namespaceURL,
                       rootTagName, null);
    }
    else { // This is the IE way to do it
        // Create an empty document as an ActiveX object
        // If there is no root element, this is all we have to do
        var doc = new ActiveXObject("MSXML2.DOMDocument");

        // If there is a root tag, initialize the document
        if (rootTagName) {
            // Look for a namespace prefix
            var prefix = "";
            var tagname = rootTagName;
            var p = rootTagName.indexOf(':');
            if (p != -1) {
                prefix = rootTagName.substring(0, p);
                tagname = rootTagName.substring(p + 1);
            }

            // If we have a namespace, we must have a namespace prefix
            // If we don't have a namespace, we discard any prefix
            if (namespaceURL) {
                if (!prefix) prefix = "a0"; // What Firefox uses
            }
            else prefix = "";

            // Create the root element (with optional namespace) as a
            // string of text
            var text = "<" + (prefix ? (prefix + ":") : "") + tagname +
                (namespaceURL
                 ? (" xmlns:" + prefix + '="' + namespaceURL + '"')
                 : "") +
                "/>";
            // And parse that text into the empty document
            doc.loadXML(text);
        }
        return doc;
    }
};

function loadXml(url) {
    // Create a new document with the previously defined function
    var xmldoc = newXmlDocument();
    xmldoc.async = false;  // We want to load synchronously
    xmldoc.load(url);      // Load and parse
    return xmldoc;         // Return the document
}; 



