diff --git a/core/assets/vendor/backbone/backbone-min.js b/core/assets/vendor/backbone/backbone-min.js index 8ea4b13d3738f24090a8172bae54d520452b6224..f29903b1ae61e2b2a1cb0aec3133404dd71a1d09 100644 --- a/core/assets/vendor/backbone/backbone-min.js +++ b/core/assets/vendor/backbone/backbone-min.js @@ -1,2 +1,2 @@ -(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h<u;h++){t=o[h];if(a=this._events[t]){this._events[t]=s=[];if(e||r){for(l=0,f=a.length;l<f;l++){n=a[l];if(e&&e!==n.callback&&e!==n.callback._callback||r&&r!==n.context){s.push(n)}}}if(!s.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=o.call(arguments,1);if(!c(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)f(i,e);if(r)f(r,arguments);return this},stopListening:function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=!e&&!r;if(!r&&typeof e==="object")r=this;if(t)(s={})[t._listenId]=t;for(var a in s){t=s[a];t.off(e,r,this);if(n||i.isEmpty(t._events))delete this._listeningTo[a]}return this}};var l=/\s+/;var c=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(l.test(i)){var n=i.split(l);for(var a=0,o=n.length;a<o;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var f=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var d={listenTo:"on",listenToOnce:"once"};i.each(d,function(t,e){u[e]=function(e,r,s){var n=this._listeningTo||(this._listeningTo={});var a=e._listenId||(e._listenId=i.uniqueId("l"));n[a]=e;if(!s&&typeof r==="object")s=this;e[t](r,s,this);return this}});u.bind=u.on;u.unbind=u.off;i.extend(e,u);var p=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId("c");this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(p.prototype,u,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0,d=o.length;f<d;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r(e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);if(s&&!r.wait){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&r.wait){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var h=this;var u=r.success;r.success=function(t){h.attributes=o;var e=h.parse(t,r);if(r.wait)e=i.extend(s||{},e);if(i.isObject(e)&&!h.set(e,r)){return false}if(u)u(h,t,r);h.trigger("sync",h,t,r)};q(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch")r.attrs=s;a=this.sync(n,this,r);if(s&&r.wait)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(t.wait||e.isNew())s();if(r)r(e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};if(this.isNew()){t.success();return false}q(this,t);var n=this.sync("delete",this,t);if(!t.wait)s();return n},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var v=["keys","values","pairs","invert","pick","omit"];i.each(v,function(t){p.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.attributes);return i[t].apply(i,e)}});var g=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,remove:false};i.extend(g.prototype,u,{model:p,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,y))},remove:function(t,e){var r=!i.isArray(t);t=r?[t]:i.clone(t);e||(e={});var s,n,a,o;for(s=0,n=t.length;s<n;s++){o=t[s]=this.get(t[s]);if(!o)continue;delete this._byId[o.id];delete this._byId[o.cid];a=this.indexOf(o);this.models.splice(a,1);this.length--;if(!e.silent){e.index=a;o.trigger("remove",o,this,e)}this._removeReference(o,e)}return r?t[0]:t},set:function(t,e){e=i.defaults({},e,m);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:i.clone(t);var s,n,a,o,h,u,l;var c=e.at;var f=this.model;var d=this.comparator&&c==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g=[],y=[],_={};var b=e.add,w=e.merge,x=e.remove;var E=!d&&b&&x?[]:false;for(s=0,n=t.length;s<n;s++){h=t[s]||{};if(h instanceof p){a=o=h}else{a=h[f.prototype.idAttribute||"id"]}if(u=this.get(a)){if(x)_[u.cid]=true;if(w){h=h===o?o.attributes:h;if(e.parse)h=u.parse(h,e);u.set(h,e);if(d&&!l&&u.hasChanged(v))l=true}t[s]=u}else if(b){o=t[s]=this._prepareModel(h,e);if(!o)continue;g.push(o);this._addReference(o,e)}o=u||o;if(E&&(o.isNew()||!_[o.id]))E.push(o);_[o.id]=true}if(x){for(s=0,n=this.length;s<n;++s){if(!_[(o=this.models[s]).cid])y.push(o)}if(y.length)this.remove(y,e)}if(g.length||E&&E.length){if(d)l=true;this.length+=g.length;if(c!=null){for(s=0,n=g.length;s<n;s++){this.models.splice(c+s,0,g[s])}}else{if(E)this.models.length=0;var k=E||g;for(s=0,n=k.length;s<n;s++){this.models.push(k[s])}}}if(l)this.sort({silent:true});if(!e.silent){for(s=0,n=g.length;s<n;s++){(o=g[s]).trigger("add",o,this,e)}if(l||E&&E.length)this.trigger("sort",this,e)}return r?t[0]:t},reset:function(t,e){e||(e={});for(var r=0,s=this.models.length;r<s;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return o.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){if(i.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e(r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var r=this;var s=e.success;e.success=function(t,i){if(e.wait)r.add(t,e);if(s)s(t,i,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof p)return t;e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_addReference:function(t,e){this._byId[t.cid]=t;if(t.id!=null)this._byId[t.id]=t;if(!t.collection)t.collection=this;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];i.each(_,function(t){g.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.models);return i[t].apply(i,e)}});var b=["groupBy","countBy","sortBy","indexBy"];i.each(b,function(t){g.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var w=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,E));this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];i.extend(w.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,i){if(this.$el)this.undelegateEvents();this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0];if(i!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(x);var n=s[1],a=s[2];r=i.bind(r,this);n+=".delegateEvents"+this.cid;if(a===""){this.$el.on(n,r)}else{this.$el.on(n,a,r)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");var r=e.$("<"+i.result(this,"tagName")+">").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=a.hide().appendTo("body")[0].contentWindow;this.navigate(r)}if(this._hasPushState){e.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!n){e.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=r;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){this.fragment=this.getFragment(null,true);this.location.replace(this.root+"#"+this.fragment);return true}else if(this._hasPushState&&this.atRoot()&&o.hash){this.fragment=this.getHash().replace(R,"");this.history.replaceState({},document.title,this.root+this.fragment)}}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};p.extend=g.extend=$.extend=w.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}};return e}); +(function(t){var e=typeof self=="object"&&self.self==self&&self||typeof global=="object"&&global.global==global&&global;if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){e.Backbone=t(e,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore"),r;try{r=require("jquery")}catch(s){}t(e,exports,i,r)}else{e.Backbone=t(e,{},e._,e.jQuery||e.Zepto||e.ender||e.$)}})(function(t,e,i,r){var s=t.Backbone;var n=[].slice;e.VERSION="1.2.1";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var a=function(t,e,r){switch(t){case 1:return function(){return i[e](this[r])};case 2:return function(t){return i[e](this[r],t)};case 3:return function(t,s){return i[e](this[r],t,s)};case 4:return function(t,s,n){return i[e](this[r],t,s,n)};default:return function(){var t=n.call(arguments);t.unshift(this[r]);return i[e].apply(i,t)}}};var o=function(t,e,r){i.each(e,function(e,s){if(i[s])t.prototype[s]=a(e,s,r)})};var h=e.Events={};var u=/\s+/;var l=function(t,e,r,s,n){var a=0,o;if(r&&typeof r==="object"){if(s!==void 0&&"context"in n&&n.context===void 0)n.context=s;for(o=i.keys(r);a<o.length;a++){e=t(e,o[a],r[o[a]],n)}}else if(r&&u.test(r)){for(o=r.split(u);a<o.length;a++){e=t(e,o[a],s,n)}}else{e=t(e,r,s,n)}return e};h.on=function(t,e,i){return c(this,t,e,i)};var c=function(t,e,i,r,s){t._events=l(f,t._events||{},e,i,{context:r,ctx:t,listening:s});if(s){var n=t._listeners||(t._listeners={});n[s.id]=s}return t};h.listenTo=function(t,e,r){if(!t)return this;var s=t._listenId||(t._listenId=i.uniqueId("l"));var n=this._listeningTo||(this._listeningTo={});var a=n[s];if(!a){var o=this._listenId||(this._listenId=i.uniqueId("l"));a=n[s]={obj:t,objId:s,id:o,listeningTo:n,count:0}}c(t,e,r,this,a);return this};var f=function(t,e,i,r){if(i){var s=t[e]||(t[e]=[]);var n=r.context,a=r.ctx,o=r.listening;if(o)o.count++;s.push({callback:i,context:n,ctx:n||a,listening:o})}return t};h.off=function(t,e,i){if(!this._events)return this;this._events=l(d,this._events,t,e,{context:i,listeners:this._listeners});return this};h.stopListening=function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=t?[t._listenId]:i.keys(s);for(var a=0;a<n.length;a++){var o=s[n[a]];if(!o)break;o.obj.off(e,r,this)}if(i.isEmpty(s))this._listeningTo=void 0;return this};var d=function(t,e,r,s){if(!t)return;var n=0,a;var o=s.context,h=s.listeners;if(!e&&!r&&!o){var u=i.keys(h);for(;n<u.length;n++){a=h[u[n]];delete h[a.id];delete a.listeningTo[a.objId]}return}var l=e?[e]:i.keys(t);for(;n<l.length;n++){e=l[n];var c=t[e];if(!c)break;var f=[];for(var d=0;d<c.length;d++){var v=c[d];if(r&&r!==v.callback&&r!==v.callback._callback||o&&o!==v.context){f.push(v)}else{a=v.listening;if(a&&--a.count===0){delete h[a.id];delete a.listeningTo[a.objId]}}}if(f.length){t[e]=f}else{delete t[e]}}if(i.size(t))return t};h.once=function(t,e,r){var s=l(v,{},t,e,i.bind(this.off,this));return this.on(s,void 0,r)};h.listenToOnce=function(t,e,r){var s=l(v,{},e,r,i.bind(this.stopListening,this,t));return this.listenTo(t,s)};var v=function(t,e,r,s){if(r){var n=t[e]=i.once(function(){s(e,n);r.apply(this,arguments)});n._callback=r}return t};h.trigger=function(t){if(!this._events)return this;var e=Math.max(0,arguments.length-1);var i=Array(e);for(var r=0;r<e;r++)i[r]=arguments[r+1];l(g,this._events,t,void 0,i);return this};var g=function(t,e,i,r){if(t){var s=t[e];var n=t.all;if(s&&n)n=n.slice();if(s)p(s,r);if(n)p(n,[e].concat(r))}return t};var p=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};h.bind=h.on;h.unbind=h.off;i.extend(e,h);var m=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId(this.cidPrefix);this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(m.prototype,h,{changed:null,validationError:null,idAttribute:"id",cidPrefix:"c",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},matches:function(t){return!!i.iteratee(t,this)(this.attributes)},set:function(t,e,r){if(t==null)return this;var s;if(typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r||(r={});if(!this._validate(s,r))return false;var n=r.unset;var a=r.silent;var o=[];var h=this._changing;this._changing=true;if(!h){this._previousAttributes=i.clone(this.attributes);this.changed={}}var u=this.attributes;var l=this.changed;var c=this._previousAttributes;if(this.idAttribute in s)this.id=s[this.idAttribute];for(var f in s){e=s[f];if(!i.isEqual(u[f],e))o.push(f);if(!i.isEqual(c[f],e)){l[f]=e}else{delete l[f]}n?delete u[f]:u[f]=e}if(!a){if(o.length)this._pending=r;for(var d=0;d<o.length;d++){this.trigger("change:"+o[d],this,u[o[d]],r)}}if(h)return this;if(!a){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e=this._changing?this._previousAttributes:this.attributes;var r={};for(var s in t){var n=t[s];if(i.isEqual(e[s],n))continue;r[s]=n}return i.size(r)?r:false},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=i.extend({parse:true},t);var e=this;var r=t.success;t.success=function(i){var s=t.parse?e.parse(i,t):i;if(!e.set(s,t))return false;if(r)r.call(t.context,e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true,parse:true},r);var n=r.wait;if(s&&!n){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}var a=this;var o=r.success;var h=this.attributes;r.success=function(t){a.attributes=h;var e=r.parse?a.parse(t,r):t;if(n)e=i.extend({},s,e);if(e&&!a.set(e,r))return false;if(o)o.call(r.context,a,t,r);a.trigger("sync",a,t,r)};q(this,r);if(s&&n)this.attributes=i.extend({},h,s);var u=this.isNew()?"create":r.patch?"patch":"update";if(u==="patch"&&!r.attrs)r.attrs=s;var l=this.sync(u,this,r);this.attributes=h;return l},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=t.wait;var n=function(){e.stopListening();e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(s)n();if(r)r.call(t.context,e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};var a=false;if(this.isNew()){i.defer(t.success)}else{q(this,t);a=this.sync("delete",this,t)}if(!s)n();return a},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;var e=this.get(this.idAttribute);return t.replace(/[^\/]$/,"$&/")+encodeURIComponent(e)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.defaults({validate:true},t))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var _={keys:1,values:1,pairs:1,invert:1,pick:0,omit:0,chain:1,isEmpty:1};o(m,_,"attributes");var y=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var b={add:true,remove:true,merge:true};var x={add:true,remove:false};i.extend(y.prototype,h,{model:m,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,x))},remove:function(t,e){e=i.extend({},e);var r=!i.isArray(t);t=r?[t]:i.clone(t);var s=this._removeModels(t,e);if(!e.silent&&s)this.trigger("update",this,e);return r?s[0]:s},set:function(t,e){e=i.defaults({},e,b);if(e.parse&&!this._isModel(t))t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:t.slice();var s,n,a,o,h;var u=e.at;if(u!=null)u=+u;if(u<0)u+=this.length+1;var l=this.comparator&&u==null&&e.sort!==false;var c=i.isString(this.comparator)?this.comparator:null;var f=[],d=[],v={};var g=e.add,p=e.merge,m=e.remove;var _=!l&&g&&m?[]:false;var y=false;for(var x=0;x<t.length;x++){a=t[x];if(o=this.get(a)){if(m)v[o.cid]=true;if(p&&a!==o){a=this._isModel(a)?a.attributes:a;if(e.parse)a=o.parse(a,e);o.set(a,e);if(l&&!h&&o.hasChanged(c))h=true}t[x]=o}else if(g){n=t[x]=this._prepareModel(a,e);if(!n)continue;f.push(n);this._addReference(n,e)}n=o||n;if(!n)continue;s=this.modelId(n.attributes);if(_&&(n.isNew()||!v[s])){_.push(n);y=y||!this.models[x]||n.cid!==this.models[x].cid}v[s]=true}if(m){for(var x=0;x<this.length;x++){if(!v[(n=this.models[x]).cid])d.push(n)}if(d.length)this._removeModels(d,e)}if(f.length||y){if(l)h=true;this.length+=f.length;if(u!=null){for(var x=0;x<f.length;x++){this.models.splice(u+x,0,f[x])}}else{if(_)this.models.length=0;var w=_||f;for(var x=0;x<w.length;x++){this.models.push(w[x])}}}if(h)this.sort({silent:true});if(!e.silent){var E=u!=null?i.clone(e):e;for(var x=0;x<f.length;x++){if(u!=null)E.index=u+x;(n=f[x]).trigger("add",n,this,E)}if(h||y)this.trigger("sort",this,e);if(f.length||d.length)this.trigger("update",this,e)}return r?t[0]:t},reset:function(t,e){e=e?i.clone(e):{};for(var r=0;r<this.models.length;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);return this.remove(e,t)},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);return this.remove(e,t)},slice:function(){return n.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;var e=this.modelId(this._isModel(t)?t.attributes:t);return this._byId[t]||this._byId[e]||this._byId[t.cid]},at:function(t){if(t<0)t+=this.length;return this.models[t]},where:function(t,e){var r=i.matches(t);return this[e?"find":"filter"](function(t){return r(t.attributes)})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=i.extend({parse:true},t);var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e.call(t.context,r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};var r=e.wait;t=this._prepareModel(t,e);if(!t)return false;if(!r)this.add(t,e);var s=this;var n=e.success;e.success=function(t,e,i){if(r)s.add(t,i);if(n)n.call(i.context,t,e,i)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models,{model:this.model,comparator:this.comparator})},modelId:function(t){return t[this.model.prototype.idAttribute||"id"]},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(this._isModel(t)){if(!t.collection)t.collection=this;return t}e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_removeModels:function(t,e){var i=[];for(var r=0;r<t.length;r++){var s=this.get(t[r]);if(!s)continue;var n=this.indexOf(s);this.models.splice(n,1);this.length--;if(!e.silent){e.index=n;s.trigger("remove",s,this,e)}i.push(s);this._removeReference(s,e)}return i.length?i:false},_isModel:function(t){return t instanceof m},_addReference:function(t,e){this._byId[t.cid]=t;var i=this.modelId(t.attributes);if(i!=null)this._byId[i]=t;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){delete this._byId[t.cid];var i=this.modelId(t.attributes);if(i!=null)delete this._byId[i];if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(t==="change"){var s=this.modelId(e.previousAttributes());var n=this.modelId(e.attributes);if(s!==n){if(s!=null)delete this._byId[s];if(n!=null)this._byId[n]=e}}this.trigger.apply(this,arguments)}});var w={forEach:3,each:3,map:3,collect:3,reduce:4,foldl:4,inject:4,reduceRight:4,foldr:4,find:3,detect:3,filter:3,select:3,reject:3,every:3,all:3,some:3,any:3,include:2,contains:2,invoke:0,max:3,min:3,toArray:1,size:1,first:3,head:3,take:3,initial:3,rest:3,tail:3,drop:3,last:3,without:0,difference:0,indexOf:3,shuffle:1,lastIndexOf:3,isEmpty:1,chain:1,sample:3,partition:3};o(y,w,"models");var E=["groupBy","countBy","sortBy","indexBy"];i.each(E,function(t){if(!i[t])return;y.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var k=e.View=function(t){this.cid=i.uniqueId("view");i.extend(this,i.pick(t,I));this._ensureElement();this.initialize.apply(this,arguments)};var S=/^(\S+)\s*(.*)$/;var I=["model","collection","el","id","attributes","className","tagName","events"];i.extend(k.prototype,h,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this._removeElement();this.stopListening();return this},_removeElement:function(){this.$el.remove()},setElement:function(t){this.undelegateEvents();this._setElement(t);this.delegateEvents();return this},_setElement:function(t){this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0]},delegateEvents:function(t){t||(t=i.result(this,"events"));if(!t)return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[r];if(!r)continue;var s=e.match(S);this.delegate(s[1],s[2],i.bind(r,this))}return this},delegate:function(t,e,i){this.$el.on(t+".delegateEvents"+this.cid,e,i);return this},undelegateEvents:function(){if(this.$el)this.$el.off(".delegateEvents"+this.cid);return this},undelegate:function(t,e,i){this.$el.off(t+".delegateEvents"+this.cid,e,i);return this},_createElement:function(t){return document.createElement(t)},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");this.setElement(this._createElement(i.result(this,"tagName")));this._setAttributes(t)}else{this.setElement(i.result(this,"el"))}},_setAttributes:function(t){this.$el.attr(t)}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}var h=s.error;s.error=function(t,e,i){s.textStatus=e;s.errorThrown=i;if(h)h.call(s.context,t,e,i)};var u=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,u,s);return u};var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var P=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var H=/\((.*?)\)/g;var $=/(\(\?)?:\w+/g;var A=/\*\w+/g;var C=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend(P.prototype,h,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);if(n.execute(s,a,r)!==false){n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)}});return this},execute:function(t,e,i){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(C,"\\$&").replace(H,"(?:$1)?").replace($,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var j=/^\/+|\/+$/g;var O=/#.*$/;N.started=false;i.extend(N.prototype,h,{interval:50,atRoot:function(){var t=this.location.pathname.replace(/[^\/]$/,"$&/");return t===this.root&&!this.getSearch()},matchRoot:function(){var t=this.decodeFragment(this.location.pathname);var e=t.slice(0,this.root.length-1)+"/";return e===this.root},decodeFragment:function(t){return decodeURI(t.replace(/%25/g,"%2525"))},getSearch:function(){var t=this.location.href.replace(/#.*/,"").match(/\?.+/);return t?t[0]:""},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getPath:function(){var t=this.decodeFragment(this.location.pathname+this.getSearch()).slice(this.root.length-1);return t.charAt(0)==="/"?t.slice(1):t},getFragment:function(t){if(t==null){if(this._usePushState||!this._wantsHashChange){t=this.getPath()}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._hasHashChange="onhashchange"in window;this._useHashChange=this._wantsHashChange&&this._hasHashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.history&&this.history.pushState);this._usePushState=this._wantsPushState&&this._hasPushState;this.fragment=this.getFragment();this.root=("/"+this.root+"/").replace(j,"/");if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var e=this.root.slice(0,-1)||"/";this.location.replace(e+"#"+this.getPath());return true}else if(this._hasPushState&&this.atRoot()){this.navigate(this.getHash(),{replace:true})}}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe");this.iframe.src="javascript:0";this.iframe.style.display="none";this.iframe.tabIndex=-1;var r=document.body;var s=r.insertBefore(this.iframe,r.firstChild).contentWindow;s.document.open();s.document.close();s.location.hash="#"+this.fragment}var n=window.addEventListener||function(t,e){return attachEvent("on"+t,e)};if(this._usePushState){n("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){n("hashchange",this.checkUrl,false)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}if(!this.options.silent)return this.loadUrl()},stop:function(){var t=window.removeEventListener||function(t,e){return detachEvent("on"+t,e)};if(this._usePushState){t("popstate",this.checkUrl,false)}else if(this._useHashChange&&!this.iframe){t("hashchange",this.checkUrl,false)}if(this.iframe){document.body.removeChild(this.iframe);this.iframe=null}if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getHash(this.iframe.contentWindow)}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){if(!this.matchRoot())return false;t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};t=this.getFragment(t||"");var i=this.root;if(t===""||t.charAt(0)==="?"){i=i.slice(0,-1)||"/"}var r=i+t;t=this.decodeFragment(t.replace(O,""));if(this.fragment===t)return;this.fragment=t;if(this._usePushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,r)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getHash(this.iframe.contentWindow)){var s=this.iframe.contentWindow;if(!e.replace){s.document.open();s.document.close()}this._updateHash(s.location,t,e.replace)}}else{return this.location.assign(r)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};m.extend=y.extend=P.extend=k.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i.call(e.context,t,r,e);t.trigger("error",t,r,e)}};return e}); //# sourceMappingURL=backbone-min.map \ No newline at end of file diff --git a/core/assets/vendor/backbone/backbone-min.map b/core/assets/vendor/backbone/backbone-min.map index 2b0cf2776dc47a99926f4332e566e9f7e9d30e22..f01489a5cb1d361fde771a6c1a3cb27dd3425ac3 100644 --- a/core/assets/vendor/backbone/backbone-min.map +++ b/core/assets/vendor/backbone/backbone-min.map @@ -1 +1 @@ -{"version":3,"file":"backbone-min.js","sources":["backbone.js"],"names":["root","factory","define","amd","_","$","exports","Backbone","require","jQuery","Zepto","ender","this","previousBackbone","array","push","slice","splice","VERSION","noConflict","emulateHTTP","emulateJSON","Events","on","name","callback","context","eventsApi","_events","events","ctx","once","self","off","apply","arguments","_callback","retain","ev","names","i","l","j","k","keys","length","trigger","args","call","allEvents","all","triggerEvents","stopListening","obj","listeningTo","_listeningTo","remove","_listenId","id","isEmpty","eventSplitter","action","rest","key","concat","test","split","a1","a2","a3","listenMethods","listenTo","listenToOnce","each","implementation","method","uniqueId","bind","unbind","extend","Model","attributes","options","attrs","cid","collection","parse","defaults","result","set","changed","initialize","prototype","validationError","idAttribute","toJSON","clone","sync","get","attr","escape","has","val","unset","changes","silent","changing","prev","current","_validate","_changing","_previousAttributes","isEqual","_pending","clear","hasChanged","changedAttributes","diff","old","previous","previousAttributes","fetch","model","success","resp","wrapError","save","xhr","validate","wait","serverAttrs","isObject","isNew","patch","destroy","url","base","urlError","replace","encodeURIComponent","constructor","isValid","error","modelMethods","unshift","Collection","models","comparator","_reset","reset","setOptions","add","merge","addOptions","map","singular","isArray","index","_byId","indexOf","_removeReference","existing","sort","at","targetModel","sortable","sortAttr","isString","toAdd","toRemove","modelMap","order","_prepareModel","_addReference","orderedModels","previousModels","pop","shift","where","first","findWhere","Error","sortBy","pluck","invoke","create","_onModelEvent","event","methods","attributeMethods","value","iterator","isFunction","View","pick","viewOptions","_ensureElement","delegateEvents","delegateEventSplitter","tagName","selector","$el","find","render","setElement","element","delegate","undelegateEvents","el","match","eventName","className","type","methodMap","params","dataType","data","contentType","JSON","stringify","_method","beforeSend","setRequestHeader","processData","noXhrPatch","ActiveXObject","ajax","window","XMLHttpRequest","dispatchEvent","update","delete","read","Router","routes","_bindRoutes","optionalParam","namedParam","splatParam","escapeRegExp","route","isRegExp","_routeToRegExp","router","history","fragment","_extractParameters","execute","navigate","optional","RegExp","exec","param","decodeURIComponent","History","handlers","bindAll","location","routeStripper","rootStripper","isExplorer","trailingSlash","pathStripper","started","interval","atRoot","pathname","getHash","href","getFragment","forcePushState","_hasPushState","_wantsHashChange","decodeURI","search","start","hashChange","_wantsPushState","pushState","docMode","document","documentMode","oldIE","navigator","userAgent","toLowerCase","frame","iframe","hide","appendTo","contentWindow","checkUrl","_checkUrlInterval","setInterval","loc","hash","replaceState","title","loadUrl","stop","clearInterval","e","any","handler","_updateHash","open","close","assign","protoProps","staticProps","parent","child","Surrogate","__super__"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"backbone-min.js","sources":["backbone.js"],"names":["factory","root","self","global","define","amd","_","$","exports","Backbone","require","e","jQuery","Zepto","ender","previousBackbone","slice","VERSION","noConflict","this","emulateHTTP","emulateJSON","addMethod","length","method","attribute","value","iteratee","context","defaultVal","args","call","arguments","unshift","apply","addUnderscoreMethods","Class","methods","each","prototype","Events","eventSplitter","eventsApi","memo","name","callback","opts","i","names","keys","test","split","on","internalOn","obj","listening","_events","onApi","ctx","listeners","_listeners","id","listenTo","_listenId","uniqueId","listeningTo","_listeningTo","thisId","objId","count","events","options","handlers","push","off","offApi","stopListening","ids","isEmpty","remaining","j","handler","_callback","size","once","onceMap","bind","listenToOnce","map","offer","trigger","Math","max","Array","triggerApi","objEvents","cb","allEvents","all","triggerEvents","concat","ev","l","a1","a2","a3","unbind","extend","Model","attributes","attrs","cid","cidPrefix","collection","parse","defaults","result","set","changed","initialize","validationError","idAttribute","toJSON","clone","sync","get","attr","escape","has","matches","key","val","_validate","unset","silent","changes","changing","_changing","_previousAttributes","current","prev","isEqual","_pending","clear","hasChanged","changedAttributes","diff","old","previous","previousAttributes","fetch","model","success","resp","serverAttrs","wrapError","save","validate","wait","isNew","patch","xhr","destroy","defer","url","base","urlError","replace","encodeURIComponent","constructor","isValid","error","modelMethods","values","pairs","invert","pick","omit","chain","Collection","models","comparator","_reset","reset","setOptions","add","remove","merge","addOptions","singular","isArray","removed","_removeModels","_isModel","existing","sort","at","sortable","sortAttr","isString","toAdd","toRemove","modelMap","order","orderChanged","_prepareModel","_addReference","modelId","splice","orderedModels","addOpts","index","_removeReference","previousModels","pop","shift","_byId","where","first","findWhere","Error","sortBy","pluck","invoke","create","callbackOpts","indexOf","_onModelEvent","event","prevId","collectionMethods","forEach","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","some","any","include","contains","min","toArray","head","take","initial","rest","tail","drop","last","without","difference","shuffle","lastIndexOf","sample","partition","attributeMethods","iterator","isFunction","View","viewOptions","_ensureElement","delegateEventSplitter","tagName","selector","$el","render","_removeElement","setElement","element","undelegateEvents","_setElement","delegateEvents","el","match","delegate","eventName","listener","undelegate","_createElement","document","createElement","className","_setAttributes","type","methodMap","params","dataType","data","contentType","JSON","stringify","_method","beforeSend","setRequestHeader","processData","textStatus","errorThrown","ajax","update","delete","read","Router","routes","_bindRoutes","optionalParam","namedParam","splatParam","escapeRegExp","route","isRegExp","_routeToRegExp","router","history","fragment","_extractParameters","execute","navigate","optional","RegExp","exec","param","decodeURIComponent","History","bindAll","window","location","routeStripper","rootStripper","pathStripper","started","interval","atRoot","path","pathname","getSearch","matchRoot","decodeFragment","decodeURI","href","getHash","getPath","charAt","getFragment","_usePushState","_wantsHashChange","start","hashChange","_hasHashChange","_useHashChange","_wantsPushState","pushState","_hasPushState","iframe","src","style","display","tabIndex","body","iWindow","insertBefore","firstChild","contentWindow","open","close","hash","addEventListener","attachEvent","checkUrl","_checkUrlInterval","setInterval","loadUrl","stop","removeEventListener","detachEvent","removeChild","clearInterval","title","_updateHash","assign","protoProps","staticProps","parent","child","Surrogate","__super__"],"mappings":"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"} \ No newline at end of file diff --git a/core/assets/vendor/backbone/backbone.js b/core/assets/vendor/backbone/backbone.js new file mode 100644 index 0000000000000000000000000000000000000000..58800425c70b1f2d779fa641b3177fd8c607859f --- /dev/null +++ b/core/assets/vendor/backbone/backbone.js @@ -0,0 +1,1873 @@ +// Backbone.js 1.2.1 + +// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +(function(factory) { + + // Establish the root object, `window` (`self`) in the browser, or `global` on the server. + // We use `self` instead of `window` for `WebWorker` support. + var root = (typeof self == 'object' && self.self == self && self) || + (typeof global == 'object' && global.global == global && global); + + // Set up Backbone appropriately for the environment. Start with AMD. + if (typeof define === 'function' && define.amd) { + define(['underscore', 'jquery', 'exports'], function(_, $, exports) { + // Export global even in AMD case in case this script is loaded with + // others that may still expect a global Backbone. + root.Backbone = factory(root, exports, _, $); + }); + + // Next for Node.js or CommonJS. jQuery may not be needed as a module. + } else if (typeof exports !== 'undefined') { + var _ = require('underscore'), $; + try { $ = require('jquery'); } catch(e) {} + factory(root, exports, _, $); + + // Finally, as a browser global. + } else { + root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$)); + } + +}(function(root, Backbone, _, $) { + + // Initial Setup + // ------------- + + // Save the previous value of the `Backbone` variable, so that it can be + // restored later on, if `noConflict` is used. + var previousBackbone = root.Backbone; + + // Create a local reference to a common array method we'll want to use later. + var slice = [].slice; + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '1.2.1'; + + // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns + // the `$` variable. + Backbone.$ = $; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option + // will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and + // set a `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... this will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Proxy Underscore methods to a Backbone class' prototype using a + // particular attribute as the data argument + var addMethod = function(length, method, attribute) { + switch (length) { + case 1: return function() { + return _[method](this[attribute]); + }; + case 2: return function(value) { + return _[method](this[attribute], value); + }; + case 3: return function(iteratee, context) { + return _[method](this[attribute], iteratee, context); + }; + case 4: return function(iteratee, defaultVal, context) { + return _[method](this[attribute], iteratee, defaultVal, context); + }; + default: return function() { + var args = slice.call(arguments); + args.unshift(this[attribute]); + return _[method].apply(_, args); + }; + } + }; + var addUnderscoreMethods = function(Class, methods, attribute) { + _.each(methods, function(length, method) { + if (_[method]) Class.prototype[method] = addMethod(length, method, attribute); + }); + }; + + // Backbone.Events + // --------------- + + // A module that can be mixed in to *any object* in order to provide it with + // custom events. You may bind with `on` or remove with `off` callback + // functions to an event; `trigger`-ing an event fires all callbacks in + // succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.on('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + var Events = Backbone.Events = {}; + + // Regular expression used to split event strings. + var eventSplitter = /\s+/; + + // Iterates over the standard `event, callback` (as well as the fancy multiple + // space-separated events `"change blur", callback` and jQuery-style event + // maps `{event: callback}`), reducing them by manipulating `memo`. + // Passes a normalized single event name and callback, as well as any + // optional `opts`. + var eventsApi = function(iteratee, memo, name, callback, opts) { + var i = 0, names; + if (name && typeof name === 'object') { + // Handle event maps. + if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback; + for (names = _.keys(name); i < names.length ; i++) { + memo = iteratee(memo, names[i], name[names[i]], opts); + } + } else if (name && eventSplitter.test(name)) { + // Handle space separated event names. + for (names = name.split(eventSplitter); i < names.length; i++) { + memo = iteratee(memo, names[i], callback, opts); + } + } else { + memo = iteratee(memo, name, callback, opts); + } + return memo; + }; + + // Bind an event to a `callback` function. Passing `"all"` will bind + // the callback to all events fired. + Events.on = function(name, callback, context) { + return internalOn(this, name, callback, context); + }; + + // An internal use `on` function, used to guard the `listening` argument from + // the public API. + var internalOn = function(obj, name, callback, context, listening) { + obj._events = eventsApi(onApi, obj._events || {}, name, callback, { + context: context, + ctx: obj, + listening: listening + }); + + if (listening) { + var listeners = obj._listeners || (obj._listeners = {}); + listeners[listening.id] = listening; + } + + return obj; + }; + + // Inversion-of-control versions of `on`. Tell *this* object to listen to + // an event in another object... keeping track of what it's listening to. + Events.listenTo = function(obj, name, callback) { + if (!obj) return this; + var id = obj._listenId || (obj._listenId = _.uniqueId('l')); + var listeningTo = this._listeningTo || (this._listeningTo = {}); + var listening = listeningTo[id]; + + // This object is not listening to any other events on `obj` yet. + // Setup the necessary references to track the listening callbacks. + if (!listening) { + var thisId = this._listenId || (this._listenId = _.uniqueId('l')); + listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0}; + } + + // Bind callbacks on obj, and keep track of them on listening. + internalOn(obj, name, callback, this, listening); + return this; + }; + + // The reducing API that adds a callback to the `events` object. + var onApi = function(events, name, callback, options) { + if (callback) { + var handlers = events[name] || (events[name] = []); + var context = options.context, ctx = options.ctx, listening = options.listening; + if (listening) listening.count++; + + handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening }); + } + return events; + }; + + // Remove one or many callbacks. If `context` is null, removes all + // callbacks with that function. If `callback` is null, removes all + // callbacks for the event. If `name` is null, removes all bound + // callbacks for all events. + Events.off = function(name, callback, context) { + if (!this._events) return this; + this._events = eventsApi(offApi, this._events, name, callback, { + context: context, + listeners: this._listeners + }); + return this; + }; + + // Tell this object to stop listening to either specific events ... or + // to every object it's currently listening to. + Events.stopListening = function(obj, name, callback) { + var listeningTo = this._listeningTo; + if (!listeningTo) return this; + + var ids = obj ? [obj._listenId] : _.keys(listeningTo); + + for (var i = 0; i < ids.length; i++) { + var listening = listeningTo[ids[i]]; + + // If listening doesn't exist, this object is not currently + // listening to obj. Break out early. + if (!listening) break; + + listening.obj.off(name, callback, this); + } + if (_.isEmpty(listeningTo)) this._listeningTo = void 0; + + return this; + }; + + // The reducing API that removes a callback from the `events` object. + var offApi = function(events, name, callback, options) { + // No events to consider. + if (!events) return; + + var i = 0, listening; + var context = options.context, listeners = options.listeners; + + // Delete all events listeners and "drop" events. + if (!name && !callback && !context) { + var ids = _.keys(listeners); + for (; i < ids.length; i++) { + listening = listeners[ids[i]]; + delete listeners[listening.id]; + delete listening.listeningTo[listening.objId]; + } + return; + } + + var names = name ? [name] : _.keys(events); + for (; i < names.length; i++) { + name = names[i]; + var handlers = events[name]; + + // Bail out if there are no events stored. + if (!handlers) break; + + // Replace events if there are any remaining. Otherwise, clean up. + var remaining = []; + for (var j = 0; j < handlers.length; j++) { + var handler = handlers[j]; + if ( + callback && callback !== handler.callback && + callback !== handler.callback._callback || + context && context !== handler.context + ) { + remaining.push(handler); + } else { + listening = handler.listening; + if (listening && --listening.count === 0) { + delete listeners[listening.id]; + delete listening.listeningTo[listening.objId]; + } + } + } + + // Update tail event if the list has any events. Otherwise, clean up. + if (remaining.length) { + events[name] = remaining; + } else { + delete events[name]; + } + } + if (_.size(events)) return events; + }; + + // Bind an event to only be triggered a single time. After the first time + // the callback is invoked, it will be removed. When multiple events are + // passed in using the space-separated syntax, the event will fire once for every + // event you passed in, not once for a combination of all events + Events.once = function(name, callback, context) { + // Map the event into a `{event: once}` object. + var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this)); + return this.on(events, void 0, context); + }; + + // Inversion-of-control versions of `once`. + Events.listenToOnce = function(obj, name, callback) { + // Map the event into a `{event: once}` object. + var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj)); + return this.listenTo(obj, events); + }; + + // Reduces the event callbacks into a map of `{event: onceWrapper}`. + // `offer` unbinds the `onceWrapper` after it has been called. + var onceMap = function(map, name, callback, offer) { + if (callback) { + var once = map[name] = _.once(function() { + offer(name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + } + return map; + }; + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + Events.trigger = function(name) { + if (!this._events) return this; + + var length = Math.max(0, arguments.length - 1); + var args = Array(length); + for (var i = 0; i < length; i++) args[i] = arguments[i + 1]; + + eventsApi(triggerApi, this._events, name, void 0, args); + return this; + }; + + // Handles triggering the appropriate event callbacks. + var triggerApi = function(objEvents, name, cb, args) { + if (objEvents) { + var events = objEvents[name]; + var allEvents = objEvents.all; + if (events && allEvents) allEvents = allEvents.slice(); + if (events) triggerEvents(events, args); + if (allEvents) triggerEvents(allEvents, [name].concat(args)); + } + return objEvents; + }; + + // A difficult-to-believe, but optimized internal dispatch function for + // triggering events. Tries to keep the usual cases speedy (most internal + // Backbone events have 3 arguments). + var triggerEvents = function(events, args) { + var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; + switch (args.length) { + case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; + case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; + case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; + case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; + default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return; + } + }; + + // Aliases for backwards compatibility. + Events.bind = Events.on; + Events.unbind = Events.off; + + // Allow the `Backbone` object to serve as a global event bus, for folks who + // want global "pubsub" in a convenient place. + _.extend(Backbone, Events); + + // Backbone.Model + // -------------- + + // Backbone **Models** are the basic data object in the framework -- + // frequently representing a row in a table in a database on your server. + // A discrete chunk of data and a bunch of useful, related methods for + // performing computations and transformations on that data. + + // Create a new model with the specified attributes. A client id (`cid`) + // is automatically generated and assigned for you. + var Model = Backbone.Model = function(attributes, options) { + var attrs = attributes || {}; + options || (options = {}); + this.cid = _.uniqueId(this.cidPrefix); + this.attributes = {}; + if (options.collection) this.collection = options.collection; + if (options.parse) attrs = this.parse(attrs, options) || {}; + attrs = _.defaults({}, attrs, _.result(this, 'defaults')); + this.set(attrs, options); + this.changed = {}; + this.initialize.apply(this, arguments); + }; + + // Attach all inheritable methods to the Model prototype. + _.extend(Model.prototype, Events, { + + // A hash of attributes whose current and previous value differ. + changed: null, + + // The value returned during the last failed validation. + validationError: null, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute: 'id', + + // The prefix is used to create the client id which is used to identify models locally. + // You may want to override this if you're experiencing name clashes with model ids. + cidPrefix: 'c', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Return a copy of the model's `attributes` object. + toJSON: function(options) { + return _.clone(this.attributes); + }, + + // Proxy `Backbone.sync` by default -- but override this if you need + // custom syncing semantics for *this* particular model. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Get the value of an attribute. + get: function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape: function(attr) { + return _.escape(this.get(attr)); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has: function(attr) { + return this.get(attr) != null; + }, + + // Special-cased proxy to underscore's `_.matches` method. + matches: function(attrs) { + return !!_.iteratee(attrs, this)(this.attributes); + }, + + // Set a hash of model attributes on the object, firing `"change"`. This is + // the core primitive operation of a model, updating the data and notifying + // anyone who needs to know about the change in state. The heart of the beast. + set: function(key, val, options) { + if (key == null) return this; + + // Handle both `"key", value` and `{key: value}` -style arguments. + var attrs; + if (typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options || (options = {}); + + // Run validation. + if (!this._validate(attrs, options)) return false; + + // Extract attributes and options. + var unset = options.unset; + var silent = options.silent; + var changes = []; + var changing = this._changing; + this._changing = true; + + if (!changing) { + this._previousAttributes = _.clone(this.attributes); + this.changed = {}; + } + + var current = this.attributes; + var changed = this.changed; + var prev = this._previousAttributes; + + // Check for changes of `id`. + if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; + + // For each `set` attribute, update or delete the current value. + for (var attr in attrs) { + val = attrs[attr]; + if (!_.isEqual(current[attr], val)) changes.push(attr); + if (!_.isEqual(prev[attr], val)) { + changed[attr] = val; + } else { + delete changed[attr]; + } + unset ? delete current[attr] : current[attr] = val; + } + + // Trigger all relevant attribute changes. + if (!silent) { + if (changes.length) this._pending = options; + for (var i = 0; i < changes.length; i++) { + this.trigger('change:' + changes[i], this, current[changes[i]], options); + } + } + + // You might be wondering why there's a `while` loop here. Changes can + // be recursively nested within `"change"` events. + if (changing) return this; + if (!silent) { + while (this._pending) { + options = this._pending; + this._pending = false; + this.trigger('change', this, options); + } + } + this._pending = false; + this._changing = false; + return this; + }, + + // Remove an attribute from the model, firing `"change"`. `unset` is a noop + // if the attribute doesn't exist. + unset: function(attr, options) { + return this.set(attr, void 0, _.extend({}, options, {unset: true})); + }, + + // Clear all attributes on the model, firing `"change"`. + clear: function(options) { + var attrs = {}; + for (var key in this.attributes) attrs[key] = void 0; + return this.set(attrs, _.extend({}, options, {unset: true})); + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged: function(attr) { + if (attr == null) return !_.isEmpty(this.changed); + return _.has(this.changed, attr); + }, + + // Return an object containing all the attributes that have changed, or + // false if there are no changed attributes. Useful for determining what + // parts of a view need to be updated and/or what attributes need to be + // persisted to the server. Unset attributes will be set to undefined. + // You can also pass an attributes object to diff against the model, + // determining if there *would be* a change. + changedAttributes: function(diff) { + if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; + var old = this._changing ? this._previousAttributes : this.attributes; + var changed = {}; + for (var attr in diff) { + var val = diff[attr]; + if (_.isEqual(old[attr], val)) continue; + changed[attr] = val; + } + return _.size(changed) ? changed : false; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous: function(attr) { + if (attr == null || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes: function() { + return _.clone(this._previousAttributes); + }, + + // Fetch the model from the server, merging the response with the model's + // local attributes. Any changed attributes will trigger a "change" event. + fetch: function(options) { + options = _.extend({parse: true}, options); + var model = this; + var success = options.success; + options.success = function(resp) { + var serverAttrs = options.parse ? model.parse(resp, options) : resp; + if (!model.set(serverAttrs, options)) return false; + if (success) success.call(options.context, model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save: function(key, val, options) { + // Handle both `"key", value` and `{key: value}` -style arguments. + var attrs; + if (key == null || typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options = _.extend({validate: true, parse: true}, options); + var wait = options.wait; + + // If we're not waiting and attributes exist, save acts as + // `set(attr).save(null, opts)` with validation. Otherwise, check if + // the model will be valid when the attributes, if any, are set. + if (attrs && !wait) { + if (!this.set(attrs, options)) return false; + } else { + if (!this._validate(attrs, options)) return false; + } + + // After a successful server-side save, the client is (optionally) + // updated with the server-side state. + var model = this; + var success = options.success; + var attributes = this.attributes; + options.success = function(resp) { + // Ensure attributes are restored during synchronous saves. + model.attributes = attributes; + var serverAttrs = options.parse ? model.parse(resp, options) : resp; + if (wait) serverAttrs = _.extend({}, attrs, serverAttrs); + if (serverAttrs && !model.set(serverAttrs, options)) return false; + if (success) success.call(options.context, model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + + // Set temporary attributes if `{wait: true}` to properly find new ids. + if (attrs && wait) this.attributes = _.extend({}, attributes, attrs); + + var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); + if (method === 'patch' && !options.attrs) options.attrs = attrs; + var xhr = this.sync(method, this, options); + + // Restore attributes. + this.attributes = attributes; + + return xhr; + }, + + // Destroy this model on the server if it was already persisted. + // Optimistically removes the model from its collection, if it has one. + // If `wait: true` is passed, waits for the server to respond before removal. + destroy: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + var wait = options.wait; + + var destroy = function() { + model.stopListening(); + model.trigger('destroy', model, model.collection, options); + }; + + options.success = function(resp) { + if (wait) destroy(); + if (success) success.call(options.context, model, resp, options); + if (!model.isNew()) model.trigger('sync', model, resp, options); + }; + + var xhr = false; + if (this.isNew()) { + _.defer(options.success); + } else { + wrapError(this, options); + xhr = this.sync('delete', this, options); + } + if (!wait) destroy(); + return xhr; + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url: function() { + var base = + _.result(this, 'urlRoot') || + _.result(this.collection, 'url') || + urlError(); + if (this.isNew()) return base; + var id = this.get(this.idAttribute); + return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse: function(resp, options) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone: function() { + return new this.constructor(this.attributes); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew: function() { + return !this.has(this.idAttribute); + }, + + // Check if the model is currently in a valid state. + isValid: function(options) { + return this._validate({}, _.defaults({validate: true}, options)); + }, + + // Run validation against the next complete set of model attributes, + // returning `true` if all is well. Otherwise, fire an `"invalid"` event. + _validate: function(attrs, options) { + if (!options.validate || !this.validate) return true; + attrs = _.extend({}, this.attributes, attrs); + var error = this.validationError = this.validate(attrs, options) || null; + if (!error) return true; + this.trigger('invalid', this, error, _.extend(options, {validationError: error})); + return false; + } + + }); + + // Underscore methods that we want to implement on the Model. + var modelMethods = { keys: 1, values: 1, pairs: 1, invert: 1, pick: 0, + omit: 0, chain: 1, isEmpty: 1 }; + + // Mix in each Underscore method as a proxy to `Model#attributes`. + addUnderscoreMethods(Model, modelMethods, 'attributes'); + + // Backbone.Collection + // ------------------- + + // If models tend to represent a single row of data, a Backbone Collection is + // more analogous to a table full of data ... or a small slice or page of that + // table, or a collection of rows that belong together for a particular reason + // -- all of the messages in this particular folder, all of the documents + // belonging to this particular author, and so on. Collections maintain + // indexes of their models, both in order, and for lookup by `id`. + + // Create a new **Collection**, perhaps to contain a specific type of `model`. + // If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + var Collection = Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.model) this.model = options.model; + if (options.comparator !== void 0) this.comparator = options.comparator; + this._reset(); + this.initialize.apply(this, arguments); + if (models) this.reset(models, _.extend({silent: true}, options)); + }; + + // Default options for `Collection#set`. + var setOptions = {add: true, remove: true, merge: true}; + var addOptions = {add: true, remove: false}; + + // Define the Collection's inheritable methods. + _.extend(Collection.prototype, Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model: Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON: function(options) { + return this.map(function(model) { return model.toJSON(options); }); + }, + + // Proxy `Backbone.sync` by default. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Add a model, or list of models to the set. + add: function(models, options) { + return this.set(models, _.extend({merge: false}, options, addOptions)); + }, + + // Remove a model, or a list of models from the set. + remove: function(models, options) { + options = _.extend({}, options); + var singular = !_.isArray(models); + models = singular ? [models] : _.clone(models); + var removed = this._removeModels(models, options); + if (!options.silent && removed) this.trigger('update', this, options); + return singular ? removed[0] : removed; + }, + + // Update a collection by `set`-ing a new list of models, adding new ones, + // removing models that are no longer present, and merging models that + // already exist in the collection, as necessary. Similar to **Model#set**, + // the core operation for updating the data contained by the collection. + set: function(models, options) { + options = _.defaults({}, options, setOptions); + if (options.parse && !this._isModel(models)) models = this.parse(models, options); + var singular = !_.isArray(models); + models = singular ? (models ? [models] : []) : models.slice(); + var id, model, attrs, existing, sort; + var at = options.at; + if (at != null) at = +at; + if (at < 0) at += this.length + 1; + var sortable = this.comparator && (at == null) && options.sort !== false; + var sortAttr = _.isString(this.comparator) ? this.comparator : null; + var toAdd = [], toRemove = [], modelMap = {}; + var add = options.add, merge = options.merge, remove = options.remove; + var order = !sortable && add && remove ? [] : false; + var orderChanged = false; + + // Turn bare objects into model references, and prevent invalid models + // from being added. + for (var i = 0; i < models.length; i++) { + attrs = models[i]; + + // If a duplicate is found, prevent it from being added and + // optionally merge it into the existing model. + if (existing = this.get(attrs)) { + if (remove) modelMap[existing.cid] = true; + if (merge && attrs !== existing) { + attrs = this._isModel(attrs) ? attrs.attributes : attrs; + if (options.parse) attrs = existing.parse(attrs, options); + existing.set(attrs, options); + if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true; + } + models[i] = existing; + + // If this is a new, valid model, push it to the `toAdd` list. + } else if (add) { + model = models[i] = this._prepareModel(attrs, options); + if (!model) continue; + toAdd.push(model); + this._addReference(model, options); + } + + // Do not add multiple models with the same `id`. + model = existing || model; + if (!model) continue; + id = this.modelId(model.attributes); + if (order && (model.isNew() || !modelMap[id])) { + order.push(model); + + // Check to see if this is actually a new model at this index. + orderChanged = orderChanged || !this.models[i] || model.cid !== this.models[i].cid; + } + + modelMap[id] = true; + } + + // Remove nonexistent models if appropriate. + if (remove) { + for (var i = 0; i < this.length; i++) { + if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model); + } + if (toRemove.length) this._removeModels(toRemove, options); + } + + // See if sorting is needed, update `length` and splice in new models. + if (toAdd.length || orderChanged) { + if (sortable) sort = true; + this.length += toAdd.length; + if (at != null) { + for (var i = 0; i < toAdd.length; i++) { + this.models.splice(at + i, 0, toAdd[i]); + } + } else { + if (order) this.models.length = 0; + var orderedModels = order || toAdd; + for (var i = 0; i < orderedModels.length; i++) { + this.models.push(orderedModels[i]); + } + } + } + + // Silently sort the collection if appropriate. + if (sort) this.sort({silent: true}); + + // Unless silenced, it's time to fire all appropriate add/sort events. + if (!options.silent) { + var addOpts = at != null ? _.clone(options) : options; + for (var i = 0; i < toAdd.length; i++) { + if (at != null) addOpts.index = at + i; + (model = toAdd[i]).trigger('add', model, this, addOpts); + } + if (sort || orderChanged) this.trigger('sort', this, options); + if (toAdd.length || toRemove.length) this.trigger('update', this, options); + } + + // Return the added (or merged) model (or models). + return singular ? models[0] : models; + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any granular `add` or `remove` events. Fires `reset` when finished. + // Useful for bulk operations and optimizations. + reset: function(models, options) { + options = options ? _.clone(options) : {}; + for (var i = 0; i < this.models.length; i++) { + this._removeReference(this.models[i], options); + } + options.previousModels = this.models; + this._reset(); + models = this.add(models, _.extend({silent: true}, options)); + if (!options.silent) this.trigger('reset', this, options); + return models; + }, + + // Add a model to the end of the collection. + push: function(model, options) { + return this.add(model, _.extend({at: this.length}, options)); + }, + + // Remove a model from the end of the collection. + pop: function(options) { + var model = this.at(this.length - 1); + return this.remove(model, options); + }, + + // Add a model to the beginning of the collection. + unshift: function(model, options) { + return this.add(model, _.extend({at: 0}, options)); + }, + + // Remove a model from the beginning of the collection. + shift: function(options) { + var model = this.at(0); + return this.remove(model, options); + }, + + // Slice out a sub-array of models from the collection. + slice: function() { + return slice.apply(this.models, arguments); + }, + + // Get a model from the set by id. + get: function(obj) { + if (obj == null) return void 0; + var id = this.modelId(this._isModel(obj) ? obj.attributes : obj); + return this._byId[obj] || this._byId[id] || this._byId[obj.cid]; + }, + + // Get the model at the given index. + at: function(index) { + if (index < 0) index += this.length; + return this.models[index]; + }, + + // Return models with matching attributes. Useful for simple cases of + // `filter`. + where: function(attrs, first) { + var matches = _.matches(attrs); + return this[first ? 'find' : 'filter'](function(model) { + return matches(model.attributes); + }); + }, + + // Return the first model with matching attributes. Useful for simple cases + // of `find`. + findWhere: function(attrs) { + return this.where(attrs, true); + }, + + // Force the collection to re-sort itself. You don't need to call this under + // normal circumstances, as the set will maintain sort order as each item + // is added. + sort: function(options) { + if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); + options || (options = {}); + + // Run sort based on type of `comparator`. + if (_.isString(this.comparator) || this.comparator.length === 1) { + this.models = this.sortBy(this.comparator, this); + } else { + this.models.sort(_.bind(this.comparator, this)); + } + + if (!options.silent) this.trigger('sort', this, options); + return this; + }, + + // Pluck an attribute from each model in the collection. + pluck: function(attr) { + return _.invoke(this.models, 'get', attr); + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `reset: true` is passed, the response + // data will be passed through the `reset` method instead of `set`. + fetch: function(options) { + options = _.extend({parse: true}, options); + var success = options.success; + var collection = this; + options.success = function(resp) { + var method = options.reset ? 'reset' : 'set'; + collection[method](resp, options); + if (success) success.call(options.context, collection, resp, options); + collection.trigger('sync', collection, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Create a new instance of a model in this collection. Add the model to the + // collection immediately, unless `wait: true` is passed, in which case we + // wait for the server to agree. + create: function(model, options) { + options = options ? _.clone(options) : {}; + var wait = options.wait; + model = this._prepareModel(model, options); + if (!model) return false; + if (!wait) this.add(model, options); + var collection = this; + var success = options.success; + options.success = function(model, resp, callbackOpts) { + if (wait) collection.add(model, callbackOpts); + if (success) success.call(callbackOpts.context, model, resp, callbackOpts); + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse: function(resp, options) { + return resp; + }, + + // Create a new collection with an identical list of models as this one. + clone: function() { + return new this.constructor(this.models, { + model: this.model, + comparator: this.comparator + }); + }, + + // Define how to uniquely identify models in the collection. + modelId: function (attrs) { + return attrs[this.model.prototype.idAttribute || 'id']; + }, + + // Private method to reset all internal state. Called when the collection + // is first initialized or reset. + _reset: function() { + this.length = 0; + this.models = []; + this._byId = {}; + }, + + // Prepare a hash of attributes (or other model) to be added to this + // collection. + _prepareModel: function(attrs, options) { + if (this._isModel(attrs)) { + if (!attrs.collection) attrs.collection = this; + return attrs; + } + options = options ? _.clone(options) : {}; + options.collection = this; + var model = new this.model(attrs, options); + if (!model.validationError) return model; + this.trigger('invalid', this, model.validationError, options); + return false; + }, + + // Internal method called by both remove and set. + // Returns removed models, or false if nothing is removed. + _removeModels: function(models, options) { + var removed = []; + for (var i = 0; i < models.length; i++) { + var model = this.get(models[i]); + if (!model) continue; + + var index = this.indexOf(model); + this.models.splice(index, 1); + this.length--; + + if (!options.silent) { + options.index = index; + model.trigger('remove', model, this, options); + } + + removed.push(model); + this._removeReference(model, options); + } + return removed.length ? removed : false; + }, + + // Method for checking whether an object should be considered a model for + // the purposes of adding to the collection. + _isModel: function (model) { + return model instanceof Model; + }, + + // Internal method to create a model's ties to a collection. + _addReference: function(model, options) { + this._byId[model.cid] = model; + var id = this.modelId(model.attributes); + if (id != null) this._byId[id] = model; + model.on('all', this._onModelEvent, this); + }, + + // Internal method to sever a model's ties to a collection. + _removeReference: function(model, options) { + delete this._byId[model.cid]; + var id = this.modelId(model.attributes); + if (id != null) delete this._byId[id]; + if (this === model.collection) delete model.collection; + model.off('all', this._onModelEvent, this); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent: function(event, model, collection, options) { + if ((event === 'add' || event === 'remove') && collection !== this) return; + if (event === 'destroy') this.remove(model, options); + if (event === 'change') { + var prevId = this.modelId(model.previousAttributes()); + var id = this.modelId(model.attributes); + if (prevId !== id) { + if (prevId != null) delete this._byId[prevId]; + if (id != null) this._byId[id] = model; + } + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + // 90% of the core usefulness of Backbone Collections is actually implemented + // right here: + var collectionMethods = { forEach: 3, each: 3, map: 3, collect: 3, reduce: 4, + foldl: 4, inject: 4, reduceRight: 4, foldr: 4, find: 3, detect: 3, filter: 3, + select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 2, + contains: 2, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3, + head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3, + without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3, + isEmpty: 1, chain: 1, sample: 3, partition: 3 }; + + // Mix in each Underscore method as a proxy to `Collection#models`. + addUnderscoreMethods(Collection, collectionMethods, 'models'); + + // Underscore methods that take a property name as an argument. + var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy']; + + // Use attributes instead of properties. + _.each(attributeMethods, function(method) { + if (!_[method]) return; + Collection.prototype[method] = function(value, context) { + var iterator = _.isFunction(value) ? value : function(model) { + return model.get(value); + }; + return _[method](this.models, iterator, context); + }; + }); + + // Backbone.View + // ------------- + + // Backbone Views are almost more convention than they are actual code. A View + // is simply a JavaScript object that represents a logical chunk of UI in the + // DOM. This might be a single item, an entire list, a sidebar or panel, or + // even the surrounding frame which wraps your whole app. Defining a chunk of + // UI as a **View** allows you to define your DOM events declaratively, without + // having to worry about render order ... and makes it easy for the view to + // react to specific changes in the state of your models. + + // Creating a Backbone.View creates its initial element outside of the DOM, + // if an existing element is not provided... + var View = Backbone.View = function(options) { + this.cid = _.uniqueId('view'); + _.extend(this, _.pick(options, viewOptions)); + this._ensureElement(); + this.initialize.apply(this, arguments); + }; + + // Cached regex to split keys for `delegate`. + var delegateEventSplitter = /^(\S+)\s*(.*)$/; + + // List of view options to be merged as properties. + var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; + + // Set up all inheritable **Backbone.View** properties and methods. + _.extend(View.prototype, Events, { + + // The default `tagName` of a View's element is `"div"`. + tagName: 'div', + + // jQuery delegate for element lookup, scoped to DOM elements within the + // current view. This should be preferred to global lookups where possible. + $: function(selector) { + return this.$el.find(selector); + }, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // **render** is the core function that your view should override, in order + // to populate its element (`this.el`), with the appropriate HTML. The + // convention is for **render** to always return `this`. + render: function() { + return this; + }, + + // Remove this view by taking the element out of the DOM, and removing any + // applicable Backbone.Events listeners. + remove: function() { + this._removeElement(); + this.stopListening(); + return this; + }, + + // Remove this view's element from the document and all event listeners + // attached to it. Exposed for subclasses using an alternative DOM + // manipulation API. + _removeElement: function() { + this.$el.remove(); + }, + + // Change the view's element (`this.el` property) and re-delegate the + // view's events on the new element. + setElement: function(element) { + this.undelegateEvents(); + this._setElement(element); + this.delegateEvents(); + return this; + }, + + // Creates the `this.el` and `this.$el` references for this view using the + // given `el`. `el` can be a CSS selector or an HTML string, a jQuery + // context or an element. Subclasses can override this to utilize an + // alternative DOM manipulation API and are only required to set the + // `this.el` property. + _setElement: function(el) { + this.$el = el instanceof Backbone.$ ? el : Backbone.$(el); + this.el = this.$el[0]; + }, + + // Set callbacks, where `this.events` is a hash of + // + // *{"event selector": "callback"}* + // + // { + // 'mousedown .title': 'edit', + // 'click .button': 'save', + // 'click .open': function(e) { ... } + // } + // + // pairs. Callbacks will be bound to the view, with `this` set properly. + // Uses event delegation for efficiency. + // Omitting the selector binds the event to `this.el`. + delegateEvents: function(events) { + events || (events = _.result(this, 'events')); + if (!events) return this; + this.undelegateEvents(); + for (var key in events) { + var method = events[key]; + if (!_.isFunction(method)) method = this[method]; + if (!method) continue; + var match = key.match(delegateEventSplitter); + this.delegate(match[1], match[2], _.bind(method, this)); + } + return this; + }, + + // Add a single event listener to the view's element (or a child element + // using `selector`). This only works for delegate-able events: not `focus`, + // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer. + delegate: function(eventName, selector, listener) { + this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); + return this; + }, + + // Clears all callbacks previously bound to the view by `delegateEvents`. + // You usually don't need to use this, but may wish to if you have multiple + // Backbone views attached to the same DOM element. + undelegateEvents: function() { + if (this.$el) this.$el.off('.delegateEvents' + this.cid); + return this; + }, + + // A finer-grained `undelegateEvents` for removing a single delegated event. + // `selector` and `listener` are both optional. + undelegate: function(eventName, selector, listener) { + this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener); + return this; + }, + + // Produces a DOM element to be assigned to your view. Exposed for + // subclasses using an alternative DOM manipulation API. + _createElement: function(tagName) { + return document.createElement(tagName); + }, + + // Ensure that the View has a DOM element to render into. + // If `this.el` is a string, pass it through `$()`, take the first + // matching element, and re-assign it to `el`. Otherwise, create + // an element from the `id`, `className` and `tagName` properties. + _ensureElement: function() { + if (!this.el) { + var attrs = _.extend({}, _.result(this, 'attributes')); + if (this.id) attrs.id = _.result(this, 'id'); + if (this.className) attrs['class'] = _.result(this, 'className'); + this.setElement(this._createElement(_.result(this, 'tagName'))); + this._setAttributes(attrs); + } else { + this.setElement(_.result(this, 'el')); + } + }, + + // Set attributes from a hash on this view's element. Exposed for + // subclasses using an alternative DOM manipulation API. + _setAttributes: function(attributes) { + this.$el.attr(attributes); + } + + }); + + // Backbone.sync + // ------------- + + // Override this function to change the manner in which Backbone persists + // models to the server. You will be passed the type of request, and the + // model in question. By default, makes a RESTful Ajax request + // to the model's `url()`. Some possible customizations could be: + // + // * Use `setTimeout` to batch rapid-fire updates into a single request. + // * Send up the models as XML instead of JSON. + // * Persist models via WebSockets instead of Ajax. + // + // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests + // as `POST`, with a `_method` parameter containing the true HTTP method, + // as well as all requests with the body as `application/x-www-form-urlencoded` + // instead of `application/json` with the model in a param named `model`. + // Useful when interfacing with server-side languages like **PHP** that make + // it difficult to read the body of `PUT` requests. + Backbone.sync = function(method, model, options) { + var type = methodMap[method]; + + // Default options, unless specified. + _.defaults(options || (options = {}), { + emulateHTTP: Backbone.emulateHTTP, + emulateJSON: Backbone.emulateJSON + }); + + // Default JSON-request options. + var params = {type: type, dataType: 'json'}; + + // Ensure that we have a URL. + if (!options.url) { + params.url = _.result(model, 'url') || urlError(); + } + + // Ensure that we have the appropriate request data. + if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { + params.contentType = 'application/json'; + params.data = JSON.stringify(options.attrs || model.toJSON(options)); + } + + // For older servers, emulate JSON by encoding the request into an HTML-form. + if (options.emulateJSON) { + params.contentType = 'application/x-www-form-urlencoded'; + params.data = params.data ? {model: params.data} : {}; + } + + // For older servers, emulate HTTP by mimicking the HTTP method with `_method` + // And an `X-HTTP-Method-Override` header. + if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { + params.type = 'POST'; + if (options.emulateJSON) params.data._method = type; + var beforeSend = options.beforeSend; + options.beforeSend = function(xhr) { + xhr.setRequestHeader('X-HTTP-Method-Override', type); + if (beforeSend) return beforeSend.apply(this, arguments); + }; + } + + // Don't process data on a non-GET request. + if (params.type !== 'GET' && !options.emulateJSON) { + params.processData = false; + } + + // Pass along `textStatus` and `errorThrown` from jQuery. + var error = options.error; + options.error = function(xhr, textStatus, errorThrown) { + options.textStatus = textStatus; + options.errorThrown = errorThrown; + if (error) error.call(options.context, xhr, textStatus, errorThrown); + }; + + // Make the request, allowing the user to override any Ajax options. + var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); + model.trigger('request', model, xhr, options); + return xhr; + }; + + // Map from CRUD to HTTP for our default `Backbone.sync` implementation. + var methodMap = { + 'create': 'POST', + 'update': 'PUT', + 'patch': 'PATCH', + 'delete': 'DELETE', + 'read': 'GET' + }; + + // Set the default implementation of `Backbone.ajax` to proxy through to `$`. + // Override this if you'd like to use a different library. + Backbone.ajax = function() { + return Backbone.$.ajax.apply(Backbone.$, arguments); + }; + + // Backbone.Router + // --------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var optionalParam = /\((.*?)\)/g; + var namedParam = /(\(\?)?:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function(route, name, callback) { + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (_.isFunction(name)) { + callback = name; + name = ''; + } + if (!callback) callback = this[name]; + var router = this; + Backbone.history.route(route, function(fragment) { + var args = router._extractParameters(route, fragment); + if (router.execute(callback, args, name) !== false) { + router.trigger.apply(router, ['route:' + name].concat(args)); + router.trigger('route', name, args); + Backbone.history.trigger('route', router, name, args); + } + }); + return this; + }, + + // Execute a route handler with the provided parameters. This is an + // excellent place to do pre-route setup or post-route cleanup. + execute: function(callback, args, name) { + if (callback) callback.apply(this, args); + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate: function(fragment, options) { + Backbone.history.navigate(fragment, options); + return this; + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function() { + if (!this.routes) return; + this.routes = _.result(this, 'routes'); + var route, routes = _.keys(this.routes); + while ((route = routes.pop()) != null) { + this.route(route, this.routes[route]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function(route) { + route = route.replace(escapeRegExp, '\\$&') + .replace(optionalParam, '(?:$1)?') + .replace(namedParam, function(match, optional) { + return optional ? match : '([^/?]+)'; + }) + .replace(splatParam, '([^?]*?)'); + return new RegExp('^' + route + '(?:\\?([\\s\\S]*))?$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted decoded parameters. Empty or unmatched parameters will be + // treated as `null` to normalize cross-browser behavior. + _extractParameters: function(route, fragment) { + var params = route.exec(fragment).slice(1); + return _.map(params, function(param, i) { + // Don't decode the search params. + if (i === params.length - 1) return param || null; + return param ? decodeURIComponent(param) : null; + }); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on either + // [pushState](http://diveintohtml5.info/history.html) and real URLs, or + // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) + // and URL fragments. If the browser supports neither (old IE, natch), + // falls back to polling. + var History = Backbone.History = function() { + this.handlers = []; + _.bindAll(this, 'checkUrl'); + + // Ensure that `History` can be used outside of the browser. + if (typeof window !== 'undefined') { + this.location = window.location; + this.history = window.history; + } + }; + + // Cached regex for stripping a leading hash/slash and trailing space. + var routeStripper = /^[#\/]|\s+$/g; + + // Cached regex for stripping leading and trailing slashes. + var rootStripper = /^\/+|\/+$/g; + + // Cached regex for stripping urls of hash. + var pathStripper = /#.*$/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Are we at the app root? + atRoot: function() { + var path = this.location.pathname.replace(/[^\/]$/, '$&/'); + return path === this.root && !this.getSearch(); + }, + + // Does the pathname match the root? + matchRoot: function() { + var path = this.decodeFragment(this.location.pathname); + var root = path.slice(0, this.root.length - 1) + '/'; + return root === this.root; + }, + + // Unicode characters in `location.pathname` are percent encoded so they're + // decoded for comparison. `%25` should not be decoded since it may be part + // of an encoded parameter. + decodeFragment: function(fragment) { + return decodeURI(fragment.replace(/%25/g, '%2525')); + }, + + // In IE6, the hash fragment and search params are incorrect if the + // fragment contains `?`. + getSearch: function() { + var match = this.location.href.replace(/#.*/, '').match(/\?.+/); + return match ? match[0] : ''; + }, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function(window) { + var match = (window || this).location.href.match(/#(.*)$/); + return match ? match[1] : ''; + }, + + // Get the pathname and search params, without the root. + getPath: function() { + var path = this.decodeFragment( + this.location.pathname + this.getSearch() + ).slice(this.root.length - 1); + return path.charAt(0) === '/' ? path.slice(1) : path; + }, + + // Get the cross-browser normalized URL fragment from the path or hash. + getFragment: function(fragment) { + if (fragment == null) { + if (this._usePushState || !this._wantsHashChange) { + fragment = this.getPath(); + } else { + fragment = this.getHash(); + } + } + return fragment.replace(routeStripper, ''); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function(options) { + if (History.started) throw new Error('Backbone.history has already been started'); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({root: '/'}, this.options, options); + this.root = this.options.root; + this._wantsHashChange = this.options.hashChange !== false; + this._hasHashChange = 'onhashchange' in window; + this._useHashChange = this._wantsHashChange && this._hasHashChange; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.history && this.history.pushState); + this._usePushState = this._wantsPushState && this._hasPushState; + this.fragment = this.getFragment(); + + // Normalize root to always include a leading and trailing slash. + this.root = ('/' + this.root + '/').replace(rootStripper, '/'); + + // Transition from hashChange to pushState or vice versa if both are + // requested. + if (this._wantsHashChange && this._wantsPushState) { + + // If we've started off with a route from a `pushState`-enabled + // browser, but we're currently in a browser that doesn't support it... + if (!this._hasPushState && !this.atRoot()) { + var root = this.root.slice(0, -1) || '/'; + this.location.replace(root + '#' + this.getPath()); + // Return immediately as browser will do redirect to new url + return true; + + // Or if we've started out with a hash-based route, but we're currently + // in a browser where it could be `pushState`-based instead... + } else if (this._hasPushState && this.atRoot()) { + this.navigate(this.getHash(), {replace: true}); + } + + } + + // Proxy an iframe to handle location events if the browser doesn't + // support the `hashchange` event, HTML5 history, or the user wants + // `hashChange` but not `pushState`. + if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) { + this.iframe = document.createElement('iframe'); + this.iframe.src = 'javascript:0'; + this.iframe.style.display = 'none'; + this.iframe.tabIndex = -1; + var body = document.body; + // Using `appendChild` will throw on IE < 9 if the document is not ready. + var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow; + iWindow.document.open(); + iWindow.document.close(); + iWindow.location.hash = '#' + this.fragment; + } + + // Add a cross-platform `addEventListener` shim for older browsers. + var addEventListener = window.addEventListener || function (eventName, listener) { + return attachEvent('on' + eventName, listener); + }; + + // Depending on whether we're using pushState or hashes, and whether + // 'onhashchange' is supported, determine how we check the URL state. + if (this._usePushState) { + addEventListener('popstate', this.checkUrl, false); + } else if (this._useHashChange && !this.iframe) { + addEventListener('hashchange', this.checkUrl, false); + } else if (this._wantsHashChange) { + this._checkUrlInterval = setInterval(this.checkUrl, this.interval); + } + + if (!this.options.silent) return this.loadUrl(); + }, + + // Disable Backbone.history, perhaps temporarily. Not useful in a real app, + // but possibly useful for unit testing Routers. + stop: function() { + // Add a cross-platform `removeEventListener` shim for older browsers. + var removeEventListener = window.removeEventListener || function (eventName, listener) { + return detachEvent('on' + eventName, listener); + }; + + // Remove window listeners. + if (this._usePushState) { + removeEventListener('popstate', this.checkUrl, false); + } else if (this._useHashChange && !this.iframe) { + removeEventListener('hashchange', this.checkUrl, false); + } + + // Clean up the iframe if necessary. + if (this.iframe) { + document.body.removeChild(this.iframe); + this.iframe = null; + } + + // Some environments will throw when clearing an undefined interval. + if (this._checkUrlInterval) clearInterval(this._checkUrlInterval); + History.started = false; + }, + + // Add a route to be tested when the fragment changes. Routes added later + // may override previous routes. + route: function(route, callback) { + this.handlers.unshift({route: route, callback: callback}); + }, + + // Checks the current URL to see if it has changed, and if it has, + // calls `loadUrl`, normalizing across the hidden iframe. + checkUrl: function(e) { + var current = this.getFragment(); + + // If the user pressed the back button, the iframe's hash will have + // changed and we should use that for comparison. + if (current === this.fragment && this.iframe) { + current = this.getHash(this.iframe.contentWindow); + } + + if (current === this.fragment) return false; + if (this.iframe) this.navigate(current); + this.loadUrl(); + }, + + // Attempt to load the current URL fragment. If a route succeeds with a + // match, returns `true`. If no defined routes matches the fragment, + // returns `false`. + loadUrl: function(fragment) { + // If the root doesn't match, no routes can match either. + if (!this.matchRoot()) return false; + fragment = this.fragment = this.getFragment(fragment); + return _.any(this.handlers, function(handler) { + if (handler.route.test(fragment)) { + handler.callback(fragment); + return true; + } + }); + }, + + // Save a fragment into the hash history, or replace the URL state if the + // 'replace' option is passed. You are responsible for properly URL-encoding + // the fragment in advance. + // + // The options object can contain `trigger: true` if you wish to have the + // route callback be fired (not usually desirable), or `replace: true`, if + // you wish to modify the current URL without adding an entry to the history. + navigate: function(fragment, options) { + if (!History.started) return false; + if (!options || options === true) options = {trigger: !!options}; + + // Normalize the fragment. + fragment = this.getFragment(fragment || ''); + + // Don't include a trailing slash on the root. + var root = this.root; + if (fragment === '' || fragment.charAt(0) === '?') { + root = root.slice(0, -1) || '/'; + } + var url = root + fragment; + + // Strip the hash and decode for matching. + fragment = this.decodeFragment(fragment.replace(pathStripper, '')); + + if (this.fragment === fragment) return; + this.fragment = fragment; + + // If pushState is available, we use it to set the fragment as a real URL. + if (this._usePushState) { + this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); + + // If hash changes haven't been explicitly disabled, update the hash + // fragment to store history. + } else if (this._wantsHashChange) { + this._updateHash(this.location, fragment, options.replace); + if (this.iframe && (fragment !== this.getHash(this.iframe.contentWindow))) { + var iWindow = this.iframe.contentWindow; + + // Opening and closing the iframe tricks IE7 and earlier to push a + // history entry on hash-tag change. When replace is true, we don't + // want this. + if (!options.replace) { + iWindow.document.open(); + iWindow.document.close(); + } + + this._updateHash(iWindow.location, fragment, options.replace); + } + + // If you've told us that you explicitly don't want fallback hashchange- + // based history, then `navigate` becomes a page refresh. + } else { + return this.location.assign(url); + } + if (options.trigger) return this.loadUrl(fragment); + }, + + // Update the hash location, either replacing the current entry, or adding + // a new one to the browser history. + _updateHash: function(location, fragment, replace) { + if (replace) { + var href = location.href.replace(/(javascript:|#).*$/, ''); + location.replace(href + '#' + fragment); + } else { + // Some browsers require that `hash` contains a leading #. + location.hash = '#' + fragment; + } + } + + }); + + // Create the default Backbone.history. + Backbone.history = new History; + + // Helpers + // ------- + + // Helper function to correctly set up the prototype chain for subclasses. + // Similar to `goog.inherits`, but uses a hash of prototype properties and + // class properties to be extended. + var extend = function(protoProps, staticProps) { + var parent = this; + var child; + + // The constructor function for the new subclass is either defined by you + // (the "constructor" property in your `extend` definition), or defaulted + // by us to simply call the parent constructor. + if (protoProps && _.has(protoProps, 'constructor')) { + child = protoProps.constructor; + } else { + child = function(){ return parent.apply(this, arguments); }; + } + + // Add static properties to the constructor function, if supplied. + _.extend(child, parent, staticProps); + + // Set the prototype chain to inherit from `parent`, without calling + // `parent` constructor function. + var Surrogate = function(){ this.constructor = child; }; + Surrogate.prototype = parent.prototype; + child.prototype = new Surrogate; + + // Add prototype properties (instance properties) to the subclass, + // if supplied. + if (protoProps) _.extend(child.prototype, protoProps); + + // Set a convenience property in case the parent's prototype is needed + // later. + child.__super__ = parent.prototype; + + return child; + }; + + // Set up inheritance for the model, collection, router, view and history. + Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend; + + // Throw an error when a URL is needed, and none is supplied. + var urlError = function() { + throw new Error('A "url" property or function must be specified'); + }; + + // Wrap an optional error callback with a fallback error event. + var wrapError = function(model, options) { + var error = options.error; + options.error = function(resp) { + if (error) error.call(options.context, model, resp, options); + model.trigger('error', model, resp, options); + }; + }; + + return Backbone; + +})); diff --git a/core/core.libraries.yml b/core/core.libraries.yml index 3a6906eff63f457746762211972c8e4aa54e2665..cc8e2aa7134eff0ac137e7acc1e41a3bc1acba24 100644 --- a/core/core.libraries.yml +++ b/core/core.libraries.yml @@ -2,10 +2,10 @@ backbone: remote: https://github.com/jashkenas/backbone - version: "1.1.2" + version: "1.2.1" license: name: MIT - url: https://github.com/jashkenas/backbone/blob/1.1.2/LICENSE + url: https://github.com/jashkenas/backbone/blob/1.2.1/LICENSE gpl-compatible: true js: assets/vendor/backbone/backbone-min.js: { weight: -19, minified: true } diff --git a/core/modules/contextual/js/toolbar/models/StateModel.js b/core/modules/contextual/js/toolbar/models/StateModel.js index 0c261c5d0473386d99ec9737cf26c0a14c78f791..691eaab7cd3f9121d9a6a0560fb2b5457f264a37 100644 --- a/core/modules/contextual/js/toolbar/models/StateModel.js +++ b/core/modules/contextual/js/toolbar/models/StateModel.js @@ -66,20 +66,17 @@ */ initialize: function (attrs, options) { // Respond to new/removed contextual links. - this.listenTo(options.contextualCollection, { - 'reset remove add': this.countContextualLinks, - 'add': this.lockNewContextualLinks - }); + this.listenTo(options.contextualCollection, 'reset remove add', this.countContextualLinks); + this.listenTo(options.contextualCollection, 'add', this.lockNewContextualLinks); + + // Automatically determine visibility. + this.listenTo(this, 'change:contextualCount', this.updateVisibility); - this.listenTo(this, { - // Automatically determine visibility. - 'change:contextualCount': this.updateVisibility, - // Whenever edit mode is toggled, lock all contextual links. - 'change:isViewing': function (model, isViewing) { - options.contextualCollection.each(function (contextualModel) { - contextualModel.set('isLocked', !isViewing); - }); - } + // Whenever edit mode is toggled, lock all contextual links. + this.listenTo(this, 'change:isViewing', function (model, isViewing) { + options.contextualCollection.each(function (contextualModel) { + contextualModel.set('isLocked', !isViewing); + }); }); }, diff --git a/core/modules/quickedit/js/views/AppView.js b/core/modules/quickedit/js/views/AppView.js index 67b4764bd304d4e4cc1918e948591c48f78be3d3..cd3212f34fa3704dea9fc1104813dda7134e505e 100644 --- a/core/modules/quickedit/js/views/AppView.js +++ b/core/modules/quickedit/js/views/AppView.js @@ -42,11 +42,9 @@ this.changedFieldStates = ['changed', 'saving', 'saved', 'invalid']; this.readyFieldStates = ['candidate', 'highlighted']; - this.listenTo(options.entitiesCollection, { - // Track app state. - 'change:state': this.appStateChange, - 'change:isActive': this.enforceSingleActiveEntity - }); + // Track app state. + this.listenTo(options.entitiesCollection, 'change:state', this.appStateChange); + this.listenTo(options.entitiesCollection, 'change:isActive', this.enforceSingleActiveEntity); // Track app state. this.listenTo(options.fieldsCollection, 'change:state', this.editorStateChange); diff --git a/core/modules/system/src/Tests/Common/AttachedAssetsTest.php b/core/modules/system/src/Tests/Common/AttachedAssetsTest.php index ca8dbc6d03cbafed65dbf3e4bfea429f68b1bd76..4e2a095ee08e15a5b6c74217c2b561120751cc8b 100644 --- a/core/modules/system/src/Tests/Common/AttachedAssetsTest.php +++ b/core/modules/system/src/Tests/Common/AttachedAssetsTest.php @@ -287,8 +287,9 @@ function testVersionQueryString() { $js = $this->assetResolver->getJsAssets($assets, FALSE)[1]; $js_render_array = \Drupal::service('asset.js.collection_renderer')->render($js); + $rendered_js = $this->renderer->renderPlain($js_render_array); - $this->assertTrue(strpos($rendered_js, 'core/assets/vendor/backbone/backbone-min.js?v=1.1.2') > 0 && strpos($rendered_js, 'core/assets/vendor/domready/ready.min.js?v=1.0.8') > 0 , 'JavaScript version identifiers correctly appended to URLs'); + $this->assertTrue(strpos($rendered_js, 'core/assets/vendor/backbone/backbone-min.js?v=1.2.1') > 0 && strpos($rendered_js, 'core/assets/vendor/domready/ready.min.js?v=1.0.8') > 0 , 'JavaScript version identifiers correctly appended to URLs'); } /**