mirror of
https://github.com/wahyd4/cdnjs.git
synced 2026-08-13 14:55:54 +10:00
+428
@@ -0,0 +1,428 @@
|
||||
/**
|
||||
* jQuery Geocoding and Places Autocomplete Plugin - V 1.3
|
||||
*
|
||||
* @author Martin Kleppe <kleppe@ubilabs.net>, 2012
|
||||
* @author Ubilabs http://ubilabs.net, 2012
|
||||
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/
|
||||
|
||||
// # $.geocomplete()
|
||||
// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.3
|
||||
//
|
||||
// * https://github.com/ubilabs/geocomplete/
|
||||
// * by Martin Kleppe <kleppe@ubilabs.net>
|
||||
|
||||
;(function($, window, document, undefined){
|
||||
|
||||
// ## Options
|
||||
// The default options for this plugin.
|
||||
//
|
||||
// * `map` - Might be a selector, an jQuery object or a DOM element. Default is `false` which shows no map.
|
||||
// * `details` - The container that should be populated with data. Defaults to `false` which ignores the setting.
|
||||
// * `location` - Location to initialize the map on. Might be an address `string` or an `array` with [latitude, longitude] or a `google.maps.LatLng`object. Default is `false` which shows a blank map.
|
||||
// * `bounds` - Whether to snap geocode search to map bounds. Default: `true` if false search globally. Alternatively pass a custom `LatLngBounds object.
|
||||
// * `detailsAttribute` - The attribute's name to use as an indicator. Default: `"name"`
|
||||
// * `mapOptions` - Options to pass to the `google.maps.Map` constructor. See the full list [here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MapOptions).
|
||||
// * `mapOptions.zoom` - The inital zoom level. Default: `14`
|
||||
// * `mapOptions.scrollwheel` - Whether to enable the scrollwheel to zoom the map. Default: `false`
|
||||
// * `mapOptions.mapTypeId` - The map type. Default: `"roadmap"`
|
||||
// * `markerOptions` - The options to pass to the `google.maps.Marker` constructor. See the full list [here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MarkerOptions).
|
||||
// * `markerOptions.draggable` - If the marker is draggable. Default: `false`. Set to true to enable dragging.
|
||||
// * `maxZoom` - The maximum zoom level too zoom in after a geocoding response. Default: `16`
|
||||
// * `types` - An array containing one or more of the supported types for the places request. Default: `['geocode']` See the full list [here](http://code.google.com/apis/maps/documentation/javascript/places.html#place_search_requests).
|
||||
|
||||
var defaults = {
|
||||
bounds: true,
|
||||
country: null,
|
||||
map: false,
|
||||
details: false,
|
||||
detailsAttribute: "name",
|
||||
location: false,
|
||||
|
||||
mapOptions: {
|
||||
zoom: 14,
|
||||
scrollwheel: false,
|
||||
mapTypeId: "roadmap"
|
||||
},
|
||||
|
||||
markerOptions: {
|
||||
draggable: false
|
||||
},
|
||||
|
||||
maxZoom: 16,
|
||||
types: ['geocode']
|
||||
};
|
||||
|
||||
// See: [Geocoding Types](https://developers.google.com/maps/documentation/geocoding/#Types)
|
||||
// on Google Developers.
|
||||
var componentTypes = ("street_address route intersection political " +
|
||||
"country administrative_area_level_1 administrative_area_level_2 " +
|
||||
"administrative_area_level_3 colloquial_area locality sublocality " +
|
||||
"neighborhood premise subpremise postal_code natural_feature airport " +
|
||||
"park point_of_interest post_box street_number floor room " +
|
||||
"lat lng viewport location " +
|
||||
"formatted_address location_type bounds").split(" ");
|
||||
|
||||
// See: [Places Details Responses](https://developers.google.com/maps/documentation/javascript/places#place_details_responses)
|
||||
// on Google Developers.
|
||||
var placesDetails = ("id url website vicinity reference name rating " +
|
||||
"international_phone_number icon formatted_phone_number").split(" ");
|
||||
|
||||
// The actual plugin constructor.
|
||||
function GeoComplete(input, options) {
|
||||
|
||||
this.options = $.extend(true, {}, defaults, options);
|
||||
|
||||
this.input = input;
|
||||
this.$input = $(input);
|
||||
|
||||
this._defaults = defaults;
|
||||
this._name = 'geocomplete';
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
// Initialize all parts of the plugin.
|
||||
$.extend(GeoComplete.prototype, {
|
||||
init: function(){
|
||||
this.initMap();
|
||||
this.initMarker();
|
||||
this.initGeocoder();
|
||||
this.initDetails();
|
||||
this.initLocation();
|
||||
},
|
||||
|
||||
// Initialize the map but only if the option `map` was set.
|
||||
// This will create a `map` within the given container
|
||||
// using the provided `mapOptions` or link to the existing map instance.
|
||||
initMap: function(){
|
||||
if (!this.options.map){ return; }
|
||||
|
||||
if (typeof this.options.map.setCenter == "function"){
|
||||
this.map = this.options.map;
|
||||
return;
|
||||
}
|
||||
|
||||
this.map = new google.maps.Map(
|
||||
$(this.options.map)[0],
|
||||
this.options.mapOptions
|
||||
);
|
||||
},
|
||||
|
||||
// Add a marker with the provided `markerOptions` but only
|
||||
// if the option was set. Additionally it listens for the `dragend` event
|
||||
// to notify the plugin about changes.
|
||||
initMarker: function(){
|
||||
if (!this.map){ return; }
|
||||
var options = $.extend(this.options.markerOptions, { map: this.map });
|
||||
this.marker = new google.maps.Marker(options);
|
||||
|
||||
google.maps.event.addListener(
|
||||
this.marker,
|
||||
'dragend',
|
||||
$.proxy(this.markerDragged, this)
|
||||
);
|
||||
},
|
||||
|
||||
// Associate the input with the autocompleter and create a geocoder
|
||||
// to fall back when the autocompleter does not return a value.
|
||||
initGeocoder: function(){
|
||||
|
||||
var options = {
|
||||
types: this.options.types,
|
||||
bounds: this.options.bounds === true ? null : this.options.bounds
|
||||
};
|
||||
|
||||
if (this.options.country){
|
||||
options.componentRestrictions = {country: this.options.country}
|
||||
}
|
||||
|
||||
this.autocomplete = new google.maps.places.Autocomplete(
|
||||
this.input, options
|
||||
);
|
||||
|
||||
this.geocoder = new google.maps.Geocoder();
|
||||
|
||||
// Bind autocomplete to map bounds but only if there is a map
|
||||
// and `options.bindToMap` is set to true.
|
||||
if (this.map && this.options.bounds === true){
|
||||
this.autocomplete.bindTo('bounds', this.map);
|
||||
}
|
||||
|
||||
// Watch `place_changed` events on the autocomplete input field.
|
||||
google.maps.event.addListener(
|
||||
this.autocomplete,
|
||||
'place_changed',
|
||||
$.proxy(this.placeChanged, this)
|
||||
);
|
||||
|
||||
// Prevent parent form from being submitted if user hit enter.
|
||||
this.$input.keypress(function(event){
|
||||
if (event.keyCode === 13){ return false; }
|
||||
});
|
||||
|
||||
// Listen for "geocode" events and trigger find action.
|
||||
this.$input.bind("geocode", $.proxy(function(){
|
||||
this.find();
|
||||
}, this));
|
||||
},
|
||||
|
||||
// Prepare a given DOM structure to be populated when we got some data.
|
||||
// This will cycle through the list of component types and map the
|
||||
// corresponding elements.
|
||||
initDetails: function(){
|
||||
if (!this.options.details){ return; }
|
||||
|
||||
var $details = $(this.options.details),
|
||||
attribute = this.options.detailsAttribute,
|
||||
details = {};
|
||||
|
||||
function setDetail(value){
|
||||
details[value] = $details.find("[" + attribute + "=" + value + "]");
|
||||
}
|
||||
|
||||
$.each(componentTypes, function(index, key){
|
||||
setDetail(key);
|
||||
setDetail(key + "_short");
|
||||
});
|
||||
|
||||
$.each(placesDetails, function(index, key){
|
||||
setDetail(key);
|
||||
});
|
||||
|
||||
this.$details = $details;
|
||||
this.details = details;
|
||||
},
|
||||
|
||||
// Set the initial location of the plugin if the `location` options was set.
|
||||
// This method will care about converting the value into the right format.
|
||||
initLocation: function() {
|
||||
|
||||
var location = this.options.location, latLng;
|
||||
|
||||
if (!location) { return; }
|
||||
|
||||
if (typeof location == 'string') {
|
||||
this.find(location);
|
||||
return;
|
||||
}
|
||||
|
||||
if (location instanceof Array) {
|
||||
latLng = new google.maps.LatLng(location[0], location[1]);
|
||||
}
|
||||
|
||||
if (location instanceof google.maps.LatLng){
|
||||
latLng = location;
|
||||
}
|
||||
|
||||
if (latLng){
|
||||
this.geoocode({ latLng: latLng });
|
||||
}
|
||||
},
|
||||
|
||||
// Look up a given address. If no `address` was specified it uses
|
||||
// the current value of the input.
|
||||
find: function(address){
|
||||
this.geocode({
|
||||
address: address || this.$input.val()
|
||||
});
|
||||
},
|
||||
|
||||
// Requests details about a given location.
|
||||
// Additionally it will bias the requests to the provided bounds.
|
||||
geocode: function(request){
|
||||
if (this.options.bounds && !request.bounds){
|
||||
if (this.options.bounds === true){
|
||||
request.bounds = this.map && this.map.getBounds();
|
||||
} else {
|
||||
request.bounds = this.options.bounds;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.options.country){
|
||||
request.region = this.options.country;
|
||||
}
|
||||
|
||||
this.geocoder.geocode(request, $.proxy(this.handleGeocode, this));
|
||||
},
|
||||
|
||||
// Handles the geocode response. If more than one results was found
|
||||
// it triggers the "geocode:multiple" events. If there was an error
|
||||
// the "geocode:error" event is fired.
|
||||
handleGeocode: function(results, status){
|
||||
if (status === google.maps.GeocoderStatus.OK) {
|
||||
var result = results[0];
|
||||
this.$input.val(result.formatted_address);
|
||||
this.update(result);
|
||||
|
||||
if (results.length > 1){
|
||||
this.trigger("geocode:multiple", results);
|
||||
}
|
||||
|
||||
} else {
|
||||
this.trigger("geocode:error", status);
|
||||
}
|
||||
},
|
||||
|
||||
// Triggers a given `event` with optional `arguments` on the input.
|
||||
trigger: function(event, argument){
|
||||
this.$input.trigger(event, [argument]);
|
||||
},
|
||||
|
||||
// Set the map to a new center by passing a `geometry`.
|
||||
// If the geometry has a viewport, the map zooms out to fit the bounds.
|
||||
// Additionally it updates the marker position.
|
||||
center: function(geometry){
|
||||
|
||||
if (geometry.viewport){
|
||||
this.map.fitBounds(geometry.viewport);
|
||||
if (this.map.getZoom() > this.options.maxZoom){
|
||||
this.map.setZoom(this.options.maxZoom);
|
||||
}
|
||||
} else {
|
||||
this.map.setZoom(this.options.maxZoom);
|
||||
this.map.setCenter(geometry.location);
|
||||
}
|
||||
|
||||
if (this.marker){
|
||||
this.marker.setPosition(geometry.location);
|
||||
this.marker.setAnimation(this.options.markerOptions.animation);
|
||||
}
|
||||
},
|
||||
|
||||
// Update the elements based on a single places or geoocoding response
|
||||
// and trigger the "geocode:result" event on the input.
|
||||
update: function(result){
|
||||
|
||||
if (this.map){
|
||||
this.center(result.geometry);
|
||||
}
|
||||
|
||||
if (this.$details){
|
||||
this.fillDetails(result);
|
||||
}
|
||||
|
||||
this.trigger("geocode:result", result);
|
||||
},
|
||||
|
||||
// Populate the provided elements with new `result` data.
|
||||
// This will lookup all elements that has an attribute with the given
|
||||
// component type.
|
||||
fillDetails: function(result){
|
||||
|
||||
var data = {},
|
||||
geometry = result.geometry,
|
||||
viewport = geometry.viewport,
|
||||
bounds = geometry.bounds;
|
||||
|
||||
// Create a simplified version of the address components.
|
||||
$.each(result.address_components, function(index, object){
|
||||
var name = object.types[0];
|
||||
data[name] = object.long_name;
|
||||
data[name + "_short"] = object.short_name;
|
||||
});
|
||||
|
||||
// Add properties of the places details.
|
||||
$.each(placesDetails, function(index, key){
|
||||
data[key] = result[key];
|
||||
});
|
||||
|
||||
// Add infos about the address and geometry.
|
||||
$.extend(data, {
|
||||
formatted_address: result.formatted_address,
|
||||
location_type: geometry.location_type || "PLACES",
|
||||
viewport: viewport,
|
||||
bounds: bounds,
|
||||
location: geometry.location,
|
||||
lat: geometry.location.lat(),
|
||||
lng: geometry.location.lng()
|
||||
});
|
||||
|
||||
// Set the values for all details.
|
||||
$.each(this.details, $.proxy(function(key, $detail){
|
||||
var value = data[key];
|
||||
this.setDetail($detail, value);
|
||||
}, this));
|
||||
|
||||
this.data = data;
|
||||
},
|
||||
|
||||
// Assign a given `value` to a single `$element`.
|
||||
// If the element is an input, the value is set, otherwise it updates
|
||||
// the text content.
|
||||
setDetail: function($element, value){
|
||||
|
||||
if (value === undefined){
|
||||
value = "";
|
||||
} else if (typeof value.toUrlValue == "function"){
|
||||
value = value.toUrlValue();
|
||||
}
|
||||
|
||||
if ($element.is(":input")){
|
||||
$element.val(value);
|
||||
} else {
|
||||
$element.text(value);
|
||||
}
|
||||
},
|
||||
|
||||
// Fire the "geocode:dragged" event and pass the new position.
|
||||
markerDragged: function(event){
|
||||
this.trigger("geocode:dragged", event.latLng);
|
||||
},
|
||||
|
||||
// Restore the old position of the marker to the last now location.
|
||||
resetMarker: function(){
|
||||
this.marker.setPosition(this.data.location);
|
||||
this.setDetail(this.details.lat, this.data.location.lat());
|
||||
this.setDetail(this.details.lng, this.data.location.lng());
|
||||
},
|
||||
|
||||
// Update the plugin after the user has selected an autocomplete entry.
|
||||
// If the place has no geometry it passes it to the geocoder.
|
||||
placeChanged: function(){
|
||||
var place = this.autocomplete.getPlace();
|
||||
|
||||
if (!place.geometry){
|
||||
this.find(place.name);
|
||||
} else {
|
||||
this.update(place);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// A plugin wrapper around the constructor.
|
||||
// Pass `options` with all settings that are different from the default.
|
||||
// The attribute is used to prevent multiple instantiations of the plugin.
|
||||
$.fn.geocomplete = function(options) {
|
||||
|
||||
var attribute = 'plugin_geocomplete';
|
||||
|
||||
// If you call `.geocomplete()` with a string as the first paramenter
|
||||
// it returns the corresponding property or calls the method with the
|
||||
// following arguments.
|
||||
if (typeof options == "string"){
|
||||
|
||||
var instance = $(this).data(attribute),
|
||||
prop = instance[options];
|
||||
|
||||
if (typeof prop == "function"){
|
||||
return prop.apply(instance, Array.prototype.slice.call(arguments, 1));
|
||||
} else {
|
||||
if (arguments.length == 2){
|
||||
prop = arguments[1];
|
||||
}
|
||||
return prop;
|
||||
}
|
||||
} else {
|
||||
return this.each(function() {
|
||||
// Prevent against multiple instantiations.
|
||||
var instance = $.data(this, attribute);
|
||||
if (!instance) {
|
||||
instance = new GeoComplete( this, options )
|
||||
$.data(this, attribute, instance);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
})( jQuery, window, document );
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* jQuery Geocoding and Places Autocomplete Plugin - V 1.3
|
||||
*
|
||||
* @author Martin Kleppe <kleppe@ubilabs.net>, 2012
|
||||
* @author Ubilabs http://ubilabs.net, 2012
|
||||
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/// # $.geocomplete()
|
||||
// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.3
|
||||
//
|
||||
// * https://github.com/ubilabs/geocomplete/
|
||||
// * by Martin Kleppe <kleppe@ubilabs.net>
|
||||
(function(a,b,c,d){function h(b,c){this.options=a.extend(!0,{},e,c),this.input=b,this.$input=a(b),this._defaults=e,this._name="geocomplete",this.init()}var e={bounds:!0,country:null,map:!1,details:!1,detailsAttribute:"name",location:!1,mapOptions:{zoom:14,scrollwheel:!1,mapTypeId:"roadmap"},markerOptions:{draggable:!1},maxZoom:16,types:["geocode"]},f="street_address route intersection political country administrative_area_level_1 administrative_area_level_2 administrative_area_level_3 colloquial_area locality sublocality neighborhood premise subpremise postal_code natural_feature airport park point_of_interest post_box street_number floor room lat lng viewport location formatted_address location_type bounds".split(" "),g="id url website vicinity reference name rating international_phone_number icon formatted_phone_number".split(" ");a.extend(h.prototype,{init:function(){this.initMap(),this.initMarker(),this.initGeocoder(),this.initDetails(),this.initLocation()},initMap:function(){if(!this.options.map)return;if(typeof this.options.map.setCenter=="function"){this.map=this.options.map;return}this.map=new google.maps.Map(a(this.options.map)[0],this.options.mapOptions)},initMarker:function(){if(!this.map)return;var b=a.extend(this.options.markerOptions,{map:this.map});this.marker=new google.maps.Marker(b),google.maps.event.addListener(this.marker,"dragend",a.proxy(this.markerDragged,this))},initGeocoder:function(){var b={types:this.options.types,bounds:this.options.bounds===!0?null:this.options.bounds};this.options.country&&(b.componentRestrictions={country:this.options.country}),this.autocomplete=new google.maps.places.Autocomplete(this.input,b),this.geocoder=new google.maps.Geocoder,this.map&&this.options.bounds===!0&&this.autocomplete.bindTo("bounds",this.map),google.maps.event.addListener(this.autocomplete,"place_changed",a.proxy(this.placeChanged,this)),this.$input.keypress(function(a){if(a.keyCode===13)return!1}),this.$input.bind("geocode",a.proxy(function(){this.find()},this))},initDetails:function(){function e(a){d[a]=b.find("["+c+"="+a+"]")}if(!this.options.details)return;var b=a(this.options.details),c=this.options.detailsAttribute,d={};a.each(f,function(a,b){e(b),e(b+"_short")}),a.each(g,function(a,b){e(b)}),this.$details=b,this.details=d},initLocation:function(){var a=this.options.location,b;if(!a)return;if(typeof a=="string"){this.find(a);return}a instanceof Array&&(b=new google.maps.LatLng(a[0],a[1])),a instanceof google.maps.LatLng&&(b=a),b&&this.geoocode({latLng:b})},find:function(a){this.geocode({address:a||this.$input.val()})},geocode:function(b){this.options.bounds&&!b.bounds&&(this.options.bounds===!0?b.bounds=this.map&&this.map.getBounds():b.bounds=this.options.bounds),this.options.country&&(b.region=this.options.country),this.geocoder.geocode(b,a.proxy(this.handleGeocode,this))},handleGeocode:function(a,b){if(b===google.maps.GeocoderStatus.OK){var c=a[0];this.$input.val(c.formatted_address),this.update(c),a.length>1&&this.trigger("geocode:multiple",a)}else this.trigger("geocode:error",b)},trigger:function(a,b){this.$input.trigger(a,[b])},center:function(a){a.viewport?(this.map.fitBounds(a.viewport),this.map.getZoom()>this.options.maxZoom&&this.map.setZoom(this.options.maxZoom)):(this.map.setZoom(this.options.maxZoom),this.map.setCenter(a.location)),this.marker&&(this.marker.setPosition(a.location),this.marker.setAnimation(this.options.markerOptions.animation))},update:function(a){this.map&&this.center(a.geometry),this.$details&&this.fillDetails(a),this.trigger("geocode:result",a)},fillDetails:function(b){var c={},d=b.geometry,e=d.viewport,f=d.bounds;a.each(b.address_components,function(a,b){var d=b.types[0];c[d]=b.long_name,c[d+"_short"]=b.short_name}),a.each(g,function(a,d){c[d]=b[d]}),a.extend(c,{formatted_address:b.formatted_address,location_type:d.location_type||"PLACES",viewport:e,bounds:f,location:d.location,lat:d.location.lat(),lng:d.location.lng()}),a.each(this.details,a.proxy(function(a,b){var d=c[a];this.setDetail(b,d)},this)),this.data=c},setDetail:function(a,b){b===d?b="":typeof b.toUrlValue=="function"&&(b=b.toUrlValue()),a.is(":input")?a.val(b):a.text(b)},markerDragged:function(a){this.trigger("geocode:dragged",a.latLng)},resetMarker:function(){this.marker.setPosition(this.data.location),this.setDetail(this.details.lat,this.data.location.lat()),this.setDetail(this.details.lng,this.data.location.lng())},placeChanged:function(){var a=this.autocomplete.getPlace();a.geometry?this.update(a):this.find(a.name)}}),a.fn.geocomplete=function(b){var c="plugin_geocomplete";if(typeof b=="string"){var d=a(this).data(c),e=d[b];return typeof e=="function"?e.apply(d,Array.prototype.slice.call(arguments,1)):(arguments.length==2&&(e=arguments[1]),e)}return this.each(function(){var d=a.data(this,c);d||(d=new h(this,b),a.data(this,c,d))})}})(jQuery,window,document);
|
||||
+434
@@ -0,0 +1,434 @@
|
||||
/**
|
||||
* jQuery Geocoding and Places Autocomplete Plugin - V 1.4
|
||||
*
|
||||
* @author Martin Kleppe <kleppe@ubilabs.net>, 2012
|
||||
* @author Ubilabs http://ubilabs.net, 2012
|
||||
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/
|
||||
|
||||
// # $.geocomplete()
|
||||
// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.4
|
||||
//
|
||||
// * https://github.com/ubilabs/geocomplete/
|
||||
// * by Martin Kleppe <kleppe@ubilabs.net>
|
||||
|
||||
;(function($, window, document, undefined){
|
||||
|
||||
// ## Options
|
||||
// The default options for this plugin.
|
||||
//
|
||||
// * `map` - Might be a selector, an jQuery object or a DOM element. Default is `false` which shows no map.
|
||||
// * `details` - The container that should be populated with data. Defaults to `false` which ignores the setting.
|
||||
// * `location` - Location to initialize the map on. Might be an address `string` or an `array` with [latitude, longitude] or a `google.maps.LatLng`object. Default is `false` which shows a blank map.
|
||||
// * `bounds` - Whether to snap geocode search to map bounds. Default: `true` if false search globally. Alternatively pass a custom `LatLngBounds object.
|
||||
// * `detailsAttribute` - The attribute's name to use as an indicator. Default: `"name"`
|
||||
// * `mapOptions` - Options to pass to the `google.maps.Map` constructor. See the full list [here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MapOptions).
|
||||
// * `mapOptions.zoom` - The inital zoom level. Default: `14`
|
||||
// * `mapOptions.scrollwheel` - Whether to enable the scrollwheel to zoom the map. Default: `false`
|
||||
// * `mapOptions.mapTypeId` - The map type. Default: `"roadmap"`
|
||||
// * `markerOptions` - The options to pass to the `google.maps.Marker` constructor. See the full list [here](http://code.google.com/apis/maps/documentation/javascript/reference.html#MarkerOptions).
|
||||
// * `markerOptions.draggable` - If the marker is draggable. Default: `false`. Set to true to enable dragging.
|
||||
// * `markerOptions.disabled` - Do not show marker. Default: `false`. Set to true to disable marker.
|
||||
// * `maxZoom` - The maximum zoom level too zoom in after a geocoding response. Default: `16`
|
||||
// * `types` - An array containing one or more of the supported types for the places request. Default: `['geocode']` See the full list [here](http://code.google.com/apis/maps/documentation/javascript/places.html#place_search_requests).
|
||||
|
||||
var defaults = {
|
||||
bounds: true,
|
||||
country: null,
|
||||
map: false,
|
||||
details: false,
|
||||
detailsAttribute: "name",
|
||||
location: false,
|
||||
|
||||
mapOptions: {
|
||||
zoom: 14,
|
||||
scrollwheel: false,
|
||||
mapTypeId: "roadmap"
|
||||
},
|
||||
|
||||
markerOptions: {
|
||||
draggable: false
|
||||
},
|
||||
|
||||
maxZoom: 16,
|
||||
types: ['geocode']
|
||||
};
|
||||
|
||||
// See: [Geocoding Types](https://developers.google.com/maps/documentation/geocoding/#Types)
|
||||
// on Google Developers.
|
||||
var componentTypes = ("street_address route intersection political " +
|
||||
"country administrative_area_level_1 administrative_area_level_2 " +
|
||||
"administrative_area_level_3 colloquial_area locality sublocality " +
|
||||
"neighborhood premise subpremise postal_code natural_feature airport " +
|
||||
"park point_of_interest post_box street_number floor room " +
|
||||
"lat lng viewport location " +
|
||||
"formatted_address location_type bounds").split(" ");
|
||||
|
||||
// See: [Places Details Responses](https://developers.google.com/maps/documentation/javascript/places#place_details_responses)
|
||||
// on Google Developers.
|
||||
var placesDetails = ("id url website vicinity reference name rating " +
|
||||
"international_phone_number icon formatted_phone_number").split(" ");
|
||||
|
||||
// The actual plugin constructor.
|
||||
function GeoComplete(input, options) {
|
||||
|
||||
this.options = $.extend(true, {}, defaults, options);
|
||||
|
||||
this.input = input;
|
||||
this.$input = $(input);
|
||||
|
||||
this._defaults = defaults;
|
||||
this._name = 'geocomplete';
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
// Initialize all parts of the plugin.
|
||||
$.extend(GeoComplete.prototype, {
|
||||
init: function(){
|
||||
this.initMap();
|
||||
this.initMarker();
|
||||
this.initGeocoder();
|
||||
this.initDetails();
|
||||
this.initLocation();
|
||||
},
|
||||
|
||||
// Initialize the map but only if the option `map` was set.
|
||||
// This will create a `map` within the given container
|
||||
// using the provided `mapOptions` or link to the existing map instance.
|
||||
initMap: function(){
|
||||
if (!this.options.map){ return; }
|
||||
|
||||
if (typeof this.options.map.setCenter == "function"){
|
||||
this.map = this.options.map;
|
||||
return;
|
||||
}
|
||||
|
||||
this.map = new google.maps.Map(
|
||||
$(this.options.map)[0],
|
||||
this.options.mapOptions
|
||||
);
|
||||
},
|
||||
|
||||
// Add a marker with the provided `markerOptions` but only
|
||||
// if the option was set. Additionally it listens for the `dragend` event
|
||||
// to notify the plugin about changes.
|
||||
initMarker: function(){
|
||||
if (!this.map){ return; }
|
||||
var options = $.extend(this.options.markerOptions, { map: this.map });
|
||||
|
||||
if (options.disabled){ return; }
|
||||
|
||||
this.marker = new google.maps.Marker(options);
|
||||
|
||||
google.maps.event.addListener(
|
||||
this.marker,
|
||||
'dragend',
|
||||
$.proxy(this.markerDragged, this)
|
||||
);
|
||||
},
|
||||
|
||||
// Associate the input with the autocompleter and create a geocoder
|
||||
// to fall back when the autocompleter does not return a value.
|
||||
initGeocoder: function(){
|
||||
|
||||
var options = {
|
||||
types: this.options.types,
|
||||
bounds: this.options.bounds === true ? null : this.options.bounds,
|
||||
componentRestrictions: this.options.componentRestrictions
|
||||
};
|
||||
|
||||
if (this.options.country){
|
||||
options.componentRestrictions = {country: this.options.country}
|
||||
}
|
||||
|
||||
this.autocomplete = new google.maps.places.Autocomplete(
|
||||
this.input, options
|
||||
);
|
||||
|
||||
this.geocoder = new google.maps.Geocoder();
|
||||
|
||||
// Bind autocomplete to map bounds but only if there is a map
|
||||
// and `options.bindToMap` is set to true.
|
||||
if (this.map && this.options.bounds === true){
|
||||
this.autocomplete.bindTo('bounds', this.map);
|
||||
}
|
||||
|
||||
// Watch `place_changed` events on the autocomplete input field.
|
||||
google.maps.event.addListener(
|
||||
this.autocomplete,
|
||||
'place_changed',
|
||||
$.proxy(this.placeChanged, this)
|
||||
);
|
||||
|
||||
// Prevent parent form from being submitted if user hit enter.
|
||||
this.$input.keypress(function(event){
|
||||
if (event.keyCode === 13){ return false; }
|
||||
});
|
||||
|
||||
// Listen for "geocode" events and trigger find action.
|
||||
this.$input.bind("geocode", $.proxy(function(){
|
||||
this.find();
|
||||
}, this));
|
||||
},
|
||||
|
||||
// Prepare a given DOM structure to be populated when we got some data.
|
||||
// This will cycle through the list of component types and map the
|
||||
// corresponding elements.
|
||||
initDetails: function(){
|
||||
if (!this.options.details){ return; }
|
||||
|
||||
var $details = $(this.options.details),
|
||||
attribute = this.options.detailsAttribute,
|
||||
details = {};
|
||||
|
||||
function setDetail(value){
|
||||
details[value] = $details.find("[" + attribute + "=" + value + "]");
|
||||
}
|
||||
|
||||
$.each(componentTypes, function(index, key){
|
||||
setDetail(key);
|
||||
setDetail(key + "_short");
|
||||
});
|
||||
|
||||
$.each(placesDetails, function(index, key){
|
||||
setDetail(key);
|
||||
});
|
||||
|
||||
this.$details = $details;
|
||||
this.details = details;
|
||||
},
|
||||
|
||||
// Set the initial location of the plugin if the `location` options was set.
|
||||
// This method will care about converting the value into the right format.
|
||||
initLocation: function() {
|
||||
|
||||
var location = this.options.location, latLng;
|
||||
|
||||
if (!location) { return; }
|
||||
|
||||
if (typeof location == 'string') {
|
||||
this.find(location);
|
||||
return;
|
||||
}
|
||||
|
||||
if (location instanceof Array) {
|
||||
latLng = new google.maps.LatLng(location[0], location[1]);
|
||||
}
|
||||
|
||||
if (location instanceof google.maps.LatLng){
|
||||
latLng = location;
|
||||
}
|
||||
|
||||
if (latLng){
|
||||
if (this.map){ this.map.setCenter(latLng); }
|
||||
}
|
||||
},
|
||||
|
||||
// Look up a given address. If no `address` was specified it uses
|
||||
// the current value of the input.
|
||||
find: function(address){
|
||||
this.geocode({
|
||||
address: address || this.$input.val()
|
||||
});
|
||||
},
|
||||
|
||||
// Requests details about a given location.
|
||||
// Additionally it will bias the requests to the provided bounds.
|
||||
geocode: function(request){
|
||||
if (this.options.bounds && !request.bounds){
|
||||
if (this.options.bounds === true){
|
||||
request.bounds = this.map && this.map.getBounds();
|
||||
} else {
|
||||
request.bounds = this.options.bounds;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.options.country){
|
||||
request.region = this.options.country;
|
||||
}
|
||||
|
||||
this.geocoder.geocode(request, $.proxy(this.handleGeocode, this));
|
||||
},
|
||||
|
||||
// Handles the geocode response. If more than one results was found
|
||||
// it triggers the "geocode:multiple" events. If there was an error
|
||||
// the "geocode:error" event is fired.
|
||||
handleGeocode: function(results, status){
|
||||
if (status === google.maps.GeocoderStatus.OK) {
|
||||
var result = results[0];
|
||||
this.$input.val(result.formatted_address);
|
||||
this.update(result);
|
||||
|
||||
if (results.length > 1){
|
||||
this.trigger("geocode:multiple", results);
|
||||
}
|
||||
|
||||
} else {
|
||||
this.trigger("geocode:error", status);
|
||||
}
|
||||
},
|
||||
|
||||
// Triggers a given `event` with optional `arguments` on the input.
|
||||
trigger: function(event, argument){
|
||||
this.$input.trigger(event, [argument]);
|
||||
},
|
||||
|
||||
// Set the map to a new center by passing a `geometry`.
|
||||
// If the geometry has a viewport, the map zooms out to fit the bounds.
|
||||
// Additionally it updates the marker position.
|
||||
center: function(geometry){
|
||||
|
||||
if (geometry.viewport){
|
||||
this.map.fitBounds(geometry.viewport);
|
||||
if (this.map.getZoom() > this.options.maxZoom){
|
||||
this.map.setZoom(this.options.maxZoom);
|
||||
}
|
||||
} else {
|
||||
this.map.setZoom(this.options.maxZoom);
|
||||
this.map.setCenter(geometry.location);
|
||||
}
|
||||
|
||||
if (this.marker){
|
||||
this.marker.setPosition(geometry.location);
|
||||
this.marker.setAnimation(this.options.markerOptions.animation);
|
||||
}
|
||||
},
|
||||
|
||||
// Update the elements based on a single places or geoocoding response
|
||||
// and trigger the "geocode:result" event on the input.
|
||||
update: function(result){
|
||||
|
||||
if (this.map){
|
||||
this.center(result.geometry);
|
||||
}
|
||||
|
||||
if (this.$details){
|
||||
this.fillDetails(result);
|
||||
}
|
||||
|
||||
this.trigger("geocode:result", result);
|
||||
},
|
||||
|
||||
// Populate the provided elements with new `result` data.
|
||||
// This will lookup all elements that has an attribute with the given
|
||||
// component type.
|
||||
fillDetails: function(result){
|
||||
|
||||
var data = {},
|
||||
geometry = result.geometry,
|
||||
viewport = geometry.viewport,
|
||||
bounds = geometry.bounds;
|
||||
|
||||
// Create a simplified version of the address components.
|
||||
$.each(result.address_components, function(index, object){
|
||||
var name = object.types[0];
|
||||
data[name] = object.long_name;
|
||||
data[name + "_short"] = object.short_name;
|
||||
});
|
||||
|
||||
// Add properties of the places details.
|
||||
$.each(placesDetails, function(index, key){
|
||||
data[key] = result[key];
|
||||
});
|
||||
|
||||
// Add infos about the address and geometry.
|
||||
$.extend(data, {
|
||||
formatted_address: result.formatted_address,
|
||||
location_type: geometry.location_type || "PLACES",
|
||||
viewport: viewport,
|
||||
bounds: bounds,
|
||||
location: geometry.location,
|
||||
lat: geometry.location.lat(),
|
||||
lng: geometry.location.lng()
|
||||
});
|
||||
|
||||
// Set the values for all details.
|
||||
$.each(this.details, $.proxy(function(key, $detail){
|
||||
var value = data[key];
|
||||
this.setDetail($detail, value);
|
||||
}, this));
|
||||
|
||||
this.data = data;
|
||||
},
|
||||
|
||||
// Assign a given `value` to a single `$element`.
|
||||
// If the element is an input, the value is set, otherwise it updates
|
||||
// the text content.
|
||||
setDetail: function($element, value){
|
||||
|
||||
if (value === undefined){
|
||||
value = "";
|
||||
} else if (typeof value.toUrlValue == "function"){
|
||||
value = value.toUrlValue();
|
||||
}
|
||||
|
||||
if ($element.is(":input")){
|
||||
$element.val(value);
|
||||
} else {
|
||||
$element.text(value);
|
||||
}
|
||||
},
|
||||
|
||||
// Fire the "geocode:dragged" event and pass the new position.
|
||||
markerDragged: function(event){
|
||||
this.trigger("geocode:dragged", event.latLng);
|
||||
},
|
||||
|
||||
// Restore the old position of the marker to the last now location.
|
||||
resetMarker: function(){
|
||||
this.marker.setPosition(this.data.location);
|
||||
this.setDetail(this.details.lat, this.data.location.lat());
|
||||
this.setDetail(this.details.lng, this.data.location.lng());
|
||||
},
|
||||
|
||||
// Update the plugin after the user has selected an autocomplete entry.
|
||||
// If the place has no geometry it passes it to the geocoder.
|
||||
placeChanged: function(){
|
||||
var place = this.autocomplete.getPlace();
|
||||
|
||||
if (!place.geometry){
|
||||
this.find(place.name);
|
||||
} else {
|
||||
this.update(place);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// A plugin wrapper around the constructor.
|
||||
// Pass `options` with all settings that are different from the default.
|
||||
// The attribute is used to prevent multiple instantiations of the plugin.
|
||||
$.fn.geocomplete = function(options) {
|
||||
|
||||
var attribute = 'plugin_geocomplete';
|
||||
|
||||
// If you call `.geocomplete()` with a string as the first parameter
|
||||
// it returns the corresponding property or calls the method with the
|
||||
// following arguments.
|
||||
if (typeof options == "string"){
|
||||
|
||||
var instance = $(this).data(attribute) || $(this).geocomplete().data(attribute),
|
||||
prop = instance[options];
|
||||
|
||||
if (typeof prop == "function"){
|
||||
prop.apply(instance, Array.prototype.slice.call(arguments, 1));
|
||||
return $(this);
|
||||
} else {
|
||||
if (arguments.length == 2){
|
||||
prop = arguments[1];
|
||||
}
|
||||
return prop;
|
||||
}
|
||||
} else {
|
||||
return this.each(function() {
|
||||
// Prevent against multiple instantiations.
|
||||
var instance = $.data(this, attribute);
|
||||
if (!instance) {
|
||||
instance = new GeoComplete( this, options )
|
||||
$.data(this, attribute, instance);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
})( jQuery, window, document );
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* jQuery Geocoding and Places Autocomplete Plugin - V 1.4
|
||||
*
|
||||
* @author Martin Kleppe <kleppe@ubilabs.net>, 2012
|
||||
* @author Ubilabs http://ubilabs.net, 2012
|
||||
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/// # $.geocomplete()
|
||||
// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.4
|
||||
//
|
||||
// * https://github.com/ubilabs/geocomplete/
|
||||
// * by Martin Kleppe <kleppe@ubilabs.net>
|
||||
(function(a,b,c,d){function h(b,c){this.options=a.extend(!0,{},e,c),this.input=b,this.$input=a(b),this._defaults=e,this._name="geocomplete",this.init()}var e={bounds:!0,country:null,map:!1,details:!1,detailsAttribute:"name",location:!1,mapOptions:{zoom:14,scrollwheel:!1,mapTypeId:"roadmap"},markerOptions:{draggable:!1},maxZoom:16,types:["geocode"]},f="street_address route intersection political country administrative_area_level_1 administrative_area_level_2 administrative_area_level_3 colloquial_area locality sublocality neighborhood premise subpremise postal_code natural_feature airport park point_of_interest post_box street_number floor room lat lng viewport location formatted_address location_type bounds".split(" "),g="id url website vicinity reference name rating international_phone_number icon formatted_phone_number".split(" ");a.extend(h.prototype,{init:function(){this.initMap(),this.initMarker(),this.initGeocoder(),this.initDetails(),this.initLocation()},initMap:function(){if(!this.options.map)return;if(typeof this.options.map.setCenter=="function"){this.map=this.options.map;return}this.map=new google.maps.Map(a(this.options.map)[0],this.options.mapOptions)},initMarker:function(){if(!this.map)return;var b=a.extend(this.options.markerOptions,{map:this.map});if(b.disabled)return;this.marker=new google.maps.Marker(b),google.maps.event.addListener(this.marker,"dragend",a.proxy(this.markerDragged,this))},initGeocoder:function(){var b={types:this.options.types,bounds:this.options.bounds===!0?null:this.options.bounds,componentRestrictions:this.options.componentRestrictions};this.options.country&&(b.componentRestrictions={country:this.options.country}),this.autocomplete=new google.maps.places.Autocomplete(this.input,b),this.geocoder=new google.maps.Geocoder,this.map&&this.options.bounds===!0&&this.autocomplete.bindTo("bounds",this.map),google.maps.event.addListener(this.autocomplete,"place_changed",a.proxy(this.placeChanged,this)),this.$input.keypress(function(a){if(a.keyCode===13)return!1}),this.$input.bind("geocode",a.proxy(function(){this.find()},this))},initDetails:function(){function e(a){d[a]=b.find("["+c+"="+a+"]")}if(!this.options.details)return;var b=a(this.options.details),c=this.options.detailsAttribute,d={};a.each(f,function(a,b){e(b),e(b+"_short")}),a.each(g,function(a,b){e(b)}),this.$details=b,this.details=d},initLocation:function(){var a=this.options.location,b;if(!a)return;if(typeof a=="string"){this.find(a);return}a instanceof Array&&(b=new google.maps.LatLng(a[0],a[1])),a instanceof google.maps.LatLng&&(b=a),b&&this.map&&this.map.setCenter(b)},find:function(a){this.geocode({address:a||this.$input.val()})},geocode:function(b){this.options.bounds&&!b.bounds&&(this.options.bounds===!0?b.bounds=this.map&&this.map.getBounds():b.bounds=this.options.bounds),this.options.country&&(b.region=this.options.country),this.geocoder.geocode(b,a.proxy(this.handleGeocode,this))},handleGeocode:function(a,b){if(b===google.maps.GeocoderStatus.OK){var c=a[0];this.$input.val(c.formatted_address),this.update(c),a.length>1&&this.trigger("geocode:multiple",a)}else this.trigger("geocode:error",b)},trigger:function(a,b){this.$input.trigger(a,[b])},center:function(a){a.viewport?(this.map.fitBounds(a.viewport),this.map.getZoom()>this.options.maxZoom&&this.map.setZoom(this.options.maxZoom)):(this.map.setZoom(this.options.maxZoom),this.map.setCenter(a.location)),this.marker&&(this.marker.setPosition(a.location),this.marker.setAnimation(this.options.markerOptions.animation))},update:function(a){this.map&&this.center(a.geometry),this.$details&&this.fillDetails(a),this.trigger("geocode:result",a)},fillDetails:function(b){var c={},d=b.geometry,e=d.viewport,f=d.bounds;a.each(b.address_components,function(a,b){var d=b.types[0];c[d]=b.long_name,c[d+"_short"]=b.short_name}),a.each(g,function(a,d){c[d]=b[d]}),a.extend(c,{formatted_address:b.formatted_address,location_type:d.location_type||"PLACES",viewport:e,bounds:f,location:d.location,lat:d.location.lat(),lng:d.location.lng()}),a.each(this.details,a.proxy(function(a,b){var d=c[a];this.setDetail(b,d)},this)),this.data=c},setDetail:function(a,b){b===d?b="":typeof b.toUrlValue=="function"&&(b=b.toUrlValue()),a.is(":input")?a.val(b):a.text(b)},markerDragged:function(a){this.trigger("geocode:dragged",a.latLng)},resetMarker:function(){this.marker.setPosition(this.data.location),this.setDetail(this.details.lat,this.data.location.lat()),this.setDetail(this.details.lng,this.data.location.lng())},placeChanged:function(){var a=this.autocomplete.getPlace();a.geometry?this.update(a):this.find(a.name)}}),a.fn.geocomplete=function(b){var c="plugin_geocomplete";if(typeof b=="string"){var d=a(this).data(c)||a(this).geocomplete().data(c),e=d[b];return typeof e=="function"?(e.apply(d,Array.prototype.slice.call(arguments,1)),a(this)):(arguments.length==2&&(e=arguments[1]),e)}return this.each(function(){var d=a.data(this,c);d||(d=new h(this,b),a.data(this,c,d))})}})(jQuery,window,document);
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "geocomplete",
|
||||
"filename": "jquery.geocomplete.min.js",
|
||||
"version": "1.4",
|
||||
"description": "Easily convert unordered lists & other nested HTML structures into entertaining, interactive, turntable-like areas.",
|
||||
"keywords": [
|
||||
"geocomplete",
|
||||
"turntable",
|
||||
"lazy",
|
||||
"susan",
|
||||
"carousel",
|
||||
"3d"
|
||||
],
|
||||
"homepage": "http://ubilabs.github.io/geocomplete/",
|
||||
"author": {
|
||||
"name": "Martin Kleppe",
|
||||
"email": "kleppe@ubilabs.net"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/ubilabs/geocomplete.git"
|
||||
}
|
||||
}
|
||||
Executable
+603
@@ -0,0 +1,603 @@
|
||||
/*
|
||||
SlidesJS 3.0
|
||||
|
||||
Documentation and examples http://slidesjs.com
|
||||
Support forum http://groups.google.com/group/slidesjs
|
||||
Created by Nathan Searles http://nathansearles.com
|
||||
|
||||
Version: 3.0
|
||||
Updated: March 8th, 2013
|
||||
|
||||
SlidesJS is an open source project, contribute at GitHub:
|
||||
https://github.com/nathansearles/Slides
|
||||
|
||||
(c) 2013 by Nathan Searles
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
(function() {
|
||||
|
||||
(function($, window, document) {
|
||||
var Plugin, defaults, pluginName;
|
||||
pluginName = "slidesjs";
|
||||
defaults = {
|
||||
width: 940,
|
||||
height: 528,
|
||||
start: 1,
|
||||
navigation: {
|
||||
active: true,
|
||||
effect: "slide"
|
||||
},
|
||||
pagination: {
|
||||
active: true,
|
||||
effect: "slide"
|
||||
},
|
||||
play: {
|
||||
active: false,
|
||||
effect: "slide",
|
||||
interval: 5000,
|
||||
auto: false,
|
||||
swap: true
|
||||
},
|
||||
effect: {
|
||||
slide: {
|
||||
speed: 500
|
||||
},
|
||||
fade: {
|
||||
speed: 300,
|
||||
crossfade: true
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
loaded: function() {},
|
||||
start: function() {},
|
||||
complete: function() {}
|
||||
}
|
||||
};
|
||||
Plugin = (function() {
|
||||
|
||||
function Plugin(element, options) {
|
||||
this.element = element;
|
||||
this.options = $.extend(true, {}, defaults, options);
|
||||
this._defaults = defaults;
|
||||
this._name = pluginName;
|
||||
this.init();
|
||||
}
|
||||
|
||||
return Plugin;
|
||||
|
||||
})();
|
||||
Plugin.prototype.init = function() {
|
||||
var $element, nextButton, pagination, playButton, prevButton, stopButton,
|
||||
_this = this;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
$.data(this, "animating", false);
|
||||
$.data(this, "total", $element.children().not(".slidesjs-navigation", $element).length);
|
||||
$.data(this, "current", this.options.start - 1);
|
||||
$.data(this, "vendorPrefix", this._getVendorPrefix());
|
||||
if (typeof TouchEvent !== "undefined") {
|
||||
$.data(this, "touch", true);
|
||||
this.options.effect.slide.speed = this.options.effect.slide.speed / 2;
|
||||
}
|
||||
$element.css({
|
||||
overflow: "hidden"
|
||||
});
|
||||
$element.slidesContainer = $element.children().not(".slidesjs-navigation", $element).wrapAll("<div class='slidesjs-container'>", $element).parent().css({
|
||||
overflow: "hidden",
|
||||
position: "relative"
|
||||
});
|
||||
$(".slidesjs-container", $element).wrapInner("<div class='slidesjs-control'>", $element).children();
|
||||
$(".slidesjs-control", $element).css({
|
||||
position: "relative",
|
||||
left: 0
|
||||
});
|
||||
$(".slidesjs-control", $element).children().addClass("slidesjs-slide").css({
|
||||
position: "absolute",
|
||||
top: 0,
|
||||
left: 0,
|
||||
width: "100%",
|
||||
zIndex: 0,
|
||||
display: "none",
|
||||
webkitBackfaceVisibility: "hidden"
|
||||
});
|
||||
$.each($(".slidesjs-control", $element).children(), function(i) {
|
||||
var $slide;
|
||||
$slide = $(this);
|
||||
return $slide.attr("slidesjs-index", i);
|
||||
});
|
||||
if (this.data.touch) {
|
||||
$(".slidesjs-control", $element).on("touchstart", function(e) {
|
||||
return _this._touchstart(e);
|
||||
});
|
||||
$(".slidesjs-control", $element).on("touchmove", function(e) {
|
||||
return _this._touchmove(e);
|
||||
});
|
||||
$(".slidesjs-control", $element).on("touchend", function(e) {
|
||||
return _this._touchend(e);
|
||||
});
|
||||
}
|
||||
$element.fadeIn(0);
|
||||
this.update();
|
||||
if (this.data.touch) {
|
||||
this._setuptouch();
|
||||
}
|
||||
$(".slidesjs-control", $element).children(":eq(" + this.data.current + ")").eq(0).fadeIn(0, function() {
|
||||
return $(this).css({
|
||||
zIndex: 10
|
||||
});
|
||||
});
|
||||
if (this.options.navigation.active) {
|
||||
prevButton = $("<a>", {
|
||||
"class": "slidesjs-previous slidesjs-navigation",
|
||||
href: "#",
|
||||
title: "Previous",
|
||||
text: "Previous"
|
||||
}).appendTo($element);
|
||||
nextButton = $("<a>", {
|
||||
"class": "slidesjs-next slidesjs-navigation",
|
||||
href: "#",
|
||||
title: "Next",
|
||||
text: "Next"
|
||||
}).appendTo($element);
|
||||
}
|
||||
$(".slidesjs-next", $element).click(function(e) {
|
||||
e.preventDefault();
|
||||
_this.stop();
|
||||
return _this.next(_this.options.navigation.effect);
|
||||
});
|
||||
$(".slidesjs-previous", $element).click(function(e) {
|
||||
e.preventDefault();
|
||||
_this.stop();
|
||||
return _this.previous(_this.options.navigation.effect);
|
||||
});
|
||||
if (this.options.play.active) {
|
||||
playButton = $("<a>", {
|
||||
"class": "slidesjs-play slidesjs-navigation",
|
||||
href: "#",
|
||||
title: "Play",
|
||||
text: "Play"
|
||||
}).appendTo($element);
|
||||
stopButton = $("<a>", {
|
||||
"class": "slidesjs-stop slidesjs-navigation",
|
||||
href: "#",
|
||||
title: "Stop",
|
||||
text: "Stop"
|
||||
}).appendTo($element);
|
||||
playButton.click(function(e) {
|
||||
e.preventDefault();
|
||||
return _this.play(true);
|
||||
});
|
||||
stopButton.click(function(e) {
|
||||
e.preventDefault();
|
||||
return _this.stop();
|
||||
});
|
||||
if (this.options.play.swap) {
|
||||
stopButton.css({
|
||||
display: "none"
|
||||
});
|
||||
}
|
||||
}
|
||||
if (this.options.pagination.active) {
|
||||
pagination = $("<ul>", {
|
||||
"class": "slidesjs-pagination"
|
||||
}).appendTo($element);
|
||||
$.each(new Array(this.data.total), function(i) {
|
||||
var paginationItem, paginationLink;
|
||||
paginationItem = $("<li>", {
|
||||
"class": "slidesjs-pagination-item"
|
||||
}).appendTo(pagination);
|
||||
paginationLink = $("<a>", {
|
||||
href: "#",
|
||||
"data-slidesjs-item": i,
|
||||
html: i + 1
|
||||
}).appendTo(paginationItem);
|
||||
return paginationLink.click(function(e) {
|
||||
e.preventDefault();
|
||||
_this.stop();
|
||||
return _this.goto(($(e.currentTarget).attr("data-slidesjs-item") * 1) + 1);
|
||||
});
|
||||
});
|
||||
}
|
||||
$(window).bind("resize", function() {
|
||||
return _this.update();
|
||||
});
|
||||
this._setActive();
|
||||
if (this.options.play.auto) {
|
||||
this.play();
|
||||
}
|
||||
return this.options.callback.loaded(this.options.start);
|
||||
};
|
||||
Plugin.prototype._setActive = function(number) {
|
||||
var $element, current;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
current = number > -1 ? number : this.data.current;
|
||||
$(".active", $element).removeClass("active");
|
||||
return $("li:eq(" + current + ") a", $element).addClass("active");
|
||||
};
|
||||
Plugin.prototype.update = function() {
|
||||
var $element, height, width;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
$(".slidesjs-control", $element).children(":not(:eq(" + this.data.current + "))").css({
|
||||
display: "none",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
width = $element.width();
|
||||
height = (this.options.height / this.options.width) * width;
|
||||
this.options.width = width;
|
||||
this.options.height = height;
|
||||
return $(".slidesjs-control, .slidesjs-container", $element).css({
|
||||
width: width,
|
||||
height: height
|
||||
});
|
||||
};
|
||||
Plugin.prototype.next = function(effect) {
|
||||
var $element;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
$.data(this, "direction", "next");
|
||||
if (effect === void 0) {
|
||||
effect = this.options.navigation.effect;
|
||||
}
|
||||
if (effect === "fade") {
|
||||
return this._fade();
|
||||
} else {
|
||||
return this._slide();
|
||||
}
|
||||
};
|
||||
Plugin.prototype.previous = function(effect) {
|
||||
var $element;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
$.data(this, "direction", "previous");
|
||||
if (effect === void 0) {
|
||||
effect = this.options.navigation.effect;
|
||||
}
|
||||
if (effect === "fade") {
|
||||
return this._fade();
|
||||
} else {
|
||||
return this._slide();
|
||||
}
|
||||
};
|
||||
Plugin.prototype.goto = function(number) {
|
||||
var $element, effect;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
if (effect === void 0) {
|
||||
effect = this.options.pagination.effect;
|
||||
}
|
||||
if (number > this.data.total) {
|
||||
number = this.data.total;
|
||||
} else if (number < 1) {
|
||||
number = 1;
|
||||
}
|
||||
if (typeof number === "number") {
|
||||
if (effect === "fade") {
|
||||
return this._fade(number);
|
||||
} else {
|
||||
return this._slide(number);
|
||||
}
|
||||
} else if (typeof number === "string") {
|
||||
if (number === "first") {
|
||||
if (effect === "fade") {
|
||||
return this._fade(0);
|
||||
} else {
|
||||
return this._slide(0);
|
||||
}
|
||||
} else if (number === "last") {
|
||||
if (effect === "fade") {
|
||||
return this._fade(this.data.total);
|
||||
} else {
|
||||
return this._slide(this.data.total);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
Plugin.prototype._setuptouch = function() {
|
||||
var $element, next, previous, slidesControl;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
slidesControl = $(".slidesjs-control", $element);
|
||||
next = this.data.current + 1;
|
||||
previous = this.data.current - 1;
|
||||
if (previous < 0) {
|
||||
previous = this.data.total - 1;
|
||||
}
|
||||
if (next > this.data.total - 1) {
|
||||
next = 0;
|
||||
}
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
display: "block",
|
||||
left: this.options.width
|
||||
});
|
||||
return slidesControl.children(":eq(" + previous + ")").css({
|
||||
display: "block",
|
||||
left: -this.options.width
|
||||
});
|
||||
};
|
||||
Plugin.prototype._touchstart = function(e) {
|
||||
var $element, touches;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
touches = e.originalEvent.touches[0];
|
||||
this._setuptouch();
|
||||
$.data(this, "touchtimer", Number(new Date()));
|
||||
$.data(this, "touchstartx", touches.pageX);
|
||||
$.data(this, "touchstarty", touches.pageY);
|
||||
return e.stopPropagation();
|
||||
};
|
||||
Plugin.prototype._touchend = function(e) {
|
||||
var $element, duration, prefix, slidesControl, timing, touches, transform,
|
||||
_this = this;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
touches = e.originalEvent.touches[0];
|
||||
slidesControl = $(".slidesjs-control", $element);
|
||||
if (slidesControl.position().left > this.options.width * 0.5 || slidesControl.position().left > this.options.width * 0.1 && (Number(new Date()) - this.data.touchtimer < 250)) {
|
||||
$.data(this, "direction", "previous");
|
||||
this._slide();
|
||||
} else if (slidesControl.position().left < -(this.options.width * 0.5) || slidesControl.position().left < -(this.options.width * 0.1) && (Number(new Date()) - this.data.touchtimer < 250)) {
|
||||
$.data(this, "direction", "next");
|
||||
this._slide();
|
||||
} else {
|
||||
prefix = this.data.vendorPrefix;
|
||||
transform = prefix + "Transform";
|
||||
duration = prefix + "TransitionDuration";
|
||||
timing = prefix + "TransitionTimingFunction";
|
||||
slidesControl[0].style[transform] = "translateX(0px)";
|
||||
slidesControl[0].style[duration] = this.options.effect.slide.speed * 0.85 + "ms";
|
||||
}
|
||||
slidesControl.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd", function() {
|
||||
prefix = _this.data.vendorPrefix;
|
||||
transform = prefix + "Transform";
|
||||
duration = prefix + "TransitionDuration";
|
||||
timing = prefix + "TransitionTimingFunction";
|
||||
slidesControl[0].style[transform] = "";
|
||||
slidesControl[0].style[duration] = "";
|
||||
return slidesControl[0].style[timing] = "";
|
||||
});
|
||||
return e.stopPropagation();
|
||||
};
|
||||
Plugin.prototype._touchmove = function(e) {
|
||||
var $element, prefix, slidesControl, touches, transform;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
touches = e.originalEvent.touches[0];
|
||||
prefix = this.data.vendorPrefix;
|
||||
slidesControl = $(".slidesjs-control", $element);
|
||||
transform = prefix + "Transform";
|
||||
$.data(this, "scrolling", Math.abs(touches.pageX - this.data.touchstartx) < Math.abs(touches.pageY - this.data.touchstarty));
|
||||
if (!this.data.animating && !this.data.scrolling) {
|
||||
e.preventDefault();
|
||||
this._setuptouch();
|
||||
slidesControl[0].style[transform] = "translateX(" + (touches.pageX - this.data.touchstartx) + "px)";
|
||||
}
|
||||
return e.stopPropagation();
|
||||
};
|
||||
Plugin.prototype.play = function(next) {
|
||||
var $element, currentSlide,
|
||||
_this = this;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
if (!this.data.playInterval) {
|
||||
if (next) {
|
||||
currentSlide = this.data.current;
|
||||
this.data.direction = "next";
|
||||
if (this.options.play.effect === "fade") {
|
||||
this._fade();
|
||||
} else {
|
||||
this._slide();
|
||||
}
|
||||
}
|
||||
$.data(this, "playInterval", setInterval((function() {
|
||||
currentSlide = _this.data.current;
|
||||
_this.data.direction = "next";
|
||||
if (_this.options.play.effect === "fade") {
|
||||
return _this._fade();
|
||||
} else {
|
||||
return _this._slide();
|
||||
}
|
||||
}), this.options.play.interval));
|
||||
$.data(this, "playing", true);
|
||||
$(".slidesjs-play", $element).addClass("slidesjs-playing");
|
||||
if (this.options.play.swap) {
|
||||
$(".slidesjs-play", $element).hide();
|
||||
return $(".slidesjs-stop", $element).show();
|
||||
}
|
||||
}
|
||||
};
|
||||
Plugin.prototype.stop = function() {
|
||||
var $element;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
clearInterval(this.data.playInterval);
|
||||
$.data(this, "playInterval", null);
|
||||
$.data(this, "playing", false);
|
||||
$(".slidesjs-play", $element).removeClass("slidesjs-playing");
|
||||
if (this.options.play.swap) {
|
||||
$(".slidesjs-stop", $element).hide();
|
||||
return $(".slidesjs-play", $element).show();
|
||||
}
|
||||
};
|
||||
Plugin.prototype._slide = function(number) {
|
||||
var $element, currentSlide, direction, duration, next, prefix, slidesControl, timing, transform, value,
|
||||
_this = this;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
if (!this.data.animating && number !== this.data.current + 1) {
|
||||
$.data(this, "animating", true);
|
||||
currentSlide = this.data.current;
|
||||
if (number > -1) {
|
||||
number = number - 1;
|
||||
value = number > currentSlide ? 1 : -1;
|
||||
direction = number > currentSlide ? -this.options.width : this.options.width;
|
||||
next = number;
|
||||
} else {
|
||||
value = this.data.direction === "next" ? 1 : -1;
|
||||
direction = this.data.direction === "next" ? -this.options.width : this.options.width;
|
||||
next = currentSlide + value;
|
||||
}
|
||||
if (next === -1) {
|
||||
next = this.data.total - 1;
|
||||
}
|
||||
if (next === this.data.total) {
|
||||
next = 0;
|
||||
}
|
||||
this._setActive(next);
|
||||
slidesControl = $(".slidesjs-control", $element);
|
||||
if (number > -1) {
|
||||
slidesControl.children(":not(:eq(" + currentSlide + "))").css({
|
||||
display: "none",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
}
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
display: "block",
|
||||
left: value * this.options.width,
|
||||
zIndex: 10
|
||||
});
|
||||
this.options.callback.start(currentSlide + 1);
|
||||
if (this.data.vendorPrefix) {
|
||||
prefix = this.data.vendorPrefix;
|
||||
transform = prefix + "Transform";
|
||||
duration = prefix + "TransitionDuration";
|
||||
timing = prefix + "TransitionTimingFunction";
|
||||
slidesControl[0].style[transform] = "translateX(" + direction + "px)";
|
||||
slidesControl[0].style[duration] = this.options.effect.slide.speed + "ms";
|
||||
return slidesControl.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd", function() {
|
||||
slidesControl[0].style[transform] = "";
|
||||
slidesControl[0].style[duration] = "";
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
left: 0
|
||||
});
|
||||
slidesControl.children(":eq(" + currentSlide + ")").css({
|
||||
display: "none",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
$.data(_this, "current", next);
|
||||
$.data(_this, "animating", false);
|
||||
slidesControl.unbind("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd");
|
||||
slidesControl.children(":not(:eq(" + next + "))").css({
|
||||
display: "none",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
if (_this.data.touch) {
|
||||
_this._setuptouch();
|
||||
}
|
||||
return _this.options.callback.complete(next + 1);
|
||||
});
|
||||
} else {
|
||||
return slidesControl.stop().animate({
|
||||
left: direction
|
||||
}, this.options.effect.slide.speed, (function() {
|
||||
slidesControl.css({
|
||||
left: 0
|
||||
});
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
left: 0
|
||||
});
|
||||
return slidesControl.children(":eq(" + currentSlide + ")").css({
|
||||
display: "none",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
}, $.data(_this, "current", next), $.data(_this, "animating", false), _this.options.callback.complete(next + 1));
|
||||
}));
|
||||
}
|
||||
}
|
||||
};
|
||||
Plugin.prototype._fade = function(number) {
|
||||
var $element, currentSlide, next, slidesControl, value,
|
||||
_this = this;
|
||||
$element = $(this.element);
|
||||
this.data = $.data(this);
|
||||
if (!this.data.animating && number !== this.data.current + 1) {
|
||||
$.data(this, "animating", true);
|
||||
currentSlide = this.data.current;
|
||||
if (number) {
|
||||
number = number - 1;
|
||||
value = number > currentSlide ? 1 : -1;
|
||||
next = number;
|
||||
} else {
|
||||
value = this.data.direction === "next" ? 1 : -1;
|
||||
next = currentSlide + value;
|
||||
}
|
||||
if (next === -1) {
|
||||
next = this.data.total - 1;
|
||||
}
|
||||
if (next === this.data.total) {
|
||||
next = 0;
|
||||
}
|
||||
this._setActive(next);
|
||||
slidesControl = $(".slidesjs-control", $element);
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
display: "block",
|
||||
left: 0,
|
||||
zIndex: 0
|
||||
});
|
||||
this.options.callback.start(currentSlide + 1);
|
||||
if (this.options.effect.fade.crossfade) {
|
||||
return slidesControl.children(":eq(" + this.data.current + ")").stop().fadeOut(this.options.effect.fade.speed, (function() {
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
zIndex: 10
|
||||
});
|
||||
$.data(_this, "animating", false);
|
||||
$.data(_this, "current", next);
|
||||
return _this.options.callback.complete(next + 1);
|
||||
}));
|
||||
} else {
|
||||
slidesControl.children(":eq(" + next + ")").css({
|
||||
display: "none"
|
||||
});
|
||||
return slidesControl.children(":eq(" + currentSlide + ")").stop().fadeOut(this.options.effect.fade.speed, (function() {
|
||||
slidesControl.children(":eq(" + next + ")").stop().fadeIn(this.options.effect.fade.speed).css({
|
||||
zIndex: 10
|
||||
});
|
||||
$.data(this, "animating", false);
|
||||
$.data(this, "current", next);
|
||||
return this.options.callback.complete(next + 1);
|
||||
}));
|
||||
}
|
||||
}
|
||||
};
|
||||
Plugin.prototype._getVendorPrefix = function() {
|
||||
var body, i, style, transition, vendor;
|
||||
body = document.body || document.documentElement;
|
||||
style = body.style;
|
||||
transition = "transition";
|
||||
vendor = ["Moz", "Webkit", "Khtml", "O", "ms"];
|
||||
transition = transition.charAt(0).toUpperCase() + transition.substr(1);
|
||||
i = 0;
|
||||
while (i < vendor.length) {
|
||||
if (typeof style[vendor[i] + transition] === "string") {
|
||||
return vendor[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
return $.fn[pluginName] = function(options) {
|
||||
return this.each(function() {
|
||||
if (!$.data(this, "plugin_" + pluginName)) {
|
||||
return $.data(this, "plugin_" + pluginName, new Plugin(this, options));
|
||||
}
|
||||
});
|
||||
};
|
||||
})(jQuery, window, document);
|
||||
|
||||
}).call(this);
|
||||
+7
File diff suppressed because one or more lines are too long
Executable
+23
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "slidesjs",
|
||||
"filename": "jquery.slides.min.js",
|
||||
"version": "3.0",
|
||||
"description": "SlidesJS is a responsive slideshow plug-in for jQuery (1.7.1+) with features like touch and CSS3 transitions.",
|
||||
"keywords": [
|
||||
"slides",
|
||||
"navigation",
|
||||
"pagination",
|
||||
"play",
|
||||
"effect",
|
||||
"callback"
|
||||
],
|
||||
"homepage": "http://slidesjs.com",
|
||||
"author": {
|
||||
"name": "Nathan Searles",
|
||||
"email": "nsearles@gmail.com"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nathansearles/Slides.git"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user