﻿(function($) {

    $.fn.mapResources = function(options) {
        var map;
        var navControl;

        // Set Options
        options = $.extend({
            marker: 'mapItem',
            latItem: 'lat',
            lonItem: 'lon',
            infoHtml: null
        }, options || {});

        this.refreshMarkers = function(resize) {
            var bounds = loadMarkers();
            if (resize) {
                map.setCenter(bounds.getCenter());
                map.setZoom(map.getBoundsZoomLevel(bounds));
            }
        };

        this.refresh = function(zoomLevel, latitude, longitude) {
            var center = map.getCenter();
            if (latitude != undefined && longitude != undefined) {
                center = new GLatLng(latitude, longitude);
            }
            map.checkResize();
            map.setCenter(center);
            map.setZoom(zoomLevel);
            setControls(this.width());
            return this;
        };

        if (GBrowserIsCompatible() && this.length > 0) {
            $(document).unload(function() {
                GUnload();
            });
            var map = new GMap2(this.get(0));
            var bounds = loadMarkers();
            map.setCenter(bounds.getCenter());
            map.setZoom(map.getBoundsZoomLevel(bounds));
            setControls(this.width());
        }

        // Private Instance Methods
        function loadMarkers() {
            var markers = new Array();
            var bounds = new GLatLngBounds();

            $('.' + options.marker + ":not(.hidden)").each(function() {
                var id = $(this).attr('id');
                var lat = $(this).find('.' + options.latItem).text();
                var lon = $(this).find('.' + options.lonItem).text();

                var point = new GLatLng(lat, lon);
                var marker = new GMarker(point);
                marker.id = id;
                markers.push(marker);
                bounds.extend(point);

                $(this).bind('click', function() {
                    if (options.infoHtml != null) {
                        options.infoHtml(marker.id, marker);
                    }
                    scrollToMarker(marker);
                });
            });

            map.clearOverlays();
            for (var i = 0; i < markers.length; i++) {
                map.addOverlay(markers[i]);
                if (options.infoHtml != null) {
                    GEvent.addListener(markers[i], "click", function() {
                        options.infoHtml(this.id, this);
                    });
                }
            }
            return bounds;
        }

        function setControls(width) {
            map.removeControl(navControl);
            if (width > 375) {
                navControl = new GLargeMapControl3D()
            } else {
                navControl = new GSmallZoomControl3D();
            }
            map.addControl(navControl);
        }

        function scrollToMarker(marker) {
            map.panTo(marker.getLatLng());
        }


        return this;
    }
})(jQuery);