﻿(function($) {

    $.fn.vMap = function(method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.vMap');
        }
    };

    var methods = {

        map: function() {
            return $(this).data("vmap_map");
        },

        markers: function() {
            return $(this).data("vmap_markers");
        },

        marker: function(lat, lng) {
            var markers = $(this).data("vmap_markers");

            if (markers == null || markers.length == 0)
                return null;

            var marker = markers[0];
            $(markers).each(function(i, item) {
                if (item.position.lat() == lat && item.position.lng() == lng)
                    marker = item;
            });
            return marker;
        },

        setcenter: function(lat, lng) {
            var map = $(this).data("vmap_map");
            map.setCenter(new google.maps.LatLng(lat, lng));
        },

        geocode: function(address) {
            var markers = $(this).data("vmap_markers");
            var map = $(this).data("vmap_map");
            var marker = markers[0];
            var geocoder = new google.maps.Geocoder();

            geocoder.geocode({ 'address': address, 'region': 'se' }, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    map.setCenter(results[0].geometry.location);
                    map.setZoom(10);
                    marker.setPosition(results[0].geometry.location);
                } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
                    alert("Inga träffar");
                } else {
                    alert("Error, status: " + status);
                }
            });
        },

        init: function(options) {
            var undef;
            var settings = {
                lat: null,
                lng: null,
                mapType: 'roadmap',
                zoom: 8,
                navigationControl: true,
                mapTypeControl: false,
                scaleControl: true,
                scrollwheel: false,
                streetViewControl: false,
                infoWindowMaxWidth: 0,
                markers: [],
                icon: 'http://www.google.com/mapfiles/marker.png'
            };

            $.extend(settings, options);

            return this.each(function() {

                var mapOptions = {
                    scrollwheel: settings.scrollwheel,
                    navigationControl: settings.navigationControl,
                    mapTypeControl: settings.mapTypeControl,
                    scaleControl: settings.scaleControl,
                    streetViewControl: settings.streetViewControl
                }

                var map = new google.maps.Map(this, mapOptions);

                if (settings.lat == null)
                    settings.lat = settings.markers[0].lat;

                if (settings.lng == null)
                    settings.lng = settings.markers[0].lng;

                map.setCenter(new google.maps.LatLng(settings.lat, settings.lng));
                map.setZoom(settings.zoom);

                switch (settings.mapType) {
                    case "satellite":
                        map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
                        break;
                    case "hybrid":
                        map.setMapTypeId(google.maps.MapTypeId.HYBRID);
                        break;
                    case "terrain":
                        map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
                        break;
                    case "roadmap":
                    default:
                        map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
                }

                var infowindow = new google.maps.InfoWindow({ maxWidth: settings.infoWindowMaxWidth });

                var markers = [];

                if (settings.markers.length > 0) {

                    $.each(settings.markers, function(i, item) {

                        var marker = new google.maps.Marker({
                            position: new google.maps.LatLng(item.lat, item.lng),
                            map: map,
                            icon: item.icon != undef ? item.icon : settings.icon,
                            draggable: item.draggable != undef ? item.draggable : false,
                            title: item.title,
                            zIndex: i
                        });

                        markers.push(marker);

                        if (item.html) {
                            google.maps.event.addListener(marker, 'click', function() {
                                infowindow.setContent(item.html);
                                infowindow.open(map, marker);
                            });

                            google.maps.event.addListener(map, "click", function() {
                                infowindow.close();
                            });
                        }
                    });
                }

                $(this).data("vmap_map", map);
                $(this).data("vmap_markers", markers);
            });
        }
    }

})(jQuery);
