diff --git a/module/assets/leaflet/leaflet-ajax/README.md b/module/assets/leaflet/leaflet-ajax/README.md new file mode 100644 index 0000000..ab0c8f2 --- /dev/null +++ b/module/assets/leaflet/leaflet-ajax/README.md @@ -0,0 +1,75 @@ +leaflet-ajax +=========== + +Allows you to call JSON via an Ajax call with a jsonp fallback. + +```javascript +var geojsonLayer = new L.GeoJSON.AJAX("geojson.json"); +``` +for jsonp add the option "dataType" and set it to "jsonp" +``` javascript +var geojsonLayer = L.geoJson.ajax("http:webhost.fake/geojson.jsonp",{dataType:"jsonp"}); +``` +Note that data starts to download when the layer is created NOT when it’s added to the map in order to get a head start. + +You may pass either a url string or an array of url strings if you want to download multiple things (handy +if your downloading data from an ESRI based thing which will have separate line, point, and poly features). + +As you see you can also use lower case methods without creating new objects + +For weirder jsonp you can set "callbackParam" for if you need to change the name of the callback parameter to something besides "callback", e.g. [Mapquest Nominative Open](http://open.mapquestapi.com/nominatim/) uses "json_callback" instead of "callback". + +If you want to use `eval` to parse JSON in older browsers you need to pass an option `evil` set to something truthy. + +If you want to be able to load stuff from the file system (with appropriate custom flags set) set local to true. + +Gives off three events `data:loading`, `data:progress` and `data:loaded`. + +- `data:loading` fires before we start downloading things, note if the constructor is given a url it won't wait to be added to the map +to start downloading the data, but it does do an async wait so you have time to add a listener to it (and so [leaflet.spin](https://github.com/makinacorpus/Leaflet.Spin) will work with it). +- `data:progress` is called each time a file is downloaded and passes the downloaded geojson as event data. +- `data:loaded` is called when all files have downloaded, this is mainly different from `data:progress` when you are downloading multiple things. + +You can also add a middleware function which is called after you download the data but before you add it to leaflet: + +```javascript +var geojsonLayer = L.geoJson.ajax("route/to/esri.json",{ + middleware:function(data){ + return esri2geoOrSomething(json); + } + }); +``` + +addUrl does not clear the current layers but adds to the current one, e.g.: + +```javascript +var geojsonLayer = L.geoJson.ajax("data.json"); +geojsonLayer.addUrl("data2.json");//we now have 2 layers +geojsonLayer.refresh();//redownload the most recent layer +geojsonLayer.refresh("new1.json");//add a new layer replacing whatever is there +``` + +last but now least we can refilter layers without re adding them + +```javascript +var geojsonLayer = L.geoJson.ajax("data.json"); +geojsonLayer.refilter(function(feature){ + return feature.properties.key === values; +}); +``` + +Behind the scenes are two new classes L.Util.ajax = function (url) for same origin requests and L.Util.jsonp = function (url,options) cross origin ones. Both return promises, which have an additional abort method that will abort the ajax request. + +```js +L.Util.ajax("url/same/origin.xml").then(function(data){ + doStuff(data); +}); +//or +L.Util.jsonp("http://www.dif.ori/gin").then(function(data){ + doStuff(data); +}); +``` + +In related news `L.Util.Promise` is now a constructor for a promise, it takes one argument, a resolver function. + +Some of the jsonp code inspired by/taken from [this interesting looking plugin](https://github.com/stefanocudini/leaflet-search) that I have failed to make heads nor tails of (the plugin, not the jsonp code) diff --git a/module/assets/leaflet/leaflet-ajax/leaflet.ajax.js b/module/assets/leaflet/leaflet-ajax/leaflet.ajax.js new file mode 100644 index 0000000..9914f7e --- /dev/null +++ b/module/assets/leaflet/leaflet-ajax/leaflet.ajax.js @@ -0,0 +1,740 @@ +;(function(){ + +/** + * Require the given path. + * + * @param {String} path + * @return {Object} exports + * @api public + */ + +function require(path, parent, orig) { + var resolved = require.resolve(path); + + // lookup failed + if (null == resolved) { + orig = orig || path; + parent = parent || 'root'; + var err = new Error('Failed to require "' + orig + '" from "' + parent + '"'); + err.path = orig; + err.parent = parent; + err.require = true; + throw err; + } + + var module = require.modules[resolved]; + + // perform real require() + // by invoking the module's + // registered function + if (!module.exports) { + module.exports = {}; + module.client = module.component = true; + module.call(this, module.exports, require.relative(resolved), module); + } + + return module.exports; +} + +/** + * Registered modules. + */ + +require.modules = {}; + +/** + * Registered aliases. + */ + +require.aliases = {}; + +/** + * Resolve `path`. + * + * Lookup: + * + * - PATH/index.js + * - PATH.js + * - PATH + * + * @param {String} path + * @return {String} path or null + * @api private + */ + +require.resolve = function(path) { + if (path.charAt(0) === '/') path = path.slice(1); + + var paths = [ + path, + path + '.js', + path + '.json', + path + '/index.js', + path + '/index.json' + ]; + + for (var i = 0; i < paths.length; i++) { + var path = paths[i]; + if (require.modules.hasOwnProperty(path)) return path; + if (require.aliases.hasOwnProperty(path)) return require.aliases[path]; + } +}; + +/** + * Normalize `path` relative to the current path. + * + * @param {String} curr + * @param {String} path + * @return {String} + * @api private + */ + +require.normalize = function(curr, path) { + var segs = []; + + if ('.' != path.charAt(0)) return path; + + curr = curr.split('/'); + path = path.split('/'); + + for (var i = 0; i < path.length; ++i) { + if ('..' == path[i]) { + curr.pop(); + } else if ('.' != path[i] && '' != path[i]) { + segs.push(path[i]); + } + } + + return curr.concat(segs).join('/'); +}; + +/** + * Register module at `path` with callback `definition`. + * + * @param {String} path + * @param {Function} definition + * @api private + */ + +require.register = function(path, definition) { + require.modules[path] = definition; +}; + +/** + * Alias a module definition. + * + * @param {String} from + * @param {String} to + * @api private + */ + +require.alias = function(from, to) { + if (!require.modules.hasOwnProperty(from)) { + throw new Error('Failed to alias "' + from + '", it does not exist'); + } + require.aliases[to] = from; +}; + +/** + * Return a require function relative to the `parent` path. + * + * @param {String} parent + * @return {Function} + * @api private + */ + +require.relative = function(parent) { + var p = require.normalize(parent, '..'); + + /** + * lastIndexOf helper. + */ + + function lastIndexOf(arr, obj) { + var i = arr.length; + while (i--) { + if (arr[i] === obj) return i; + } + return -1; + } + + /** + * The relative require() itself. + */ + + function localRequire(path) { + var resolved = localRequire.resolve(path); + return require(resolved, parent, path); + } + + /** + * Resolve relative to the parent. + */ + + localRequire.resolve = function(path) { + var c = path.charAt(0); + if ('/' == c) return path.slice(1); + if ('.' == c) return require.normalize(p, path); + + // resolve deps by returning + // the dep in the nearest "deps" + // directory + var segs = parent.split('/'); + var i = lastIndexOf(segs, 'deps') + 1; + if (!i) i = 0; + path = segs.slice(0, i + 1).join('/') + '/deps/' + path; + return path; + }; + + /** + * Check if module is defined at `path`. + */ + + localRequire.exists = function(path) { + return require.modules.hasOwnProperty(localRequire.resolve(path)); + }; + + return localRequire; +}; +require.register("calvinmetcalf-setImmediate/lib/index.js", function(exports, require, module){ +"use strict"; +var types = [ + require("./nextTick"), + require("./mutation"), + require("./postMessage"), + require("./messageChannel"), + require("./stateChange"), + require("./timeout") +]; +var handlerQueue = []; + +function drainQueue() { + var i = 0, + task, + innerQueue = handlerQueue; + handlerQueue = []; + /*jslint boss: true */ + while (task = innerQueue[i++]) { + task(); + } +} +var nextTick; +types.some(function (obj) { + var t = obj.test(); + if (t) { + nextTick = obj.install(drainQueue); + } + return t; +}); +var retFunc = function (task) { + var len, args; + if (arguments.length > 1 && typeof task === "function") { + args = Array.prototype.slice.call(arguments, 1); + args.unshift(undefined); + task = task.bind.apply(task, args); + } + if ((len = handlerQueue.push(task)) === 1) { + nextTick(drainQueue); + } + return len; +}; +retFunc.clear = function (n) { + if (n <= handlerQueue.length) { + handlerQueue[n - 1] = function () {}; + } + return this; +}; +module.exports = retFunc; + +}); +require.register("calvinmetcalf-setImmediate/lib/nextTick.js", function(exports, require, module){ +"use strict"; +exports.test = function () { + // Don't get fooled by e.g. browserify environments. + return typeof process === "object" && Object.prototype.toString.call(process) === "[object process]"; +}; + +exports.install = function () { + return process.nextTick; +}; +}); +require.register("calvinmetcalf-setImmediate/lib/postMessage.js", function(exports, require, module){ +"use strict"; +var globe = require("./global"); +exports.test = function () { + // The test against `importScripts` prevents this implementation from being installed inside a web worker, + // where `global.postMessage` means something completely different and can"t be used for this purpose. + + if (!globe.postMessage || globe.importScripts) { + return false; + } + + var postMessageIsAsynchronous = true; + var oldOnMessage = globe.onmessage; + globe.onmessage = function () { + postMessageIsAsynchronous = false; + }; + globe.postMessage("", "*"); + globe.onmessage = oldOnMessage; + + return postMessageIsAsynchronous; +}; + +exports.install = function (func) { + var codeWord = "com.calvinmetcalf.setImmediate" + Math.random(); + function globalMessage(event) { + if (event.source === globe && event.data === codeWord) { + func(); + } + } + if (globe.addEventListener) { + globe.addEventListener("message", globalMessage, false); + } else { + globe.attachEvent("onmessage", globalMessage); + } + return function () { + globe.postMessage(codeWord, "*"); + }; +}; +}); +require.register("calvinmetcalf-setImmediate/lib/messageChannel.js", function(exports, require, module){ +"use strict"; +var globe = require("./global"); +exports.test = function () { + return !!globe.MessageChannel; +}; + +exports.install = function (func) { + var channel = new globe.MessageChannel(); + channel.port1.onmessage = func; + return function () { + channel.port2.postMessage(0); + }; +}; +}); +require.register("calvinmetcalf-setImmediate/lib/stateChange.js", function(exports, require, module){ +"use strict"; +var globe = require("./global"); +exports.test = function () { + return "document" in globe && "onreadystatechange" in globe.document.createElement("script"); +}; + +exports.install = function (handle) { + return function () { + + // Create a