﻿/// <reference path="ThirdParty/jquery-1.2.6-vsdoc.js" />

(function($) {

    $.locator = function(options) {
        var s = $.extend({}, $.locator.defaults, options);
        $(document).unload(google.maps.unload);

        var map;
        var markers = [];
        var extInfoTemplate;

        var setCenter = function(latitude, longitude, zoom) {
            map.setCenter(new GLatLng(latitude, longitude), zoom);
        };

        var initValues = function() {
            map = new google.maps.Map2($('#' + s.holderId)[0]);
            var template = $('#' + s.infoWindowLayoutTemplateId);

            extInfoTemplate = template.show().html();

            template.hide();
        };

        var initMap = function() {
            if (typeof (s.latitude) != 'undefined' && typeof (s.longitude) != 'undefined') {
                // we have a start point :D                
                setUpMap(new GLatLng(s.latitude, s.longitude), 3);
            }
            else {
                s.geocoder.getLatLng(s.baseCountry, function(point) {
                    if (!point) {
                        if (s.failure) {
                            s.failure();
                        }
                    }
                    else {
                        setUpMap(point, 3);
                    }
                });
            }
        };

        function closeAllMarkers() {
            map.closeExtInfoWindow();
        };

        function triggerMarker(lat, lng) {
            for (var i = 0; i < markers.length; i++) {
                var marker = markers[i];
                var point = marker.getLatLng();
                if (point.y == lat && point.x == lng) {
                    GEvent.trigger(marker, 'click');
                    return;
                }
            }
        };

        function addMarkers(center, address) {
            var data = s.locations;
            if (data && data.results && data.error === null) {

                $.each(data.results, function() {
                    createMarker(this);
                });

                map.setCenter(center);
            } else {
                map.setCenter(center);
                if (s.failure) {
                    s.failure();
                }
            }
        };

        function createMarker(location) {
            var point = new google.maps.LatLng(location.Coordinate.Latitude, location.Coordinate.Longitude);
            var marker = new google.maps.Marker(point, icon(s));
            var html = extInfoTemplate;

            var url = "";
            if (typeof (location.URL) != 'undefined' && location.URL.length > 0) {
                url = s.extInfoWindow.websiteLink.replace("url", location.URL);
            }

            html = html.replace("companyName", location.CompanyName);
            html = html.replace("Address", location.Address1);
            html = html.replace("websiteLink", url);
            html = html.replace("donateLink", s.extInfoWindow.donateLink);

            google.maps.Event.addListener(marker, 'click', function() {
                marker.openExtInfoWindow(map, s.extInfoWindow.cssId, html, s.extInfoWindow.options, location.PinID);
            });

            map.addOverlay(marker);
            markers.push(marker);

            return point;
        };

        function setUpMap(startPoint, zoom) {
            s.geocoder.setBaseCountryCode(s.baseCountry);
            map.setCenter(startPoint, zoom);
            map.setMapType(G_HYBRID_MAP);
            addMarkers(startPoint, "", s);

            var obj = map.getContainer();

            //zoomy zoomy
            $(obj).mousewheel(function(event, delta) {
                if (delta > 0) {
                    map.zoomIn();
                }
                else if (delta < 0) {
                    map.zoomOut();
                }

                // Stop the window from scrolling
                return false;
            });

            var holder = $('<div class="MapIconHolders"><!-- --></div').appendTo(obj).get(0);
            $('<div class="Button PanUp"><!-- --></div').appendTo(holder).bind('click', function() {
                map.panDirection(0, +1);
            });
            $('<div class="Button PanDown"><!-- --></div').appendTo(holder).bind('click', function() {
                map.panDirection(0, -1);
            });
            $('<div class="Button PanLeft"><!-- --></div').appendTo(holder).bind('click', function() {
                map.panDirection(+1, 0);
            });
            $('<div class="Button PanRight"><!-- --></div').appendTo(holder).bind('click', function() {
                map.panDirection(-1, 0);
            });
            $('<div class="Button ZoomIn"><!-- --></div').appendTo(holder).bind('click', function() {
                map.zoomIn();
            });
            $('<div class="Button ZoomOut"><!-- --></div').appendTo(holder).bind('click', function() {
                map.zoomOut();
            });
            $('<div class="Type Map"><!-- --></div').appendTo(holder).bind('click', function() {
                $(".Map").addClass("MapOn");
                $(".Satellite").removeClass("SatelliteOn");
                $(".Hybrid").removeClass("HybridOn");
                map.setMapType(G_NORMAL_MAP);
            });
            $('<div class="Type Satellite"><!-- --></div').appendTo(holder).bind('click', function() {
                $(".Map").removeClass("MapOn");
                $(".Satellite").addClass("SatelliteOn");
                $(".Hybrid").removeClass("HybridOn");
                map.setMapType(G_SATELLITE_MAP);
            });
            $('<div class="Type Hybrid HybridOn"><!-- --></div').appendTo(holder).bind('click', function() {
                $(".Map").removeClass("MapOn");
                $(".Satellite").removeClass("SatelliteOn");
                $(".Hybrid").addClass("HybridOn");
                map.setMapType(G_HYBRID_MAP);
            });


            if ($.browser.msie && $.browser.version < 7) {
                $(document).ready(function() {
                    $(holder).pngFix();
                });
            }
        };

        initValues();
        initMap();

        return {
            SetCenter: function(latitude, longitude, zoom) {
                setCenter(latitude, longitude, zoom)
            },
            TriggerMarker: function(lat, lng) {
                triggerMarker(lat, lng);
            },
            CloseAllMarkers: function() {
                closeAllMarkers();
            }
        };
    };

    //
    // private function for debugging
    //
    function debug($obj) {
        if (window.console && window.console.log)
            window.console.log($obj);
    }
    //
    // Google icon constructor
    //
    function icon(s) {
        var icon = new google.maps.Icon();
        icon.image = s.icon.image;
        icon.shadow = s.icon.shadow;
        icon.iconSize = s.icon.iconSize;
        icon.shadowSize = s.icon.shadowSize;
        icon.iconAnchor = s.icon.iconAnchor;
        icon.infoWindowAnchor = s.icon.infoWindowAnchor;
        return icon;

    }
    //
    // Locator Icon Default
    //
    $.locator.icon = {
        image: "/Images/Marker.png",
        shadow: ""
    };
    //
    // Ext Info Window Defaults
    //
    $.locator.extInfoWindow = {
        cssId: "InfoWindow",
        options: {
            paddingX: 60,
            paddingY: 60
        },
        websiteLink: "<a href=\"url\" target=\"_blank\">Read story</a> |",
        donateLink: "<a href=\"/Donations---Events.aspx\" target=\"_blank\">Donate to this cause</a>"
    };

    //
    // locator defaults
    //
    $.locator.defaults = {
        holderId: '',
        infoWindowLayoutTemplateId: "InfoWindowTemplate",
        geocoder: null,
        latitude: 0,
        longitude: 0,
        baseCountry: null,
        success: null,
        failure: null,
        icon: $.locator.icon,
        extInfoWindow: $.locator.extInfoWindow,
        locations: []
    };
})(jQuery);

