!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),(f.L||(f.L={})).Realtime=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { self._completeHandlers.shift()(resp) } } function success (resp) { var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE resp = (type !== 'jsonp') ? self.request : resp // use global data filter on response text var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type) , r = filteredResponse try { resp.responseText = r } catch (e) { // can't assign this in IE<=8, just ignore } if (r) { switch (type) { case 'json': try { resp = win.JSON ? win.JSON.parse(r) : eval('(' + r + ')') } catch (err) { return error(resp, 'Could not parse JSON in response', err) } break case 'js': resp = eval(r) break case 'html': resp = r break case 'xml': resp = resp.responseXML && resp.responseXML.parseError // IE trololo && resp.responseXML.parseError.errorCode && resp.responseXML.parseError.reason ? null : resp.responseXML break } } self._responseArgs.resp = resp self._fulfilled = true fn(resp) self._successHandler(resp) while (self._fulfillmentHandlers.length > 0) { resp = self._fulfillmentHandlers.shift()(resp) } complete(resp) } function timedOut() { self._timedOut = true self.request.abort() } function error(resp, msg, t) { resp = self.request self._responseArgs.resp = resp self._responseArgs.msg = msg self._responseArgs.t = t self._erred = true while (self._errorHandlers.length > 0) { self._errorHandlers.shift()(resp, msg, t) } complete(resp) } this.request = getRequest.call(this, success, error) } Reqwest.prototype = { abort: function () { this._aborted = true this.request.abort() } , retry: function () { init.call(this, this.o, this.fn) } /** * Small deviation from the Promises A CommonJs specification * http://wiki.commonjs.org/wiki/Promises/A */ /** * `then` will execute upon successful requests */ , then: function (success, fail) { success = success || function () {} fail = fail || function () {} if (this._fulfilled) { this._responseArgs.resp = success(this._responseArgs.resp) } else if (this._erred) { fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t) } else { this._fulfillmentHandlers.push(success) this._errorHandlers.push(fail) } return this } /** * `always` will execute whether the request succeeds or fails */ , always: function (fn) { if (this._fulfilled || this._erred) { fn(this._responseArgs.resp) } else { this._completeHandlers.push(fn) } return this } /** * `fail` will execute when the request fails */ , fail: function (fn) { if (this._erred) { fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t) } else { this._errorHandlers.push(fn) } return this } , 'catch': function (fn) { return this.fail(fn) } } function reqwest(o, fn) { return new Reqwest(o, fn) } // normalize newline variants according to spec -> CRLF function normalize(s) { return s ? s.replace(/\r?\n/g, '\r\n') : '' } function serial(el, cb) { var n = el.name , t = el.tagName.toLowerCase() , optCb = function (o) { // IE gives value="" even where there is no value attribute // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273 if (o && !o['disabled']) cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text'])) } , ch, ra, val, i // don't serialize elements that are disabled or without a name if (el.disabled || !n) return switch (t) { case 'input': if (!/reset|button|image|file/i.test(el.type)) { ch = /checkbox/i.test(el.type) ra = /radio/i.test(el.type) val = el.value // WebKit gives us "" instead of "on" if a checkbox has no value, so correct it here ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val)) } break case 'textarea': cb(n, normalize(el.value)) break case 'select': if (el.type.toLowerCase() === 'select-one') { optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null) } else { for (i = 0; el.length && i < el.length; i++) { el.options[i].selected && optCb(el.options[i]) } } break } } // collect up all form elements found from the passed argument elements all // the way down to child elements; pass a '
' or form fields. // called with 'this'=callback to use for serial() on each element function eachFormElement() { var cb = this , e, i , serializeSubtags = function (e, tags) { var i, j, fa for (i = 0; i < tags.length; i++) { fa = e[byTag](tags[i]) for (j = 0; j < fa.length; j++) serial(fa[j], cb) } } for (i = 0; i < arguments.length; i++) { e = arguments[i] if (/input|select|textarea/i.test(e.tagName)) serial(e, cb) serializeSubtags(e, [ 'input', 'select', 'textarea' ]) } } // standard query string style serialization function serializeQueryString() { return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments)) } // { 'name': 'value', ... } style serialization function serializeHash() { var hash = {} eachFormElement.apply(function (name, value) { if (name in hash) { hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]]) hash[name].push(value) } else hash[name] = value }, arguments) return hash } // [ { name: 'name', value: 'value' }, ... ] style serialization reqwest.serializeArray = function () { var arr = [] eachFormElement.apply(function (name, value) { arr.push({name: name, value: value}) }, arguments) return arr } reqwest.serialize = function () { if (arguments.length === 0) return '' var opt, fn , args = Array.prototype.slice.call(arguments, 0) opt = args.pop() opt && opt.nodeType && args.push(opt) && (opt = null) opt && (opt = opt.type) if (opt == 'map') fn = serializeHash else if (opt == 'array') fn = reqwest.serializeArray else fn = serializeQueryString return fn.apply(null, args) } reqwest.toQueryString = function (o, trad) { var prefix, i , traditional = trad || false , s = [] , enc = encodeURIComponent , add = function (key, value) { // If value is a function, invoke it and return its value value = ('function' === typeof value) ? value() : (value == null ? '' : value) s[s.length] = enc(key) + '=' + enc(value) } // If an array was passed in, assume that it is an array of form elements. if (isArray(o)) { for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value']) } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for (prefix in o) { if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add) } } // spaces should be + according to spec return s.join('&').replace(/%20/g, '+') } function buildParams(prefix, obj, traditional, add) { var name, i, v , rbracket = /\[\]$/ if (isArray(obj)) { // Serialize array item. for (i = 0; obj && i < obj.length; i++) { v = obj[i] if (traditional || rbracket.test(prefix)) { // Treat each array item as a scalar. add(prefix, v) } else { buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add) } } } else if (obj && obj.toString() === '[object Object]') { // Serialize object item. for (name in obj) { buildParams(prefix + '[' + name + ']', obj[name], traditional, add) } } else { // Serialize scalar item. add(prefix, obj) } } reqwest.getcallbackPrefix = function () { return callbackPrefix } // jQuery and Zepto compatibility, differences can be remapped here so you can call // .ajax.compat(options, callback) reqwest.compat = function (o, fn) { if (o) { o['type'] && (o['method'] = o['type']) && delete o['type'] o['dataType'] && (o['type'] = o['dataType']) o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback'] o['jsonp'] && (o['jsonpCallback'] = o['jsonp']) } return new Reqwest(o, fn) } reqwest.ajaxSetup = function (options) { options = options || {} for (var k in options) { globalSetupOptions[k] = options[k] } } return reqwest }); },{}],2:[function(require,module,exports){ (function (global){ "use strict"; var L = (typeof window !== "undefined" ? window.L : typeof global !== "undefined" ? global.L : null), reqwest = require('reqwest'); L.Realtime = L.GeoJSON.extend({ includes: L.Mixin.Events, options: { start: true, interval: 60 * 1000, getFeatureId: function(f) { return f.properties.id; }, updateFeature: function(f, oldLayer, newLayer) { if (f.geometry.type === 'Point') { oldLayer.setLatLng(newLayer.getLatLng()); return oldLayer; } else { return newLayer; } }, cache: false }, initialize: function(src, options) { L.GeoJSON.prototype.initialize.call(this, undefined, options); if (typeof(src) === 'function') { this._src = src; } else { this._src = L.bind(function(responseHandler, errorHandler) { var reqOptions = this.options.cache ? src : this._bustCache(src); reqwest(reqOptions).then(responseHandler, errorHandler); }, this); } this._features = {}; this._featureLayers = {}; if (this.options.start) { this.start(); } }, start: function() { if (!this._timer) { this._timer = setInterval(L.bind(this.update, this), this.options.interval); this.update(); } return this; }, stop: function() { if (this._timer) { clearTimeout(this._timer); delete this._timer; } return this; }, isRunning: function() { return this._timer; }, update: function(geojson) { var responseHandler, errorHandler; if (geojson) { this._onNewData(false, geojson); } else { responseHandler = L.bind(function(data) { this._onNewData(true, data); }, this); errorHandler = L.bind(this._onError, this); this._src(responseHandler, errorHandler); } return this; }, remove: function(geojson) { var features = L.Util.isArray(geojson) ? geojson : geojson.features ? geojson.features : [geojson], exit = {}, i, len, fId; for (i = 0, len = features.length; i < len; i++) { fId = this.options.getFeatureId(features[i]); this.removeLayer(this._featureLayers[fId]); exit[fId] = this._features[fId]; delete this._features[fId]; delete this._featureLayers[fId]; } this.fire('update', { features: this._features, enter: {}, update: {}, exit: exit }); return this; }, getLayer: function(featureId) { return this._featureLayers[featureId]; }, getFeature: function(featureId) { return this._features[featureId]; }, _onNewData: function(removeMissing, response) { var oef = this.options.onEachFeature, layersToRemove = [], features = {}, enter = {}, update = {}, exit = {}, i; this.options.onEachFeature = L.bind(function onEachFeature(f, l) { var fId, oldLayer, newLayer; if (oef) { oef(f, l); } fId = this.options.getFeatureId(f); oldLayer = this._featureLayers[fId]; if (oldLayer) { newLayer = this.options.updateFeature(f, oldLayer, l); if (newLayer !== oldLayer) { this.removeLayer(oldLayer); } if (newLayer !== l) { layersToRemove.push(l); } l = newLayer; update[fId] = f; } else { enter[fId] = f; } this._featureLayers[fId] = l; this._features[fId] = features[fId] = f; }, this); this.addData(response); if (removeMissing) { exit = this._removeUnknown(features); } for (i = 0; i < layersToRemove.length; i++) { this.removeLayer(layersToRemove[i]); } this.fire('update', { features: this._features, enter: enter, update: update, exit: exit }); this.options.onEachFeature = oef; }, _onError: function(err, msg) { this.fire('error', { error: err, message: msg }); }, _removeUnknown: function(known) { var fId, removed = {}; for (fId in this._featureLayers) { if (!known[fId]) { this.removeLayer(this._featureLayers[fId]); removed[fId] = this._features[fId]; delete this._featureLayers[fId]; delete this._features[fId]; } } return removed; }, _bustCache: function(src) { function fixUrl(url) { return url + L.Util.getParamString({'_': new Date().getTime()}); } if (typeof src === 'string' || src instanceof String) { return fixUrl(src); } else { return L.extend({}, src, {url: fixUrl(src.url)}); } } }); L.realtime = function(src, options) { return new L.Realtime(src, options); }; L.Realtime.reqwest = reqwest; module.exports = L.Realtime; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"reqwest":1}]},{},[2])(2) });