343 lines
8.4 KiB
JavaScript
343 lines
8.4 KiB
JavaScript
/*!
|
|
* jQuery FN Google Map 3.0-beta
|
|
* 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($) {
|
|
|
|
/**
|
|
* 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) {
|
|
$[a] = $[a] || {};
|
|
$[a][b] = function(a, b) {
|
|
if ( arguments.length ) {
|
|
this._s(a, b);
|
|
}
|
|
};
|
|
$[a][b].prototype = c;
|
|
$.fn[b] = function(d) {
|
|
var e = this, f = Array.prototype.slice.call(arguments, 1), g = typeof d === 'string';
|
|
if ( g && d.substring(0, 1) === '_' ) { return e; }
|
|
this.each(function() {
|
|
var h = $.data(this, b);
|
|
if ( !h ) {
|
|
h = $.data(this, b, new $[a][b](d, this));
|
|
}
|
|
if ( g ) {
|
|
var i = h[d].apply(h, f);
|
|
if (i != null) {
|
|
e = i;
|
|
}
|
|
}
|
|
});
|
|
return e;
|
|
};
|
|
};
|
|
|
|
$.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(a, b) {
|
|
if (b) {
|
|
this.options[a] = b;
|
|
this.get('map').setOptions(this.options);
|
|
}
|
|
return this.options[a];
|
|
},
|
|
|
|
/**
|
|
* Setup plugin basics,
|
|
* @el is the jQuery element
|
|
* @options is the
|
|
*/
|
|
_s: function(a, b) {
|
|
this.el = $(b);
|
|
jQuery.extend(this.options, a);
|
|
this.options.center = this._latLng(this.options.center);
|
|
this._create();
|
|
if ( this._init ) { this._init(); }
|
|
},
|
|
|
|
/**
|
|
* Instanciate the Google Maps object
|
|
*/
|
|
_create: function() {
|
|
var a = this;
|
|
a._a = { 'map': new google.maps.Map(a.el[0], a.options), 'markers': [], 'overlays': [], 'services': [], 'iw': new google.maps.InfoWindow };
|
|
google.maps.event.addListenerOnce(a._a.map, 'bounds_changed', function() { a.el.trigger('init', a._a.map); });
|
|
a._call(a.options.callback, a._a.map);
|
|
},
|
|
|
|
/**
|
|
* 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'));
|
|
},
|
|
|
|
/**
|
|
* Helper function to check if a LatLng is within the viewport
|
|
* @param marker:google.maps.Marker
|
|
*/
|
|
inViewport: function(a) {
|
|
var b = this.get('map').getBounds();
|
|
return (b) ? b.contains(a.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(a, b) {
|
|
this.get('map').controls[b].push(this._unwrap(a));
|
|
},
|
|
|
|
/**
|
|
* Adds a Marker to the map
|
|
* @param markerOptions:google.maps.MarkerOptions
|
|
* @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) {
|
|
a.map = this.get('map');
|
|
a.position = this._latLng(a.position);
|
|
var d = new (c || google.maps.Marker)(a);
|
|
var f = this.get('markers');
|
|
if ( d.id ) {
|
|
f[d.id] = d;
|
|
} else {
|
|
f.push(d);
|
|
}
|
|
if ( d.bounds ) {
|
|
this.addBounds(d.getPosition());
|
|
}
|
|
this._call(b, a.map, d);
|
|
return $(d);
|
|
},
|
|
|
|
/**
|
|
* 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.hasOwnProperty(b) ) {
|
|
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 objects with a specific property and value, e.g. 'category', 'tags'
|
|
* @param context:string in what context, e.g. 'markers'
|
|
* @param options:object property:string the property to search within, value:string, delimiter:string (optional)
|
|
* @param callback:function(marker:google.maps.Marker, isFound:boolean)
|
|
*/
|
|
find: function(a, b, c) {
|
|
var d = this.get(a);
|
|
for ( e in d ) {
|
|
if ( d.hasOwnProperty(e) ) {
|
|
c(d[e], (( b.delimiter && d[e][b.property] ) ? ( d[e][b.property].split(b.delimiter).indexOf(b.value) > -1 ) : ( d[e][b.property] === b.value )));
|
|
}
|
|
};
|
|
},
|
|
|
|
/**
|
|
* 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._a;
|
|
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').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._a[a] = b;
|
|
},
|
|
|
|
/**
|
|
* Refreshes the map
|
|
*/
|
|
refresh: function(a) {
|
|
var b = this.get('map');
|
|
var c = b.getCenter();
|
|
$(b).triggerEvent('resize');
|
|
b.setCenter(c);
|
|
},
|
|
|
|
/**
|
|
* Destroys the plugin.
|
|
*/
|
|
destroy: function() {
|
|
this.clear('markers');
|
|
this.clear('services');
|
|
this.clear('overlays');
|
|
for ( b in this._a ) {
|
|
this._a[b] = null;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Helper method for calling a function
|
|
* @param callback
|
|
*/
|
|
_call: function(a) {
|
|
if ( a && $.isFunction(a) ) {
|
|
a.apply(this, Array.prototype.slice.call(arguments, 1));
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Helper method for google.maps.Latlng
|
|
* @param callback
|
|
*/
|
|
_latLng: function(a) {
|
|
if (!a) {
|
|
return new google.maps.LatLng(0.0,0.0);
|
|
}
|
|
if ( a instanceof google.maps.LatLng ) {
|
|
return a;
|
|
} else {
|
|
var b = a.replace(/ /g,'').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, b) {
|
|
return this.addEventListener('click', a, b);
|
|
},
|
|
|
|
rightclick: function(a) {
|
|
return this.addEventListener('rightclick', a);
|
|
},
|
|
|
|
dblclick: function(a, b) {
|
|
return this.addEventListener('dblclick', a, b);
|
|
},
|
|
|
|
mouseover: function(a, b) {
|
|
return this.addEventListener('mouseover', a, b);
|
|
},
|
|
|
|
mouseout: function(a, b) {
|
|
return this.addEventListener('mouseout', a, b);
|
|
},
|
|
|
|
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, c) {
|
|
if ( google.maps && this[0] instanceof google.maps.MVCObject ) {
|
|
google.maps.event.addListener(this[0], a, b );
|
|
} else {
|
|
if (c) {
|
|
this.bind(a, b, c);
|
|
} else {
|
|
this.bind(a, b);
|
|
}
|
|
}
|
|
return this;
|
|
}
|
|
|
|
});
|
|
|
|
} (jQuery) ); |