text:  /*!
   * jQuery UI Google Map 2.0
   * http://code.google.com/p/jquery-ui-map/
   *
   * Copyright (c) 2010 - 2011 Johan Säll Larsson
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   * THE SOFTWARE.
   *
   * Depends:
   *      jquery.ui.core.js
   *      jquery.ui.widget.js
   */
  
  ( function($) {
  	
  	jQuery.fn.extend( {
  		
  		click: function(a) { 
  			return this.addEventListener('click', a);
  		},
  		
  		rightclick: function(a) {
  			return this.addEventListener('rightclick', a);
  		},
  		
  		dblclick: function(a) {
  			return this.addEventListener('dblclick', a);
  		},
  		
  		mouseover: function(a) {
  			return this.addEventListener('mouseover', a);
  		},
  		
  		mouseout: function(a) {
  			return this.addEventListener('mouseout', a);
  		},
  		
  		drag: function(a) {
  			return this.addEventListener('drag', a );
  		},
  		
  		dragend: function(a) {
  			return this.addEventListener('dragend', a );
  		},
  		
  		triggerEvent: function(a) {
  			google.maps.event.trigger(this.get(0), a);		
  		},
  		
  		addEventListener: function(a, b) {
  			if ( google.maps && this.get(0) instanceof google.maps.MVCObject ) {
  				google.maps.event.addListener(this.get(0), a, b );
  			} else {
  				this.bind(a, b);	
  			}
  			return this;
  		}
  		
  	});
  	
  	$.widget( "ui.gmap", {
  			
  			options: {
  				backgroundColor : null,
  				center: ( google.maps ) ? new google.maps.LatLng(0.0, 0.0) : null,
  				disableDefaultUI: false,
  				disableDoubleClickZoom: false,
  				draggable: true,
  				draggableCursor: null,
  				draggingCursor: null,
  				keyboardShortcuts: true,
  				mapTypeControl: true,
  				mapTypeControlOptions: null,
  				mapTypeId: ( google.maps ) ? google.maps.MapTypeId.ROADMAP : null,
  				navigationControl: true,
  				navigationControlOptions: null,
  				noClear: false,
  				scaleControl: false,
  				scaleControlOptions: null,
  				scrollwheel: false,
  				streetViewControl: true,
  				streetViewControlOptions: null,
  				zoom: 5,
  				callback: null
  			},
  			
  			_create: function() {
  				$.ui.gmap.instances[this.element.attr('id')] = { map: new google.maps.Map( this.element[0], this.options ), markers: [], bounds: null, services: [] };
  			},
  			
  			_init: function() {
  				$.ui.gmap._trigger(this.options.callback, this.getMap() );
  				return $(this.getMap());
  			},
  			
  			_setOption: function(a, b) {
  				var map = this.getMap();
  				this.options.center = map.getCenter();
  				this.options.mapTypeId = map.getMapTypeId();
  				this.options.zoom = map.getZoom();
  				$.Widget.prototype._setOption.apply(this, arguments);
  				map.setOptions(this.options);
  			},
  			
  			/**
  			 * Adds a LatLng to the bounds.
  			 */
  			addBounds: function(a) {
  				var instances = $.ui.gmap.instances[this.element.attr('id')];
  				if ( !instances.bounds ) {
  					instances.bounds = new google.maps.LatLngBounds(); 
  				}
  				instances.bounds.extend(a);
  				instances.map.fitBounds(instances.bounds);
  			},
  			
  			/**
  			 * Adds a control to the map
  			 * @param a:jQuery/Node/String
  			 * @param b:google.maps.ControlPosition, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#ControlPosition
  			 */
  			addControl: function(a, b) {
  				this.getMap().controls[b].push($.ui.gmap._unwrap(a));
  			},
  			
  			/**
  			 * Adds a Marker to the map
  			 * @param a:google.maps.MarkerOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#MarkerOptions
  			 * @param b:function(map:google.maps.Map, marker:Marker)
  			 * @return $(google.maps.Marker)
  			 */
  			addMarker: function(a, b) {
  				var marker = new google.maps.Marker( jQuery.extend( { 'map': this.getMap(), 'bounds':false }, a) );
  				this.getMarkers().push( marker );
  				if ( marker.bounds ) {
  					this.addBounds(marker.getPosition());
  				}
  				$.ui.gmap._trigger(b, this.getMap(), marker );
  				return $(marker);
  			},
  			
  			/**
  			 * Adds an InfoWindow to the map
  			 * @param a:google.maps.InfoWindowOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#InfoWindowOptions
  			 * @param b:function(InfoWindow:google.maps.InfoWindowOptions)
  			 * @return $(google.maps.InfoWindowOptions)
  			 */
  			addInfoWindow: function(a, b) {
  				var iw = new google.maps.InfoWindow(a);
  				$.ui.gmap._trigger(b, iw);
  				return $(iw);
  			},
  			
  			/**
  			 * Computes directions between two or more places.
  			 * @param a:google.maps.DirectionsRequest, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#DirectionsRequest
  			 * @param b:google.maps.DirectionsRendererOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#DirectionsRendererOptions
  			 * @param c:function(success:boolean, result:google.maps.DirectionsResult), http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#DirectionsResult
  			 */
  			displayDirections: function(a, b, c) { 
  				var instance = $.ui.gmap.instances[this.element.attr('id')];
  				if ( !instance.services.DirectionsService ) {
  					instance.services.DirectionsService = new google.maps.DirectionsService();
  				}
  				if ( !instance.services.DirectionsRenderer ) {
  					instance.services.DirectionsRenderer = new google.maps.DirectionsRenderer();
  				}
  				instance.services.DirectionsRenderer.setOptions(jQuery.extend({'map': instance.map}, b));
  				instance.services.DirectionsService.route( a, function(result, status) {
  					if ( status === google.maps.DirectionsStatus.OK ) {
  						if ( b.panel ) {
  							instance.services.DirectionsRenderer.setDirections(result);
  						}
  					} else {
  						instance.services.DirectionsRenderer.setMap(null);
  					}
  					$.ui.gmap._trigger(c, ( status === google.maps.DirectionsStatus.OK ), result);
  				});
  			},
  			
  			/**
  			 * Displays the panorama for a given LatLng or panorama ID.
  			 * @param a:jQuery/String/Node
  			 * @param b?:google.maps.StreetViewPanoramaOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#StreetViewPanoramaOptions
  			 */
  			displayStreetView: function(a, b) {
  				var instance = $.ui.gmap.instances[this.element.attr('id')];
  				instance.services.StreetViewPanorama = new google.maps.StreetViewPanorama($.ui.gmap._unwrap(a), b);
  				instance.map.setStreetView(instance.services.StreetViewPanorama);
  			},
  			
  			/**
  			 * Returns the marker(s) with a specific property and value, e.g. 'category', 'airports'
  			 * @param a:String - the property to search within
  			 * @param b:String - the query
  			 * @param c:function(found:boolean, marker:google.maps.Marker)
  			 */
  			findMarker : function(a, b, c) {
  				$.each( this.getMarkers(), function(i, marker) {
  					$.ui.gmap._trigger(c, ( marker[a] === b ), marker);
  				});
  			},
  			
  			/**
  			 * Extracts meta data from the HTML
  			 * @param a:String - rdfa, microformats or microdata 
  			 * @param b:String - the namespace
  			 * @param c:function(item:jQuery, result:Array<String>)
  			 */
  			loadMetadata: function(a, b, c) { 
  				if ( a === 'rdfa' ) {
  					$.ui.gmap.rdfa(b, c);
  				} else if ( a === 'microformat') {
  					$.ui.gmap.microformat(b, c);
  				} else if ( a === 'microdata') {
  					$.ui.gmap.microdata(b, c);
  				}
  			},
  			
  			/**
  			 * Adds fusion data to the map.
  			 * @param a:google.maps.FusionTablesLayerOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#FusionTablesLayerOptions
  			 */
  			loadFusion: function(a) {
  				var instance = $.ui.gmap.instances[this.element.attr('id')];
  				if ( !instance.services.FusionTablesLayer ) {
  					instance.services.FusionTablesLayer = new google.maps.FusionTablesLayer();
  				}
  				instance.services.FusionTablesLayer.setOptions(a);
  				instance.services.FusionTablesLayer.setMap(this.getMap());
  			},
  			
  			/**
  			 * Adds markers from KML file or GeoRSS feed
  			 * @param a:String - an identifier for the RSS e.g. 'rss_dogs'
  			 * @param b:String - URL to feed
  			 * @param c:google.maps.KmlLayerOptions, http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#KmlLayerOptions
  			 */
  			loadKML: function(a, b, c) {
  				var instance = $.ui.gmap.instances[this.element.attr('id')];
  				if ( !instance.services[a] )
  					instance.services[a] = new google.maps.KmlLayer(b, jQuery.extend({'map': instance.map }, c)); 
  			},
  			
  			/**
  			 * A service for converting between an address and a LatLng.
  			 * @param a:google.maps.GeocoderRequest
  			 * @param b:function(success:boolean, result:google.maps.GeocoderResult), http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#GeocoderResult
  			 */
  			search: function(a, b) {
  				var instance = $.ui.gmap.instances[this.element.attr('id')];
  				if ( !instance.services.Geocoder ) {
  					instance.services.Geocoder = new google.maps.Geocoder();
  				}
  				instance.services.Geocoder.geocode( a, function(result, status) {
  					$.ui.gmap._trigger(b, ( status === google.maps.GeocoderStatus.OK ), result);
  				});
  			},
  			
  			/**
  			 * Returns the map.
  			 * @return google.maps.Map
  			 */
  			getMap: function() {
  				return $.ui.gmap.instances[this.element.attr('id')].map;
  			},
  			
  			/**
  			 * Returns all markers.
  			 * @return Array<google.maps.Marker>
  			 */
  			getMarkers: function() {
  				return $.ui.gmap.instances[this.element.attr('id')].markers;
  			},
  			
  			/**
  			 * Returns a service by its service name
  			 * @param id:string
  			 */
  			getService: function(id) {
  				return $.ui.gmap.instances[this.element.attr('id')].services[id];
  			},
  			
  			/**
  			 * Clears all the markers and added event listeners.
  			 */
  			clearMarkers: function() {
  				$.each( this.getMarkers(), function(a,b) {
  					google.maps.event.clearInstanceListeners(b);
  					b.setMap(null);
  					b = null;
  				});
  				$.ui.gmap.instances[this.element.attr('id')].markers = [];
  			},
  			
  			/**
  			 * Destroys the plugin.
  			 */
  			destroy: function() {
  				this.clearMarkers();
  				google.maps.event.clearInstanceListeners(this.getMap());
  				$.each($.ui.gmap.instances[this.element.attr('id')].services, function (a, b) {
  					b = null;
  				});
  				$.Widget.prototype.destroy.call( this );
  			}
  			
  	});
  
  	$.extend($.ui.gmap, {
          
  		version: "2.0",
  		instances: [],
  		
  		_trigger: function(a) {
  			if ( $.isFunction(a) ) {
  				a.apply(this, Array.prototype.slice.call(arguments, 1));
  			}
  		},
  		
  		_unwrap: function unwrap(a) {
  			if ( !a ) {
  				return null;
  			} else if ( a instanceof jQuery ) {
  				return a[0];
  			} else if ( a instanceof Object ) {
  				return a;
  			}
  			return document.getElementById(a);
  		}
  			
  	});
  
  } (jQuery) );