soundmap_wordpress_plugin/soundmap/js/jquery.ui.map.js
Xavier Balderas 066b54b180 First Upload
2011-07-30 12:08:23 +02:00

350 lines
12 KiB
JavaScript

/*!
* 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) );