+1
-1
| { | ||
| "name": "bikini", | ||
| "version": "0.7.2", | ||
| "version": "0.7.3", | ||
| "main": [ | ||
@@ -5,0 +5,0 @@ "./dist/bikini.js", |
| /*! | ||
| * Project: Bikini - Everything a model needs | ||
| * Copyright: (c) 2015 M-Way Solutions GmbH. | ||
| * Version: 0.6.3 | ||
| * Date: Tue May 12 2015 09:32:44 | ||
| * Version: 0.7.2 | ||
| * Date: Tue May 12 2015 16:00:45 | ||
| * License: https://raw.githubusercontent.com/mwaylabs/bikini/master/MIT-LICENSE.txt | ||
| */ | ||
| !function(a,b,c,d){var e=null;e="undefined"!=typeof exports?exports:a.Bikini={},e.Version=e.version="0.6.3",e.f=function(){},e.create=function(a){return new this(a)},e.design=function(a){var b=this.extend(a||{});return new b},e.extend=b.Model.extend,e.isCollection=function(a){return b.Collection.prototype.isPrototypeOf(a)},e.isModel=function(a){return b.Model.prototype.isPrototypeOf(a)},e.isEntity=function(a){return e.Entity.prototype.isPrototypeOf(a)},e.DATA={TYPE:{INTEGER:"integer",STRING:"string",TEXT:"text",DATE:"date",BOOLEAN:"boolean",FLOAT:"float",OBJECT:"object",ARRAY:"array",BINARY:"binary",OBJECTID:"objectid",NULL:"null"}},e.Object={_type:"Bikini.Object",_create:function(a){var b=function(){};return b.prototype=a,new b},include:function(a){for(var b in a){if(this.hasOwnProperty(b))throw e.Exception.RESERVED_WORD.getException();this[b]=a[b]}return this},design:function(a){var b=this._create(this);return b.include(this._normalize(a)),b},bindToCaller:function(a,b,c){return function(){if("function"!=typeof b||"object"!=typeof a)throw e.Exception.INVALID_INPUT_PARAMETER.getException();return Array.isArray(c)?b.apply(a,c):b.call(a,c)}},_normalize:function(a){return a=a&&"object"==typeof a?a:{}},handleCallback:function(a){var b=Array.prototype.slice.call(arguments,1);if(a){var c="object"==typeof a.target?a.target:this,d=a;if("function"==typeof a.action?d=a.action:"string"==typeof a.action&&(d=c[a.action]),"function"==typeof d)return this.bindToCaller(c,d,b)()}}},YES=!0,NO=!1,e.ObjectID=function(a){e.ObjectID.counter=e.ObjectID.counter||parseInt(Math.random()*Math.pow(16,6)),e.ObjectID.machineId=e.ObjectID.machineId||parseInt(Math.random()*Math.pow(16,6)),e.ObjectID.processId=e.ObjectID.processId||parseInt(Math.random()*Math.pow(16,4)),this._ObjectID(a)},e.ObjectID._looksLikeObjectID=function(a){return 24===a.length&&a.match(/^[0-9a-f]*$/)},c.extend(e.ObjectID.prototype,{_str:"",_ObjectID:function(a){if(a){if(a=a.toLowerCase(),!e.ObjectID._looksLikeObjectID(a))throw new Error("Invalid hexadecimal string for creating an ObjectID");this._str=a}else this._str=this._hexString(8,(new Date).getTime()/1e3)+this._hexString(6,e.ObjectID.machineId)+this._hexString(4,e.ObjectID.processId)+this._hexString(6,e.ObjectID.counter++);return this._str},_hexString:function(a,b){b=b||parseInt(Math.random()*Math.pow(16,a));for(var c=b.toString(16);c.length<a;)c="0"+c;return c.substr(0,a)},toString:function(){return"ObjectID('"+this._str+"')"},equals:function(a){return a instanceof this._ObjectID&&this.valueOf()===a.valueOf()},clone:function(){return new e.ObjectID(this._str)},typeName:function(){return"oid"},getTimestamp:function(){return 1e3*parseInt(this._str.substr(0,8),16)},getMachineId:function(){return parseInt(this._str.substr(8,6),16)},getProcessId:function(){return parseInt(this._str.substr(14,4),16)},getCounter:function(){return parseInt(this._str.substr(18,6),16)},valueOf:function(){return this._str},toJSON:function(){return this._str},toHexString:function(){return this._str},_selectorIsId:function(a){return"string"==typeof a||"number"==typeof a||a instanceof e.ObjectId},_selectorIsIdPerhapsAsObject:function(a){return this._selectorIsId(a)||a&&"object"==typeof a&&a._id&&this._selectorIsId(a._id)&&1===c.size(a)},_idsMatchedBySelector:function(a){if(this._selectorIsId(a))return[a];if(!a)return null;if(c.has(a,"_id"))return this._selectorIsId(a._id)?[a._id]:a._id&&a._id.$in&&c.isArray(a._id.$in)&&!c.isEmpty(a._id.$in)&&c.all(a._id.$in,this._selectorIsId)?a._id.$in:null;if(a.$and&&c.isArray(a.$and))for(var b=0;b<a.$and.length;++b){var d=this._idsMatchedBySelector(a.$and[b]);if(d)return d}return null}}),e.UniqueId=e.Object.design({uuid:function(a,b){var c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),d=[];b=b||c.length;var e;if(a)for(e=0;a>e;e++)d[e]=c[0|Math.random()*b];else{var f;for(d[8]=d[13]=d[18]=d[23]="-",d[14]="4",e=0;36>e;e++)d[e]||(f=0|16*Math.random(),d[e]=c[19===e?3&f|8:f])}return d.join("")}}),e.Base64=e.Object.design({type:"Bikini.Base64",_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encodeBinary:function(a){for(var b,c="",d=new Array(4),e=0,f=0;e<a.length;){b=new Array(3);for(var g=0;g<b.length;g++)b[g]=e<a.length?255&a.charCodeAt(e++):0;switch(d[0]=b[0]>>2,d[1]=(3&b[0])<<4|b[1]>>4,d[2]=(15&b[1])<<2|b[2]>>6,d[3]=63&b[2],f=e-(a.length-1)){case 2:d[3]=64,d[2]=64;break;case 1:d[3]=64}for(g=0;g<d.length;g++)c+=this._keyStr.charAt(d[g])}return c},encode:function(a){var b,c,d,f,g,h,i,j="",k=0;for(a=e.Cypher.utf8Encode(a);k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),d=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|d>>6,i=63&d,isNaN(c)?h=i=64:isNaN(d)&&(i=64),j+=this._keyStr.charAt(f)+this._keyStr.charAt(g)+this._keyStr.charAt(h)+this._keyStr.charAt(i);return j},binaryEncode:function(a){for(var b,c,d,e,f,g,h,i="",j=0;j<a.length;)b=a.charCodeAt(j++),c=a.charCodeAt(j++),d=a.charCodeAt(j++),e=b>>2,f=(3&b)<<4|c>>4,g=(15&c)<<2|d>>6,h=63&d,isNaN(c)?g=h=64:isNaN(d)&&(h=64),i+=this._keyStr.charAt(e)+this._keyStr.charAt(f)+this._keyStr.charAt(g)+this._keyStr.charAt(h);return i},decode:function(a){var b,c,d,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=this._keyStr.indexOf(a.charAt(k++)),g=this._keyStr.indexOf(a.charAt(k++)),h=this._keyStr.indexOf(a.charAt(k++)),i=this._keyStr.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,d=(3&h)<<6|i,j+=String.fromCharCode(b),64!==h&&(j+=String.fromCharCode(c)),64!==i&&(j+=String.fromCharCode(d));return e.Cypher.utf8Decode(j)}}),e.SHA256=e.Object.design({type:"Bikini.SHA256",chrsz:8,hexcase:0,hash:function(a){return a=e.Cypher.utf8Encode(a),this.binb2hex(this.coreSha256(this.str2binb(a),a.length*this.chrsz))},safeAdd:function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c},S:function(a,b){return a>>>b|a<<32-b},R:function(a,b){return a>>>b},Ch:function(a,b,c){return a&b^~a&c},Maj:function(a,b,c){return a&b^a&c^b&c},Sigma0256:function(a){return this.S(a,2)^this.S(a,13)^this.S(a,22)},Sigma1256:function(a){return this.S(a,6)^this.S(a,11)^this.S(a,25)},Gamma0256:function(a){return this.S(a,7)^this.S(a,18)^this.R(a,3)},Gamma1256:function(a){return this.S(a,17)^this.S(a,19)^this.R(a,10)},coreSha256:function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),p=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),q=new Array(64);for(a[b>>5]|=128<<24-b%32,a[(b+64>>9<<4)+15]=b,k=0;k<a.length;k+=16){for(c=p[0],d=p[1],e=p[2],f=p[3],g=p[4],h=p[5],i=p[6],j=p[7],l=0;64>l;l++)q[l]=16>l?a[l+k]:this.safeAdd(this.safeAdd(this.safeAdd(this.Gamma1256(q[l-2]),q[l-7]),this.Gamma0256(q[l-15])),q[l-16]),m=this.safeAdd(this.safeAdd(this.safeAdd(this.safeAdd(j,this.Sigma1256(g)),this.Ch(g,h,i)),o[l]),q[l]),n=this.safeAdd(this.Sigma0256(c),this.Maj(c,d,e)),j=i,i=h,h=g,g=this.safeAdd(f,m),f=e,e=d,d=c,c=this.safeAdd(m,n);p[0]=this.safeAdd(c,p[0]),p[1]=this.safeAdd(d,p[1]),p[2]=this.safeAdd(e,p[2]),p[3]=this.safeAdd(f,p[3]),p[4]=this.safeAdd(g,p[4]),p[5]=this.safeAdd(h,p[5]),p[6]=this.safeAdd(i,p[6]),p[7]=this.safeAdd(j,p[7])}return p},str2binb:function(a){for(var b=[],c=(1<<this.chrsz)-1,d=0;d<a.length*this.chrsz;d+=this.chrsz)b[d>>5]|=(a.charCodeAt(d/this.chrsz)&c)<<24-d%32;return b},binb2hex:function(a){for(var b=this.hexcase?"0123456789ABCDEF":"0123456789abcdef",c="",d=0;d<4*a.length;d++)c+=b.charAt(a[d>>2]>>8*(3-d%4)+4&15)+b.charAt(a[d>>2]>>8*(3-d%4)&15);return c}}),e.Cypher=e.Object.design({type:"Bikini.Cypher",defaultDecoder:e.Base64,defaultEncoder:e.Base64,defaultHasher:e.SHA256,decode:function(a,b){return b&&b.decode?b.decode(a):this.defaultDecoder.decode(a)},encode:function(a,b){return b&&b.encode?b.encode(a):this.defaultEncoder.encode(a)},hash:function(a,b){return b&&b.hash?b.hash(a):this.defaultHasher.hash(a)},utf8Encode:function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b},utf8Decode:function(a){var b,c,d,e,f,g="";for(b=c=d=e=0;b<a.length;)c=a.charCodeAt(b),128>c?(g+=String.fromCharCode(c),b++):c>191&&224>c?(e=a.charCodeAt(b+1),g+=String.fromCharCode((31&c)<<6|63&e),b+=2):(e=a.charCodeAt(b+1),f=a.charCodeAt(b+2),g+=String.fromCharCode((15&c)<<12|(63&e)<<6|63&f),b+=3);return g}}),e.Date={create:function(){var a=moment.apply(this,arguments);return c.extend(a,this)}},e.Field=function(a){this.merge(a),this.initialize.apply(this,arguments)},e.Field.extend=e.extend,e.Field.create=e.create,e.Field.design=e.design,c.extend(e.Field.prototype,e.Object,{_type:"Bikini.Field",name:null,type:null,index:null,defaultValue:void 0,length:null,required:NO,persistent:YES,initialize:function(){},merge:function(a){a=c.isString(a)?{type:a}:a||{},this.name=c.isUndefined(a.name)?this.name:a.name,this.type=c.isUndefined(a.type)?this.type:a.type,this.index=c.isUndefined(a.index)?this.index:a.index,this.defaultValue=c.isUndefined(a.defaultValue)?this.defaultValue:a.defaultValue,this.length=c.isUndefined(a.length)?this.length:a.length,this.required=c.isUndefined(a.required)?this.required:a.required,this.persistent=c.isUndefined(a.persistent)?this.persistent:a.persistent},transform:function(a,b){b=b||this.type;try{if(c.isUndefined(a))return this.defaultValue;if(b===e.DATA.TYPE.STRING||b===e.DATA.TYPE.TEXT)return c.isObject(a)?JSON.stringify(a):c.isNull(a)?"null":a.toString();if(b===e.DATA.TYPE.INTEGER)return parseInt(a);if(b===e.DATA.TYPE.BOOLEAN)return a===!0||"true"===a;if(b===e.DATA.TYPE.FLOAT)return parseFloat(a);if(b===e.DATA.TYPE.OBJECT||b===e.DATA.TYPE.ARRAY){if(!c.isObject(a))return c.isString(a)?JSON.parse(a):null}else if(b===e.DATA.TYPE.DATE){if(!e.Date.isPrototypeOf(a)){var d=a?e.Date.create(a):null;return d&&d.isValid()?d:null}}else if(b===e.DATA.TYPE.OBJECTID&&!e.ObjectID.prototype.isPrototypeOf(a))return c.isString(a)?new e.ObjectID(a):null;return a}catch(f){console.error("Failed converting value! "+f.message)}},equals:function(a,b){var d=this.transform(a),e=this.transform(b);return this._equals(d,e,c.isArray(d))},isBinary:function(a){return"undefined"!=typeof Uint8Array&&a instanceof Uint8Array||a&&a.$Uint8ArrayPolyfill},detectType:function(a){return c.isNumber(a)?e.DATA.TYPE.FLOAT:c.isString(a)?e.DATA.TYPE.STRING:c.isBoolean(a)?e.DATA.TYPE.BOOLEAN:c.isArray(a)?e.DATA.TYPE.ARRAY:c.isNull(a)?e.DATA.TYPE.NULL:c.isDate(a)||e.Date.isPrototypeOf(a)?e.DATA.TYPE.DATE:e.ObjectID.prototype.isPrototypeOf(a)?e.DATA.TYPE.OBJECTID:this.isBinary(a)?e.DATA.TYPE.BINARY:e.DATA.TYPE.OBJECT},typeOrder:function(a){switch(a){case e.DATA.TYPE.NULL:return 0;case e.DATA.TYPE.FLOAT:return 1;case e.DATA.TYPE.STRING:return 2;case e.DATA.TYPE.OBJECT:return 3;case e.DATA.TYPE.ARRAY:return 4;case e.DATA.TYPE.BINARY:return 5;case e.DATA.TYPE.DATE:return 6}return-1},_equals:function(a,b,d){var e,f=this;if(a===b)return!0;if(!a||!b)return!1;if(!c.isObject(a)||!c.isObject(b))return!1;if(a instanceof Date&&b instanceof Date)return a.valueOf()===b.valueOf();if(this.isBinary(a)&&this.isBinary(b)){if(a.length!==b.length)return!1;for(e=0;e<a.length;e++)if(a[e]!==b[e])return!1;return!0}if(c.isFunction(a.equals))return a.equals(b);if(c.isArray(a)){if(!c.isArray(b))return!1;if(a.length!==b.length)return!1;for(e=0;e<a.length;e++)if(!f.equals(a[e],b[e],d))return!1;return!0}var g;if(d){var h=[];return c.each(b,function(a,b){h.push(b)}),e=0,g=c.all(a,function(a,c){return e>=h.length?!1:c!==h[e]?!1:f.equals(a,b[h[e]],d)?(e++,!0):!1}),g&&e===h.length}return e=0,g=c.all(a,function(a,g){return c.has(b,g)&&f.equals(a,b[g],d)?(e++,!0):!1}),g&&c.size(b)===e},_cmp:function(a,b){if(void 0===a)return void 0===b?0:-1;if(void 0===b)return 1;var c=0,d=this.detectType(a),f=this.detectType(b),g=this.typeOrder(d),h=this.typeOrder(f);if(g!==h)return h>g?-1:1;if(d!==f)throw new Error("Missing type coercion logic in _cmp");if(7===d&&(d=f=2,a=a.toHexString(),b=b.toHexString()),d===e.DATA.TYPE.DATE&&(d=f=1,a=a.getTime(),b=b.getTime()),d===e.DATA.TYPE.FLOAT)return a-b;if(f===e.DATA.TYPE.STRING)return b>a?-1:a===b?0:1;if(d===e.DATA.TYPE.OBJECT){var i=function(a){var b=[];for(var c in a)b.push(c),b.push(a[c]);return b};return this._cmp(i(a),i(b))}if(d===e.DATA.TYPE.ARRAY)for(c=0;;c++){if(c===a.length)return c===b.length?0:-1;if(c===b.length)return 1;var j=this._cmp(a[c],b[c]);if(0!==j)return j}if(d===e.DATA.TYPE.BINARY){if(a.length!==b.length)return a.length-b.length;for(c=0;c<a.length;c++){if(a[c]<b[c])return-1;if(a[c]>b[c])return 1}return 0}if(d===e.DATA.TYPE.BOOLEAN)return a?b?0:1:b?-1:0;if(d===e.DATA.TYPE.NULL)return 0;throw new Error("Unknown type to sort")}}),e.Entity=function(a){var b=this.fields;this.fields={},this._mergeFields(b),a=a||{},a.fields&&this._mergeFields(a.fields),this.typeMapping=a.typeMapping||this.typeMapping;var c=a.collection,d=a.model||(c?c.prototype.model:null);this.idAttribute=a.idAttribute||this.idAttribute||(d?d.prototype.idAttribute:""),this._updateFields(this.typeMapping),this.initialize.apply(this,arguments)},e.Entity.from=function(a,b){if(e.Entity.prototype.isPrototypeOf(a))b&&b.typeMapping&&a._updateFields(b.typeMapping);else if(c.isFunction(a)&&e.Entity.prototype.isPrototypeOf(a.prototype)){var d=a;a=new d(b)}else{"string"==typeof a&&(a={name:a});var f=e.Entity.extend(a);a=new f(b)}return a},e.Entity.extend=e.extend,e.Entity.create=e.create,e.Entity.design=e.design,c.extend(e.Entity.prototype,e.Object,{_type:"Bikini.Entity",name:"",idAttribute:"",fields:{},initialize:function(){},getFields:function(){return this.fields},getField:function(a){return this.fields[a]},getFieldName:function(a){var b=this.getField(a);return b&&b.name?b.name:a},getKey:function(){return this.idAttribute||e.Model.idAttribute},getKeys:function(){return this.splitKey(this.getKey())},splitKey:function(a){var b=[];return c.isString(a)&&c.each(a.split(","),function(a){var c=a.trim();c&&b.push(c)}),b},_mergeFields:function(a){c.isObject(this.fields)||(this.fields={});var b=this;c.isObject(a)&&c.each(a,function(a,c){b.fields[c]?b.fields[c].merge(a):b.fields[c]=new e.Field(a)})},_updateFields:function(a){var b=this;c.each(this.fields,function(c,d){c.persistent===NO?delete b.fields[d]:(c.name||(c.name=d),a&&a[c.type]&&(c.type=a[c.type]))})},toAttributes:function(a,b,d){if(d=d||this.fields,a&&!c.isEmpty(d)){var e,f={};return c.each(d,function(b,d){e=c.isFunction(a.get)?a.get(b.name):a[b.name],f[d]=e}),f}return a},fromAttributes:function(a,b){if(b=b||this.fields,a&&!c.isEmpty(b)){var d={};return c.each(b,function(b,e){var f=c.isFunction(a.get)?a.get(e):a[e];f=b.transform(f),c.isUndefined(f)||(d[b.name]=f)}),d}return a},setId:function(a,b){if(a&&b){var d=this.getKey()||a.idAttribute;d&&(c.isFunction(a.set)?a.set(d,b):a[d]=b)}return a},getId:function(a){if(a){var b=this.getKey()||a.idAttribute;if(b)return c.isFunction(a.get)?a.get(b):a[b]}}}),e.Security=e.Object.design({logon:function(a,b){var c=a?a.credentials:null;if(c)switch(c.type){case"basic":return this.logonBasicAuth(a,b)}return this.handleCallback(b)},logonBasicAuth:function(a,b){var c=a.credentials;return a.beforeSend=function(a){e.Security.setBasicAuth(a,c)},this.handleCallback(b)},setBasicAuth:function(a,b){if(b&&b.username&&a&&e.Base64){var c=e.Base64.encode(encodeURIComponent(b.username+":"+(b.password||"")));a.setRequestHeader("Authorization","Basic "+c)}}}),e.Model=b.Model.extend({constructor:function(a,c){this.url&&"string"==typeof this.url&&"/"!==this.url.charAt(this.url.length-1)&&(this.url+="/"),this.init(a,c),b.Model.apply(this,arguments)}}),e.Model.create=e.create,e.Model.design=e.design,c.extend(e.Model.prototype,e.Object,{_type:"Bikini.Model",isModel:YES,entity:null,defaults:{},changedSinceSync:{},logon:e.Security.logon,init:function(a,b){b=b||{},this.collection=b.collection||this.collection,this.idAttribute=b.idAttribute||this.idAttribute,this.store=this.store||(this.collection?this.collection.store:null)||b.store,this.store&&c.isFunction(this.store.initModel)&&this.store.initModel(this,b),this.entity=this.entity||(this.collection?this.collection.entity:null)||b.entity,this.entity&&(this.entity=e.Entity.from(this.entity,{model:this.constructor,typeMapping:b.typeMapping}),this.idAttribute=this.entity.idAttribute||this.idAttribute),this.credentials=this.credentials||(this.collection?this.collection.credentials:null)||b.credentials,this.on("change",this.onChange,this),this.on("sync",this.onSync,this)},sync:function(a,d,e){e=e||{},e.credentials=e.credentials||this.credentials;var f=(e.store?e.store:null)||this.store,g=this,h=arguments;return this.logon(e,function(a){return f&&c.isFunction(f.sync)?f.sync.apply(g,h):b.sync.apply(g,h)})},onChange:function(a,b){var d=a.changedAttributes();if(c.isObject(d))for(var e in d)this.changedSinceSync[e]=d[e]},onSync:function(a,b){this.changedSinceSync={}},getUrlRoot:function(){if(this.urlRoot)return c.isFunction(this.urlRoot)?this.urlRoot():this.urlRoot;if(this.collection)return this.collection.getUrlRoot();if(this.url){var a=c.isFunction(this.url)?this.url():this.url;return a&&this.id&&a.indexOf(this.id)>0?a.substr(0,a.indexOf(this.id)):a}},toJSON:function(a){a=a||{};var b=a.entity||this.entity;return e.isEntity(b)?b.fromAttributes(a.attrs||this.attributes):a.attrs||c.clone(this.attributes)},parse:function(a,b){b=b||{};var c=b.entity||this.entity;return e.isEntity(c)?c.toAttributes(a):a}}),e.Collection=b.Collection.extend({constructor:function(a){this.url&&"/"!==this.url.charAt(this.url.length-1)&&(this.url+="/"),this.init(a),b.Collection.apply(this,arguments)}}),e.Collection.create=e.create,e.Collection.design=e.design,c.extend(e.Collection.prototype,e.Object,{_type:"Bikini.Collection",isCollection:YES,model:e.Model,entity:null,options:null,logon:e.Security.logon,init:function(a){a=a||{},this.store=a.store||this.store||(this.model?this.model.prototype.store:null),this.entity=a.entity||this.entity||(this.model?this.model.prototype.entity:null),this.options=a.options||this.options;var b=this.entity||this.entityFromUrl(this.url);b&&(this.entity=e.Entity.from(b,{model:this.model,typeMapping:a.typeMapping})),this._updateUrl(),this.store&&c.isFunction(this.store.initCollection)&&this.store.initCollection(this,a)},entityFromUrl:function(a){if(a){var b=document.createElement("a");b.href=a||this.url,""===b.host&&(b.href=b.href);var c=b.pathname.match(/([^\/]+)\/?$/);if(c&&c.length>1)return c[-1]}},sort:function(a){c.isObject(a&&a.sort)&&(this.comparator=e.DataSelector.compileSort(a.sort)),b.Collection.prototype.sort.apply(this,arguments)},select:function(a){var b=a&&a.query?e.DataSelector.create(a.query):null,c=e.Collection.create(null,{model:this.model});return a&&a.sort&&(c.comparator=e.DataSelector.compileSort(a.sort)),this.each(function(a){(!b||b.matches(a.attributes))&&c.add(a)}),c},destroy:function(a){a=a||{};var b=a.success;if(this.length>0){a.success=function(){0===this.length&&b&&b()};for(var c;c=this.first();)this.sync("delete",c,a),this.remove(c)}else b&&b()},destroyLocal:function(){var a=this.endpoint.localStore;return this.entity.name&&a.drop(this.entity.name),localStorage.setItem("__"+this.channel+"last_msg_time",""),this.store.endpoints={},this.reset()},sync:function(a,d,e){e=e||{},e.credentials=e.credentials||this.credentials;var f=(e.store?e.store:null)||this.store,g=this,h=arguments;return this.logon(e,function(a){return f&&c.isFunction(f.sync)?f.sync.apply(g,h):b.sync.apply(g,h)})},save:function(){this.each(function(a){a.save()})},getUrlParams:function(a){a=a||this.getUrl();var b=a.match(/\?([^#]*)/),d={};return b&&b.length>1&&c.each(b[1].split("&"),function(a){var b=a.split("=");d[b[0]]=b[1]}),d},getUrl:function(a){return(c.isFunction(this.url)?this.url():this.url)||""},getUrlRoot:function(){var a=this.getUrl();return a?a.indexOf("?")>=0?a.substr(0,a.indexOf("?")):a:""},applyFilter:function(a){this.trigger("filter",this.filter(a))},_updateUrl:function(){var a=this.getUrlParams();if(this.options&&(this.url=this.getUrlRoot(),this.options.query&&(a.query=encodeURIComponent(JSON.stringify(this.options.query))),this.options.fields&&(a.fields=encodeURIComponent(JSON.stringify(this.options.fields))),this.options.sort&&(a.sort=encodeURIComponent(JSON.stringify(this.options.sort))),!c.isEmpty(a))){this.url+="?";var b=[];for(var d in a)b.push(d+(a[d]?"="+a[d]:""));this.url+=b.join("&")}}}),e.DataSelector=e.Object.design({_type:"Bikini.DataSelector",_selector:null,create:function(a){var b=this.design({_selector:null});return b.init(a),b},init:function(a){this._selector=this.compileSelector(a)},matches:function(a){return c.isFunction(this._selector)?this._selector(a):!1},hasOperators:function(a){var b;for(var c in a){var d="$"===c.substr(0,1);if(void 0===b)b=d;else if(b!==d)throw new Error("Inconsistent selector: "+a)}return!!b},compileSelector:function(a){if(c.isFunction(a))return function(b){return a.call(b)};if(this._selectorIsId(a))return function(b){var d=c.isFunction(b.getId)?b.getId():b._id||b.id;return e.Field.prototype.equals(d,a)};if(!a||"_id"in a&&!a._id)return function(a){return!1};if(c.isBoolean(a)||c.isArray(a)||e.Field.prototype.isBinary(a))throw new Error("Invalid selector: "+a);return this.compileDocSelector(a)},compileDocSelector:function(a){var b=e.DataSelector,d=[];return c.each(a,function(a,e){if("$"===e.substr(0,1)){if(!c.has(b.LOGICAL_OPERATORS,e))throw new Error("Unrecognized logical operator: "+e);d.push(b.LOGICAL_OPERATORS[e](a))}else{var f=b._makeLookupFunction(e),g=b.compileValueSelector(a);d.push(function(a){var b=f(a);return c.any(b,g)})}}),function(a){var b=c.isFunction(a.getData)?a.getData():a;return c.all(d,function(a){return a(b)})}},compileValueSelector:function(a){var b=e.DataSelector;if(null===a)return function(a){return b._anyIfArray(a,function(a){return null===a})};if(!c.isObject(a))return function(c){return b._anyIfArray(c,function(b){return b===a})};if(c.isRegExp(a))return function(d){return c.isUndefined(d)?!1:b._anyIfArray(d,function(b){return a.test(b)})};if(c.isArray(a))return function(d){return c.isArray(d)?b._anyIfArrayPlus(d,function(c){return b._equal(a,c)}):!1};if(this.hasOperators(a)){var d=[];return c.each(a,function(e,f){if(!c.has(b.VALUE_OPERATORS,f))throw new Error("Unrecognized operator: "+f);d.push(b.VALUE_OPERATORS[f](e,a.$options))}),function(a){return c.all(d,function(b){return b(a)})}}return function(c){return b._anyIfArray(c,function(c){return b._equal(a,c)})}},_makeLookupFunction:function(a){var b,d,e,f=a.indexOf(".");if(-1===f)b=a;else{b=a.substr(0,f);var g=a.substr(f+1);d=this._makeLookupFunction(g),e=/^\d+(\.|$)/.test(g)}return function(a){if(null===a)return[void 0];var f=a[b];return d?c.isArray(f)&&0===f.length?[void 0]:((!c.isArray(f)||e)&&(f=[f]),Array.prototype.concat.apply([],c.map(f,d))):[f]}},_anyIfArray:function(a,b){return c.isArray(a)?c.any(a,b):b(a)},_anyIfArrayPlus:function(a,b){return b(a)?!0:c.isArray(a)&&c.any(a,b)},_selectorIsId:function(a){return c.isString(a)||c.isNumber(a)},_equal:function(a,b){return e.Field.prototype._equals(a,b,!0)},_cmp:function(a,b){return e.Field.prototype._cmp(a,b)},LOGICAL_OPERATORS:{$and:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.all(b,function(b){return b(a)})}},$or:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.any(b,function(b){return b(a)})}},$nor:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.all(b,function(b){return!b(a)})}},$where:function(a){if(!c.isFunction(a)){var b=a;a=function(){return b}}return function(b){return a.call(b)}}},VALUE_OPERATORS:{$in:function(a){if(!c.isArray(a))throw new Error("Argument to $in must be array");return function(b){return e.DataSelector._anyIfArrayPlus(b,function(b){return c.any(a,function(a){return e.DataSelector._equal(a,b)})})}},$all:function(a){if(!c.isArray(a))throw new Error("Argument to $all must be array");return function(b){return c.isArray(b)?c.all(a,function(a){return c.any(b,function(b){return e.DataSelector._equal(a,b)})}):!1}},$lt:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)<0})}},$lte:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)<=0})}},$gt:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)>0})}},$gte:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)>=0})}},$ne:function(a){return function(b){return!e.DataSelector._anyIfArrayPlus(b,function(b){return e.DataSelector._equal(b,a)})}},$nin:function(a){if(!c.isArray(a))throw new Error("Argument to $nin must be array");var b=this.VALUE_OPERATORS.$in(a);return function(a){return void 0===a?!0:!b(a)}},$exists:function(a){return function(b){return a===(void 0!==b)}},$mod:function(a){var b=a[0],c=a[1];return function(a){return e.DataSelector._anyIfArray(a,function(a){return a%b===c})}},$size:function(a){return function(b){return c.isArray(b)&&a===b.length}},$type:function(a){return function(b){return c.isUndefined(b)?!1:e.DataSelector._anyIfArray(b,function(b){return e.Field.prototype.detectType(b)===a})}},$regex:function(a,b){if(c.isUndefined(b)){if(/[^gim]/.test(b))throw new Error("Only the i, m, and g regexp options are supported");var d=c.isRegExp(a)?a.source:a;a=new RegExp(d,b)}else c.isRegExp(a)||(a=new RegExp(a));return function(b){return c.isUndefined(b)?!1:e.DataSelector._anyIfArray(b,function(b){return a.test(b)})}},$options:function(a){return function(a){return!0}},$elemMatch:function(a){var b=e.DataSelector.compileDocSelector(a);return function(a){return c.isArray(a)?c.any(a,function(a){return b(a)}):!1}},$not:function(a){var b=e.DataSelector.compileDocSelector(a);return function(a){return!b(a)}}},compileSort:function(a){var b=[];if(c.isArray(a))for(var d=0;d<a.length;d++)b.push("string"==typeof a[d]?{lookup:this._makeLookupFunction(a[d]),ascending:!0}:{lookup:this._makeLookupFunction(a[d][0]),ascending:"desc"!==a[d][1]});else{if("object"!=typeof a)throw new Error("Bad sort specification: ",JSON.stringify(a));for(var f in a)b.push({lookup:this._makeLookupFunction(f),ascending:a[f]>=0})}if(0===b.length)return function(){return 0};var g=function(a,b){var d,f=!0;return c.each(a,function(a){c.isArray(a)||(a=[a]),c.isArray(a)&&0===a.length&&(a=[void 0]),c.each(a,function(a){if(f)d=a,f=!1;else{var c=e.DataSelector._cmp(d,a);(b&&c>0||!b&&0>c)&&(d=a)}})}),d};return function(a,c){a=a.attributes?a.attributes:a,c=c.attributes?c.attributes:c;for(var d=0;d<b.length;++d){var f=b[d],h=g(f.lookup(a),f.ascending),i=g(f.lookup(c),f.ascending),j=e.DataSelector._cmp(h,i);if(0!==j)return f.ascending?j:-j}return 0}}}),e.SqlSelector=e.DataSelector.design({_type:"Bikini.SqlSelector",_selector:null,_query:null,_entity:null,create:function(a,b){var c=this.extend({_entity:b,_selector:null,_query:null});return c.init(a),c},init:function(a){this._selector=this.compileSelector(a),this._query=this.buildSqlQuery(a)},buildStatement:function(a){return this._query},buildSqlQuery:function(a,b){if(a instanceof Function)return"";if(c.isString(a))return a;if(!a||"_id"in a&&!a._id)return"1=2";if(c.isBoolean(a)||c.isArray(a)||e.DataField.isBinary(a))throw new Error("Invalid selector: "+a);return this.buildSqlWhere(a)()},buildSqlWhere:function(a){var b=this,d=[];return c.each(a,function(a,e){if("$"===e.substr(0,1))d.push(b.buildLogicalOperator(e,a));else{var f=b.buildLookup(e),g=b.buildValueSelector(a);c.isFunction(g)&&d.push(function(){return g(f)})}}),function(){var a="";return c.each(d,function(d){c.isFunction(d)&&(a+=d.call(b))}),a}},buildValueSelector:function(a){var b=this;if(null===a)return function(a){return a+" IS NULL"};if(!c.isObject(a))return function(c){return c+" = "+b.buildValue(a)};if(c.isRegExp(a)){var d=a.toString(),e=d.match(/\/[\^]?([^^.*$'+()]*)[\$]?\//);if(e&&e.length>1){var f=d.indexOf("/^")<0?"%":"",g=d.indexOf("$/")<0?"%":"";return function(a){return a+' LIKE "'+f+e[1]+g+'"'}}return null}if(c.isArray(a))return null;if(this.hasOperators(a)){var h=[];return c.each(a,function(a,d){if(!c.has(b.VALUE_OPERATORS,d))throw new Error("Unrecognized operator: "+d);h.push(b.VALUE_OPERATORS[d](a,b))}),function(a){return b.LOGICAL_OPERATORS.$and(h,a)}}return function(c){return c+" = "+b.buildValue(a)}},buildLookup:function(a){var b=this._entity?this._entity.getField(a):null;return a=b&&b.name?b.name:a,'"'+a+'"'},buildValue:function(a){return c.isString(a)?'"'+a.replace(/"/g,'""')+'"':a},buildLogicalOperator:function(a,b){if(c.has(this.LOGICAL_OPERATORS,a)){if(!c.isArray(b)||c.isEmpty(b))throw new Error("$and/$or/$nor must be nonempty array");var d=c.map(b,this.buildSqlWhere,this),e=this;return function(b){return e.LOGICAL_OPERATORS[a](d,b)}}throw new Error("Unrecognized logical operator: "+a)},LOGICAL_OPERATORS:{$and:function(a,b){var d="",e=0;return c.each(a,function(a){var c=null!==a?a(b):"";c&&(e++,d+=d?" AND "+c:c)}),e>1?"( "+d+" )":d},$or:function(a,b){var d="",e=!1;return c.each(a,function(a){var c=null!==a?a(b):"";e|=!c,d+=d&&c?" OR "+c:c}),e?"":"( "+d+" )"},$nor:function(a,b){var d="",e=!1;return c.each(a,function(a){var c=null!==a?a(b):"";e|=!c,d+=d&&c?" OR "+c:c}),e?"":"NOT ( "+d+" )"}},VALUE_OPERATORS:{$in:function(a){return null},$all:function(a){return null},$lt:function(a,b){return function(c){return c+" < "+b.buildValue(a)}},$lte:function(a,b){return function(c){return c+" <= "+b.buildValue(a)}},$gt:function(a,b){return function(c){return c+" > "+b.buildValue(a)}},$gte:function(a,b){return function(c){return c+"">""+b.buildValue(a)}},$ne:function(a,b){return function(c){return c+" <> "+b.buildValue(a)}},$nin:function(a){return null},$exists:function(a,b){return function(a){return a+" IS NOT NULL"}},$mod:function(a){return null},$size:function(a){return null},$type:function(a){return null},$regex:function(a,b){return null},$options:function(a){return null},$elemMatch:function(a){return null},$not:function(a,b){var c=b.buildSqlWhere(a);return function(a){return"NOT ("+c(a)+")"}}}}),e.Store=function(){this.initialize.apply(this,arguments)},e.Store.extend=e.extend,e.Store.create=e.create,e.Store.design=e.design,c.extend(e.Store.prototype,b.Events,e.Object,{_type:"Bikini.Store",entities:null,options:null,name:"",typeMapping:function(){var a={};return a[e.DATA.TYPE.OBJECTID]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.DATE]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.BINARY]=e.DATA.TYPE.TEXT,a}(),initialize:function(a){a=a||{},this.options=this.options||{},this.options.name=this.name,this.options.typeMapping=this.typeMapping,this.options.entities=this.entities,c.extend(this.options,a||{}),this._setEntities(a.entities||{})},_setEntities:function(a){this.entities={};for(var b in a){var c=e.Entity.from(a[b],{store:this,typeMapping:this.options.typeMapping});c.name=c.name||b;var d=c.collection||e.Collection.extend({model:e.Model.extend({})}),f=d.prototype.model; | ||
| !function(a,b,c,d){var e=null;e="undefined"!=typeof exports?exports:a.Bikini={},e.Version=e.version="0.7.2",e.f=function(){},e.create=function(a){return new this(a)},e.design=function(a){var b=this.extend(a||{});return new b},e.extend=b.Model.extend,e.isCollection=function(a){return b.Collection.prototype.isPrototypeOf(a)},e.isModel=function(a){return b.Model.prototype.isPrototypeOf(a)},e.isEntity=function(a){return e.Entity.prototype.isPrototypeOf(a)},e.DATA={TYPE:{INTEGER:"integer",STRING:"string",TEXT:"text",DATE:"date",BOOLEAN:"boolean",FLOAT:"float",OBJECT:"object",ARRAY:"array",BINARY:"binary",OBJECTID:"objectid",NULL:"null"}},e.Object={_type:"Bikini.Object",_create:function(a){var b=function(){};return b.prototype=a,new b},include:function(a){for(var b in a){if(this.hasOwnProperty(b))throw e.Exception.RESERVED_WORD.getException();this[b]=a[b]}return this},design:function(a){var b=this._create(this);return b.include(this._normalize(a)),b},bindToCaller:function(a,b,c){return function(){if("function"!=typeof b||"object"!=typeof a)throw e.Exception.INVALID_INPUT_PARAMETER.getException();return Array.isArray(c)?b.apply(a,c):b.call(a,c)}},_normalize:function(a){return a=a&&"object"==typeof a?a:{}},handleCallback:function(a){var b=Array.prototype.slice.call(arguments,1);if(a){var c="object"==typeof a.target?a.target:this,d=a;if("function"==typeof a.action?d=a.action:"string"==typeof a.action&&(d=c[a.action]),"function"==typeof d)return this.bindToCaller(c,d,b)()}}},YES=!0,NO=!1,e.ObjectID=function(a){e.ObjectID.counter=e.ObjectID.counter||parseInt(Math.random()*Math.pow(16,6)),e.ObjectID.machineId=e.ObjectID.machineId||parseInt(Math.random()*Math.pow(16,6)),e.ObjectID.processId=e.ObjectID.processId||parseInt(Math.random()*Math.pow(16,4)),this._ObjectID(a)},e.ObjectID._looksLikeObjectID=function(a){return 24===a.length&&a.match(/^[0-9a-f]*$/)},c.extend(e.ObjectID.prototype,{_str:"",_ObjectID:function(a){if(a){if(a=a.toLowerCase(),!e.ObjectID._looksLikeObjectID(a))throw new Error("Invalid hexadecimal string for creating an ObjectID");this._str=a}else this._str=this._hexString(8,(new Date).getTime()/1e3)+this._hexString(6,e.ObjectID.machineId)+this._hexString(4,e.ObjectID.processId)+this._hexString(6,e.ObjectID.counter++);return this._str},_hexString:function(a,b){b=b||parseInt(Math.random()*Math.pow(16,a));for(var c=b.toString(16);c.length<a;)c="0"+c;return c.substr(0,a)},toString:function(){return"ObjectID('"+this._str+"')"},equals:function(a){return a instanceof this._ObjectID&&this.valueOf()===a.valueOf()},clone:function(){return new e.ObjectID(this._str)},typeName:function(){return"oid"},getTimestamp:function(){return 1e3*parseInt(this._str.substr(0,8),16)},getMachineId:function(){return parseInt(this._str.substr(8,6),16)},getProcessId:function(){return parseInt(this._str.substr(14,4),16)},getCounter:function(){return parseInt(this._str.substr(18,6),16)},valueOf:function(){return this._str},toJSON:function(){return this._str},toHexString:function(){return this._str},_selectorIsId:function(a){return"string"==typeof a||"number"==typeof a||a instanceof e.ObjectId},_selectorIsIdPerhapsAsObject:function(a){return this._selectorIsId(a)||a&&"object"==typeof a&&a._id&&this._selectorIsId(a._id)&&1===c.size(a)},_idsMatchedBySelector:function(a){if(this._selectorIsId(a))return[a];if(!a)return null;if(c.has(a,"_id"))return this._selectorIsId(a._id)?[a._id]:a._id&&a._id.$in&&c.isArray(a._id.$in)&&!c.isEmpty(a._id.$in)&&c.all(a._id.$in,this._selectorIsId)?a._id.$in:null;if(a.$and&&c.isArray(a.$and))for(var b=0;b<a.$and.length;++b){var d=this._idsMatchedBySelector(a.$and[b]);if(d)return d}return null}}),e.UniqueId=e.Object.design({uuid:function(a,b){var c="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),d=[];b=b||c.length;var e;if(a)for(e=0;a>e;e++)d[e]=c[0|Math.random()*b];else{var f;for(d[8]=d[13]=d[18]=d[23]="-",d[14]="4",e=0;36>e;e++)d[e]||(f=0|16*Math.random(),d[e]=c[19===e?3&f|8:f])}return d.join("")}}),e.Base64=e.Object.design({type:"Bikini.Base64",_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encodeBinary:function(a){for(var b,c="",d=new Array(4),e=0,f=0;e<a.length;){b=new Array(3);for(var g=0;g<b.length;g++)b[g]=e<a.length?255&a.charCodeAt(e++):0;switch(d[0]=b[0]>>2,d[1]=(3&b[0])<<4|b[1]>>4,d[2]=(15&b[1])<<2|b[2]>>6,d[3]=63&b[2],f=e-(a.length-1)){case 2:d[3]=64,d[2]=64;break;case 1:d[3]=64}for(g=0;g<d.length;g++)c+=this._keyStr.charAt(d[g])}return c},encode:function(a){var b,c,d,f,g,h,i,j="",k=0;for(a=e.Cypher.utf8Encode(a);k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),d=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|d>>6,i=63&d,isNaN(c)?h=i=64:isNaN(d)&&(i=64),j+=this._keyStr.charAt(f)+this._keyStr.charAt(g)+this._keyStr.charAt(h)+this._keyStr.charAt(i);return j},binaryEncode:function(a){for(var b,c,d,e,f,g,h,i="",j=0;j<a.length;)b=a.charCodeAt(j++),c=a.charCodeAt(j++),d=a.charCodeAt(j++),e=b>>2,f=(3&b)<<4|c>>4,g=(15&c)<<2|d>>6,h=63&d,isNaN(c)?g=h=64:isNaN(d)&&(h=64),i+=this._keyStr.charAt(e)+this._keyStr.charAt(f)+this._keyStr.charAt(g)+this._keyStr.charAt(h);return i},decode:function(a){var b,c,d,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=this._keyStr.indexOf(a.charAt(k++)),g=this._keyStr.indexOf(a.charAt(k++)),h=this._keyStr.indexOf(a.charAt(k++)),i=this._keyStr.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,d=(3&h)<<6|i,j+=String.fromCharCode(b),64!==h&&(j+=String.fromCharCode(c)),64!==i&&(j+=String.fromCharCode(d));return e.Cypher.utf8Decode(j)}}),e.SHA256=e.Object.design({type:"Bikini.SHA256",chrsz:8,hexcase:0,hash:function(a){return a=e.Cypher.utf8Encode(a),this.binb2hex(this.coreSha256(this.str2binb(a),a.length*this.chrsz))},safeAdd:function(a,b){var c=(65535&a)+(65535&b),d=(a>>16)+(b>>16)+(c>>16);return d<<16|65535&c},S:function(a,b){return a>>>b|a<<32-b},R:function(a,b){return a>>>b},Ch:function(a,b,c){return a&b^~a&c},Maj:function(a,b,c){return a&b^a&c^b&c},Sigma0256:function(a){return this.S(a,2)^this.S(a,13)^this.S(a,22)},Sigma1256:function(a){return this.S(a,6)^this.S(a,11)^this.S(a,25)},Gamma0256:function(a){return this.S(a,7)^this.S(a,18)^this.R(a,3)},Gamma1256:function(a){return this.S(a,17)^this.S(a,19)^this.R(a,10)},coreSha256:function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),p=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),q=new Array(64);for(a[b>>5]|=128<<24-b%32,a[(b+64>>9<<4)+15]=b,k=0;k<a.length;k+=16){for(c=p[0],d=p[1],e=p[2],f=p[3],g=p[4],h=p[5],i=p[6],j=p[7],l=0;64>l;l++)q[l]=16>l?a[l+k]:this.safeAdd(this.safeAdd(this.safeAdd(this.Gamma1256(q[l-2]),q[l-7]),this.Gamma0256(q[l-15])),q[l-16]),m=this.safeAdd(this.safeAdd(this.safeAdd(this.safeAdd(j,this.Sigma1256(g)),this.Ch(g,h,i)),o[l]),q[l]),n=this.safeAdd(this.Sigma0256(c),this.Maj(c,d,e)),j=i,i=h,h=g,g=this.safeAdd(f,m),f=e,e=d,d=c,c=this.safeAdd(m,n);p[0]=this.safeAdd(c,p[0]),p[1]=this.safeAdd(d,p[1]),p[2]=this.safeAdd(e,p[2]),p[3]=this.safeAdd(f,p[3]),p[4]=this.safeAdd(g,p[4]),p[5]=this.safeAdd(h,p[5]),p[6]=this.safeAdd(i,p[6]),p[7]=this.safeAdd(j,p[7])}return p},str2binb:function(a){for(var b=[],c=(1<<this.chrsz)-1,d=0;d<a.length*this.chrsz;d+=this.chrsz)b[d>>5]|=(a.charCodeAt(d/this.chrsz)&c)<<24-d%32;return b},binb2hex:function(a){for(var b=this.hexcase?"0123456789ABCDEF":"0123456789abcdef",c="",d=0;d<4*a.length;d++)c+=b.charAt(a[d>>2]>>8*(3-d%4)+4&15)+b.charAt(a[d>>2]>>8*(3-d%4)&15);return c}}),e.Cypher=e.Object.design({type:"Bikini.Cypher",defaultDecoder:e.Base64,defaultEncoder:e.Base64,defaultHasher:e.SHA256,decode:function(a,b){return b&&b.decode?b.decode(a):this.defaultDecoder.decode(a)},encode:function(a,b){return b&&b.encode?b.encode(a):this.defaultEncoder.encode(a)},hash:function(a,b){return b&&b.hash?b.hash(a):this.defaultHasher.hash(a)},utf8Encode:function(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b},utf8Decode:function(a){var b,c,d,e,f,g="";for(b=c=d=e=0;b<a.length;)c=a.charCodeAt(b),128>c?(g+=String.fromCharCode(c),b++):c>191&&224>c?(e=a.charCodeAt(b+1),g+=String.fromCharCode((31&c)<<6|63&e),b+=2):(e=a.charCodeAt(b+1),f=a.charCodeAt(b+2),g+=String.fromCharCode((15&c)<<12|(63&e)<<6|63&f),b+=3);return g}}),e.Date={create:function(){var a=moment.apply(this,arguments);return c.extend(a,this)}},e.Field=function(a){this.merge(a),this.initialize.apply(this,arguments)},e.Field.extend=e.extend,e.Field.create=e.create,e.Field.design=e.design,c.extend(e.Field.prototype,e.Object,{_type:"Bikini.Field",name:null,type:null,index:null,defaultValue:void 0,length:null,required:NO,persistent:YES,initialize:function(){},merge:function(a){a=c.isString(a)?{type:a}:a||{},this.name=c.isUndefined(a.name)?this.name:a.name,this.type=c.isUndefined(a.type)?this.type:a.type,this.index=c.isUndefined(a.index)?this.index:a.index,this.defaultValue=c.isUndefined(a.defaultValue)?this.defaultValue:a.defaultValue,this.length=c.isUndefined(a.length)?this.length:a.length,this.required=c.isUndefined(a.required)?this.required:a.required,this.persistent=c.isUndefined(a.persistent)?this.persistent:a.persistent},transform:function(a,b){b=b||this.type;try{if(c.isUndefined(a))return this.defaultValue;if(b===e.DATA.TYPE.STRING||b===e.DATA.TYPE.TEXT)return c.isObject(a)?JSON.stringify(a):c.isNull(a)?"null":a.toString();if(b===e.DATA.TYPE.INTEGER)return parseInt(a);if(b===e.DATA.TYPE.BOOLEAN)return a===!0||"true"===a;if(b===e.DATA.TYPE.FLOAT)return parseFloat(a);if(b===e.DATA.TYPE.OBJECT||b===e.DATA.TYPE.ARRAY){if(!c.isObject(a))return c.isString(a)?JSON.parse(a):null}else if(b===e.DATA.TYPE.DATE){if(!e.Date.isPrototypeOf(a)){var d=a?e.Date.create(a):null;return d&&d.isValid()?d:null}}else if(b===e.DATA.TYPE.OBJECTID&&!e.ObjectID.prototype.isPrototypeOf(a))return c.isString(a)?new e.ObjectID(a):null;return a}catch(f){console.error("Failed converting value! "+f.message)}},equals:function(a,b){var d=this.transform(a),e=this.transform(b);return this._equals(d,e,c.isArray(d))},isBinary:function(a){return"undefined"!=typeof Uint8Array&&a instanceof Uint8Array||a&&a.$Uint8ArrayPolyfill},detectType:function(a){return c.isNumber(a)?e.DATA.TYPE.FLOAT:c.isString(a)?e.DATA.TYPE.STRING:c.isBoolean(a)?e.DATA.TYPE.BOOLEAN:c.isArray(a)?e.DATA.TYPE.ARRAY:c.isNull(a)?e.DATA.TYPE.NULL:c.isDate(a)||e.Date.isPrototypeOf(a)?e.DATA.TYPE.DATE:e.ObjectID.prototype.isPrototypeOf(a)?e.DATA.TYPE.OBJECTID:this.isBinary(a)?e.DATA.TYPE.BINARY:e.DATA.TYPE.OBJECT},typeOrder:function(a){switch(a){case e.DATA.TYPE.NULL:return 0;case e.DATA.TYPE.FLOAT:return 1;case e.DATA.TYPE.STRING:return 2;case e.DATA.TYPE.OBJECT:return 3;case e.DATA.TYPE.ARRAY:return 4;case e.DATA.TYPE.BINARY:return 5;case e.DATA.TYPE.DATE:return 6}return-1},_equals:function(a,b,d){var e,f=this;if(a===b)return!0;if(!a||!b)return!1;if(!c.isObject(a)||!c.isObject(b))return!1;if(a instanceof Date&&b instanceof Date)return a.valueOf()===b.valueOf();if(this.isBinary(a)&&this.isBinary(b)){if(a.length!==b.length)return!1;for(e=0;e<a.length;e++)if(a[e]!==b[e])return!1;return!0}if(c.isFunction(a.equals))return a.equals(b);if(c.isArray(a)){if(!c.isArray(b))return!1;if(a.length!==b.length)return!1;for(e=0;e<a.length;e++)if(!f.equals(a[e],b[e],d))return!1;return!0}var g;if(d){var h=[];return c.each(b,function(a,b){h.push(b)}),e=0,g=c.all(a,function(a,c){return e>=h.length?!1:c!==h[e]?!1:f.equals(a,b[h[e]],d)?(e++,!0):!1}),g&&e===h.length}return e=0,g=c.all(a,function(a,g){return c.has(b,g)&&f.equals(a,b[g],d)?(e++,!0):!1}),g&&c.size(b)===e},_cmp:function(a,b){if(void 0===a)return void 0===b?0:-1;if(void 0===b)return 1;var c=0,d=this.detectType(a),f=this.detectType(b),g=this.typeOrder(d),h=this.typeOrder(f);if(g!==h)return h>g?-1:1;if(d!==f)throw new Error("Missing type coercion logic in _cmp");if(7===d&&(d=f=2,a=a.toHexString(),b=b.toHexString()),d===e.DATA.TYPE.DATE&&(d=f=1,a=a.getTime(),b=b.getTime()),d===e.DATA.TYPE.FLOAT)return a-b;if(f===e.DATA.TYPE.STRING)return b>a?-1:a===b?0:1;if(d===e.DATA.TYPE.OBJECT){var i=function(a){var b=[];for(var c in a)b.push(c),b.push(a[c]);return b};return this._cmp(i(a),i(b))}if(d===e.DATA.TYPE.ARRAY)for(c=0;;c++){if(c===a.length)return c===b.length?0:-1;if(c===b.length)return 1;var j=this._cmp(a[c],b[c]);if(0!==j)return j}if(d===e.DATA.TYPE.BINARY){if(a.length!==b.length)return a.length-b.length;for(c=0;c<a.length;c++){if(a[c]<b[c])return-1;if(a[c]>b[c])return 1}return 0}if(d===e.DATA.TYPE.BOOLEAN)return a?b?0:1:b?-1:0;if(d===e.DATA.TYPE.NULL)return 0;throw new Error("Unknown type to sort")}}),e.Entity=function(a){var b=this.fields;this.fields={},this._mergeFields(b),a=a||{},a.fields&&this._mergeFields(a.fields),this.typeMapping=a.typeMapping||this.typeMapping;var c=a.collection,d=a.model||(c?c.prototype.model:null);this.idAttribute=a.idAttribute||this.idAttribute||(d?d.prototype.idAttribute:""),this._updateFields(this.typeMapping),this.initialize.apply(this,arguments)},e.Entity.from=function(a,b){if(e.Entity.prototype.isPrototypeOf(a))b&&b.typeMapping&&a._updateFields(b.typeMapping);else if(c.isFunction(a)&&e.Entity.prototype.isPrototypeOf(a.prototype)){var d=a;a=new d(b)}else{"string"==typeof a&&(a={name:a});var f=e.Entity.extend(a);a=new f(b)}return a},e.Entity.extend=e.extend,e.Entity.create=e.create,e.Entity.design=e.design,c.extend(e.Entity.prototype,e.Object,{_type:"Bikini.Entity",name:"",idAttribute:"",fields:{},initialize:function(){},getFields:function(){return this.fields},getField:function(a){return this.fields[a]},getFieldName:function(a){var b=this.getField(a);return b&&b.name?b.name:a},getKey:function(){return this.idAttribute||e.Model.idAttribute},getKeys:function(){return this.splitKey(this.getKey())},splitKey:function(a){var b=[];return c.isString(a)&&c.each(a.split(","),function(a){var c=a.trim();c&&b.push(c)}),b},_mergeFields:function(a){c.isObject(this.fields)||(this.fields={});var b=this;c.isObject(a)&&c.each(a,function(a,c){b.fields[c]?b.fields[c].merge(a):b.fields[c]=new e.Field(a)})},_updateFields:function(a){var b=this;c.each(this.fields,function(c,d){c.persistent===NO?delete b.fields[d]:(c.name||(c.name=d),a&&a[c.type]&&(c.type=a[c.type]))})},toAttributes:function(a,b,d){if(d=d||this.fields,a&&!c.isEmpty(d)){var e,f={};return c.each(d,function(b,d){e=c.isFunction(a.get)?a.get(b.name):a[b.name],f[d]=e}),f}return a},fromAttributes:function(a,b){if(b=b||this.fields,a&&!c.isEmpty(b)){var d={};return c.each(b,function(b,e){var f=c.isFunction(a.get)?a.get(e):a[e];f=b.transform(f),c.isUndefined(f)||(d[b.name]=f)}),d}return a},setId:function(a,b){if(a&&b){var d=this.getKey()||a.idAttribute;d&&(c.isFunction(a.set)?a.set(d,b):a[d]=b)}return a},getId:function(a){if(a){var b=this.getKey()||a.idAttribute;if(b)return c.isFunction(a.get)?a.get(b):a[b]}}}),e.Security=e.Object.design({logon:function(a,b){var c=a?a.credentials:null;if(c)switch(c.type){case"basic":return this.logonBasicAuth(a,b)}return this.handleCallback(b)},logonBasicAuth:function(a,b){var c=a.credentials;return a.beforeSend=function(a){e.Security.setBasicAuth(a,c)},this.handleCallback(b)},setBasicAuth:function(a,b){if(b&&b.username&&a&&e.Base64){var c=e.Base64.encode(encodeURIComponent(b.username+":"+(b.password||"")));a.setRequestHeader("Authorization","Basic "+c)}}}),e.Model=b.Model.extend({constructor:function(a,c){this.url&&"string"==typeof this.url&&"/"!==this.url.charAt(this.url.length-1)&&(this.url+="/"),this.init(a,c),b.Model.apply(this,arguments)}}),e.Model.create=e.create,e.Model.design=e.design,c.extend(e.Model.prototype,e.Object,{_type:"Bikini.Model",isModel:YES,entity:null,defaults:{},changedSinceSync:{},logon:e.Security.logon,init:function(a,b){b=b||{},this.collection=b.collection||this.collection,this.idAttribute=b.idAttribute||this.idAttribute,this.store=this.store||(this.collection?this.collection.store:null)||b.store,this.store&&c.isFunction(this.store.initModel)&&this.store.initModel(this,b),this.entity=this.entity||(this.collection?this.collection.entity:null)||b.entity,this.entity&&(this.entity=e.Entity.from(this.entity,{model:this.constructor,typeMapping:b.typeMapping}),this.idAttribute=this.entity.idAttribute||this.idAttribute),this.credentials=this.credentials||(this.collection?this.collection.credentials:null)||b.credentials,this.on("change",this.onChange,this),this.on("sync",this.onSync,this)},sync:function(a,d,e){e=e||{},e.credentials=e.credentials||this.credentials;var f=(e.store?e.store:null)||this.store,g=this,h=arguments;return this.logon(e,function(a){return f&&c.isFunction(f.sync)?f.sync.apply(g,h):b.sync.apply(g,h)})},onChange:function(a,b){var d=a.changedAttributes();if(c.isObject(d))for(var e in d)this.changedSinceSync[e]=d[e]},onSync:function(a,b){this.changedSinceSync={}},getUrlRoot:function(){if(this.urlRoot)return c.isFunction(this.urlRoot)?this.urlRoot():this.urlRoot;if(this.collection)return this.collection.getUrlRoot();if(this.url){var a=c.isFunction(this.url)?this.url():this.url;return a&&this.id&&a.indexOf(this.id)>0?a.substr(0,a.indexOf(this.id)):a}},toJSON:function(a){a=a||{};var b=a.entity||this.entity;return e.isEntity(b)?b.fromAttributes(a.attrs||this.attributes):a.attrs||c.clone(this.attributes)},parse:function(a,b){b=b||{};var c=b.entity||this.entity;return e.isEntity(c)?c.toAttributes(a):a}}),e.Collection=b.Collection.extend({constructor:function(a){this.url&&"/"!==this.url.charAt(this.url.length-1)&&(this.url+="/"),this.init(a),b.Collection.apply(this,arguments)}}),e.Collection.create=e.create,e.Collection.design=e.design,c.extend(e.Collection.prototype,e.Object,{_type:"Bikini.Collection",isCollection:YES,model:e.Model,entity:null,options:null,logon:e.Security.logon,init:function(a){a=a||{},this.store=a.store||this.store||(this.model?this.model.prototype.store:null),this.entity=a.entity||this.entity||(this.model?this.model.prototype.entity:null),this.options=a.options||this.options;var b=this.entity||this.entityFromUrl(this.url);b&&(this.entity=e.Entity.from(b,{model:this.model,typeMapping:a.typeMapping})),this._updateUrl(),this.store&&c.isFunction(this.store.initCollection)&&this.store.initCollection(this,a)},entityFromUrl:function(a){if(a){var b=document.createElement("a");b.href=a||this.url,""===b.host&&(b.href=b.href);var c=b.pathname.match(/([^\/]+)\/?$/);if(c&&c.length>1)return c[-1]}},sort:function(a){c.isObject(a&&a.sort)&&(this.comparator=e.DataSelector.compileSort(a.sort)),b.Collection.prototype.sort.apply(this,arguments)},select:function(a){var b=a&&a.query?e.DataSelector.create(a.query):null,c=e.Collection.create(null,{model:this.model});return a&&a.sort&&(c.comparator=e.DataSelector.compileSort(a.sort)),this.each(function(a){(!b||b.matches(a.attributes))&&c.add(a)}),c},destroy:function(a){a=a||{};var b=a.success;if(this.length>0){a.success=function(){0===this.length&&b&&b()};for(var c;c=this.first();)this.sync("delete",c,a),this.remove(c)}else b&&b()},destroyLocal:function(){var a=this.endpoint.localStore;return this.entity.name&&a.drop(this.entity.name),localStorage.setItem("__"+this.channel+"last_msg_time",""),this.store.endpoints={},this.reset()},sync:function(a,d,e){e=e||{},e.credentials=e.credentials||this.credentials;var f=(e.store?e.store:null)||this.store,g=this,h=arguments;return this.logon(e,function(a){return f&&c.isFunction(f.sync)?f.sync.apply(g,h):b.sync.apply(g,h)})},save:function(){this.each(function(a){a.save()})},getUrlParams:function(a){a=a||this.getUrl();var b=a.match(/\?([^#]*)/),d={};return b&&b.length>1&&c.each(b[1].split("&"),function(a){var b=a.split("=");d[b[0]]=b[1]}),d},getUrl:function(a){return(c.isFunction(this.url)?this.url():this.url)||""},getUrlRoot:function(){var a=this.getUrl();return a?a.indexOf("?")>=0?a.substr(0,a.indexOf("?")):a:""},applyFilter:function(a){this.trigger("filter",this.filter(a))},_updateUrl:function(){var a=this.getUrlParams();if(this.options&&(this.url=this.getUrlRoot(),this.options.query&&(a.query=encodeURIComponent(JSON.stringify(this.options.query))),this.options.fields&&(a.fields=encodeURIComponent(JSON.stringify(this.options.fields))),this.options.sort&&(a.sort=encodeURIComponent(JSON.stringify(this.options.sort))),!c.isEmpty(a))){this.url+="?";var b=[];for(var d in a)b.push(d+(a[d]?"="+a[d]:""));this.url+=b.join("&")}}}),e.DataSelector=e.Object.design({_type:"Bikini.DataSelector",_selector:null,create:function(a){var b=this.design({_selector:null});return b.init(a),b},init:function(a){this._selector=this.compileSelector(a)},matches:function(a){return c.isFunction(this._selector)?this._selector(a):!1},hasOperators:function(a){var b;for(var c in a){var d="$"===c.substr(0,1);if(void 0===b)b=d;else if(b!==d)throw new Error("Inconsistent selector: "+a)}return!!b},compileSelector:function(a){if(c.isFunction(a))return function(b){return a.call(b)};if(this._selectorIsId(a))return function(b){var d=c.isFunction(b.getId)?b.getId():b._id||b.id;return e.Field.prototype.equals(d,a)};if(!a||"_id"in a&&!a._id)return function(a){return!1};if(c.isBoolean(a)||c.isArray(a)||e.Field.prototype.isBinary(a))throw new Error("Invalid selector: "+a);return this.compileDocSelector(a)},compileDocSelector:function(a){var b=e.DataSelector,d=[];return c.each(a,function(a,e){if("$"===e.substr(0,1)){if(!c.has(b.LOGICAL_OPERATORS,e))throw new Error("Unrecognized logical operator: "+e);d.push(b.LOGICAL_OPERATORS[e](a))}else{var f=b._makeLookupFunction(e),g=b.compileValueSelector(a);d.push(function(a){var b=f(a);return c.any(b,g)})}}),function(a){var b=c.isFunction(a.getData)?a.getData():a;return c.all(d,function(a){return a(b)})}},compileValueSelector:function(a){var b=e.DataSelector;if(null===a)return function(a){return b._anyIfArray(a,function(a){return null===a})};if(!c.isObject(a))return function(c){return b._anyIfArray(c,function(b){return b===a})};if(c.isRegExp(a))return function(d){return c.isUndefined(d)?!1:b._anyIfArray(d,function(b){return a.test(b)})};if(c.isArray(a))return function(d){return c.isArray(d)?b._anyIfArrayPlus(d,function(c){return b._equal(a,c)}):!1};if(this.hasOperators(a)){var d=[];return c.each(a,function(e,f){if(!c.has(b.VALUE_OPERATORS,f))throw new Error("Unrecognized operator: "+f);d.push(b.VALUE_OPERATORS[f](e,a.$options))}),function(a){return c.all(d,function(b){return b(a)})}}return function(c){return b._anyIfArray(c,function(c){return b._equal(a,c)})}},_makeLookupFunction:function(a){var b,d,e,f=a.indexOf(".");if(-1===f)b=a;else{b=a.substr(0,f);var g=a.substr(f+1);d=this._makeLookupFunction(g),e=/^\d+(\.|$)/.test(g)}return function(a){if(null===a)return[void 0];var f=a[b];return d?c.isArray(f)&&0===f.length?[void 0]:((!c.isArray(f)||e)&&(f=[f]),Array.prototype.concat.apply([],c.map(f,d))):[f]}},_anyIfArray:function(a,b){return c.isArray(a)?c.any(a,b):b(a)},_anyIfArrayPlus:function(a,b){return b(a)?!0:c.isArray(a)&&c.any(a,b)},_selectorIsId:function(a){return c.isString(a)||c.isNumber(a)},_equal:function(a,b){return e.Field.prototype._equals(a,b,!0)},_cmp:function(a,b){return e.Field.prototype._cmp(a,b)},LOGICAL_OPERATORS:{$and:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.all(b,function(b){return b(a)})}},$or:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.any(b,function(b){return b(a)})}},$nor:function(a){if(!c.isArray(a)||c.isEmpty(a))throw new Error("$and/$or/$nor must be nonempty array");var b=c.map(a,e.DataSelector.compileDocSelector);return function(a){return c.all(b,function(b){return!b(a)})}},$where:function(a){if(!c.isFunction(a)){var b=a;a=function(){return b}}return function(b){return a.call(b)}}},VALUE_OPERATORS:{$in:function(a){if(!c.isArray(a))throw new Error("Argument to $in must be array");return function(b){return e.DataSelector._anyIfArrayPlus(b,function(b){return c.any(a,function(a){return e.DataSelector._equal(a,b)})})}},$all:function(a){if(!c.isArray(a))throw new Error("Argument to $all must be array");return function(b){return c.isArray(b)?c.all(a,function(a){return c.any(b,function(b){return e.DataSelector._equal(a,b)})}):!1}},$lt:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)<0})}},$lte:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)<=0})}},$gt:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)>0})}},$gte:function(a){return function(b){return e.DataSelector._anyIfArray(b,function(b){return e.DataSelector._cmp(b,a)>=0})}},$ne:function(a){return function(b){return!e.DataSelector._anyIfArrayPlus(b,function(b){return e.DataSelector._equal(b,a)})}},$nin:function(a){if(!c.isArray(a))throw new Error("Argument to $nin must be array");var b=this.VALUE_OPERATORS.$in(a);return function(a){return void 0===a?!0:!b(a)}},$exists:function(a){return function(b){return a===(void 0!==b)}},$mod:function(a){var b=a[0],c=a[1];return function(a){return e.DataSelector._anyIfArray(a,function(a){return a%b===c})}},$size:function(a){return function(b){return c.isArray(b)&&a===b.length}},$type:function(a){return function(b){return c.isUndefined(b)?!1:e.DataSelector._anyIfArray(b,function(b){return e.Field.prototype.detectType(b)===a})}},$regex:function(a,b){if(c.isUndefined(b)){if(/[^gim]/.test(b))throw new Error("Only the i, m, and g regexp options are supported");var d=c.isRegExp(a)?a.source:a;a=new RegExp(d,b)}else c.isRegExp(a)||(a=new RegExp(a));return function(b){return c.isUndefined(b)?!1:e.DataSelector._anyIfArray(b,function(b){return a.test(b)})}},$options:function(a){return function(a){return!0}},$elemMatch:function(a){var b=e.DataSelector.compileDocSelector(a);return function(a){return c.isArray(a)?c.any(a,function(a){return b(a)}):!1}},$not:function(a){var b=e.DataSelector.compileDocSelector(a);return function(a){return!b(a)}}},compileSort:function(a){var b=[];if(c.isArray(a))for(var d=0;d<a.length;d++)b.push("string"==typeof a[d]?{lookup:this._makeLookupFunction(a[d]),ascending:!0}:{lookup:this._makeLookupFunction(a[d][0]),ascending:"desc"!==a[d][1]});else{if("object"!=typeof a)throw new Error("Bad sort specification: ",JSON.stringify(a));for(var f in a)b.push({lookup:this._makeLookupFunction(f),ascending:a[f]>=0})}if(0===b.length)return function(){return 0};var g=function(a,b){var d,f=!0;return c.each(a,function(a){c.isArray(a)||(a=[a]),c.isArray(a)&&0===a.length&&(a=[void 0]),c.each(a,function(a){if(f)d=a,f=!1;else{var c=e.DataSelector._cmp(d,a);(b&&c>0||!b&&0>c)&&(d=a)}})}),d};return function(a,c){a=a.attributes?a.attributes:a,c=c.attributes?c.attributes:c;for(var d=0;d<b.length;++d){var f=b[d],h=g(f.lookup(a),f.ascending),i=g(f.lookup(c),f.ascending),j=e.DataSelector._cmp(h,i);if(0!==j)return f.ascending?j:-j}return 0}}}),e.SqlSelector=e.DataSelector.design({_type:"Bikini.SqlSelector",_selector:null,_query:null,_entity:null,create:function(a,b){var c=this.extend({_entity:b,_selector:null,_query:null});return c.init(a),c},init:function(a){this._selector=this.compileSelector(a),this._query=this.buildSqlQuery(a)},buildStatement:function(a){return this._query},buildSqlQuery:function(a,b){if(a instanceof Function)return"";if(c.isString(a))return a;if(!a||"_id"in a&&!a._id)return"1=2";if(c.isBoolean(a)||c.isArray(a)||e.DataField.isBinary(a))throw new Error("Invalid selector: "+a);return this.buildSqlWhere(a)()},buildSqlWhere:function(a){var b=this,d=[];return c.each(a,function(a,e){if("$"===e.substr(0,1))d.push(b.buildLogicalOperator(e,a));else{var f=b.buildLookup(e),g=b.buildValueSelector(a);c.isFunction(g)&&d.push(function(){return g(f)})}}),function(){var a="";return c.each(d,function(d){c.isFunction(d)&&(a+=d.call(b))}),a}},buildValueSelector:function(a){var b=this;if(null===a)return function(a){return a+" IS NULL"};if(!c.isObject(a))return function(c){return c+" = "+b.buildValue(a)};if(c.isRegExp(a)){var d=a.toString(),e=d.match(/\/[\^]?([^^.*$'+()]*)[\$]?\//);if(e&&e.length>1){var f=d.indexOf("/^")<0?"%":"",g=d.indexOf("$/")<0?"%":"";return function(a){return a+' LIKE "'+f+e[1]+g+'"'}}return null}if(c.isArray(a))return null;if(this.hasOperators(a)){var h=[];return c.each(a,function(a,d){if(!c.has(b.VALUE_OPERATORS,d))throw new Error("Unrecognized operator: "+d);h.push(b.VALUE_OPERATORS[d](a,b))}),function(a){return b.LOGICAL_OPERATORS.$and(h,a)}}return function(c){return c+" = "+b.buildValue(a)}},buildLookup:function(a){var b=this._entity?this._entity.getField(a):null;return a=b&&b.name?b.name:a,'"'+a+'"'},buildValue:function(a){return c.isString(a)?'"'+a.replace(/"/g,'""')+'"':a},buildLogicalOperator:function(a,b){if(c.has(this.LOGICAL_OPERATORS,a)){if(!c.isArray(b)||c.isEmpty(b))throw new Error("$and/$or/$nor must be nonempty array");var d=c.map(b,this.buildSqlWhere,this),e=this;return function(b){return e.LOGICAL_OPERATORS[a](d,b)}}throw new Error("Unrecognized logical operator: "+a)},LOGICAL_OPERATORS:{$and:function(a,b){var d="",e=0;return c.each(a,function(a){var c=null!==a?a(b):"";c&&(e++,d+=d?" AND "+c:c)}),e>1?"( "+d+" )":d},$or:function(a,b){var d="",e=!1;return c.each(a,function(a){var c=null!==a?a(b):"";e|=!c,d+=d&&c?" OR "+c:c}),e?"":"( "+d+" )"},$nor:function(a,b){var d="",e=!1;return c.each(a,function(a){var c=null!==a?a(b):"";e|=!c,d+=d&&c?" OR "+c:c}),e?"":"NOT ( "+d+" )"}},VALUE_OPERATORS:{$in:function(a){return null},$all:function(a){return null},$lt:function(a,b){return function(c){return c+" < "+b.buildValue(a)}},$lte:function(a,b){return function(c){return c+" <= "+b.buildValue(a)}},$gt:function(a,b){return function(c){return c+" > "+b.buildValue(a)}},$gte:function(a,b){return function(c){return c+"">""+b.buildValue(a)}},$ne:function(a,b){return function(c){return c+" <> "+b.buildValue(a)}},$nin:function(a){return null},$exists:function(a,b){return function(a){return a+" IS NOT NULL"}},$mod:function(a){return null},$size:function(a){return null},$type:function(a){return null},$regex:function(a,b){return null},$options:function(a){return null},$elemMatch:function(a){return null},$not:function(a,b){var c=b.buildSqlWhere(a);return function(a){return"NOT ("+c(a)+")"}}}}),e.Store=function(){this.initialize.apply(this,arguments)},e.Store.extend=e.extend,e.Store.create=e.create,e.Store.design=e.design,c.extend(e.Store.prototype,b.Events,e.Object,{_type:"Bikini.Store",entities:null,options:null,name:"",typeMapping:function(){var a={};return a[e.DATA.TYPE.OBJECTID]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.DATE]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.BINARY]=e.DATA.TYPE.TEXT,a}(),initialize:function(a){a=a||{},this.options=this.options||{},this.options.name=this.name,this.options.typeMapping=this.typeMapping,this.options.entities=this.entities,c.extend(this.options,a||{}),this._setEntities(a.entities||{})},_setEntities:function(a){this.entities={};for(var b in a){var c=e.Entity.from(a[b],{store:this,typeMapping:this.options.typeMapping});c.name=c.name||b;var d=c.collection||e.Collection.extend({model:e.Model.extend({})}),f=d.prototype.model; | ||
| d.prototype.entity=f.prototype.entity=b,d.prototype.store=f.prototype.store=this,c.idAttribute=c.idAttribute||f.prototype.idAttribute,this.entities[b]=c}},getEntity:function(a){if(a){var b=a.entity||a,d=c.isString(b)?b:b.name;if(d)return this.entities[d]||(b&&b.name?b:{name:d})}},getCollection:function(a){return c.isString(a)&&(a=this.entities[a]),a&&a.collection?e.Collection.prototype.isPrototypeOf(a.collection)?a.collection:new a.collection:void 0},createModel:function(a,b){if(c.isString(a)&&(a=this.entities[a]),a&&a.collection){var d=a.collection.model||a.collection.prototype.model;if(d)return new d(b)}},getArray:function(a){return c.isArray(a)?a:e.isCollection(a)?a.models:c.isObject(a)?[a]:[]},getDataArray:function(a){var d=[];if(c.isArray(a)||b.Collection.prototype.isPrototypeOf(a))c.each(a,function(a){var b=this.getAttributes(a);b&&d.push(b)});else{var e=this.getAttributes(a);e&&d.push(this.getAttributes(e))}return d},getAttributes:function(a){return b.Model.prototype.isPrototypeOf(a)?a.attributes:c.isObject(a)?a:null},initModel:function(a){},initCollection:function(a){},initEntity:function(a){},sync:function(a,b,c){},fetch:function(a,b){if(!a||a.models||a.attributes||b||(b=a),a&&(a.models||a.attributes)||!b||!b.entity||(a=this.getCollection(b.entity)),a&&a.fetch){var d=c.extend({},b||{},{store:this});return a.fetch(d)}},create:function(a,b,d){if(!a||a.models||d||(b=a,d=b),a&&a.models||!d||!d.entity||(a=this.getCollection(d.entity)),a&&a.create){var e=c.extend({},d||{},{store:this});a.create(b,e)}},save:function(a,b,d){if(!a||a.attributes||d||(b=a,d=b),a&&a.attributes||!d||!d.entity||(a=this.createModel(d.entity)),a&&a.save){var e=c.extend({},d||{},{store:this});a.save(b,e)}},destroy:function(a,b){if(a&&a.destroy){var d=c.extend({},b||{},{store:this});a.destroy(d)}},_checkEntity:function(a,b){if(!e.isEntity(b)){var c=e.Store.CONST.ERROR_NO_ENTITY;return console.error(c),this.handleCallback(a.error,c),this.handleCallback(a.finish,c),!1}return!0},_checkData:function(a,b){if(!(c.isArray(b)&&0!==b.length||c.isObject(b))){var d=e.Store.CONST.ERROR_NO_DATA;return console.error(d),this.handleCallback(a.error,d),this.handleCallback(a.finish,d),!1}return!0},handleSuccess:function(a){var b=Array.prototype.slice.call(arguments,1);a.success&&this.handleCallback.apply(this,[a.success].concat(b)),a.finish&&this.handleCallback.apply(this,[a.finish].concat(b))},handleError:function(a){var b=Array.prototype.slice.call(arguments,1);a.error&&this.handleCallback.apply(this,[a.error].concat(b)),a.finish&&this.handleCallback.apply(this,[a.finish].concat(b))},CONST:{ERROR_NO_ENTITY:"No valid entity specified. ",ERROR_NO_DATA:"No data passed. ",ERROR_LOAD_DATA:"Error while loading data from store. ",ERROR_SAVE_DATA:"Error while saving data to the store. ",ERROR_LOAD_IDS:"Error while loading ids from store. ",ERROR_SAVE_IDS:"Error while saving ids to the store. "}}),e.LocalStorageStore=e.Store.extend({_type:"Bikini.LocalStorageStore",ids:{},sync:function(a,b,d){d=d||{};var f,g=d.store||this.store,h=g.getEntity(b.entity||d.entity||this.entity);if(g&&h&&b){var i=b.id||("create"===a?(new e.ObjectID).toHexString():null);switch(f=d.attrs||b.toJSON(d),a){case"patch":case"update":case"create":"create"!==a&&(f=c.extend(g._getItem(h,i)||{},f)),b.id!==i&&b.idAttribute&&(f[b.idAttribute]=i),g._setItem(h,i,f);break;case"delete":g._removeItem(h,i);break;case"read":if(i)f=g._getItem(h,i);else{f=[];var j=g._getItemIds(h);for(i in j){var k=g._getItem(h,i);k&&f.push(k)}}break;default:return}}f?g.handleSuccess(d,f):g.handleError(d,e.Store.CONST.ERROR_NO_ENTITY)},drop:function(a){var b=this.getEntity(a);if(b&&b.name){for(var c=this._findAllKeys(b),d=0;d<c.length;d++)localStorage.removeItem(c[d]);localStorage.removeItem("__ids__"+b.name),this.handleSuccess(a)}else this.handleError(a,e.Store.CONST.ERROR_NO_ENTITY)},_getKey:function(a,b){return"_"+a.name+"_"+b},_getItem:function(a,b){var c;if(a&&b)try{c=JSON.parse(localStorage.getItem(this._getKey(a,b))),c?a.setId(c,b):this._delItemId(b)}catch(d){console.error(e.Store.CONST.ERROR_LOAD_DATA+d.message)}return c},_setItem:function(a,b,c){if(a&&b&&c)try{localStorage.setItem(this._getKey(a,b),JSON.stringify(c)),this._addItemId(a,b)}catch(d){console.error(e.Store.CONST.ERROR_SAVE_DATA+d.message)}},_removeItem:function(a,b){a&&b&&(localStorage.removeItem(this._getKey(a,b)),this._delItemId(a,b))},_addItemId:function(a,b){var c=this._getItemIds(a);b in c||(c[b]="",this._saveItemIds(a,c))},_delItemId:function(a,b){var c=this._getItemIds(a);b in c&&(delete c[b],this._saveItemIds(a,c))},_findAllKeys:function(a){var b=[],c=this._getKey(a,"");if(c)for(var d,e=localStorage.length,f=0;e>f;f++)d=localStorage.key(f),d&&d===c&&b.push(d);return b},_getItemIds:function(a){try{var b="__ids__"+a.name;return this.ids[a.name]||(this.ids[a.name]=JSON.parse(localStorage.getItem(b))||{}),this.ids[a.name]}catch(c){console.error(e.Store.CONST.ERROR_LOAD_IDS+c.message)}},_saveItemIds:function(a,b){try{var c="__ids__"+a.name;localStorage.setItem(c,JSON.stringify(b))}catch(d){console.error(e.Store.CONST.ERROR_SAVE_IDS+d.message)}}}),e.WebSqlStore=e.Store.extend({_type:"Bikini.WebSqlStore",_selector:null,options:null,name:"bikini",size:1048576,version:"1.0",db:null,dataField:{name:"data",type:"text",required:!0},idField:{name:"id",type:"string",required:!0},typeMapping:function(){var a={};return a[e.DATA.TYPE.OBJECTID]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.DATE]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.OBJECT]=e.DATA.TYPE.TEXT,a[e.DATA.TYPE.ARRAY]=e.DATA.TYPE.TEXT,a[e.DATA.TYPE.BINARY]=e.DATA.TYPE.TEXT,a}(),sqlTypeMapping:function(){var a={};return a[e.DATA.TYPE.STRING]="varchar(255)",a[e.DATA.TYPE.TEXT]="text",a[e.DATA.TYPE.OBJECT]="text",a[e.DATA.TYPE.ARRAY]="text",a[e.DATA.TYPE.FLOAT]="float",a[e.DATA.TYPE.INTEGER]="integer",a[e.DATA.TYPE.DATE]="varchar(255)",a[e.DATA.TYPE.BOOLEAN]="boolean",a}(),initialize:function(a){e.Store.prototype.initialize.apply(this,arguments),this.options=this.options||{},this.options.name=this.name,this.options.size=this.size,this.options.version=this.version,this.options.typeMapping=this.typeMapping,this.options.sqlTypeMapping=this.sqlTypeMapping,c.extend(this.options,a||{}),this._openDb({error:function(a){console.error(a)}})},sync:function(a,b,c){var f=c.store||this.store,g=e.isCollection(b)?b.models:[b],h=new d.Deferred,i=c.success;switch(c.success&&(c.success=function(a){h.resolve(a),i(a)}),c.entity=c.entity||this.entity,a){case"create":f._checkTable(c,function(){f._insertOrReplace(g,c)});break;case"update":case"patch":f._checkTable(c,function(){f._insertOrReplace(g,c)});break;case"delete":f._delete(g,c);break;case"read":var j=this;f._checkTable(c,function(){f._select(j,c)})}return h.promise()},select:function(a){this._select(null,a)},drop:function(a){this._dropTable(a)},createTable:function(a){this._createTable(a)},execute:function(a){this._executeSql(a)},_openDb:function(a){var b,c;if(!this.db)try{if(window.openDatabase){if(this.db=window.openDatabase(this.options.name,"","",this.options.size),this.entities)for(var d in this.entities)this._createTable({entity:this.entities[d]})}else b="Your browser does not support WebSQL databases."}catch(e){c=e}this.db?this.options.version&&this.db.version!==this.options.version?this._updateDb(a):this.handleSuccess(a,this.db):2===c||"2"===c?this._updateDb(a):(!b&&c&&(b=c),this.handleSuccess(a,b))},_updateDb:function(a){var b,d,e=this;try{var f=window.openDatabase(this.options.name,"","",this.options.size);try{var g=this._sqlUpdateDatabase(f.version,this.options.version);f.changeVersion(f.version,this.options.version,function(a){c.each(g,function(b){console.log("sql statement: "+b),d=b,a.executeSql(b)})},function(b){e.handleError(a,b,d)},function(){e.handleSuccess(a)})}catch(h){b=h.message,console.error("webSql change version failed, DB-Version: "+f.version)}}catch(h){b=h.message}b&&this.handleError(a,b)},_sqlUpdateDatabase:function(a,b){var c=[];if(this.entities)for(var d in this.entities){var e=this.entities[d];c.push(this._sqlDropTable(e.name)),c.push(this._sqlCreateTable(e))}return c},_sqlDropTable:function(a){return"DROP TABLE IF EXISTS '"+a+"'"},_isAutoincrementKey:function(a,b){if(a&&b){var c=this.getField(a,b);return c&&c.type===e.DATA.TYPE.INTEGER}},_sqlPrimaryKey:function(a,b){return b&&1===b.length?this._isAutoincrementKey(a,b[0])?b[0]+" INTEGER PRIMARY KEY ASC AUTOINCREMENT UNIQUE":b[0]+" PRIMARY KEY ASC UNIQUE":""},_sqlConstraint:function(a,b){return b&&b.length>1?"PRIMARY KEY ("+b.join(",")+") ON CONFLICT REPLACE":""},_sqlCreateTable:function(a){var b=this,d=a.getKeys(),e=1===d.length?this._sqlPrimaryKey(a,d):"",f=d.length>1?this._sqlConstraint(a,d):a.constraint||"",g="",h=this.getFields(a);c.each(h,function(a){if(!e||a.name!==d[0]){var c=b._dbAttribute(a);c&&(g+=(g?", ":"")+c)}}),g||(g=this._dbAttribute(this.dataField));var i="CREATE TABLE IF NOT EXISTS '"+a.name+"' (";return i+=e?e+", ":"",i+=g,i+=f?", "+f:"",i+=");"},_sqlDelete:function(a,b){var c="DELETE FROM '"+b.name+"'",d=this._sqlWhere(a,b)||this._sqlWhereFromData(a,b);return d&&(c+=" WHERE "+d),c+=a.and?" AND "+a.and:""},_sqlWhere:function(a,b){this._selector=null;var d="";return c.isString(a.where)?d=a.where:c.isObject(a.where)&&(this._selector=e.SqlSelector.create(a.where,b),d=this._selector.buildStatement()),d},_sqlWhereFromData:function(a,b){var d=this,e=[];if(a&&a.models&&b&&b.idAttribute){var f,g=b.idAttribute,h=this.getField(b,g);if(c.each(a.models,function(a){f=a.id,c.isUndefined(f)||e.push(d._sqlValue(f,h))}),e.length>0)return g+" IN ("+e.join(",")+")"}return""},_sqlSelect:function(a,b){var c="SELECT ";a.fields?a.fields.length>1?c+=a.fields.join(", "):1===a.fields.length&&(c+=a.fields[0]):c+="*",c+=" FROM '"+b.name+"'",a.join&&(c+=" JOIN "+a.join),a.leftJoin&&(c+=" LEFT JOIN "+a.leftJoin);var d=this._sqlWhere(a,b)||this._sqlWhereFromData(a,b);return d&&(c+=" WHERE "+d),a.order&&(c+=" ORDER BY "+a.order),a.limit&&(c+=" LIMIT "+a.limit),a.offset&&(c+=" OFFSET "+a.offset),c},_sqlValue:function(a,b){var c=b&&b.type?b.type:e.Field.prototype.detectType(a);return c===e.DATA.TYPE.INTEGER||c===e.DATA.TYPE.FLOAT?a:c===e.DATA.TYPE.BOOLEAN?a?"1":"0":c===e.DATA.TYPE.NULL?"NULL":(a=e.Field.prototype.transform(a,e.DATA.TYPE.STRING),a=a.replace(/"/g,'""'),'"'+a+'"')},_dbAttribute:function(a){if(a&&a.name){var b=this.options.sqlTypeMapping[a.type],c=a.required?" NOT NULL":"";if(b)return a.name+" "+b.toUpperCase()+c}},_dropTable:function(a){var b=this.getEntity(a);if(b.db=null,this._checkDb(a)&&b){var c=this._sqlDropTable(b.name);this._executeTransaction(a,[c])}},_createTable:function(a){var b=this.getEntity(a);if(b.db=this.db,this._checkDb(a)&&this._checkEntity(a,b)){var c=this._sqlCreateTable(b);this._executeTransaction(a,[c])}},_checkTable:function(a,b){var c=this.getEntity(a);c&&!c.db?this._createTable({success:function(){b()},error:function(b){this.handleError(a,b)},entity:c}):b()},_insertOrReplace:function(a,b){var d=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,d)&&this._checkData(b,a)){for(var f=this._isAutoincrementKey(d,d.getKey()),g=[],h="INSERT OR REPLACE INTO '"+d.name+"' (",i=0;i<a.length;i++){var j=a[i],k="";f||j.id||!j.idAttribute||j.set(j.idAttribute,(new e.ObjectID).toHexString());var l,m,n=b.attrs||j.toJSON();if(c.isEmpty(d.fields)?(l=[j.id,JSON.stringify(n)],m=["id","data"]):(l=c.values(n),m=c.keys(n)),l.length>0){var o=new Array(l.length).join("?,")+"?",p="'"+m.join("','")+"'";k+=h+p+") VALUES ("+o+");",g.push({statement:k,arguments:l})}}this._executeTransaction(b,g)}},_select:function(a,b){var d=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,d)){var f,g=e.isCollection(a);g?a=[]:b.models=[a];var h=this._sqlSelect(b,d),i=this;this.db.readTransaction(function(b){var e=h.statement||h,j=h.arguments;f=e,console.log("sql statement: "+e),j&&console.log(" arguments: "+JSON.stringify(j)),b.executeSql(e,j,function(b,e){for(var f=e.rows.length,h=0;f>h;h++){var j,k=e.rows.item(h);if(c.isEmpty(d.fields)&&i._hasDefaultFields(k))try{j=JSON.parse(k.data)}catch(l){}else j=k;if(j&&(!i._selector||i._selector.matches(j))){if(!g){a=j;break}a.push(j)}}},function(a,b){console.error("webSql error: "+b.message)})},function(a){console.error("WebSql Syntax Error: "+a.message),i.handleError(b,a.message,f)},function(){i.handleSuccess(b,a)})}},_delete:function(a,b){var c=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,c)){b.models=a;var d=this._sqlDelete(b,c);this._executeTransaction(b,[d])}},_executeSql:function(a){a.sql&&this._executeTransaction(a,[a.sql])},_executeTransaction:function(a,b){var d,e;if(this._checkDb(a)){var f=this;try{this.db.transaction(function(a){c.each(b,function(b){var c=b.statement||b,d=b.arguments;e=c,console.log("sql statement: "+c),d&&console.log(" arguments: "+JSON.stringify(d)),a.executeSql(c,d)})},function(b){console.error(b.message),f.handleError(a,b.message,e)},function(){f.handleSuccess(a)})}catch(g){console.error(g.message)}}d&&this.handleCallback(a.error,d,e)},_hasDefaultFields:function(a){return c.every(c.keys(a),function(a){return a===this.idField.name||a===this.dataField.name},this)},_checkDb:function(a){if(!this.db){var b="db handler not initialized.";return console.error(b),this.handleError(a,b),!1}return!0},getFields:function(a){if(c.isEmpty(a.fields)){var b={};b.data=this.dataField;var d=a.idAttribute||"id";return b[d]=this.idField,b}return a.fields},getField:function(a,b){return this.getFields(a)[b]}}),e.BikiniStore=e.Store.extend({_type:"Bikini.BikiniStore",_selector:null,endpoints:{},options:null,localStore:e.WebSqlStore,useLocalStore:!0,useSocketNotify:!0,useOfflineChanges:!0,isConnected:!1,typeMapping:{binary:"text",date:"string"},initialize:function(a){console.log("Bikini.BikiniStore.initialize"),e.Store.prototype.initialize.apply(this,arguments),this.options=this.options||{},this.options.useLocalStore=this.useLocalStore,this.options.useSocketNotify=this.useSocketNotify,this.options.useOfflineChanges=this.useOfflineChanges,this.options.query=a.query||!1,this.options.socketPath=this.socketPath,this.options.localStore=this.localStore,this.options.typeMapping=this.typeMapping,this.options.useSocketNotify&&"object"!=typeof io&&(console.log("Socket.IO not present !!"),this.options.useSocketNotify=!1),c.extend(this.options,a||{})},initCollection:function(a){console.log("Bikini.BikiniStore.initCollection");var b=a.getUrlRoot();"/"!==b.charAt(b.length-1)&&(b+="/");var c=this.getEntity(a.entity);if(b&&c){var d=c.name,e=this._locationBasedHashCode(b),f=c.credentials||a.credentials,g=f&&f.username?f.username:"",h=d+g+e;a.channel=h;var i=this,j=this.endpoints[e];if(!j){var k=this.getLocation(b);j={},j.baseUrl=b,j.readUrl=a.getUrl(),j.host=k.protocol+"//"+k.host,j.path=k.pathname,j.entity=c,j.channel=h,j.credentials=f,j.socketPath=this.options.socketPath,j.localStore=this.createLocalStore(j),j.messages=this.createMsgCollection(j),j.socket=this.createSocket(j),j.info=this.fetchServerInfo(j),i.endpoints[e]=j}a.endpoint=j,a.listenTo(this,j.channel,this.onMessage,a)}},getEndpoint:function(a){if(console.log("Bikini.BikiniStore.getEndpoint"),a){var b=this._locationBasedHashCode(a);return this.endpoints[b]}},createLocalStore:function(a,b){if(console.log("Bikini.BikiniStore.createLocalStore"),this.options.useLocalStore&&a){var c={};return c[a.entity.name]={name:a.channel,idAttribute:b},this.options.localStore.create({entities:c})}},createMsgCollection:function(a){if(this.options.useOfflineChanges&&a){var b="msg-"+a.channel,c={};c[b]={name:b,idAttribute:"id"};var d=e.Collection.design({url:a.url,entity:b,store:this.options.localStore.create({entities:c})}),f=this;return d.fetch({success:function(){f.sendMessages(a)}}),d}},createSocket:function(a,b){if(console.log("Bikini.BikiniStore.createSocket"),this.options.useSocketNotify&&a&&a.socketPath){var c=this,d=a.host,e=a.path,f=this.getLocation(d);""===f.port&&("https:"===f.protocol?d+=":443":"http:"===f.protocol&&(d+=":80")),e=a.socketPath;var g=e&&0===e.indexOf("/")?e.substr(1):e,h={resource:g};return this.options.socketQuery&&(h.query=this.options.socketQuery),a.socket=io.connect(d,h),a.socket.on("connect",function(){c._bindChannel(a,b),c.onConnect(a)}),a.socket.on("disconnect",function(){console.log("socket.io: disconnect"),c.onDisconnect(a)}),a.socket}},_bindChannel:function(a,b){console.log("Bikini.BikiniStore._bindChannel");var c=this;if(a&&a.socket){var d=a.channel,e=a.socket,f=this.getLastMessageTime(d);b=b||a.entity.name,e.on(d,function(a){a&&(c.trigger(d,a),c.options.useLocalStore&&c.setLastMessageTime(d,a.time))}),e.emit("bind",{entity:b,channel:d,time:f})}},getLastMessageTime:function(a){return void 0!==this.lastMesgTime?this.lastMesgTime:(console.log("Bikini.BikiniStore.getLastMessageTime"),this.lastMesgTime=localStorage.getItem("__"+a+"lastMesgTime")||0,this.lastMesgTime)},setLastMessageTime:function(a,b){b&&b>this.getLastMessageTime()&&(console.log("Bikini.BikiniStore.setLastMessageTime"),localStorage.setItem("__"+a+"lastMesgTime",b),this.lastMesgTime=b)},_hashCode:function(a){console.log("Bikini.BikiniStore._hashCode");var b,c=0;if(0===a.length)return c;for(var d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=(c<<5)-c+b,c|=0;return c},_locationBasedHashCode:function(a){return console.log("Bikini.BikiniStore._locationBasedHashCode"),this._hashCode(this._getLocationUrl(a))},_getLocationUrl:function(a){return console.log("Bikini.BikiniStore._getLocationUrl"),this.getLocation(a).toString()},_getLocation:function(a){console.log("Bikini.BikiniStore._getLocation");var b=document.createElement("a");return b.href=a||this.url,""===b.host&&(b.href=b.href),b},onConnect:function(a){console.log("Bikini.BikiniStore.onConnect"),this.isConnected=!0,this.fetchChanges(a),this.sendMessages(a)},onDisconnect:function(a){console.log("Bikini.BikiniStore.onDisconnect"),this.isConnected=!1,a.socket&&a.socket.socket&&a.socket.socket.onDisconnect()},onMessage:function(a){if(console.log("Bikini.BikiniStore.onMessage"),a){var b=this.endpoint?this.endpoint.localStore:null,c=null,d=null,e=null,f={store:b,entity:this.entity,merge:!0,fromMessage:!0,parse:!0};switch(a.id&&a.method?(c=a.data||{},d=a.method,e=a.id):a.attributes&&(c=a.attributes.data,d=a.attributes.method,e=a.attributes.id),d){case"patch":case"update":case"create":f.patch="patch"===d;var g=e?this.get(e):null;g?g.save(c,f):this.create(c,f);break;case"delete":if(e)if("all"===e){for(;g=this.first();)b&&b.sync.apply(this,["delete",g,{store:b,fromMessage:!0}]),this.remove(g);this.store.setLastMessageTime(this.endpoint.channel,"")}else{var h=this.get(e);h&&h.destroy(f)}}}},sync:function(a,b,c){console.log("Bikini.BikiniStore.sync");var d=c.store||this.store;if(c.fromMessage)return d.handleCallback(c.success);var f=d.getEndpoint(this.getUrlRoot()),g=null;if(d&&f){var h=this.channel;e.isModel(b)&&!b.id&&b.set(b.idAttribute,(new e.ObjectID).toHexString());var i=d.getLastMessageTime(h);return"read"===a&&f.localStore&&i?"read"===a&&(g=d.fetchChanges(f)):g=d.addMessage(a,b,f.localStore?{}:c,f),f.localStore&&(c.store=f.localStore,f.localStore.sync.apply(this,arguments)),g}},addMessage:function(a,b,d,e){var f=this;if(a&&b){var g=b.changedSinceSync,h=null,i=!0;switch(a){case"update":case"create":h=d.attrs||b.toJSON();break;case"patch":if(c.isEmpty(g))return;h=b.toJSON({attrs:g});break;case"delete":break;default:i=!1}var j={_id:b.id,id:b.id,method:a,data:h},k=function(a,c){return f.emitMessage(a,c,d,b)};return i?this.storeMessage(e,j,k):k(e,j)}},emitMessage:function(a,b,d,f){var g=a.channel,h=this,i=e.isModel(f)||"read"!==b.method?a.baseUrl:a.readUrl;return b.id&&"create"!==b.method&&(i+=("/"===i.charAt(i.length-1)?"":"/")+b.id),f.sync.apply(f,[b.method,f,{url:i,error:function(c,e){!c.responseText&&h.options.useOfflineChanges?(h.onDisconnect(a),h.handleCallback(d.success,b.data)):h.removeMessage(a,b,function(a,b){h.handleCallback(d.error,e)})},success:function(e){h.isConnected||h.onConnect(a),h.removeMessage(a,b,function(a,b){if(d.success){var f=e;h.handleCallback(d.success,f)}else if("read"===b.method)for(var i=c.isArray(e)?e:[e],j=0;j<i.length;j++)e=i[j],e&&h.trigger(g,{id:e[a.entity.idAttribute]||e._id,method:"update",data:e});else h.trigger(g,b)})},store:{}}])},fetchChanges:function(a){var b=this,c=a?a.channel:"",d=b.getLastMessageTime(c);if(a&&a.baseUrl&&c&&d){var f=new e.Collection({});return f.fetch({url:a.baseUrl+"changes/"+d,success:function(a,d,e){return f.each(function(a){a.get("time")&&a.get("method")&&(b.options.useLocalStore&&b.setLastMessageTime(c,a.get("time")),b.trigger(c,a))}),e.xhr},credentials:a.credentials})}},fetchServerInfo:function(a){var b=this;if(a&&a.baseUrl){var c=new e.Model,d=b.getLastMessageTime(a.channel),f=a.baseUrl;return"/"!==f.charAt(f.length-1)&&(f+="/"),c.fetch({url:f+"info",success:function(e,f,g){if(!d&&c.get("time")&&b.setLastMessageTime(a.channel,c.get("time")),!a.socketPath&&c.get("socketPath")){a.socketPath=c.get("socketPath");var h=c.get("entity")||a.entity.name;b.options.useSocketNotify&&(a.socket=b.createSocket(a,h))}return g.xhr},credentials:a.credentials})}},sendMessages:function(a){if(a&&a.messages){var b=this;a.messages.each(function(c){var d;try{d=JSON.parse(c.get("msg"))}catch(e){}var f=c.get("channel");if(d&&f){var g=b.createModel({collection:a.messages},d.data);b.emitMessage(a,d,{},g)}else c.destroy()})}},mergeMessages:function(a,b){return a},storeMessage:function(a,b,d){if(a&&a.messages&&b){var e=a.channel,f=a.messages.get(b._id);if(f){var g=JSON.parse(f.get("msg"));f.save({msg:JSON.stringify(c.extend(g,b))})}else a.messages.create({_id:b._id,id:b.id,msg:JSON.stringify(b),channel:e})}return d(a,b)},removeMessage:function(a,b,c){if(a&&a.messages){var d=a.messages.get(b._id);d&&d.destroy()}return c(a,b)},clear:function(a){if(a){var b=this.getEndpoint(a.getUrlRoot());b&&(b.messages&&b.messages.destroy(),a.reset(),this.setLastMessageTime(b.channel,""))}},getLocation:function(a){var b=document.createElement("a");return b.href=a||this.url,""===b.host&&(b.href=b.href),b}})}(this,Backbone,_,$); | ||
| d.prototype.entity=f.prototype.entity=b,d.prototype.store=f.prototype.store=this,c.idAttribute=c.idAttribute||f.prototype.idAttribute,this.entities[b]=c}},getEntity:function(a){if(a){var b=a.entity||a,d=c.isString(b)?b:b.name;if(d)return this.entities[d]||(b&&b.name?b:{name:d})}},getCollection:function(a){return c.isString(a)&&(a=this.entities[a]),a&&a.collection?e.Collection.prototype.isPrototypeOf(a.collection)?a.collection:new a.collection:void 0},createModel:function(a,b){if(c.isString(a)&&(a=this.entities[a]),a&&a.collection){var d=a.collection.model||a.collection.prototype.model;if(d)return new d(b)}},getArray:function(a){return c.isArray(a)?a:e.isCollection(a)?a.models:c.isObject(a)?[a]:[]},getDataArray:function(a){var d=[];if(c.isArray(a)||b.Collection.prototype.isPrototypeOf(a))c.each(a,function(a){var b=this.getAttributes(a);b&&d.push(b)});else{var e=this.getAttributes(a);e&&d.push(this.getAttributes(e))}return d},getAttributes:function(a){return b.Model.prototype.isPrototypeOf(a)?a.attributes:c.isObject(a)?a:null},initModel:function(a){},initCollection:function(a){},initEntity:function(a){},sync:function(a,b,c){},fetch:function(a,b){if(!a||a.models||a.attributes||b||(b=a),a&&(a.models||a.attributes)||!b||!b.entity||(a=this.getCollection(b.entity)),a&&a.fetch){var d=c.extend({},b||{},{store:this});return a.fetch(d)}},create:function(a,b,d){if(!a||a.models||d||(b=a,d=b),a&&a.models||!d||!d.entity||(a=this.getCollection(d.entity)),a&&a.create){var e=c.extend({},d||{},{store:this});a.create(b,e)}},save:function(a,b,d){if(!a||a.attributes||d||(b=a,d=b),a&&a.attributes||!d||!d.entity||(a=this.createModel(d.entity)),a&&a.save){var e=c.extend({},d||{},{store:this});a.save(b,e)}},destroy:function(a,b){if(a&&a.destroy){var d=c.extend({},b||{},{store:this});a.destroy(d)}},_checkEntity:function(a,b){if(!e.isEntity(b)){var c=e.Store.CONST.ERROR_NO_ENTITY;return console.error(c),this.handleCallback(a.error,c),this.handleCallback(a.finish,c),!1}return!0},_checkData:function(a,b){if(!(c.isArray(b)&&0!==b.length||c.isObject(b))){var d=e.Store.CONST.ERROR_NO_DATA;return console.error(d),this.handleCallback(a.error,d),this.handleCallback(a.finish,d),!1}return!0},handleSuccess:function(a){var b=Array.prototype.slice.call(arguments,1);a.success&&this.handleCallback.apply(this,[a.success].concat(b)),a.finish&&this.handleCallback.apply(this,[a.finish].concat(b))},handleError:function(a){var b=Array.prototype.slice.call(arguments,1);a.error&&this.handleCallback.apply(this,[a.error].concat(b)),a.finish&&this.handleCallback.apply(this,[a.finish].concat(b))},CONST:{ERROR_NO_ENTITY:"No valid entity specified. ",ERROR_NO_DATA:"No data passed. ",ERROR_LOAD_DATA:"Error while loading data from store. ",ERROR_SAVE_DATA:"Error while saving data to the store. ",ERROR_LOAD_IDS:"Error while loading ids from store. ",ERROR_SAVE_IDS:"Error while saving ids to the store. "}}),e.LocalStorageStore=e.Store.extend({_type:"Bikini.LocalStorageStore",ids:{},sync:function(a,b,d){d=d||{};var f,g=d.store||this.store,h=g.getEntity(b.entity||d.entity||this.entity);if(g&&h&&b){var i=b.id||("create"===a?(new e.ObjectID).toHexString():null);switch(f=d.attrs||b.toJSON(d),a){case"patch":case"update":case"create":"create"!==a&&(f=c.extend(g._getItem(h,i)||{},f)),b.id!==i&&b.idAttribute&&(f[b.idAttribute]=i),g._setItem(h,i,f);break;case"delete":g._removeItem(h,i);break;case"read":if(i)f=g._getItem(h,i);else{f=[];var j=g._getItemIds(h);for(i in j){var k=g._getItem(h,i);k&&f.push(k)}}break;default:return}}f?g.handleSuccess(d,f):g.handleError(d,e.Store.CONST.ERROR_NO_ENTITY)},drop:function(a){var b=this.getEntity(a);if(b&&b.name){for(var c=this._findAllKeys(b),d=0;d<c.length;d++)localStorage.removeItem(c[d]);localStorage.removeItem("__ids__"+b.name),this.handleSuccess(a)}else this.handleError(a,e.Store.CONST.ERROR_NO_ENTITY)},_getKey:function(a,b){return"_"+a.name+"_"+b},_getItem:function(a,b){var c;if(a&&b)try{c=JSON.parse(localStorage.getItem(this._getKey(a,b))),c?a.setId(c,b):this._delItemId(b)}catch(d){console.error(e.Store.CONST.ERROR_LOAD_DATA+d.message)}return c},_setItem:function(a,b,c){if(a&&b&&c)try{localStorage.setItem(this._getKey(a,b),JSON.stringify(c)),this._addItemId(a,b)}catch(d){console.error(e.Store.CONST.ERROR_SAVE_DATA+d.message)}},_removeItem:function(a,b){a&&b&&(localStorage.removeItem(this._getKey(a,b)),this._delItemId(a,b))},_addItemId:function(a,b){var c=this._getItemIds(a);b in c||(c[b]="",this._saveItemIds(a,c))},_delItemId:function(a,b){var c=this._getItemIds(a);b in c&&(delete c[b],this._saveItemIds(a,c))},_findAllKeys:function(a){var b=[],c=this._getKey(a,"");if(c)for(var d,e=localStorage.length,f=0;e>f;f++)d=localStorage.key(f),d&&d===c&&b.push(d);return b},_getItemIds:function(a){try{var b="__ids__"+a.name;return this.ids[a.name]||(this.ids[a.name]=JSON.parse(localStorage.getItem(b))||{}),this.ids[a.name]}catch(c){console.error(e.Store.CONST.ERROR_LOAD_IDS+c.message)}},_saveItemIds:function(a,b){try{var c="__ids__"+a.name;localStorage.setItem(c,JSON.stringify(b))}catch(d){console.error(e.Store.CONST.ERROR_SAVE_IDS+d.message)}}}),e.WebSqlStore=e.Store.extend({_type:"Bikini.WebSqlStore",_selector:null,options:null,name:"bikini",size:1048576,version:"1.0",db:null,dataField:{name:"data",type:"text",required:!0},idField:{name:"id",type:"string",required:!0},typeMapping:function(){var a={};return a[e.DATA.TYPE.OBJECTID]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.DATE]=e.DATA.TYPE.STRING,a[e.DATA.TYPE.OBJECT]=e.DATA.TYPE.TEXT,a[e.DATA.TYPE.ARRAY]=e.DATA.TYPE.TEXT,a[e.DATA.TYPE.BINARY]=e.DATA.TYPE.TEXT,a}(),sqlTypeMapping:function(){var a={};return a[e.DATA.TYPE.STRING]="varchar(255)",a[e.DATA.TYPE.TEXT]="text",a[e.DATA.TYPE.OBJECT]="text",a[e.DATA.TYPE.ARRAY]="text",a[e.DATA.TYPE.FLOAT]="float",a[e.DATA.TYPE.INTEGER]="integer",a[e.DATA.TYPE.DATE]="varchar(255)",a[e.DATA.TYPE.BOOLEAN]="boolean",a}(),initialize:function(a){e.Store.prototype.initialize.apply(this,arguments),this.options=this.options||{},this.options.name=this.name,this.options.size=this.size,this.options.version=this.version,this.options.typeMapping=this.typeMapping,this.options.sqlTypeMapping=this.sqlTypeMapping,c.extend(this.options,a||{}),this._openDb({error:function(a){console.error(a)}})},sync:function(a,b,c){var f=c.store||this.store,g=e.isCollection(b)?b.models:[b],h=new d.Deferred,i=c.success;switch(c.success&&(c.success=function(a){h.resolve(a),i(a)}),c.entity=c.entity||this.entity,a){case"create":f._checkTable(c,function(){f._insertOrReplace(g,c)});break;case"update":case"patch":f._checkTable(c,function(){f._insertOrReplace(g,c)});break;case"delete":f._delete(g,c);break;case"read":var j=this;f._checkTable(c,function(){f._select(j,c)})}return h.promise()},select:function(a){this._select(null,a)},drop:function(a){this._dropTable(a)},createTable:function(a){this._createTable(a)},execute:function(a){this._executeSql(a)},_openDb:function(a){var b,c;if(!this.db)try{if(window.openDatabase){if(this.db=window.openDatabase(this.options.name,"","",this.options.size),this.entities)for(var d in this.entities)this._createTable({entity:this.entities[d]})}else b="Your browser does not support WebSQL databases."}catch(e){c=e}this.db?this.options.version&&this.db.version!==this.options.version?this._updateDb(a):this.handleSuccess(a,this.db):2===c||"2"===c?this._updateDb(a):(!b&&c&&(b=c),this.handleSuccess(a,b))},_updateDb:function(a){var b,d,e=this;try{var f=window.openDatabase(this.options.name,"","",this.options.size);try{var g=this._sqlUpdateDatabase(f.version,this.options.version);f.changeVersion(f.version,this.options.version,function(a){c.each(g,function(b){console.log("sql statement: "+b),d=b,a.executeSql(b)})},function(b){e.handleError(a,b,d)},function(){e.handleSuccess(a)})}catch(h){b=h.message,console.error("webSql change version failed, DB-Version: "+f.version)}}catch(h){b=h.message}b&&this.handleError(a,b)},_sqlUpdateDatabase:function(a,b){var c=[];if(this.entities)for(var d in this.entities){var e=this.entities[d];c.push(this._sqlDropTable(e.name)),c.push(this._sqlCreateTable(e))}return c},_sqlDropTable:function(a){return"DROP TABLE IF EXISTS '"+a+"'"},_isAutoincrementKey:function(a,b){if(a&&b){var c=this.getField(a,b);return c&&c.type===e.DATA.TYPE.INTEGER}},_sqlPrimaryKey:function(a,b){return b&&1===b.length?this._isAutoincrementKey(a,b[0])?b[0]+" INTEGER PRIMARY KEY ASC AUTOINCREMENT UNIQUE":b[0]+" PRIMARY KEY ASC UNIQUE":""},_sqlConstraint:function(a,b){return b&&b.length>1?"PRIMARY KEY ("+b.join(",")+") ON CONFLICT REPLACE":""},_sqlCreateTable:function(a){var b=this,d=a.getKeys(),e=1===d.length?this._sqlPrimaryKey(a,d):"",f=d.length>1?this._sqlConstraint(a,d):a.constraint||"",g="",h=this.getFields(a);c.each(h,function(a){if(!e||a.name!==d[0]){var c=b._dbAttribute(a);c&&(g+=(g?", ":"")+c)}}),g||(g=this._dbAttribute(this.dataField));var i="CREATE TABLE IF NOT EXISTS '"+a.name+"' (";return i+=e?e+", ":"",i+=g,i+=f?", "+f:"",i+=");"},_sqlDelete:function(a,b){var c="DELETE FROM '"+b.name+"'",d=this._sqlWhere(a,b)||this._sqlWhereFromData(a,b);return d&&(c+=" WHERE "+d),c+=a.and?" AND "+a.and:""},_sqlWhere:function(a,b){this._selector=null;var d="";return c.isString(a.where)?d=a.where:c.isObject(a.where)&&(this._selector=e.SqlSelector.create(a.where,b),d=this._selector.buildStatement()),d},_sqlWhereFromData:function(a,b){var d=this,e=[];if(a&&a.models&&b&&b.idAttribute){var f,g=b.idAttribute,h=this.getField(b,g);if(c.each(a.models,function(a){f=a.id,c.isUndefined(f)||e.push(d._sqlValue(f,h))}),e.length>0)return g+" IN ("+e.join(",")+")"}return""},_sqlSelect:function(a,b){var c="SELECT ";a.fields?a.fields.length>1?c+=a.fields.join(", "):1===a.fields.length&&(c+=a.fields[0]):c+="*",c+=" FROM '"+b.name+"'",a.join&&(c+=" JOIN "+a.join),a.leftJoin&&(c+=" LEFT JOIN "+a.leftJoin);var d=this._sqlWhere(a,b)||this._sqlWhereFromData(a,b);return d&&(c+=" WHERE "+d),a.order&&(c+=" ORDER BY "+a.order),a.limit&&(c+=" LIMIT "+a.limit),a.offset&&(c+=" OFFSET "+a.offset),c},_sqlValue:function(a,b){var c=b&&b.type?b.type:e.Field.prototype.detectType(a);return c===e.DATA.TYPE.INTEGER||c===e.DATA.TYPE.FLOAT?a:c===e.DATA.TYPE.BOOLEAN?a?"1":"0":c===e.DATA.TYPE.NULL?"NULL":(a=e.Field.prototype.transform(a,e.DATA.TYPE.STRING),a=a.replace(/"/g,'""'),'"'+a+'"')},_dbAttribute:function(a){if(a&&a.name){var b=this.options.sqlTypeMapping[a.type],c=a.required?" NOT NULL":"";if(b)return a.name+" "+b.toUpperCase()+c}},_dropTable:function(a){var b=this.getEntity(a);if(b.db=null,this._checkDb(a)&&b){var c=this._sqlDropTable(b.name);this._executeTransaction(a,[c])}},_createTable:function(a){var b=this.getEntity(a);if(b.db=this.db,this._checkDb(a)&&this._checkEntity(a,b)){var c=this._sqlCreateTable(b);this._executeTransaction(a,[c])}},_checkTable:function(a,b){var c=this.getEntity(a);c&&!c.db?this._createTable({success:function(){b()},error:function(b){this.handleError(a,b)},entity:c}):b()},_insertOrReplace:function(a,b){var d=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,d)&&this._checkData(b,a)){for(var f=this._isAutoincrementKey(d,d.getKey()),g=[],h="INSERT OR REPLACE INTO '"+d.name+"' (",i=0;i<a.length;i++){var j=a[i],k="";f||j.id||!j.idAttribute||j.set(j.idAttribute,(new e.ObjectID).toHexString());var l,m,n=b.attrs||j.toJSON();if(c.isEmpty(d.fields)?(l=[j.id,JSON.stringify(n)],m=["id","data"]):(l=c.values(n),m=c.keys(n)),l.length>0){var o=new Array(l.length).join("?,")+"?",p="'"+m.join("','")+"'";k+=h+p+") VALUES ("+o+");",g.push({statement:k,arguments:l})}}this._executeTransaction(b,g)}},_select:function(a,b){var d=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,d)){var f,g=e.isCollection(a);g?a=[]:b.models=[a];var h=this._sqlSelect(b,d),i=this;this.db.readTransaction(function(b){var e=h.statement||h,j=h.arguments;f=e,console.log("sql statement: "+e),j&&console.log(" arguments: "+JSON.stringify(j)),b.executeSql(e,j,function(b,e){for(var f=e.rows.length,h=0;f>h;h++){var j,k=e.rows.item(h);if(c.isEmpty(d.fields)&&i._hasDefaultFields(k))try{j=JSON.parse(k.data)}catch(l){}else j=k;if(j&&(!i._selector||i._selector.matches(j))){if(!g){a=j;break}a.push(j)}}},function(a,b){console.error("webSql error: "+b.message)})},function(a){console.error("WebSql Syntax Error: "+a.message),i.handleError(b,a.message,f)},function(){i.handleSuccess(b,a)})}},_delete:function(a,b){var c=this.getEntity(b);if(this._checkDb(b)&&this._checkEntity(b,c)){b.models=a;var d=this._sqlDelete(b,c);this._executeTransaction(b,[d])}},_executeSql:function(a){a.sql&&this._executeTransaction(a,[a.sql])},_executeTransaction:function(a,b){var d,e;if(this._checkDb(a)){var f=this;try{this.db.transaction(function(a){c.each(b,function(b){var c=b.statement||b,d=b.arguments;e=c,console.log("sql statement: "+c),d&&console.log(" arguments: "+JSON.stringify(d)),a.executeSql(c,d)})},function(b){console.error(b.message),f.handleError(a,b.message,e)},function(){f.handleSuccess(a)})}catch(g){console.error(g.message)}}d&&this.handleCallback(a.error,d,e)},_hasDefaultFields:function(a){return c.every(c.keys(a),function(a){return a===this.idField.name||a===this.dataField.name},this)},_checkDb:function(a){if(!this.db){var b="db handler not initialized.";return console.error(b),this.handleError(a,b),!1}return!0},getFields:function(a){if(c.isEmpty(a.fields)){var b={};b.data=this.dataField;var d=a.idAttribute||"id";return b[d]=this.idField,b}return a.fields},getField:function(a,b){return this.getFields(a)[b]}}),e.BikiniStore=e.Store.extend({_type:"Bikini.BikiniStore",_selector:null,endpoints:{},options:null,localStore:e.WebSqlStore,useLocalStore:!0,useSocketNotify:!0,useOfflineChanges:!0,isConnected:!1,typeMapping:{binary:"text",date:"string"},initialize:function(a){console.log("Bikini.BikiniStore.initialize"),e.Store.prototype.initialize.apply(this,arguments),this.options=this.options||{},this.options.useLocalStore=this.useLocalStore,this.options.useSocketNotify=this.useSocketNotify,this.options.useOfflineChanges=this.useOfflineChanges,this.options.query=a.query||!1,this.options.socketPath=this.socketPath,this.options.localStore=this.localStore,this.options.typeMapping=this.typeMapping,this.options.useSocketNotify&&"object"!=typeof io&&(console.log("Socket.IO not present !!"),this.options.useSocketNotify=!1),c.extend(this.options,a||{})},initCollection:function(a){console.log("Bikini.BikiniStore.initCollection");var b=a.getUrlRoot();"/"!==b.charAt(b.length-1)&&(b+="/");var c=this.getEntity(a.entity);if(b&&c){var d=c.name,e=this._locationBasedHashCode(b),f=c.credentials||a.credentials,g=f&&f.username?f.username:"",h=d+g+e;a.channel=h;var i=this,j=this.endpoints[e];if(!j){var k=this.getLocation(b);j={},j.baseUrl=b,j.readUrl=a.getUrl(),j.host=k.protocol+"//"+k.host,j.path=k.pathname,j.entity=c,j.channel=h,j.credentials=f,j.socketPath=this.options.socketPath,j.localStore=this.createLocalStore(j),j.messages=this.createMsgCollection(j),j.socket=this.createSocket(j),j.info=this.fetchServerInfo(j),i.endpoints[e]=j}a.endpoint=j,a.listenTo(this,j.channel,this.onMessage,a)}},getEndpoint:function(a){if(console.log("Bikini.BikiniStore.getEndpoint"),a){var b=this._locationBasedHashCode(a);return this.endpoints[b]}},createLocalStore:function(a,b){if(console.log("Bikini.BikiniStore.createLocalStore"),this.options.useLocalStore&&a){var c={};return c[a.entity.name]={name:a.channel,idAttribute:b},this.options.localStore.create({entities:c})}},createMsgCollection:function(a){if(this.options.useOfflineChanges&&a){var b="msg-"+a.channel,c={};c[b]={name:b,idAttribute:"id"};var d=e.Collection.design({url:a.url,entity:b,store:this.options.localStore.create({entities:c})}),f=this;return d.fetch({success:function(){f.sendMessages(a)}}),d}},createSocket:function(a,b){if(console.log("Bikini.BikiniStore.createSocket"),this.options.useSocketNotify&&a&&a.socketPath){var c=this,d=a.host,e=a.path,f=this.getLocation(d);""===f.port&&("https:"===f.protocol?d+=":443":"http:"===f.protocol&&(d+=":80")),e=a.socketPath;var g=e&&0===e.indexOf("/")?e.substr(1):e,h={resource:g};this.options.socketQuery&&(h.query=this.options.socketQuery),a.socket=io.connect(d,h),a.socket.on("connect",function(){c._bindChannel(a,b),c.onConnect(a)}),a.socket.on("disconnect",function(){console.log("socket.io: disconnect"),c.onDisconnect(a)});var i=a.channel;return a.socket.on(i,function(a){a&&(c.trigger(i,a),c.options.useLocalStore&&c.setLastMessageTime(i,a.time))}),a.socket}},_bindChannel:function(a,b){console.log("Bikini.BikiniStore._bindChannel");if(a&&a.socket){var c=a.channel,d=a.socket,e=this.getLastMessageTime(c);b=b||a.entity.name,d.emit("bind",{entity:b,channel:c,time:e})}},getLastMessageTime:function(a){return void 0!==this.lastMesgTime?this.lastMesgTime:(console.log("Bikini.BikiniStore.getLastMessageTime"),this.lastMesgTime=localStorage.getItem("__"+a+"lastMesgTime")||0,this.lastMesgTime)},setLastMessageTime:function(a,b){b&&b>this.getLastMessageTime()&&(console.log("Bikini.BikiniStore.setLastMessageTime"),localStorage.setItem("__"+a+"lastMesgTime",b),this.lastMesgTime=b)},_hashCode:function(a){console.log("Bikini.BikiniStore._hashCode");var b,c=0;if(0===a.length)return c;for(var d=0,e=a.length;e>d;d++)b=a.charCodeAt(d),c=(c<<5)-c+b,c|=0;return c},_locationBasedHashCode:function(a){return console.log("Bikini.BikiniStore._locationBasedHashCode"),this._hashCode(this._getLocationUrl(a))},_getLocationUrl:function(a){return console.log("Bikini.BikiniStore._getLocationUrl"),this.getLocation(a).toString()},_getLocation:function(a){console.log("Bikini.BikiniStore._getLocation");var b=document.createElement("a");return b.href=a||this.url,""===b.host&&(b.href=b.href),b},onConnect:function(a){console.log("Bikini.BikiniStore.onConnect"),this.isConnected=!0,this.fetchChanges(a),this.sendMessages(a)},onDisconnect:function(a){console.log("Bikini.BikiniStore.onDisconnect"),this.isConnected=!1,a.socket&&a.socket.socket&&a.socket.socket.onDisconnect()},onMessage:function(a){if(console.log("Bikini.BikiniStore.onMessage"),a){var b=this.endpoint?this.endpoint.localStore:null,c=null,d=null,e=null,f={store:b,entity:this.entity,merge:!0,fromMessage:!0,parse:!0};switch(a.id&&a.method?(c=a.data||{},d=a.method,e=a.id):a.attributes&&(c=a.attributes.data,d=a.attributes.method,e=a.attributes.id),d){case"patch":case"update":case"create":f.patch="patch"===d;var g=e?this.get(e):null;g?g.save(c,f):this.create(c,f);break;case"delete":if(e)if("all"===e){for(;g=this.first();)b&&b.sync.apply(this,["delete",g,{store:b,fromMessage:!0}]),this.remove(g);this.store.setLastMessageTime(this.endpoint.channel,"")}else{var h=this.get(e);h&&h.destroy(f)}}}},sync:function(a,b,c){console.log("Bikini.BikiniStore.sync");var d=c.store||this.store;if(c.fromMessage)return d.handleCallback(c.success);var f=d.getEndpoint(this.getUrlRoot()),g=null;if(d&&f){var h=this.channel;e.isModel(b)&&!b.id&&b.set(b.idAttribute,(new e.ObjectID).toHexString());var i=d.getLastMessageTime(h);return"read"===a&&f.localStore&&i?"read"===a&&(g=d.fetchChanges(f)):g=d.addMessage(a,b,f.localStore?{}:c,f),f.localStore&&(c.store=f.localStore,f.localStore.sync.apply(this,arguments)),g}},addMessage:function(a,b,d,e){var f=this;if(a&&b){var g=b.changedSinceSync,h=null,i=!0;switch(a){case"update":case"create":h=d.attrs||b.toJSON();break;case"patch":if(c.isEmpty(g))return;h=b.toJSON({attrs:g});break;case"delete":break;default:i=!1}var j={_id:b.id,id:b.id,method:a,data:h},k=function(a,c){return f.emitMessage(a,c,d,b)};return i?this.storeMessage(e,j,k):k(e,j)}},emitMessage:function(a,b,d,f){var g=a.channel,h=this,i=e.isModel(f)||"read"!==b.method?a.baseUrl:a.readUrl;return b.id&&"create"!==b.method&&(i+=("/"===i.charAt(i.length-1)?"":"/")+b.id),f.sync.apply(f,[b.method,f,{url:i,error:function(c,e){!c.responseText&&h.options.useOfflineChanges?(h.onDisconnect(a),h.handleCallback(d.success,b.data)):h.removeMessage(a,b,function(a,b){h.handleCallback(d.error,e)})},success:function(e){h.isConnected||h.onConnect(a),h.removeMessage(a,b,function(a,b){if(d.success){var f=e;h.handleCallback(d.success,f)}else if(e)if("read"===b.method)for(var i=c.isArray(e)?e:[e],j=0;j<i.length;j++)e=i[j],e&&h.trigger(g,{id:e[a.entity.idAttribute]||e._id,method:"update",data:e});else h.trigger(g,b)})},store:{}}])},fetchChanges:function(a){var b=this,c=a?a.channel:"",d=b.getLastMessageTime(c);if(a&&a.baseUrl&&c&&d){var f=new e.Collection({});return f.fetch({url:a.baseUrl+"changes/"+d,success:function(a,d,e){return f.each(function(a){a.get("time")&&a.get("method")&&(b.options.useLocalStore&&b.setLastMessageTime(c,a.get("time")),b.trigger(c,a))}),e.xhr},credentials:a.credentials})}},fetchServerInfo:function(a){var b=this;if(a&&a.baseUrl){var c=new e.Model,d=b.getLastMessageTime(a.channel),f=a.baseUrl;return"/"!==f.charAt(f.length-1)&&(f+="/"),c.fetch({url:f+"info",success:function(e,f,g){if(!d&&c.get("time")&&b.setLastMessageTime(a.channel,c.get("time")),!a.socketPath&&c.get("socketPath")){a.socketPath=c.get("socketPath");var h=c.get("entity")||a.entity.name;b.options.useSocketNotify&&(a.socket=b.createSocket(a,h))}return g.xhr},credentials:a.credentials})}},sendMessages:function(a){if(a&&a.messages){var b=this;a.messages.each(function(c){var d;try{d=JSON.parse(c.get("msg"))}catch(e){}var f=c.get("channel");if(d&&f){var g=b.createModel({collection:a.messages},d.data);b.emitMessage(a,d,{},g)}else c.destroy()})}},mergeMessages:function(a,b){return a},storeMessage:function(a,b,d){if(a&&a.messages&&b){var e=a.channel,f=a.messages.get(b._id);if(f){var g=JSON.parse(f.get("msg"));f.save({msg:JSON.stringify(c.extend(g,b))})}else a.messages.create({_id:b._id,id:b.id,msg:JSON.stringify(b),channel:e})}return d(a,b)},removeMessage:function(a,b,c){if(a&&a.messages){var d=a.messages.get(b._id);d&&d.destroy()}return c(a,b)},clear:function(a){if(a){var b=this.getEndpoint(a.getUrlRoot());b&&(b.messages&&b.messages.destroy(),a.reset(),this.setLastMessageTime(b.channel,""))}},getLocation:function(a){var b=document.createElement("a");return b.href=a||this.url,""===b.host&&(b.href=b.href),b}})}(this,Backbone,_,$); | ||
| //# sourceMappingURL=bikini.map |
+1
-1
| { | ||
| "name": "bikini", | ||
| "version": "0.7.2", | ||
| "version": "0.7.3", | ||
| "description": "", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -142,4 +142,4 @@ // Copyright (c) 2013 M-Way Solutions GmbH | ||
| */ | ||
| createMsgCollection: function( endpoint ) { | ||
| if( this.options.useOfflineChanges && endpoint ) { | ||
| createMsgCollection: function (endpoint) { | ||
| if (this.options.useOfflineChanges && endpoint) { | ||
| var entity = 'msg-' + endpoint.channel; | ||
@@ -160,3 +160,3 @@ var entities = {}; | ||
| messages.fetch({ | ||
| success: function() { | ||
| success: function () { | ||
| that.sendMessages(endpoint); | ||
@@ -205,2 +205,11 @@ } | ||
| }); | ||
| var channel = endpoint.channel; | ||
| endpoint.socket.on(channel, function (msg) { | ||
| if (msg) { | ||
| that.trigger(channel, msg); | ||
| if (that.options.useLocalStore) { | ||
| that.setLastMessageTime(channel, msg.time); | ||
| } | ||
| } | ||
| }); | ||
| return endpoint.socket; | ||
@@ -218,10 +227,2 @@ } | ||
| name = name || endpoint.entity.name; | ||
| socket.on(channel, function (msg) { | ||
| if (msg) { | ||
| that.trigger(channel, msg); | ||
| if (that.options.useLocalStore) { | ||
| that.setLastMessageTime(channel, msg.time); | ||
| } | ||
| } | ||
| }); | ||
| socket.emit('bind', { | ||
@@ -234,4 +235,5 @@ entity: name, | ||
| }, | ||
| getLastMessageTime: function (channel) { | ||
| if(this.lastMesgTime !== undefined) { | ||
| if (this.lastMesgTime !== undefined) { | ||
| return this.lastMesgTime; | ||
@@ -243,2 +245,3 @@ } | ||
| }, | ||
| setLastMessageTime: function (channel, time) { | ||
@@ -251,2 +254,3 @@ if (time && time > this.getLastMessageTime()) { | ||
| }, | ||
| _hashCode: function (str) { | ||
@@ -477,3 +481,4 @@ console.log('Bikini.BikiniStore._hashCode'); | ||
| that.handleCallback(options.success, resp); | ||
| } else { | ||
| } else if (data) { | ||
| // no data if server asks not to alter state | ||
| // that.setLastMessageTime(channel, msg.time); | ||
@@ -480,0 +485,0 @@ if (msg.method === 'read') { |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
731069
0.04%19524
0.02%