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