373 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  /*!
 | |
|  * jQuery FN Google Map 3.0-rc
 | |
|  * http://code.google.com/p/jquery-ui-map/
 | |
|  * Copyright (c) 2010 - 2012 Johan Säll Larsson
 | |
|  * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
 | |
|  */
 | |
| ( function($) {
 | |
| 	
 | |
| 	/**
 | |
| 	 * @param name:string
 | |
| 	 * @param prototype:object
 | |
| 	 */
 | |
| 	$.a = function(name, prototype) {
 | |
| 		
 | |
| 		var namespace = name.split('.')[0];
 | |
|         name = name.split('.')[1];
 | |
| 		
 | |
| 		$[namespace] = $[namespace] || {};
 | |
| 		$[namespace][name] = function(options, element) {
 | |
| 			if ( arguments.length ) {
 | |
| 				this._setup(options, element);
 | |
| 			}
 | |
| 		};
 | |
| 		
 | |
| 		$[namespace][name].prototype = $.extend({
 | |
| 			'namespace': namespace,
 | |
| 			'pluginName': name
 | |
|         }, prototype);
 | |
| 		
 | |
| 		$.fn[name] = function(options) {
 | |
| 			
 | |
| 			var isMethodCall = typeof options === "string",
 | |
| 				args = Array.prototype.slice.call(arguments, 1),
 | |
| 				returnValue = this;
 | |
| 			
 | |
| 			if ( isMethodCall && options.substring(0, 1) === '_' ) { 
 | |
| 				return returnValue; 
 | |
| 			}
 | |
| 
 | |
| 			this.each(function() {
 | |
| 				var instance = $.data(this, name);
 | |
| 				if (!instance) {
 | |
| 					instance = $.data(this, name, new $[namespace][name](options, this));
 | |
| 				}
 | |
| 				if (isMethodCall) {
 | |
| 					returnValue = instance[options].apply(instance, args);
 | |
| 				}
 | |
| 			});
 | |
| 			
 | |
| 			return returnValue; 
 | |
| 			
 | |
| 		};
 | |
| 		
 | |
| 	};
 | |
| 	
 | |
| 	$.a('ui.gmap', {
 | |
| 		
 | |
| 		/**
 | |
| 		 * Map options
 | |
| 		 * @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#MapOptions
 | |
| 		 */
 | |
| 		options: {
 | |
| 			mapTypeId: 'roadmap',
 | |
| 			zoom: 5	
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Get or set options
 | |
| 		 * @param key:string
 | |
| 		 * @param options:object
 | |
| 		 * @return object
 | |
| 		 */
 | |
| 		option: function(key, options) {
 | |
| 			if (options) {
 | |
| 				this.options[key] = options;
 | |
| 				this.get('map').set(key, options);
 | |
| 				return this;
 | |
| 			}
 | |
| 			return this.options[key];
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Setup plugin basics, 
 | |
| 		 * @param options:object
 | |
| 		 * @param element:node
 | |
| 		 */
 | |
| 		_setup: function(options, element) {
 | |
| 			this.el = element;
 | |
| 			options = options || {};
 | |
| 			jQuery.extend(this.options, options, { 'center': this._latLng(options.center) });
 | |
| 			this._create();
 | |
| 			if ( this._init ) { this._init(); }
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Instanciate the Google Maps object
 | |
| 		 */
 | |
| 		_create: function() {
 | |
| 			var self = this;
 | |
| 			this.instance = { 'map': new google.maps.Map(self.el, self.options), 'markers': [], 'overlays': [], 'services': [] };
 | |
| 			google.maps.event.addListenerOnce(self.instance.map, 'bounds_changed', function() { $(self.el).trigger('init', self.instance.map); });
 | |
| 			self._call(self.options.callback, self.instance.map);
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Adds a latitude longitude pair to the bounds.
 | |
| 		 * @param position:google.maps.LatLng/string
 | |
| 		 */
 | |
| 		addBounds: function(position) {
 | |
| 			var bounds = this.get('bounds', new google.maps.LatLngBounds());
 | |
| 			bounds.extend(this._latLng(position));
 | |
| 			this.get('map').fitBounds(bounds);
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Helper function to check if a LatLng is within the viewport
 | |
| 		 * @param marker:google.maps.Marker
 | |
| 		 */
 | |
| 		inViewport: function(marker) {
 | |
| 			var bounds = this.get('map').getBounds();
 | |
| 			return (bounds) ? bounds.contains(marker.getPosition()) : false;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Adds a custom control to the map
 | |
| 		 * @param panel:jquery/node/string	
 | |
| 		 * @param position:google.maps.ControlPosition	 
 | |
| 		 * @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#ControlPosition
 | |
| 		 */
 | |
| 		addControl: function(panel, position) {
 | |
| 			this.get('map').controls[position].push(this._unwrap(panel));
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Adds a Marker to the map
 | |
| 		 * @param markerOptions:google.maps.MarkerOptions
 | |
| 		 * @param callback:function(map:google.maps.Map, marker:google.maps.Marker) (optional)
 | |
| 		 * @return $(google.maps.Marker)
 | |
| 		 * @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#MarkerOptions
 | |
| 		 */
 | |
| 		addMarker: function(markerOptions, callback) {
 | |
| 			markerOptions.map = this.get('map');
 | |
| 			markerOptions.position = this._latLng(markerOptions.position);
 | |
| 			var marker = new (markerOptions.marker || google.maps.Marker)(markerOptions);
 | |
| 			var markers = this.get('markers');
 | |
| 			if ( marker.id ) {
 | |
| 				markers[marker.id] = marker;
 | |
| 			} else {
 | |
| 				markers.push(marker);
 | |
| 			}
 | |
| 			if ( marker.bounds ) {
 | |
| 				this.addBounds(marker.getPosition());
 | |
| 			}
 | |
| 			this._call(callback, markerOptions.map, marker);
 | |
| 			return $(marker);
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Clears by type
 | |
| 		 * @param ctx:string	e.g. 'markers', 'overlays', 'services'
 | |
| 		 */
 | |
| 		clear: function(ctx) {
 | |
| 			this._c(this.get(ctx));
 | |
| 			this.set(ctx, []);
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		_c: function(obj) {
 | |
| 			for ( var property in obj ) {
 | |
| 				if ( obj.hasOwnProperty(property) ) {
 | |
| 					if ( obj[property] instanceof google.maps.MVCObject ) {
 | |
| 						google.maps.event.clearInstanceListeners(obj[property]);
 | |
| 						if ( obj[property].setMap ) {
 | |
| 							obj[property].setMap(null);
 | |
| 						}
 | |
| 					} else if ( obj[property] instanceof Array ) {
 | |
| 						this._c(obj[property]);
 | |
| 					}
 | |
| 					obj[property] = null;
 | |
| 				}
 | |
| 			}
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Returns the objects with a specific property and value, e.g. 'category', 'tags'
 | |
| 		 * @param ctx:string	in what context, e.g. 'markers' 
 | |
| 		 * @param options:object	property:string	the property to search within, value:string, operator:string (optional) (AND/OR)
 | |
| 		 * @param callback:function(marker:google.maps.Marker, isFound:boolean)
 | |
| 		 */
 | |
| 		find: function(ctx, options, callback) {
 | |
| 			var obj = this.get(ctx);
 | |
| 			options.value = $.isArray(options.value) ? options.value : [options.value];
 | |
| 			for ( var property in obj ) {
 | |
| 				if ( obj.hasOwnProperty(property) ) {
 | |
| 					var isFound = false;
 | |
| 					for ( var value in options.value ) {
 | |
| 						if ( $.inArray(options.value[value], obj[property][options.property]) > -1 ) {
 | |
| 							isFound = true;
 | |
| 						} else {
 | |
| 							if ( options.operator && options.operator === 'AND' ) {
 | |
| 								isFound = false;
 | |
| 								break;
 | |
| 							}
 | |
| 						}
 | |
| 					}
 | |
| 					callback(obj[property], isFound);
 | |
| 				}
 | |
| 			}
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Returns an instance property by key. Has the ability to set an object if the property does not exist
 | |
| 		 * @param key:string
 | |
| 		 * @param value:object(optional)
 | |
| 		 */
 | |
| 		get: function(key, value) {
 | |
| 			var instance = this.instance;
 | |
| 			if ( !instance[key] ) {
 | |
| 				if ( key.indexOf('>') > -1 ) {
 | |
| 					var e = key.replace(/ /g, '').split('>');
 | |
| 					for ( var i = 0; i < e.length; i++ ) {
 | |
| 						if ( !instance[e[i]] ) {
 | |
| 							if (value) {
 | |
| 								instance[e[i]] = ( (i + 1) < e.length ) ? [] : value;
 | |
| 							} else {
 | |
| 								return null;
 | |
| 							}
 | |
| 						}
 | |
| 						instance = instance[e[i]];
 | |
| 					}
 | |
| 					return instance;
 | |
| 				} else if ( value && !instance[key] ) {
 | |
| 					this.set(key, value);
 | |
| 				}
 | |
| 			}
 | |
| 			return instance[key];
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Triggers an InfoWindow to open
 | |
| 		 * @param infoWindowOptions:google.maps.InfoWindowOptions
 | |
| 		 * @param marker:google.maps.Marker (optional)
 | |
| 		 * @param callback:function (optional)
 | |
| 		 * @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#InfoWindowOptions
 | |
| 		 */
 | |
| 		openInfoWindow: function(infoWindowOptions, marker, callback) {
 | |
| 			var iw = this.get('iw', infoWindowOptions.infoWindow || new google.maps.InfoWindow);
 | |
| 			iw.setOptions(infoWindowOptions);
 | |
| 			iw.open(this.get('map'), this._unwrap(marker)); 
 | |
| 			this._call(callback, iw);
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Triggers an InfoWindow to close
 | |
| 		 */
 | |
| 		closeInfoWindow: function() {
 | |
| 			if ( this.get('iw') != null ) {
 | |
| 				this.get('iw').close();
 | |
| 			}
 | |
| 			return this;
 | |
| 		},
 | |
| 				
 | |
| 		/**
 | |
| 		 * Sets an instance property
 | |
| 		 * @param key:string
 | |
| 		 * @param value:object
 | |
| 		 */
 | |
| 		set: function(key, value) {
 | |
| 			this.instance[key] = value;
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Refreshes the map
 | |
| 		 */
 | |
| 		refresh: function() {
 | |
| 			var map = this.get('map');
 | |
| 			var latLng = map.getCenter();
 | |
| 			$(map).triggerEvent('resize');
 | |
| 			map.setCenter(latLng);
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Destroys the plugin.
 | |
| 		 */
 | |
| 		destroy: function() {
 | |
| 			this.clear('markers').clear('services').clear('overlays')._c(this.instance);
 | |
| 			jQuery.removeData(this.el, this.name);
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Helper method for calling a function
 | |
| 		 * @param callback
 | |
| 		 */
 | |
| 		_call: function(callback) {
 | |
| 			if ( callback && $.isFunction(callback) ) {
 | |
| 				callback.apply(this, Array.prototype.slice.call(arguments, 1));
 | |
| 			}
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Helper method for google.maps.Latlng
 | |
| 		 * @param latLng:string/google.maps.LatLng
 | |
| 		 */
 | |
| 		_latLng: function(latLng) {
 | |
| 			if ( !latLng ) {
 | |
| 				return new google.maps.LatLng(0.0, 0.0);
 | |
| 			}
 | |
| 			if ( latLng instanceof google.maps.LatLng ) {
 | |
| 				return latLng;
 | |
| 			} else {
 | |
| 				latLng = latLng.replace(/ /g,'').split(',');
 | |
| 				return new google.maps.LatLng(latLng[0], latLng[1]);
 | |
| 			}
 | |
| 		},
 | |
| 		
 | |
| 		/**
 | |
| 		 * Helper method for unwrapping jQuery/DOM/string elements
 | |
| 		 * @param obj:string/node/jQuery
 | |
| 		 */
 | |
| 		_unwrap: function(obj) {
 | |
| 			return (!obj) ? null : ( (obj instanceof jQuery) ? obj[0] : ((obj instanceof Object) ? obj : $('#'+obj)[0]) )
 | |
| 		}
 | |
| 		
 | |
| 	});
 | |
| 	
 | |
| 	jQuery.fn.extend( {
 | |
| 		
 | |
| 		triggerEvent: function(eventType) {
 | |
| 			google.maps.event.trigger(this[0], eventType);
 | |
| 			return this;
 | |
| 		},
 | |
| 		
 | |
| 		addEventListener: function(eventType, eventDataOrCallback, eventCallback) {
 | |
| 			if ( google.maps && this[0] instanceof google.maps.MVCObject ) {
 | |
| 				google.maps.event.addListener(this[0], eventType, eventDataOrCallback);
 | |
| 			} else {
 | |
| 				if (eventCallback) {
 | |
| 					this.bind(eventType, eventDataOrCallback, eventCallback);
 | |
| 				} else {
 | |
| 					this.bind(eventType, eventDataOrCallback);
 | |
| 				} 
 | |
| 			}
 | |
| 			return this;
 | |
| 		}
 | |
| 		  
 | |
| 		/*removeEventListener: function(eventType) {
 | |
| 			if ( google.maps && this[0] instanceof google.maps.MVCObject ) {
 | |
| 				if (eventType) {
 | |
| 					google.maps.event.clearListeners(this[0], eventType);
 | |
| 				} else {
 | |
| 					google.maps.event.clearInstanceListeners(this[0]);
 | |
| 				}
 | |
| 			} else {
 | |
| 				this.unbind(eventType);
 | |
| 			}
 | |
| 			return this;
 | |
| 		}*/
 | |
| 		
 | |
| 	});
 | |
| 	
 | |
| 	jQuery.each(('click rightclick dblclick mouseover mouseout drag dragend').split(' '), function(i, name) {
 | |
| 		jQuery.fn[name] = function(a, b) {
 | |
| 			return this.addEventListener(name, a, b);
 | |
| 		}
 | |
| 	});
 | |
| 	
 | |
| } (jQuery) ); |