soundmap_wordpress_plugin/plugins/soundmap/js/jquery.ui.map.js
2012-03-23 17:46:58 +01:00

352 lines
8.9 KiB
JavaScript

/*!
* jQuery FN Google Map 3.0-alpha
* http://code.google.com/p/jquery-ui-map/
* Copyright (c) 2010 - 2011 Johan Säll Larsson
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
( function($) {
/**
* This is how you write unmaintainable code :) - the size is small though.
* @param namespace:string
* @param name:string
* @param base:object
*/
$.a = function( a, b, c ) {
var d = [];
$[a] = $[a] || {};
$[a][b] = function(options, element) {
if ( arguments.length ) {
this._s(options, element);
}
};
$[a][b].prototype = c;
$.fn[b] = function(options) {
var id = this.attr('id');
if ( d[id] && d[id][options] ) {
return d[id][options].apply(d[id], Array.prototype.slice.call(arguments, 1));
} else if ( typeof options === 'object' || ! options ) {
d[id] = new $[a][b](options, this);
return this;
}
};
};
$.a("ui", "gmap", {
/**
* Map options
* @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#MapOptions
*/
options: {
center: (google.maps) ? new google.maps.LatLng(0.0, 0.0) : null,
mapTypeId: (google.maps) ? google.maps.MapTypeId.ROADMAP : null,
zoom: 5
},
/**
* Get or set options
* @param key:string
* @param options:object
*/
option: function(a, b) {
c = this;
if (!b) {
return c.options[a];
} else {
c._u(a, b);
}
},
/**
* Setup plugin basics,
* Set the jQuery UI Widget this.element, so extensions will work on both plugins
*/
_s: function( a, b ) {
this.id = b.attr('id');
this.instances = [];
this.element = b;
this.options = jQuery.extend(this.options, a);
this._create();
if ( this._init ) {
this._init();
}
},
/**
* Create
* @return $(google.maps.Map)
*/
_create: function() {
this.options.center = this._latLng(this.options.center);
var a = this.element;
var b = this.instances[this.id] = { map: new google.maps.Map( a[0], this.options ), markers: [], services: [], overlays: [] };
google.maps.event.addListenerOnce(b.map, 'bounds_changed', function() {
a.trigger('init', this);
});
return $(b.map);
},
/**
* Set map options
* @param key:string (optional)
* @param value:object (optional)
*/
_u: function(a, b) {
var map = this.get('map');
jQuery.extend(this.options, { 'center': map.getCenter(), 'mapTypeId': map.getMapTypeId(), 'zoom': map.getZoom() } );
if (a && b) {
this.options[a] = b;
}
map.setOptions(this.options);
},
/**
* Adds a latitude longitude pair to the bounds.
* @param position:google.maps.LatLng/string
*/
addBounds: function(a) {
this.get('bounds', new google.maps.LatLngBounds()).extend(this._latLng(a));
this.get('map').fitBounds(this.get('bounds'));
},
/**
* 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(a, b) {
this.get('map').controls[b].push(this._unwrap(a));
},
/**
* Adds a Marker to the map
* @param markerOptions:google.maps.MarkerOptions (optional)
* @param callback:function(map:google.maps.Map, marker:google.maps.Marker) (optional)
* @param marker:function (optional)
* @return $(google.maps.Marker)
* @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#MarkerOptions
*/
addMarker: function(a, b, c) {
var d = this.get('map');
var c = c || google.maps.Marker;
a.position = (a.position) ? this._latLng(a.position) : null;
var e = new c( jQuery.extend({'map': d, 'bounds': false}, a) );
var f = this.get('markers', []);
if ( e.id ) {
f[e.id] = e;
} else {
f.push(e);
}
if ( e.bounds ) {
this.addBounds(e.getPosition());
}
this._call(b, d, e);
return $(e);
},
/**
* Adds an InfoWindow to the map
* @param infoWindowOptions:google.maps.InfoWindowOptions (optional)
* @param callback:function(InfoWindow:google.maps.InfoWindowOptions) (optional)
* @return $(google.maps.InfoWindowOptions)
* @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#InfoWindowOptions
*/
addInfoWindow: function(a, b) {
var c = new google.maps.InfoWindow(a);
this._call(b, c);
return $(c);
},
/**
* Clears by type
* @param type:string i.e. markers, overlays, services
*/
clear: function(a) {
this._c(this.get(a));
this.set(a, []);
},
_c: function(a) {
for ( b in a ) {
if ( a[b] instanceof google.maps.MVCObject ) {
google.maps.event.clearInstanceListeners(a[b]);
a[b].setMap(null);
} else if ( a[b] instanceof Array ) {
this._c(a[b]);
}
a[b] = null;
}
},
/**
* Returns the marker(s) with a specific property and value, e.g. 'category', 'tags'
* @param property:string the property to search within
* @param value:string
* @param delimiter:string/boolean a delimiter if it's multi-valued otherwise false
* @param callback:function(marker:google.maps.Marker, isFound:boolean)
*/
findMarker: function(a, b, c, d) {
var e = this.get('markers');
for ( f in e ) {
var g = ( c && e[f][a] ) ? ( e[f][a].split(c).indexOf(b) > -1 ) : ( e[f][a] === b );
this._call(d, e[f], g);
};
},
/**
* 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(a, b) {
var c = this.instances[this.id];
if (!c[a]) {
if ( a.indexOf('>') > -1 ) {
var e = a.replace(/ /g, '').split('>');
for ( var i = 0; i < e.length; i++ ) {
if ( !c[e[i]] ) {
if (b) {
c[e[i]] = ( (i + 1) < e.length ) ? [] : b;
} else {
return null;
}
}
c = c[e[i]];
}
return c;
} else if ( b && !c[a] ) {
this.set(a, b);
}
}
return c[a];
},
/**
* Triggers an InfoWindow to open
* @param infoWindowOptions:google.maps.InfoWindowOptions
* @param marker:google.maps.Marker (optional)
* @see http://code.google.com/intl/sv-SE/apis/maps/documentation/javascript/reference.html#InfoWindowOptions
*/
openInfoWindow: function(a, b) {
this.get('iw', new google.maps.InfoWindow).setOptions(a);
this.get('iw').open(this.get('map'), this._unwrap(b));
},
/**
* Sets an instance property
* @param key:string
* @param value:object
*/
set: function(a, b) {
this.instances[this.id][a] = b;
},
/**
* Refreshes the map
*/
refresh: function() {
$(this.get('map')).triggerEvent('resize');
this._update();
},
/**
* Destroys the plugin.
*/
destroy: function() {
this.clear('markers');
this.clear('services');
this.clear('overlays');
var a = this.instances[this.id];
for ( b in a ) {
a[b] = null;
}
},
/**
* Helper method for calling a function
* @param callback
*/
_call: function(a) {
if ( $.isFunction(a) ) {
a.apply(this, Array.prototype.slice.call(arguments, 1));
}
},
/**
* Helper method for google.maps.Latlng
* @param callback
*/
_latLng: function(a) {
if ( a instanceof google.maps.LatLng ) {
return a;
} else {
var b = a.replace(' ','').split(',');
return new google.maps.LatLng(b[0], b[1]);
}
},
/**
* Helper method for unwrapping jQuery/DOM/string elements
* @param callback
*/
_unwrap: function(a) {
if ( !a ) {
return null;
} else if ( a instanceof jQuery ) {
return a[0];
} else if ( a instanceof Object ) {
return a;
}
return $('#'+a)[0];
}
});
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[0], a);
},
addEventListener: function(a, b) {
if ( google.maps && this[0] instanceof google.maps.MVCObject ) {
google.maps.event.addListener(this[0], a, b );
} else {
this.bind(a, b);
}
return this;
}
});
} (jQuery) );