//<![CDATA[
var MMM_GMAPS_MAXIMAZEDCANVA = 'gmaps_canvas';
var MMM_GMAPS_ROUTECANVA = 'gmaps_route';
var MMM_GMAPS_ROUTEOPIONS = 'gmaps_info_route_content';
var MMM_GMAPS_CHOICELIST = 'gmaps_choice_list';
var Gmaps_ClientGeocoder;
var Gmaps_Directions;
var Gmaps_BrowserIsCompatible;

var GmapsProvider =
{
    Maps: new Array(),
    Loader: new Array(),
    ApiKey: null,
    CallBack: new Array(),
    AddMap: function(id, canva, address, name, image, draggable, coordsTarget, savePositionButton, mapOption)
    {
        GmapsProvider.Loader.push(
            {
                Id: id,
                Canva: canva,
                Address: address,
                Name: name,
                Image: image,
                Draggable: draggable,
                CoordsTarget: coordsTarget,
                SavePositionButton: savePositionButton,
                MapOption: mapOption
            });
    },
    GetMap: function(id)
    {
        return this.Maps[id];
    },
    Load: function(apiKey)
    {
        GmapsProvider.ApiKey = apiKey;
        google.load("maps", "2.x", { "callback": GmapsProvider.LoadCallBack });
    },
    LoadCallBack: function()
    {
        try
        {
            var script = document.createElement("script");
            script.src = "http://www.google.com/uds/solutions/localsearch/gmlocalsearch.js?key=" + GmapsProvider.ApiKey;
            script.type = "text/javascript";
            document.getElementsByTagName("head")[0].appendChild(script);

            GmapsManager.ZoomMap = new GMap2($(MMM_GMAPS_MAXIMAZEDCANVA));
            Gmaps_ClientGeocoder = new GClientGeocoder();
            Gmaps_BrowserIsCompatible = GBrowserIsCompatible();

            GmapsProvider.Maps = new Array();

            for (var i = 0; i < GmapsProvider.Loader.length; ++i)
            {
                GmapsProvider.Maps[GmapsProvider.Loader[i].Id] =
                new GmapsObject(GmapsProvider.Loader[i].Canva
                    , GmapsProvider.Loader[i].Address
                    , GmapsProvider.Loader[i].Name
                    , GmapsProvider.Loader[i].Image
                    , GmapsProvider.Loader[i].Draggable
                    , GmapsProvider.Loader[i].CoordsTarget
                    , GmapsProvider.Loader[i].SavePositionButton
                    , GmapsProvider.Loader[i].MapOption);
            }

            for (var i = 0; i < GmapsProvider.CallBack.length; ++i)
                GmapsProvider.CallBack[i]();
        }
        catch (err) { }
    }
}

var GmapsObject = function(canva, address, name, image, draggable, coordsTarget, savePositionButton, mapOption)
{
    this.minimizedCanva = canva;
    this.address = address;
    this.originalAddress = address;
    this.name = name;
    this.image = image;
    this.map = null;
    this.draggable = draggable;
    this.coordsTarget = coordsTarget;
    this.savePositionButton = savePositionButton;
    this.mapOption = mapOption;
    this.coordinates = Array();

    this.Init = function()
    {
        try
        {
            this.map = new GMap2($(this.minimizedCanva));
            this.map.addControl(new GSmallMapControl());

            var $this = this;
            Gmaps_ClientGeocoder.getLocations(this.address, function(response)
            {
                $this.map.clearOverlays();
                if (!response || response.Status.code != G_GEO_SUCCESS)
                {
                    //alert(MMM_GMAPS_ERRORMESSAGE);
                }
                else
                {
                    var place = response.Placemark[0];
                    var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                    if ($this.mapOption == null)
                    {
                        $this.map.setCenter(point);
                        $this.map.setZoom(15);
                    }
                    else
                    {
                        point = new GLatLng($this.mapOption.Coordinates[1], $this.mapOption.Coordinates[0]);
                        $this.map.setCenter(point);
                        $this.map.setZoom($this.mapOption.Zoom);
                    }
                    var marker = new GMarker(point, { draggable: $this.draggable });

                    if ($this.draggable)
                    {
                        GEvent.addListener($this.map, 'mouseover', function()
                        {
                            $('gmapsMarkerTooltip_' + $this.minimizedCanva).style.visibility = 'visible';
                        });
                        GEvent.addListener($this.map, 'mouseout', function()
                        {
                            $('gmapsMarkerTooltip_' + $this.minimizedCanva).style.visibility = 'hidden';
                        });
                        GEvent.addListener(marker, "dragend", function()
                        {
                            $this.coordinates[1] = marker.getLatLng().lat();
                            $this.coordinates[0] = marker.getLatLng().lng();
                            $this.map.setCenter(marker.getLatLng());
                            $($this.coordsTarget).value = '{Coordinates: [' + $this.coordinates[0] + ', ' + $this.coordinates[1] + '], Zoom: ' + $this.map.getZoom() + '}';
                            $($this.savePositionButton).style.visibility = 'visible';
                        });
                    }

                    $this.map.addOverlay(marker);
                }
            });
        }
        catch (err) { }
    }
    this.ShowLocation = function(address)
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            var $this = this;
            geocoder.getLocations(address, function(response)
            {
                this.map.clearOverlays();
                if (!response || response.Status.code != 200)
                {
                    //alert(errorMessage);
                }
                else
                {
                    place = response.Placemark[0];

                    var html = HtmlMapWindow(place);

                    point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
                    marker = new GMarker(point);
                    GEvent.addListener(marker, "click", function()
                    {
                        $this.map.openInfoWindowHtml(point, html);
                    });

                    $this.map.addOverlay(marker);
                    $this.map.setCenter(point);
                    $this.map.setZoom(15);
                    $this.map.openInfoWindowHtml(point, html);
                }
            });
        }
        catch (err) { }
    }

    this.Init();
}

var GmapsManager =
{
    CurrentMap: null,
    ZoomMap: null,
    RouteDirection: 'to',
    DisplayMethod: 'map',
    RouteFrom: null,
    RouteTo: null,
    Zoom: function(map)
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            GmapsManager.CurrentMap = map;
            ClearElement($(MMM_GMAPS_CHOICELIST));
            $(MMM_GMAPS_ROUTECANVA).style.display = "none";
            $(MMM_GMAPS_PRINTID).style.display = "none";

            GmapsManager.ZoomMap = new GMap2($(MMM_GMAPS_MAXIMAZEDCANVA));
            GmapsManager.ZoomMap.setUIToDefault();

            GmapsManager.ZoomMap.removeMapType(G_SATELLITE_MAP);
            GmapsManager.ZoomMap.removeMapType(G_HYBRID_MAP);
            GmapsManager.ZoomMap.removeMapType(G_PHYSICAL_MAP);
            GmapsManager.ZoomMap.removeMapType(G_NORMAL_MAP);

            GmapsManager.ZoomMap.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10, 20)));
            Gmaps_ClientGeocoder.getLocations(GmapsManager.CurrentMap.address, GmapsManager.AddAddressToMap);

            $('GmapsTitle').innerHTML = GmapsManager.CurrentMap.name;

            MMM_Popup.Show('GMaps');

            GmapsManager.PrepareRoute('to');
        }
        catch (err) { }
    },
    LoadPrintable: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        GmapsManager.ZoomMap = new GMap2($(MMM_GMAPS_MAXIMAZEDCANVA));
    },
    AddAddressToMap: function(response)
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        GmapsManager.ZoomMap.clearOverlays();
        if (!response || response.Status.code != G_GEO_SUCCESS)
        {
            //alert(MMM_GMAPS_ERRORMESSAGE);
        }
        else
        {
            if (response.Placemark.length == 0)
            {
                alert(MMM_GMAPS_UNKNOWNADDRESS);
                return;
            }

            if (response.Placemark.length > 1)
                GmapsManager.ShowSelection(response);

            GmapsManager.ShowAddress(response.Placemark[0]);
        }
    },
    ShowAddress: function(place)
    {
        try
        {
            var html = GmapsManager.HtmlMapWindow(place);
            var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
            if (GmapsManager.CurrentMap.mapOption == null)
            {
                GmapsManager.ZoomMap.setCenter(point);
                GmapsManager.ZoomMap.setZoom(15);
            }
            else
            {
                point = new GLatLng(GmapsManager.CurrentMap.mapOption.Coordinates[1], GmapsManager.CurrentMap.mapOption.Coordinates[0]);
                GmapsManager.ZoomMap.setCenter(point);
                GmapsManager.ZoomMap.setZoom(GmapsManager.CurrentMap.mapOption.Zoom);
            }

            var marker = new GMarker(point);
            GEvent.addListener(marker, "click", function()
            {
                GmapsManager.ZoomMap.openInfoWindowHtml(point, html);
            });
            GmapsManager.ZoomMap.addOverlay(marker);
            GmapsManager.ZoomMap.openInfoWindowHtml(point, html);
        }
        catch (err) { }
    },
    ShowSelection: function(response)
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            ClearElement($(MMM_GMAPS_CHOICELIST));
            for (i = 0; i < response.Placemark.length; ++i)
            {
                var liElement = document.createElement('li');
                liElement.innerHTML = response.Placemark[i].address;
                liElement.onclick = function()
                {
                    GmapsManager.CurrentMap.address = arguments.callee.Placemark.address;
                    GmapsManager.ShowAddress(arguments.callee.Placemark);
                    for (i = 0; i < this.parentNode.childNodes.length; ++i)
                        this.parentNode.childNodes[i].className = '';
                    this.className = 'selected';
                };
                liElement.onclick.Placemark = response.Placemark[i];
                if (i == 0)
                    liElement.className = 'selected';
                $(MMM_GMAPS_CHOICELIST).appendChild(liElement);
            }
            $(MMM_GMAPS_CHOICELIST).parentNode.style.display = "block";
        }
        catch (err) { }
    },
    HtmlMapWindow: function(place)
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        var tpl = '<table cellpadding="0" cellspacing="2" border="0" class="gmaps_info_window">';
        tpl += '<tr>';
        tpl += '<td colspan="2"><strong>' + GmapsManager.CurrentMap.name + '</strong></td>';
        tpl += '</tr>';
        tpl += '<tr>';
        if (GmapsManager.CurrentMap.image != '')
            tpl += '<td style="height:80px;"><img src="' + GmapsManager.CurrentMap.image + '" align="left" /></td>';
        else
            tpl += '<td>&nbsp;</td>';
        tpl += '<td>'
        if (place.AddressDetails.Country.AdministrativeArea)
        {
            if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea)
            {
                tpl += place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                tpl += "<br />" + place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
                tpl += ", " + place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName + ", ";
            }
            else
            {
                tpl += place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName + ", ";
            }
        }
        tpl += place.AddressDetails.Country.CountryName;
        tpl += '</td>';
        tpl += '</tr>';
        tpl += '<tr>';
        tpl += '<td colspan="2" class="options"><br />';
        tpl += '<a href="javascript:GmapsManager.PrepareRoute(\'from\');">' + MMM_GMAPS_ROUTEFROMIMAGE + '</a>&nbsp;';
        tpl += '&nbsp;<a href="javascript:GmapsManager.PrepareRoute(\'to\');">' + MMM_GMAPS_ROUTETOIMAGE + '</a>';
        tpl += '</td>';
        tpl += '</tr>';
        tpl += '</table>';
        return tpl;
    },
    ClosePopup: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        MMM_Popup.Hide('GMaps');
        GmapsManager.displayMethod = 'map';
        GmapsManager.CurrentMap.address = GmapsManager.CurrentMap.originalAddress;
        ClearElement($(MMM_GMAPS_ROUTECANVA));
        $('route_from').value = '';
        $('route_to').value = '';
        GmapsManager.CurrentMap = null;
    },
    PrepareRoute: function(_routeDirection)
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            GmapsManager.RouteDirection = _routeDirection;
            GmapsManager.DisplayMethod = 'route';

            if (GmapsManager.RouteDirection == 'to')
            {
                GmapsManager.RouteFrom = '';
                GmapsManager.RouteTo = GmapsManager.CurrentMap.address;
            }
            else
            {
                GmapsManager.RouteFrom = GmapsManager.CurrentMap.address;
                GmapsManager.RouteTo = '';
            }
            $('route_from').value = GmapsManager.RouteFrom;
            $('route_to').value = GmapsManager.RouteTo;
            $(MMM_GMAPS_CHOICELIST).parentNode.style.display = "none";
            $(MMM_GMAPS_ROUTEOPIONS).style.display = "block";
        }
        catch (err) { }
    },
    CalculRoute: function()
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            GmapsManager.RouteFrom = $('route_from').value;
            GmapsManager.RouteTo = $('route_to').value;

            GmapsManager.ZoomMap.clearOverlays();
            ClearElement($(MMM_GMAPS_ROUTECANVA));

            Gmaps_Directions = new GDirections(GmapsManager.ZoomMap, $(MMM_GMAPS_ROUTECANVA));

            GEvent.addListener(Gmaps_Directions, "error", GmapsManager.HandleErrors);
            Gmaps_Directions.load("from: " + GmapsManager.RouteFrom + " to: " + GmapsManager.RouteTo);

            //var finder = new RegExp(" ", "g");
            //var from = GmapsManager.RouteFrom.replace(finder, "+");
            //var to = GmapsManager.RouteTo.replace(finder, "+");
            //var rdv = GmapsManager.CurrentMap.name.replace(finder, "+");

            var from = encodeURIComponent(GmapsManager.RouteFrom);
            var to = encodeURIComponent(GmapsManager.RouteTo);
            var rdv = encodeURIComponent(GmapsManager.CurrentMap.name);

            var link = MMM_GMAPS_PRINTLINK.replace(/\[\[FROM\]\]/, from);
            link = link.replace(/\[\[TO\]\]/, to);
            link = link.replace(/\[\[RDV\]\]/, rdv);

            $(MMM_GMAPS_PRINTID).style.display = "inline";
            $(MMM_GMAPS_PRINTID).href = link;
            $(MMM_GMAPS_ROUTECANVA).style.display = "block";

        }
        catch (err) { }
    },
    HandleErrors: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        if (Gmaps_Directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
            GmapsManager.ShowRouteSelection();
        else if (Gmaps_Directions.getStatus().code == G_GEO_SERVER_ERROR)
            alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + Gmaps_Directions.getStatus().code);
        else if (Gmaps_Directions.getStatus().code == G_GEO_MISSING_QUERY)
            alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + Gmaps_Directions.getStatus().code);
        else if (Gmaps_Directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
            alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + Gmaps_Directions.getStatus().code);
        else if (Gmaps_Directions.getStatus().code == G_GEO_BAD_KEY)
            alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + Gmaps_Directions.getStatus().code);
        else if (Gmaps_Directions.getStatus().code == G_GEO_BAD_REQUEST)
            alert("A directions request could not be successfully parsed.\n Error code: " + Gmaps_Directions.getStatus().code);
        else
            alert("An unknown error occurred.");
    },
    ShowRouteSelection: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        if (GmapsManager.RouteDirection == 'to')
            Gmaps_ClientGeocoder.getLocations(GmapsManager.RouteFrom, GmapsManager.ShowRouteSelectionChoice);
        else
            Gmaps_ClientGeocoder.getLocations(GmapsManager.RouteTo, GmapsManager.ShowRouteSelectionChoice);
    },
    ShowRouteSelectionChoice: function(response)
    {
        try
        {
            if (!Gmaps_BrowserIsCompatible)
                return;

            GmapsManager.CurrentMap.map.clearOverlays();
            if (!response || response.Status.code != G_GEO_SUCCESS)
            {
                alert(errorMessage);
            }
            else
            {
                ClearElement($(MMM_GMAPS_CHOICELIST));
                for (i = 0; i < response.Placemark.length; ++i)
                {
                    var liElement = document.createElement('li');
                    liElement.innerHTML = response.Placemark[i].address;
                    liElement.onclick = function()
                    {
                        if (GmapsManager.RouteDirection == 'from')
                        {
                            $('route_to').value = this.innerHTML;
                            $('route_from').value = GmapsManager.CurrentMap.address;
                        }
                        else
                        {
                            $('route_from').value = this.innerHTML;
                            $('route_to').value = GmapsManager.CurrentMap.address;
                        }
                        GmapsManager.CalculRoute();
                        ClearElement($(MMM_GMAPS_CHOICELIST));
                        $(MMM_GMAPS_CHOICELIST).parentNode.style.display = "none";
                    };
                    $(MMM_GMAPS_CHOICELIST).appendChild(liElement);
                }
                $(MMM_GMAPS_CHOICELIST).parentNode.style.display = "block";
            }
        }
        catch (err) { }
    },
    InvertRoute: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        var tmp = $('route_from').value;
        $('route_from').value = $('route_to').value;
        $('route_to').value = tmp;

        GmapsManager.CalculRoute()
    },
    Print: function()
    {
        if (!Gmaps_BrowserIsCompatible)
            return;

        var url = 'http://maps.google.com/maps';
        if (GmapsManager.DisplayMethod == "route")
        {
            url += '?saddr=' + GmapsManager.RouteFrom.replace(/ /, "+");
            url += '&daddr=' + GmapsManager.RouteTo.replace(/ /, "+");
        }
        else
        {
            url += "?q=" + GmapsManager.CurrentMap.address.replace(/ /, "+");
        }
        url += '&hl=' + MMM_USERLANGAGE;
        url += '&ie=UTF8';
        url += '&layer=c';
        url += '&pw=2';

        window.open(url);
    }
}
//]]>
