diff --git a/ajax/libs/geocomplete/1.3/jquery.geocomplete.js b/ajax/libs/geocomplete/1.3/jquery.geocomplete.js new file mode 100755 index 000000000..2dcd02a32 --- /dev/null +++ b/ajax/libs/geocomplete/1.3/jquery.geocomplete.js @@ -0,0 +1,428 @@ +/** + * jQuery Geocoding and Places Autocomplete Plugin - V 1.3 + * + * @author Martin Kleppe , 2012 + * @author Ubilabs http://ubilabs.net, 2012 + * @license MIT License + */ + +// # $.geocomplete() +// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.3 +// +// * https://github.com/ubilabs/geocomplete/ +// * by Martin Kleppe + +;(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 ); \ No newline at end of file diff --git a/ajax/libs/geocomplete/1.3/jquery.geocomplete.min.js b/ajax/libs/geocomplete/1.3/jquery.geocomplete.min.js new file mode 100755 index 000000000..a21536ac2 --- /dev/null +++ b/ajax/libs/geocomplete/1.3/jquery.geocomplete.min.js @@ -0,0 +1,12 @@ +/** + * jQuery Geocoding and Places Autocomplete Plugin - V 1.3 + * + * @author Martin Kleppe , 2012 + * @author Ubilabs http://ubilabs.net, 2012 + * @license MIT License + */// # $.geocomplete() +// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.3 +// +// * https://github.com/ubilabs/geocomplete/ +// * by Martin Kleppe +(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); \ No newline at end of file diff --git a/ajax/libs/geocomplete/1.4/jquery.geocomplete.js b/ajax/libs/geocomplete/1.4/jquery.geocomplete.js new file mode 100755 index 000000000..4399d1b62 --- /dev/null +++ b/ajax/libs/geocomplete/1.4/jquery.geocomplete.js @@ -0,0 +1,434 @@ +/** + * jQuery Geocoding and Places Autocomplete Plugin - V 1.4 + * + * @author Martin Kleppe , 2012 + * @author Ubilabs http://ubilabs.net, 2012 + * @license MIT License + */ + +// # $.geocomplete() +// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.4 +// +// * https://github.com/ubilabs/geocomplete/ +// * by Martin Kleppe + +;(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 ); diff --git a/ajax/libs/geocomplete/1.4/jquery.geocomplete.min.js b/ajax/libs/geocomplete/1.4/jquery.geocomplete.min.js new file mode 100755 index 000000000..8087156a5 --- /dev/null +++ b/ajax/libs/geocomplete/1.4/jquery.geocomplete.min.js @@ -0,0 +1,12 @@ +/** + * jQuery Geocoding and Places Autocomplete Plugin - V 1.4 + * + * @author Martin Kleppe , 2012 + * @author Ubilabs http://ubilabs.net, 2012 + * @license MIT License + */// # $.geocomplete() +// ## jQuery Geocoding and Places Autocomplete Plugin - V 1.4 +// +// * https://github.com/ubilabs/geocomplete/ +// * by Martin Kleppe +(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); \ No newline at end of file diff --git a/ajax/libs/geocomplete/package.json b/ajax/libs/geocomplete/package.json new file mode 100755 index 000000000..7c1f0682c --- /dev/null +++ b/ajax/libs/geocomplete/package.json @@ -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" + } +} diff --git a/ajax/libs/slidesjs/3.0/jquery.slides.js b/ajax/libs/slidesjs/3.0/jquery.slides.js new file mode 100755 index 000000000..e1f6ca58f --- /dev/null +++ b/ajax/libs/slidesjs/3.0/jquery.slides.js @@ -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("
", $element).parent().css({ + overflow: "hidden", + position: "relative" + }); + $(".slidesjs-container", $element).wrapInner("
", $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 = $("", { + "class": "slidesjs-previous slidesjs-navigation", + href: "#", + title: "Previous", + text: "Previous" + }).appendTo($element); + nextButton = $("", { + "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 = $("", { + "class": "slidesjs-play slidesjs-navigation", + href: "#", + title: "Play", + text: "Play" + }).appendTo($element); + stopButton = $("", { + "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 = $("