File: //home/awaldron/public_html/archive/mg/js/legacy/jquery.jmapping.js
/*
* 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();
} 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){
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);