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) ); |