/*
 * Google map with Ext.
 * v. 1.01 (added panoramio)
 * v. 1.02 (added labeled marker) Viene utilizzato il CSS ".LabeledMarker_markerLabel" per scrivere la label
 * v. 1.03 (bug fixing, more tags and utility functions)
 * v. 1.04 (bug fixing)
 * v. 1.05 (added new geotag, popid to indicate the id of an dom object (mainly for an icon in the resultset)
 */


var ectrlMap, ectrlGDir;
var to_htmls = [];
var from_htmls = [];
var gmarkers = [];
var htmls = [];
var i = 0;

// create a base icon for all of our markers that specifies the shadow, icon dimensions, etc.
// see example: http://probonomap.bc.ca/global/google_maps.js
var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
//baseIcon.iconSize = new GSize(20, 34);
baseIcon.iconSize = new GSize(30, 42);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);

// functions that open the directions forms
function tohere(i) {
    gmarkers[i].openInfoWindowHtml(to_htmls[i]);
}
function fromhere(i) {
    gmarkers[i].openInfoWindowHtml(from_htmls[i]);
}

var GoogleMap = function() {

    return {
        show: function(mapid, lat, lng, zoom, options) {
            var bounds = new GLatLngBounds();

            // If we aren't supported, we're done
            if (!window.GBrowserIsCompatible || !GBrowserIsCompatible())
                return this;

            // Default values make for easy debugging
            if (lat == null) lat = 37.4419;
            if (lng == null) lng = -122.1419;
            if (!zoom) zoom = 13;

            // Sanitize options
            if (!options || typeof options != 'object')
                options = {};
            options.mapOptions = options.mapOptions || {};
            options.markers = options.markers || [];
            options.controls = options.controls || {};

            // Create a ectrlMap

            var elMapId = document.getElementById(mapid);

            if (elMapId) {

                ectrlMap = new GMap2(elMapId, options.mapOptions);

                ectrlMap.enableDoubleClickZoom();
                ectrlMap.disableScrollWheelZoom();
                ectrlMap.addMapType(G_PHYSICAL_MAP);
                ectrlMap.addMapType(G_SATELLITE_3D_MAP); // --> Funziona abbastanza bene

                ectrlMap.addControl(new PanoControl());

                // Center and zoom the ectrlMap
                //ectrlMap.setCenter(new GLatLng(lat, lng), zoom, G_PHYSICAL_MAP ); --> For the default (Phisical Maps)
                ectrlMap.setCenter(new GLatLng(lat, lng), zoom);

                // Add controls to our ectrlMap
                for (var i = 0; i < options.controls.length; i++) {
                    var c = options.controls[i];
                    eval("ectrlMap.addControl(new " + c + "());");
                }

                // If we have markers, put them on the ectrlMap
                var marker = null;
                var doReposition = false;
                ectrlMap.clearOverlays();
                options.markers.each(function(m, obj, idx) {
                    if (marker = this.marker(m))  {
                        doReposition = true;
                        ectrlMap.addOverlay(marker);
                        bounds.extend(marker.getPoint());
                    }
                }, this);

                // Set zoom and center using bounds
                if (doReposition == true) {
                    var calcZoom = ectrlMap.getBoundsZoomLevel(bounds)-1;
                    if (calcZoom > 12) {
                        calcZoom = 12
                    };
                    //alert(calcZoom);
                    ectrlMap.setZoom(calcZoom);
                    ectrlMap.setCenter(bounds.getCenter());
                }

                ectrlGDir = new GDirections(ectrlMap, null);
            }

        },
        refresh: function(mapid, lat, lng, zoom, options) {
            var bounds = new GLatLngBounds();

            // If we aren't supported, we're done
            if (!window.GBrowserIsCompatible || !GBrowserIsCompatible())
                return this;

            // If we have markers, put them on the ectrlMap
            var marker = null;
            var doReposition = false;
            ectrlMap.clearOverlays();

            options.markers.each(function(m, obj, idx) {
                if (marker = this.marker(m))  {
                    doReposition = true;
                    ectrlMap.addOverlay(marker);
                    bounds.extend(marker.getPoint());
                }
            }, this);

            // Set zoom and center using bounds
            try {
                if (doReposition == true) {
                    var calcZoom = ectrlMap.getBoundsZoomLevel(bounds)-1;
                    if (calcZoom > 12) {
                        calcZoom = 12
                    };
                    //alert(calcZoom);
                    ectrlMap.setZoom(calcZoom);
                    ectrlMap.setCenter(bounds.getCenter());
                }

            } catch(e) {
                alert("Reposition: " + e.name + ". " + e.message);
            }

        },

        setdirections: function(fromAddress, toAddress, locale) {
            if (ectrlGDir == null) ectrlGDir = new GDirections(ectrlMap, null);

            ectrlGDir.load("from: " + fromAddress + " to: " + toAddress, {
                "locale": locale
            });
        },

        marker: function(m) {
            if (!m) {
                return null;
            } else if (m.lat == null && m.lng == null) {
                return this.marker(this.readFromGeo(m));
            } else {
                if ((m.lat > 0) && (m.lng > 0)) {


                    var latlng = new GLatLng(m.lat, m.lng);

                    var icon = new GIcon(baseIcon);

                    if (m.micon != '') {
                        icon.image = m.micon;
                    } else {
                        icon.image = "/gmap/images/marker_localita.png";
                    }

                    var hoffset = -1;

                    if (m.mlabel.length > 1) {
                        hoffset = -6;
                    }

                    opts = {
                        "icon": icon,
                        "clickable": true,
                        "labelText": m.mlabel,
                        "labelOffset": new GSize(hoffset, -32)
                    };
                    var marker = new LabeledMarker(latlng, opts);

                    var html = "";

                    if (m.pophtml != '') {
                        var myDiv = document.getElementById(m.pophtml);
                        if (myDiv) {
                            html = myDiv.innerHTML;
                        }
                    } else {
                        if (m.txt) {
                            html = "<div><b>"+m.txt+"</b><br/>"+
                            "<img border=\"0\" src=\""+m.imgurl+"\"><br/>" +
                            "<a href=\"" + m.tpdetail + "\">...</a></div>";
                        }
                    }

                    // The info window version with the "to here" form open
                    if (m.routedesc != '') {
                        to_htmls[i] = html + '<br>'+m.routedesc+': <b>'+m.routetohere+'</b> - <a href="javascript:fromhere(' + i + ')">'+m.routefromhere+'</a>' +
                        '<br>'+m.routeaddressfrom+':<form action="javascript:getDirections()">' +
                        '<input type="text" SIZE=40 MAXLENGTH=40 name="saddr" id="saddr" value="" /><br>' +
                        '<INPUT value="Vai" TYPE="SUBMIT">' +
                        '<input type="hidden" id="daddr" value="'+name+"@"+ m.lat + ',' + m.lng +
                        '"/>';
                        // The info window version with the "to here" form open
                        from_htmls[i] = html + '<br>'+m.routedesc+': <a href="javascript:tohere(' + i + ')">'+m.routetohere+'</a> - <b>'+m.routefromhere+'</b>' +
                        '<br>'+m.routeaddressto+':<form action="javascript:getDirections()">' +
                        '<input type="text" SIZE=40 MAXLENGTH=40 name="daddr" id="daddr" value="" /><br>' +
                        '<INPUT value="Vai" TYPE="SUBMIT">' +
                        '<input type="hidden" id="saddr" value="'+name+"@"+ m.lat + ',' + m.lng +
                        '"/>';
                        // The inactive version of the direction info
                        html = html + '<br>Ottieni indicazioni stradali: <a href="javascript:tohere('+i+')">A qui</a> - <a href="javascript:fromhere('+i+')">Da qui</a>';
                    }
                    GEvent.addListener(marker, "click", function() {
                        marker.openInfoWindowHtml(html);
                    });

                    // Used when clicking on an external dom element (e.g. marker icon outside the map)
                    if (m.popid != '') {
                        jQuery("#"+m.popid).click(function () {
                            GEvent.trigger(marker,"click");
                        });
                    }

                    gmarkers[i] = marker;
                    htmls[i] = html;

                    i++;

                    return marker;
                } else {
                    return null;
                }
            }
        },
        readFromGeo: function(elem) {
            var latElem = elem.select(".latitude").first();
            var lngElem = elem.select(".longitude").first();

            // pid
            var pidValue = '';
            var pidElem = elem.select(".pid").first();
            if (pidElem) {
                pidValue=pidElem.dom.getAttribute("title");
            }

            // imgurl
            var imgurlValue = '';
            var imgurlElem = elem.select(".imgurl").first();
            if (imgurlElem) {
                imgurlValue=imgurlElem.dom.getAttribute("title");
            }

            // tpadd
            var tpaddValue = '';
            var tpaddElem = elem.select(".tpadd").first();
            if (tpaddElem) {
                tpaddValue=tpaddElem.dom.getAttribute("title");
            }

            // tpadd_label
            var tpaddlabValue = '';
            var tpaddlabElem = elem.select(".tpadd_label").first();
            if (tpaddlabElem) {
                tpaddlabValue=tpaddlabElem.dom.getAttribute("title");
            }

            // tpdetail
            var tpdetailValue = '';
            var tpdetailElem = elem.select(".tpdetail").first();
            if (tpdetailElem) {
                tpdetailValue=tpdetailElem.dom.getAttribute("title");
            }

            var kmlElem = elem.select(".kml").first();

            // mlabel
            var mlabelValue = '';
            var mlabelElem = elem.select(".mlabel").first();
            if (mlabelElem) {
                mlabelValue = mlabelElem.dom.getAttribute("title");
            }

            // micon
            var miconValue = '';
            var miconElem = elem.select(".micon").first();
            if (miconElem) {
                miconValue = miconElem.dom.getAttribute("title");
            }

            // pophtml
            var pophtmlValue = '';
            var pophtmlElem = elem.select(".pophtml").first();
            if (pophtmlElem) {
                pophtmlValue = pophtmlElem.dom.getAttribute("title");
            }

            // popid (div id for open this marker)
            var popidValue = '';
            var popidElem = elem.select(".popid").first();
            if (popidElem) {
                popidValue = popidElem.dom.getAttribute("title");
            }

            // routedesc
            var routedescValue = '';         // Ottieni indicazioni stradali
            var routedescElem = elem.select(".routedesc").first();
            if (routedescElem) routedescValue = routedescElem.dom.getAttribute("title");

            // routetohere
            var routetohereValue = '';       // A qui
            var routetohereElem = elem.select(".routetohere").first();
            if (routetohereElem) routetohereValue = routetohereElem.dom.getAttribute("title");

            // routefromhere
            var routefromhereValue = '';     // Da qui
            var routefromhereElem = elem.select(".routefromhere").first();
            if (routefromhereElem) routefromhereValue = routefromhereElem.dom.getAttribute("title");

            // routeaddressfrom
            var routeaddressfromValue = '';  // Indirizzo di partenza
            var routeaddressfromElem = elem.select(".routeaddressfrom").first();
            if (routeaddressfromElem) routeaddressfromValue = routeaddressfromElem.dom.getAttribute("title");

            // routeaddressto
            var routeaddresstoValue = '';    // Indirizzo di arrivo
            var routeaddresstoElem = elem.select(".routeaddressto").first();
            if (routeaddresstoElem) routeaddresstoValue = routeaddresstoElem.dom.getAttribute("title");
            // -- Route END of definitions
            if (kmlElem) {
                var gx = new GGeoXml(kmlElem.dom.getAttribute("title"));
                ectrlMap.addOverlay(gx);
            }
            if (latElem && lngElem) {
                if (parseFloat(latElem.dom.getAttribute("title")) > 0) {
                    return {
                        lat:parseFloat(latElem.dom.getAttribute("title")),
                        lng:parseFloat(lngElem.dom.getAttribute("title")),
                        txt:elem.dom.getAttribute("title"),
                        pid:pidValue,
                        imgurl:imgurlValue,
                        tpadd:tpaddValue,
                        tpadd_label:tpaddlabValue,
                        tpdetail:tpdetailValue,
                        mlabel:mlabelValue,
                        micon:miconValue,
                        pophtml:pophtmlValue,
                        popid:popidValue,
                        routedesc:routedescValue,
                        routetohere:routetohereValue,
                        routefromhere:routefromhereValue,
                        routeaddressfrom:routeaddressfromValue,
                        routeaddressto:routeaddresstoValue

                    }
                } else {
                    return null;
                }

            } else if (kmlElem) {
                var gx = new GGeoXml(kmlElem.dom.getAttribute("title"));
                ectrlMap.addOverlay(gx);
                return null;
            } else {
                return null;
            }
        }
    };
}();

// GMaps Layers

var layers = new Array();

function addGeoObject(id, url, visible) {

    var bFound = false;
    var geoxml;

    if (layers.length > 0) {
        for(var idx in layers) {
            if (layers[idx].id == id) {
                bFound = true;
                geoxml = layers[idx].geoxml;
            }
        }
    }

    if (!bFound) {
        geoxml = new GGeoXml(url, function() {
            //alert("Loaded: " + geoxml.hasLoaded());
            if (geoxml.loadedCorrectly()) {
            // geoxml.gotoDefaultViewport(ectrlMap);
            } else {
                alert("Not Load Properly");
            }
        });

        var newGeoObj = new Object;
        newGeoObj.id = id;
        newGeoObj.url = url;
        newGeoObj.geoxml = geoxml;
        layers.push(newGeoObj);
    }

    if (visible == true) {
        ectrlMap.addOverlay(geoxml);
    } else {
        ectrlMap.removeOverlay(geoxml);
    }

}

// ===== request the directions =====
function getDirections() {
    var saddr = document.getElementById("saddr").value
    var daddr = document.getElementById("daddr").value
    ectrlGDir.load("from: "+saddr+" to: "+daddr);
}

// ===== show and hide map =====

function showGMap(mapcontainer, geoid){
    gmapHideElement("gmap-hidden");
    gmapShowElement("gmap-shown");
    gmapShowElement(mapcontainer);
    refreshGMapGeo(geoid);
}

function hideGMap(mapcontainer){
    gmapShowElement("gmap-hidden");
    gmapHideElement("gmap-shown");
    gmapHideElement(mapcontainer);
}

function refreshGMapGeo(geoid) {
    if (ectrlMap){
        GoogleMap.refresh('map', 46.14749156542368, 11.1016845703125, 8, {
            controls: ["GLargeMapControl", "GMapTypeControl", "GOverviewMapControl"],
            markers: Ext.select(geoid)
        });
    } else {
        GoogleMap.show('map', 46.14749156542368, 11.1016845703125, 8, {
            controls: ["GLargeMapControl", "GMapTypeControl", "GOverviewMapControl"],
            markers: Ext.select(geoid)
        });
    }
}

function setGMapCenterAndZoom(latitude, longitude, zoom) {
    if (ectrlMap){
        var newCenter = new GLatLng(latitude, longitude);
        ectrlMap.setCenter(newCenter, zoom);
    }
}

function gmapShowElement(id) {
    document.getElementById(id).style.display = 'block';
}

function gmapHideElement(id) {
    document.getElementById(id).style.display = 'none';
}
