// Backbone.Select, v2.1.0 // Copyright (c) 2014-2016 Michael Heim, Zeilenwechsel.de // (c) 2013 Derick Bailey, Muted Solutions, LLC. // Distributed under MIT license // http://github.com/hashchange/backbone.select !function(a,b){"use strict";var c="object"==typeof exports&&exports&&!exports.nodeType&&"object"==typeof module&&module&&!module.nodeType;"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(["exports","underscore","backbone"],b):c?b(exports,require("underscore"),require("backbone")):b({},_,Backbone)}(this,function(a,_,Backbone){"use strict";function b(a,b,c,d){function e(a,b,c){function d(a){return b.get(a)||c[a]}return _.map(a,d)}if(!c.silent&&!c["@bbs:silentLocally"]){var f,g=n(c,a),h=v(a,g),i=a.length,j=_.keys(b),k=_.keys(a[g]),l=_.difference(k,j),o=_.difference(j,k),p=h===j.length&&0===l.length&&0===o.length;if(d&&d.length&&!c["@bbs:silentReselect"]&&B("reselect:any",g,[d,a,m(c,g,a)],a,c),!p)return f={selected:e(l,a,b),deselected:e(o,a,b)},0===h?void B("select:none",g,[f,a,m(c,g,a)],a,c):h===i?void B("select:all",g,[f,a,m(c,g,a)],a,c):h>0&&h1});var c=_.flatten(_.pluck(b,"indexes"));c.sort(function(a,b){return a-b}),_.each(c,function(b,c){a.splice(b-c,1)}),_.each(b,function(b){a.push({context:b.context,triggerArgs:[b.label?"select:some:"+b.label:"select:some",{selected:b.merged.selected,deselected:b.merged.deselected},b.context,b.merged.options]})})}function G(a,b){b.select=function(){var c=b.select;return function(d){return d instanceof Backbone.Model?c.apply(b,arguments):a.apply(b,arguments)}}()}function H(a){var b=a.add;a.add=function(){var a,d,e,f,g=_.toArray(arguments),h=g[1]?_.clone(g[1]):{},i=h.silent,j=h["@bbs:backboneSubcall"],k=i&&!j;return g[1]=h,k&&(f=_.clone(h),e=this.models&&this.models.slice()||[]),h["@bbs:backboneSubcall"]=!0,d=a=b.apply(this,g),k&&d&&(_.isArray(d)||(d=[d]),d=_.difference(d,e),_.each(d,function(a){var b=_.clone(f);c(a,this,b),this.trigger("@bbs:add:silent",a,this,b)},this)),a}}function I(a){var b=a.set;a.set=function(){var a,e,f,g,h,i,j,k,l=_.toArray(arguments),m=l[1]?_.clone(l[1]):{},n=m.silent,o=m["@bbs:backboneSubcall"],p=n&&!o;return l[1]=m,p&&(k=_.clone(m),f=this.models&&this.models.slice()||[],g=N(this)),m["@bbs:backboneSubcall"]=!0,e=a=b.apply(this,l),p&&e&&(_.isArray(e)||(e=[e]),(void 0===m.remove||m.remove)&&(i=_.difference(f,e),j=M(i,f),_.each(i,function(a){var b=_.clone(k);b.index=j[a.cid],b["@bbs:wasSelected"]=g[a.cid],d(a,this,b),this.trigger("@bbs:remove:silent",a,this,b)},this)),(void 0===m.add||m.add)&&(h=_.difference(e,f),_.each(h,function(a){var b=_.clone(k);c(a,this,b),this.trigger("@bbs:add:silent",a,this,b)},this))),a}}function J(a){var b=a.remove;a.remove=function(){var a,c,e,f,g,h=_.toArray(arguments),i=h[1]?_.clone(h[1]):{},j=h[0],k=i.silent,l=i["@bbs:backboneSubcall"],m=k&&!l;return h[1]=i,m&&(g=_.clone(i),e=M(j,this.models),f=N(this,j)),i["@bbs:backboneSubcall"]=!0,c=a=b.apply(this,h),m&&c&&(_.isArray(c)||(c=[c]),_.each(c,function(a){var b=_.clone(g);b.index=e[a.cid],b["@bbs:wasSelected"]=f[a.cid],d(a,this,b),this.trigger("@bbs:remove:silent",a,this,b)},this)),a}}function K(a){var b=a.reset,c="Backbone.Select.One"===a._pickyType?f:g;a.reset=function(){var a,d,e=_.toArray(arguments),f=e[1]?_.clone(e[1]):{},g=f.silent,h=f["@bbs:backboneSubcall"],i=g&&!h;return e[1]=f,i&&(d=_.clone(f),d.previousModels=this.models||[]),f["@bbs:backboneSubcall"]=!0,a=b.apply(this,e),i&&(c(this,d),this.trigger("@bbs:reset:silent",this,d)),a}}function L(a){a.trigger=function(){var b=a.trigger;return function(a,c){var d=_.toArray(arguments),e="update"===a||"reset"===a||"sort"===a||"change"===a,f="add"===a||"remove"===a||"destroy"===a;if(e&&_.isObject(d[2])&&_.has(d[2],"@bbs:backboneSubcall")&&delete d[2]["@bbs:backboneSubcall"],f&&_.isObject(d[3])&&_.has(d[3],"@bbs:backboneSubcall")&&delete d[3]["@bbs:backboneSubcall"],O(a)){var g=Q(a),h="on"+g.replace(/(^|:)(\w)/gi,P),i=this[h];_.isFunction(i)&&i.apply(this,_.tail(d))}return b.apply(this,d),this}}()}function M(a,b){var c={},d=a||[];return _.isArray(d)||(d=[d]),b=b.slice()||[],_.each(d,function(a){var d=_.indexOf(b,a);d!==-1&&(c[a.cid]=d,b.splice(d,1))}),c}function N(a,b){var c=b||a.models,d={};return _.isArray(c)||(c=[c]),x(a,function(a){_.each(c,function(b){d[b.cid]||(d[b.cid]={}),d[b.cid][a]=!!b[a]})}),d}function O(a){return/^([rd]e)?select(ed)?($|:)/.test(a)}function P(a,b,c){return c.toUpperCase()}function Q(a){return"ed"===a.slice(-2)?a=a.slice(0,-2):":one"!==a.slice(-4)&&":any"!==a.slice(-4)||(a=a.slice(0,-4)),a}var R=[],S={SelectOne:{_pickyType:"Backbone.Select.One",select:function(a,b){var c,d,e,f;return b=A(b),b["@bbs:processedBy"][this._pickyCid]?this:(c=n(b,this),t(c,this)?this:(d=a&&this[c]===a?a:void 0,d||(f=_.extend(_.omit(b,"@bbs:silentLocally","@bbs:processedBy","@bbs:eventQueue"),{"@bbs:eventQueueAppendOnly":C(b)}),this.deselect(void 0,f),this[c]=a),b["@bbs:processedBy"][this._pickyCid]={done:!1},b["@bbs:processedBy"][this[c].cid]||this[c].select(j(b)),b.silent||b["@bbs:silentLocally"]||(e=m(b,c,this),d?b["@bbs:silentReselect"]||B("reselect:one",c,[a,this,e],this,b):B("select:one",c,[a,this,e],this,b)),b["@bbs:processedBy"][this._pickyCid].done=!0,E(b),this))},deselect:function(a,b){var c;return b=A(b),b["@bbs:processedBy"][this._pickyCid]?this:(c=n(b,this),t(c,this)||!this[c]?this:b["@bbs:messageOnly"]?this:(a=a||this[c],this[c]!==a?this:(b["@bbs:processedBy"][this._pickyCid]={done:!1},delete this[c],b["@bbs:skipModelCall"]||a.deselect(j(b)),b.silent||b["@bbs:silentLocally"]||B("deselect:one",c,[a,this,m(b,c,this)],this,b),b["@bbs:processedBy"][this._pickyCid].done=!0,E(b),this)))},close:function(){return i(this),this.stopListening(),this}},SelectMany:{_pickyType:"Backbone.Select.Many",select:function(a,c){var d,e,f,g;return c=A(c),d=n(c,this),t(d,this)?this:(e=_.clone(this[d]),f=this[d][a.cid]?[a]:[],f.length&&c["@bbs:processedBy"][this._pickyCid]?this:(c.exclusive&&(g=_.extend(_.omit(c,"@bbs:eventQueue","exclusive"),{"@bbs:eventQueueAppendOnly":C(c),"@bbs:silentLocally":!0}),this.each(function(b){b!==a&&this.deselect(b,_.omit(g,"@bbs:processedBy"))},this)),f.length||(this[d][a.cid]=a,w(_.size(this[d]),this,d)),c["@bbs:processedBy"][this._pickyCid]={done:!1},c["@bbs:processedBy"][a.cid]||a.select(j(c)),b(this,e,c,f),c["@bbs:processedBy"][this._pickyCid].done=!0,E(c),this))},deselect:function(a,c){var d,e;return a?(c=A(c),c["@bbs:processedBy"][this._pickyCid]?this:(d=n(c,this),t(d,this)?this:c["@bbs:messageOnly"]?this:(e=_.clone(this[d]),this[d][a.cid]?(c["@bbs:processedBy"][this._pickyCid]={done:!1},delete this[d][a.cid],w(_.size(this[d]),this,d),c["@bbs:skipModelCall"]||a.deselect(j(c)),b(this,e,c),c["@bbs:processedBy"][this._pickyCid].done=!0,E(c),this):this))):this.deselectAll(c)},selectAll:function(a){var c,d,e,f=[];return a=A(a),c=n(a,this),t(c,this)?this:(d=_.clone(this[c]),e=_.extend(_.omit(a,"@bbs:eventQueue","exclusive"),{"@bbs:eventQueueAppendOnly":C(a),"@bbs:silentLocally":!0}),this.each(function(a){this[c][a.cid]&&f.push(a),this.select(a,_.omit(e,"@bbs:processedBy"))},this),w(_.size(this[c]),this,c),b(this,d,a,f),a["@bbs:processedBy"][this._pickyCid]?a["@bbs:processedBy"][this._pickyCid].done=!0:a["@bbs:processedBy"][this._pickyCid]={done:!0},E(a),this)},invertSelection:function(a){var c,d,e;return a=A(a),c=n(a,this),t(c,this)?this:(d=_.clone(this[c]),e=_.extend(_.omit(a,"@bbs:eventQueue","exclusive"),{"@bbs:eventQueueAppendOnly":C(a),"@bbs:silentLocally":!0}),this.each(function(a){this[c][a.cid]?this.deselect(a,_.omit(e,"@bbs:processedBy")):this.select(a,_.omit(e,"@bbs:processedBy"))},this),w(_.size(this[c]),this,c),b(this,d,a),a["@bbs:processedBy"][this._pickyCid]?a["@bbs:processedBy"][this._pickyCid].done=!0:a["@bbs:processedBy"][this._pickyCid]={done:!0},E(a),this)},deselectAll:function(a){var c,d,e;return a=A(a),d=n(a,this),t(d,this)?this:0===v(this,d)?this:(c=_.clone(this[d]),e=_.extend(_.omit(a,"@bbs:eventQueue"),{"@bbs:eventQueueAppendOnly":C(a),"@bbs:silentLocally":!0}),this.each(function(a){this.deselect(a,_.omit(e,"@bbs:processedBy"))},this),w(0,this,d),b(this,c,a),a["@bbs:processedBy"][this._pickyCid]?a["@bbs:processedBy"][this._pickyCid].done=!0:a["@bbs:processedBy"][this._pickyCid]={done:!0},E(a),this)},selectNone:function(a){return this.deselectAll(a)},toggleSelectAll:function(a){var b;return a||(a={}),b=n(a,this),t(b,this)?this:(v(this,b)===this.length?this.deselectAll(a):this.selectAll(a),this)},close:function(){return i(this),this.stopListening(),this}},SelectMe:{_pickyType:"Backbone.Select.Me",select:function(a){var b,c,d;return a=A(a),a["@bbs:processedBy"][this.cid]?this:(a["@bbs:processedBy"][this.cid]={done:!1},b=n(a,this),c=this[b],this[b]=!0,this._pickyCollections&&this.trigger("@bbs:_selected",this,k(a,"exclusive")),a.silent||a["@bbs:silentLocally"]||(d=m(a,b,this),c?a["@bbs:silentReselect"]||B("reselected",b,[this,d],this,a):B("selected",b,[this,d],this,a)),a["@bbs:processedBy"][this.cid].done=!0,E(a),this)},deselect:function(a){var b,c;return a=A(a),a["@bbs:processedBy"][this.cid]?this:(b=n(a,this),c=!this[b],a["@bbs:processedBy"][this.cid]={done:c},this[b]=!1,this._pickyCollections&&(c&&(a=_.extend(a,{"@bbs:messageOnly":!0})),this.trigger("@bbs:_deselected",this,j(a))),c?this:(a.silent||a["@bbs:silentLocally"]||B("deselected",b,[this,m(a,b,this)],this,a),a["@bbs:processedBy"][this.cid].done=!0,E(a),this))},toggleSelected:function(a){var b;return a||(a={}),b=n(a,this),this[b]?this.deselect(a):this.select(a),this}}},T={Me:{applyTo:function(a,b){if(!_.isObject(a))throw new Error("The host object is undefined or not an object.");_.extend(a,S.SelectMe),a._pickyLabels={},a._pickyDefaultLabel=b&&b.defaultLabel||"selected",p(a._pickyDefaultLabel,a),L(a)},custom:{applyModelMixin:void 0}},One:{applyTo:function(a,b,e){var g;if(!_.isObject(a))throw new Error("The host object is undefined or not an object.");if(arguments.length<2)throw new Error("The `models` parameter has not been passed to Select.One.applyTo. Its value can be undefined, or null, if no models are passed in during instantiation, but even so, it must be provided.");g=a.select,_.extend(a,S.SelectOne),a._pickyCid=_.uniqueId("singleSelect"),a._pickyLabels={},a._pickyDefaultLabel=e&&e.defaultLabel||"selected",s(e&&e.ignoreLabel,a),p(a._pickyDefaultLabel,a),L(a),G(g,a),H(a),I(a),J(a),K(a),_.isArray(b)&&_.each(b,function(b){b&&b instanceof Backbone.Model&&(o(b,a,e),h(b,a),y(b,function(c){p(c,a),b[c]&&!t(c,a)&&(a[c]&&a[c].deselect({label:c}),a[c]=b)}))}),a.listenTo(a,"@bbs:_selected",a.select),a.listenTo(a,"@bbs:_deselected",a.deselect),a.listenTo(a,"reset",f),a.listenTo(a,"add",c),a.listenTo(a,"remove",d)}},Many:{applyTo:function(a,b,e){var f;if(!_.isObject(a))throw new Error("The host object is undefined or not an object.");if(arguments.length<2)throw new Error("The `models` parameter has not been passed to Select.One.applyTo. Its value can be undefined, or null, if no models are passed in during instantiation, but even so, it must be provided.");f=a.select,_.extend(a,S.SelectMany),a._pickyCid=_.uniqueId("multiSelect"),a._pickyLabels={},a._pickyDefaultLabel=e&&e.defaultLabel||"selected",s(e&&e.ignoreLabel,a),p(a._pickyDefaultLabel,a),L(a),G(f,a),H(a),I(a),J(a),K(a),_.isArray(b)&&_.each(b,function(b){b&&b instanceof Backbone.Model&&(o(b,a,e),h(b,a),y(b,function(c){p(c,a),b[c]&&!t(c,a)&&(a[c][b.cid]=b)}))}),a.listenTo(a,"@bbs:_selected",a.select),a.listenTo(a,"@bbs:_deselected",a.deselect),a.listenTo(a,"reset",g),a.listenTo(a,"add",c),a.listenTo(a,"remove",d)}}},U=["@bbs:silentLocally","_externalEvent","exclusive"],V=["@bbs:messageOnly","@bbs:silentLocally","@bbs:silentReselect","@bbs:skipModelCall","@bbs:processedBy","@bbs:eventQueue","@bbs:eventQueueAppendOnly","@bbs:backboneSubcall"];Backbone.Select=T,Backbone.Select.version="2.1.0",function(){var a,b=[],c=[],d=[],e=Backbone.Model.extend({initialize:function(){Backbone.Select.Me.applyTo(this)}}),f=Backbone.Collection.extend({initialize:function(a){Backbone.Select.One.applyTo(this,a)}}),g=Backbone.Collection.extend({initialize:function(a){Backbone.Select.Many.applyTo(this,a)}}),h=new e,i=new f,j=new g;if(_.allKeys)b=_.allKeys(h),c=_.allKeys(i),d=_.allKeys(j);else{for(a in h)b.push(a);for(a in i)c.push(a);for(a in j)d.push(a)}R=_.without(_.union(b,c,d),"selected","selectedLength"),i.close(),j.close()}(),a.info="Backbone.Select has loaded. Don't use the exported value of the module. Its functionality is available inside the Backbone namespace."}); //# sourceMappingURL=backbone.select.min.js.map