/*
 * jMapping v1.1 - jQuery plugin for creating Google Maps
 *
 * Copyright (c) 2009 Brian Landau (Viget Labs)
 * MIT License: http://www.opensource.org/licenses/mit-license.php
 *
 */

if (GMap2){
    GMap2.prototype.centerAndZoomOnBounds = function(bounds) {
        this.setCenter(bounds.getCenter(), this.getBoundsZoomLevel(bounds));
    };
}

(function($) {
    $.jMapping = function(map_elm, options) {
        this.map_elm = (typeof map_elm == "string") ? $(map_elm).get(0) : map_elm;

        if (!($(this.map_elm).data('jMapping') instanceof $.jMapping)) {
            this.settings = $.extend(true, {}, $.jMapping.defaults);
            $.extend(true, this.settings, options);

            if (GBrowserIsCompatible()) {
                this.init(true);
            } else {
                this.mapped = false;
            }
        }
    };

    $.extend($.jMapping, {
        defaults: {
            side_bar_selector: '#map-locations:first',
            location_selector: '.location',
            link_selector: '.map-item',
            info_window_selector: '.info-html',
            info_window_max_width: 150,
            metadata_options: { type: 'attr', name: 'data' }
        },
        makeGLatLng: function(place_point) {
            return new GLatLng(place_point.lat, place_point.lng);
        }
    });

    $.jMapping.prototype = {
        gmarkers: {},
        gwindows: {},
        mapped: true,
        init: function(update) {
            var self = this, places, info_window_selector, bounds;

            info_window_selector = [
        this.settings.side_bar_selector,
        this.settings.location_selector,
        this.settings.info_window_selector
      ].join(' ');
            $(info_window_selector).hide();

            places = this.getPlaces();
            bounds = this._getBounds(places);
            
            if (update) {
                this.gmarkers = {};
                if (typeof (this.markerManager) != "undefined") {
                    this.markerManager.clearMarkers();
                }
                if (typeof (this.map) != "undefined") {
                    this.map.centerAndZoomOnBounds(bounds);
                } else {
                    this.createMap(places, bounds);
                    this.markerManager = new MarkerManager(this.map);
                }
            } else {
                this.createMap(places, bounds);
                this.markerManager = new MarkerManager(this.map);
            }

            places.each(function() {
                self._createMarker(this);
                if (!(self.settings.link_selector === false)) {
                    self._setupLink(this);
                }
            });

            if (typeof (this.map) != "undefined") {
                bounds_zoom_level = this.map.getBoundsZoomLevel(bounds);
                min_zoom = (bounds_zoom_level < 7) ? 0 : (bounds_zoom_level - 7);
                this.markerManager.addMarkers(this._gmarkersArray(), min_zoom);
                this.markerManager.refresh();
            }

            if (!(this.settings.link_selector === false) && !update) {
                this._attachMapsEventToLinks();
            }
        },
        update: function() {
            this.init(true);
        },
        createMap: function(places, bounds) {

            if (typeof (this.map_elm) == "undefined") {
                return;
            }

            this.map = new GMap2(this.map_elm);
            if ($.isFunction(this.settings.map_config)) {
                this.settings.map_config.apply(this, [this.map]);
            } else {
                this.map.setMapType(G_NORMAL_MAP);
                this.map.addControl(new GSmallMapControl());
            }
            this.map.centerAndZoomOnBounds(bounds);
        },
        getPlaces: function() {
            return $(this.settings.side_bar_selector + ' ' + this.settings.location_selector);
        },
        _getPlacesData: function(places) {
            var self = this;
            return places.map(function() {
                return $(this).metadata(self.settings.metadata_options);
            });
        },
        _getBounds: function(places) {

            if (places.length == 0) {
                return;
            }

            var places_data = this._getPlacesData(places);
            var bounds = new GLatLngBounds(
                $.jMapping.makeGLatLng(places_data[0].point),
                $.jMapping.makeGLatLng(places_data[0].point));

            for (var i = 1, len = places_data.length; i < len; i++) {
                bounds.extend($.jMapping.makeGLatLng(places_data[i].point));
            }
            return bounds;
        },
        _setupLink: function(place_elm) {
            var $place_elm = $(place_elm);
            var location_data = $place_elm.metadata(this.settings.metadata_options);
            var link = $place_elm.find(this.settings.link_selector);

            if (link.attr('href').match(/^((\#.*)|(\s*))$/)) {
                link.attr('href', ("#" + location_data.id));
            }
        },
        _chooseIconOptions: function(category) {
            if (this.settings.category_icon_options) {
                if ($.isFunction(this.settings.category_icon_options)) {
                    return this.settings.category_icon_options.apply(this, [category]);
                } else {
                    return this.settings.category_icon_options[category] || this.settings.category_icon_options['default'];
                }
            } else {
                return {};
            }
        },
        _createMarker: function(place_elm) {
            var $place_elm = $(place_elm), place_data, point, marker, $info_window_elm;

            place_data = $place_elm.metadata(this.settings.metadata_options);
            point = $.jMapping.makeGLatLng(place_data.point);
            if (this.settings.category_icon_options) {
                var custom_icon = MapIconMaker.createMarkerIcon(this._chooseIconOptions(place_data.category));
                marker = new GMarker(point, { icon: custom_icon });
            } else {
                marker = new GMarker(point);
            }

            $info_window_elm = $place_elm.find(this.settings.info_window_selector);
            if ($info_window_elm.length > 0) {

                //
                //creating new object + subscribing to event
                //
                //
                //

                html = $info_window_elm.html();

                marker.overlay = new MyOverlay(marker, html, $info_window_elm.html());
                var map = this.map;

                GEvent.addListener(marker, "click", function() {

                    if (typeof MyOverlay !== 'undefined') {
                        if (currentMarker) {
                            closeOverlay(map);
                        }

                        if (!this.overlay) {
                            this.overlay = new MyOverlay(this, this.html);
                        }

                        //console.log(this);

                        bounds = map.getBounds();
                        var southWest = bounds.getSouthWest();
                        var northEast = bounds.getNorthEast();
                        lngSpan = northEast.lng() - southWest.lng();
                        latSpan = northEast.lat() - southWest.lat();

                        currentMarker = this;

                        //map.setActiveKey(this.key);
                        //map.addOverlay(this.overlay);
                        map.panTo(new GLatLng(marker.getPoint().lat() + latSpan / 4, marker.getPoint().lng() - lngSpan / 4));
                        map.addOverlay(this.overlay);

                        //                        var resizeBounds = new GLatLngBounds();
                        //                        resizeBounds.extend(marker.getLatLng());
                        //                        map.setZoom(map.getBoundsZoomLevel(resizeBounds));
                        //                        map.setCenter(resizeBounds.getCenter());

                        //this.hide();
                    } else {
                        this.openInfoWindowHtml(html);
                    }
                });




            }

            this.gmarkers[parseInt(place_data.id, 10)] = marker;
            return marker;
        },
        _attachMapsEventToLinks: function() {
            var self = this;
            var location_link_selector = [
        this.settings.side_bar_selector,
        this.settings.location_selector,
        this.settings.link_selector
      ].join(' ');

            $(location_link_selector).live('click', function(e) {
                e.preventDefault();
                var marker_index = parseInt($(this).attr('href').split('#')[1], 10);
                GEvent.trigger(self.gmarkers[marker_index], "click");
            });
        },
        _gmarkersArray: function() {
            var marker_arr = [];
            $.each(this.gmarkers, function(key, value) {
                marker_arr.push(value);
            });
            return marker_arr;
        }
    };

    $.fn.jMapping = function(options) {
        if ((options == 'update') && $(this[0]).data('jMapping')) {
            $(this[0]).data('jMapping').update();
        } else {
            if (options == 'update') options = {};
            $(this[0]).data('jMapping', new $.jMapping(this[0], options));
        }
        return this;
    };
})(jQuery);


///*
//* jMapping v1.1 - jQuery plugin for creating Google Maps
//*
//* Copyright (c) 2009 Brian Landau (Viget Labs)
//* MIT License: http://www.opensource.org/licenses/mit-license.php
//*
//*/
//if (GMap2) {
//    GMap2.prototype.centerAndZoomOnBounds = function(bounds)
//    { this.setCenter(bounds.getCenter(), this.getBoundsZoomLevel(bounds)); };
//}
//(function($) {
//    $.jMapping = function(map_elm, options) {
//        this.map_elm = (typeof map_elm == "string") ? $(map_elm).get(0) : map_elm;
//        if (!($(this.map_elm).data('jMapping') instanceof $.jMapping)) {
//            this.settings = $.extend(true, {}, $.jMapping.defaults);
//            $.extend(true, this.settings, options);
//            if (GBrowserIsCompatible()) {


//                this.gmarkers = {};

//                this.init();
//                //this.gmarkers = {};
//                // this.markerManager.clearMarkers();

//                //this.init();

//            } else { this.mapped = false; } 
//        } 
//    };
//    $.extend($.jMapping, { defaults: { side_bar_selector: '#map-side-bar:first', location_selector: '.map-location', link_selector: 'a.map-link', info_window_selector: '.info-box', info_window_max_width: 425, metadata_options: { type: 'attr', name: 'data'} }, makeGLatLng: function(place_point) { return new GLatLng(place_point.lat, place_point.lng); } }); $.jMapping.prototype = { gmarkers: {}, mapped: true, init: function(update) {
//        var self = this, places, info_window_selector, bounds; info_window_selector = [this.settings.side_bar_selector, this.settings.location_selector, this.settings.info_window_selector].join(' '); $(info_window_selector).hide(); places = this.getPlaces(); bounds = this._getBounds(places); if (update) { this.gmarkers = {}; this.markerManager.clearMarkers(); this.map.centerAndZoomOnBounds(bounds); } else { this.createMap(places, bounds); this.markerManager = new MarkerManager(this.map); }
//        places.each(function() {
//            self._createMarker(this);



//            if (!(self.settings.link_selector === false)) { self._setupLink(this); } 
//        });
//        bounds_zoom_level = this.map.getBoundsZoomLevel(bounds);
//        min_zoom = (bounds_zoom_level < 7) ? 0 : (bounds_zoom_level - 7);
//        this.markerManager.addMarkers(this._gmarkersArray(), min_zoom);
//        this.markerManager.refresh();
//        if (!(this.settings.link_selector === false) && !update) { this._attachMapsEventToLinks(); } 
//    }, update: function() { this.init(true); }, createMap: function(places, bounds) {
//        this.map = new GMap2(this.map_elm);
//        if ($.isFunction(this.settings.map_config)) { this.settings.map_config.apply(this, [this.map]); } else {
//            this.map.setMapType(G_NORMAL_MAP);
//            this.map.addControl(new GSmallMapControl());
//        }
//        this.map.centerAndZoomOnBounds(bounds);
//    }, getPlaces: function() { return $(this.settings.side_bar_selector + ' ' + this.settings.location_selector); }, _getPlacesData: function(places) { var self = this; return places.map(function() { return $(this).metadata(self.settings.metadata_options); }); }, _getBounds: function(places) {
//        var places_data = this._getPlacesData(places); var bounds = new GLatLngBounds($.jMapping.makeGLatLng(places_data[0].point), $.jMapping.makeGLatLng(places_data[0].point)); for (var i = 1, len = places_data.length; i < len; i++) { bounds.extend($.jMapping.makeGLatLng(places_data[i].point)); }
//        return bounds;
//    }, _setupLink: function(place_elm) {
//        var $place_elm = $(place_elm);
//        var location_data = $place_elm.metadata(this.settings.metadata_options);
//        var link = $place_elm.find(this.settings.link_selector);
//        if (link.attr('href').match(/^((\#.*)|(\s*))$/)) { link.attr('href', ("#" + location_data.id)); } 
//    }, _chooseIconOptions: function(category) { if (this.settings.category_icon_options) { if ($.isFunction(this.settings.category_icon_options)) { return this.settings.category_icon_options.apply(this, [category]); } else { return this.settings.category_icon_options[category] || this.settings.category_icon_options['default']; } } else { return {}; } }, _createMarker: function(place_elm) {
//        var $place_elm = $(place_elm), place_data, point, marker, $info_window_elm; place_data = $place_elm.metadata(this.settings.metadata_options); point = $.jMapping.makeGLatLng(place_data.point); if (this.settings.category_icon_options) { var custom_icon = MapIconMaker.createMarkerIcon(this._chooseIconOptions(place_data.category)); marker = new GMarker(point, { icon: custom_icon }); } else { marker = new GMarker(point); }
//        $info_window_elm = $place_elm.find(this.settings.info_window_selector);
//        if ($info_window_elm.length > 0) {


//            ///////////////////////// start //////////////////////////////////////


//            html = $info_window_elm.html();

//            marker.overlay = new MyOverlay(marker, html, $info_window_elm.html());
//            var map = this.map;

//            GEvent.addListener(marker, "click", function() {

//                if (typeof MyOverlay !== 'undefined') {
//                    if (currentMarker) {
//                        closeOverlay(map);
//                    }

//                    if (!this.overlay) {
//                        this.overlay = new MyOverlay(this, this.html);
//                    }

//                    //console.log(this);

//                    bounds = map.getBounds();
//                    var southWest = bounds.getSouthWest();
//                    var northEast = bounds.getNorthEast();
//                    lngSpan = northEast.lng() - southWest.lng();
//                    latSpan = northEast.lat() - southWest.lat();

//                    currentMarker = this;

//                    //map.setActiveKey(this.key);
//                    //map.addOverlay(this.overlay);
//                    map.panTo(new GLatLng(marker.getPoint().lat() + latSpan / 4, marker.getPoint().lng() - lngSpan / 4));
//                    map.addOverlay(this.overlay);

//                    //                        var resizeBounds = new GLatLngBounds();
//                    //                        resizeBounds.extend(marker.getLatLng());
//                    //                        map.setZoom(map.getBoundsZoomLevel(resizeBounds));
//                    //                        map.setCenter(resizeBounds.getCenter());

//                    //this.hide();
//                } else {
//                    this.openInfoWindowHtml(html);
//                }
//            });

//            
//            
//            ////////////////////////// finish /////////////////////////////////////

//            



////                marker.bindInfoWindowHtml($info_window_elm.html(),
////                {

////                
////                    maxWidth: this.settings.info_window_max_width


////                }); 
//                
//                
//                    
//                    }
//                    this.gmarkers[parseInt(place_data.id, 10)] = marker; return marker;
//                
//                
//                }, _attachMapsEventToLinks: function() { var self = this; var location_link_selector = [this.settings.side_bar_selector, this.settings.location_selector, this.settings.link_selector].join(' '); $(location_link_selector).live('click', function(e) { e.preventDefault(); var marker_index = parseInt($(this).attr('href').split('#')[1], 10); GEvent.trigger(self.gmarkers[marker_index], "click"); }); }, _gmarkersArray: function() { var marker_arr = []; $.each(this.gmarkers, function(key, value) { marker_arr.push(value); }); return marker_arr; } 
//    }; $.fn.jMapping = function(options) {
//        if ((options == 'update') && $(this[0]).data('jMapping')) { $(this[0]).data('jMapping').update(); } else { if (options == 'update') options = {}; $(this[0]).data('jMapping', new $.jMapping(this[0], options)); }
//        return this;
//    };
//})(jQuery);