﻿(function ($) {


    // Google Maps API reference V3, V2 is now deprecated
    // http://code.google.com/apis/maps/documentation/javascript/
    // still missing in version 3
    // GOverviewMapControl()
    // GUnload() NO UNLOAD DEFINED YET IN Version 3
    // GBrowserIsCompatible

    $.createGoogleMap = function (mapID, markers, centerLat, centLng, defaultZoom, options) {

        var me = $.extend({
            showMapTypes: true, //Adds buttons to change the map type
            showScale: true,
            showOverview: true, // Overview Control in corner
            isZoomToFit: false
        }, options || {});
 

        me.hackCenterLat = centerLat;
        me.hackCentLng = centLng;

        Anmida.GoogleMap = me;

        me.googleMap = null;
        me.bounds = null;
        me.markerArray = [];

        me.closeAllInfoWindows = function () {
            for (var i = 0; i < me.markerArray.length; i++) {
                if (me.markerArray[i].infowindow) {
                    me.markerArray[i].infowindow.close();
                }
            };
        };

        me.addMarkerToGoogleMap = function (latitude, longitude, title, markerContent, imageUrl, draggable) {

            var point = new google.maps.LatLng(latitude, longitude);
            me.bounds.extend(point);

            var marker = new google.maps.Marker({
                position: point,
                map: me.googleMap,
                title: title
            });

            if (markerContent != "") {
                // extend the marker with an infoWindow
                marker.infowindow = new google.maps.InfoWindow({
                    content: markerContent
                });
                google.maps.event.addListener(marker, 'click', function () {
                    //Close all the other marker windows
                    me.closeAllInfoWindows();
                    marker.infowindow.open(me.googleMap, marker);
                });
            };

            if (imageUrl != "") {
                marker.setIcon(imageUrl);
            };

            marker.setDraggable(draggable);
            me.markerArray.push(marker);
            //            //bounds.extend(point);

            // Recenter if point is out of bounds
            google.maps.event.addListenerOnce(me.googleMap, 'tilesloaded', function () {
                if (!me.googleMap.getBounds().contains(point)) {
                    me.recenter(point);
                };
            });
            //            //GEvent.addListener(marker, "click", function() { map.openInfoWindowHtml(point, markerContent); });
            //            //GEvent.addListener(marker, "mouseover", function() { map.openInfoWindowHtml(point, markerContent); });
            return marker;
        };

        me.goToMarker = function (i) {
            google.maps.event.trigger(me.markerArray[i], "click");
        };

        me.clearMarkers = function () {
            for (var i = 0; i < me.markerArray.length; i++) {
                me.markerArray[i].setMap(null);
            };
            me.markerArray.length = 0;
        };

        me.recenter = function () {

            me.googleMap.setCenter(me.markerArray[0].position);

        }

        me.getZoomLevel = function () {
            return me.googleMap.getZoom();
        };

        me.setZoomLevel = function (zoomLevel) {
            return me.googleMap.setZoom(zoomLevel);
        };

        me.getCenter = function () {
            return me.googleMap.getCenter();
        };

        me.setCenter = function (lat, lng) {
            return me.googleMap.setCenter(new google.maps.LatLng(lat, lng));
        };

        me.zoomToFit = function () {
            me.googleMap.fitBounds(me.bounds);
        };

        //Init section
        var myLatlng = new google.maps.LatLng(0, 0);

        var myOptions = {
            center: myLatlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: me.showMapTypes,
            scaleControl: me.showScale
        };

        me.googleMap = new google.maps.Map(document.getElementById(mapID), myOptions);
        me.bounds = new google.maps.LatLngBounds();

        // Show Markers on the map
        for (i = 0; i < markers.length; i++) {
            me.addMarkerToGoogleMap(markers[i].Latitude, markers[i].Longitude, markers[i].Title, markers[i].Content, markers[i].ImageUrl, false);
        };

        if (me.isZoomToFit) {
            me.zoomToFit();
        }
        else {
            me.googleMap.setCenter(new google.maps.LatLng(centerLat, centLng));
            me.setZoomLevel(defaultZoom);
        };

        me.reset = function () {
            // trigger resize in case map was invisible
            google.maps.event.trigger(me.googleMap, 'resize')
            if (me.isZoomToFit) {
                me.zoomToFit();
            }
            else {
                me.googleMap.setCenter(new google.maps.LatLng(centerLat, centLng));
                me.setZoomLevel(defaultZoom);
            };
        };

//        me.redraw = function () {

//            google.maps.event.trigger(me.googleMap, 'resize');
//            me.googleMap.setCenter(new google.maps.LatLng(me.hackCenterLat, me.hackCentLng));
//            alert(me.hackCenterLat);
//        }

        return me;
    };

})(jQuery);
