diff --git a/app/scripts/dabl/adapter/Adapter.js b/app/scripts/dabl/adapter/Adapter.js index ef3abf3..9b7b49f 100644 --- a/app/scripts/dabl/adapter/Adapter.js +++ b/app/scripts/dabl/adapter/Adapter.js @@ -16,13 +16,20 @@ var Adapter = dabl.Class.extend({ if (!this._cache[table]) { this._cache[table] = {}; } + + var isEmptyKey = key === "" || key === 0 || key === null || typeof key === 'undefined' || isNaN(key); + if (arguments.length < 3) { - if (!this._cache[table][key]) { + if (isEmptyKey || !this._cache[table][key]) { return null; } return this._cache[table][key]; } - this._cache[table][key] = value; + + if(!isEmptyKey) { + this._cache[table][key] = value; + } + return this; }, @@ -155,4 +162,4 @@ var Adapter = dabl.Class.extend({ } }); -dabl.Adapter = Adapter; \ No newline at end of file +dabl.Adapter = Adapter; diff --git a/app/scripts/dabl/adapter/RESTAdapter.js b/app/scripts/dabl/adapter/RESTAdapter.js index b614746..b99348a 100644 --- a/app/scripts/dabl/adapter/RESTAdapter.js +++ b/app/scripts/dabl/adapter/RESTAdapter.js @@ -41,9 +41,9 @@ Route.prototype = { val = typeof params[urlParam] !== 'undefined' || params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; if (typeof val !== 'undefined' && val !== null) { encodedVal = encodeUriSegment(val); - url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1"); + url = url.replace(new RegExp(":" + urlParam + "(\\b)", "g"), encodedVal + "$1"); } else { - url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W)", "g"), function(match, leadingSlashes, tail) { + url = url.replace(new RegExp("(\/?):" + urlParam + "(\\b)", "g"), function(match, leadingSlashes, tail) { if (tail.charAt(0) === '/') { return tail; } else { @@ -158,13 +158,10 @@ var RESTAdapter = dabl.Adapter.extend({ jQuery.ajax({ url: route.url(data), - type: 'POST', + type: method, data: JSON.stringify(data), contentType: 'application/json;charset=utf-8', dataType: 'json', - headers: { - 'X-HTTP-Method-Override': method - }, success: function(data, textStatus, jqXHR) { if (!self._isValidResponseObject(data, model)) { error(jqXHR, textStatus, 'Invalid response.'); @@ -226,13 +223,9 @@ var RESTAdapter = dabl.Adapter.extend({ jQuery.ajax({ url: route.url(instance.toJSON()), - type: 'POST', - data: {}, contentType: 'application/json;charset=utf-8', dataType: 'json', - headers: { - 'X-HTTP-Method-Override': 'DELETE' - }, + method: 'DELETE', success: function(data, textStatus, jqXHR) { if (data && (data.error || (data.errors && data.errors.length))) { error(jqXHR, textStatus, 'Invalid response.'); diff --git a/app/scripts/dabl/adapter/RESTAdapterAngular.js b/app/scripts/dabl/adapter/RESTAdapterAngular.js index 49209c9..c09b985 100644 --- a/app/scripts/dabl/adapter/RESTAdapterAngular.js +++ b/app/scripts/dabl/adapter/RESTAdapterAngular.js @@ -55,11 +55,8 @@ angular.module('dabl', []) $http({ url: route.url(data), - method: 'POST', - data: data, - headers: { - 'X-HTTP-Method-Override': method - } + method: method, + data: data }) .success(function(data, status, headers, config) { if (!self._isValidResponseObject(data, model)) { @@ -100,11 +97,7 @@ angular.module('dabl', []) $http({ url: route.url(instance.toJSON()), - method: 'POST', - data: {}, - headers: { - 'X-HTTP-Method-Override': 'DELETE' - } + method: 'DELETE' }) .success(function(data, status, headers, config) { if (data && (data.error || (data.errors && data.errors.length))) { diff --git a/dist/scripts/dabl.adapter.rest.angular.min.js b/dist/scripts/dabl.adapter.rest.angular.min.js index 31783a0..0f61fc3 100644 --- a/dist/scripts/dabl.adapter.rest.angular.min.js +++ b/dist/scripts/dabl.adapter.rest.angular.min.js @@ -1 +1 @@ -!function(a,b){b["true"]=a,angular.module("dabl",[]).factory("dabl",["$http","$q",function(a,b){dabl.Deferred=function(){var a=b.defer(),c=a.promise;return a.promise=function(){return c},a};var c=dabl.RESTAdapter.extend({$http:null,init:function(a){this._super(a)},_getErrorCallback:function(a){return function(b,c,d,e){var f="Request failed.";b&&(b.error?f=b.error:b.errors&&(f=b.errors.join("\n"))),a.reject(f,b,e)}},_save:function(c,d){var e,f,g=c.constructor,h=this._getRoute(g._url),i={},j=g.getKey(),k=this,l=b.defer(),m=this._getErrorCallback(l);for(e in g._fields){var n=g._fields[e];f=c[e],g.isTemporalType(n.type)&&(f=this.formatDate(f,n.type)),i[e]=f}return a({url:h.url(i),method:"POST",data:i,headers:{"X-HTTP-Method-Override":d}}).success(function(a){return k._isValidResponseObject(a,g)?(c.fromJSON(a).resetModified().setNew(!1),j&&"undefined"!=typeof c[j]&&k.cache(g._table,c[j],c),void l.resolve(c)):void m.apply(this,arguments)}).error(m),l.promise},update:function(a){if(!a.isModified()){var c=b.defer();return c.resolve(a),c.promise}return this._save(a,"PUT")},remove:function(c){var d=c.constructor,e=this._getRoute(d._url),f=d.getKey(),g=this,h=b.defer(),i=this._getErrorCallback(h);return a({url:e.url(c.toJSON()),method:"POST",data:{},headers:{"X-HTTP-Method-Override":"DELETE"}}).success(function(a){return a&&(a.error||a.errors&&a.errors.length)?void i.apply(this,arguments):(f&&c[f]&&g.cache(d._table,c[f],null),void h.resolve(c))}).error(i),h.promise},find:function(c,d){var e,f=this._getRoute(c._url),g={},h=null,i=b.defer(),j=this._getErrorCallback(i),k=this,l=c.getKey();if(!l||2!==arguments.length||"number"!=typeof d&&"string"!=typeof d)e=this.findQuery.apply(this,arguments),e.limit(1),g=e.getSimpleJSON();else{if(h=this.cache(c._table,d))return i.resolve(h),i.promise;g={},g[l]=d}return a.get(f.urlGet(g)).success(function(a){return k._isValidResponseObject(a,c)?(a instanceof Array&&(a=a.shift()),void i.resolve(c.inflate(a))):void j.apply(this,arguments)}).error(j),i.promise},findAll:function(c){var d=this.findQuery.apply(this,arguments),e=this._getRoute(c._url),f=d.getSimpleJSON(),g=b.defer(),h=this._getErrorCallback(g);return a.get(e.urlGet(f)).success(function(a){return"object"!=typeof a||a.error||a.errors&&a.errors.length?void h.apply(this,arguments):(a instanceof Array||(a=[a]),void g.resolve(c.inflateArray(a)))}).error(h),g.promise},countAll:function(c){var d=this.findQuery.apply(this,arguments).setAction(dabl.Query.ACTION_COUNT),e=this._getRoute(c._url),f=d.getSimpleJSON(),g=b.defer(),h=this._getErrorCallback(g);return a.get(e.urlGet(f)).success(function(a){var b=parseInt(a.total,10);return isNaN(b)||"object"!=typeof a||a.error||a.errors&&a.errors.length?void h.apply(this,arguments):void g.resolve(b)}).error(h),g.promise}});return dabl.AngularRESTAdapter=c,dabl}])}({},function(){return this}()); \ No newline at end of file +!function(a,b){b["true"]=a,angular.module("dabl",[]).factory("dabl",["$http","$q",function(a,b){dabl.Deferred=function(){var a=b.defer(),c=a.promise;return a.promise=function(){return c},a};var c=dabl.RESTAdapter.extend({$http:null,init:function(a){this._super(a)},_getErrorCallback:function(a){return function(b,c,d,e){var f="Request failed.";b&&(b.error?f=b.error:b.errors&&(f=b.errors.join("\n"))),a.reject(f,b,e)}},_save:function(c,d){var e,f,g=c.constructor,h=this._getRoute(g._url),i={},j=g.getKey(),k=this,l=b.defer(),m=this._getErrorCallback(l);for(e in g._fields){var n=g._fields[e];f=c[e],g.isTemporalType(n.type)&&(f=this.formatDate(f,n.type)),i[e]=f}return a({url:h.url(i),method:d,data:i}).success(function(a,b,d,e){return k._isValidResponseObject(a,g)?(c.fromJSON(a).resetModified().setNew(!1),j&&"undefined"!=typeof c[j]&&k.cache(g._table,c[j],c),void l.resolve(c)):void m.apply(this,arguments)}).error(m),l.promise},update:function(a){if(!a.isModified()){var c=b.defer();return c.resolve(a),c.promise}return this._save(a,"PUT")},remove:function(c){var d=c.constructor,e=this._getRoute(d._url),f=d.getKey(),g=this,h=b.defer(),i=this._getErrorCallback(h);return a({url:e.url(c.toJSON()),method:"DELETE"}).success(function(a,b,e,j){return a&&(a.error||a.errors&&a.errors.length)?void i.apply(this,arguments):(f&&c[f]&&g.cache(d._table,c[f],null),void h.resolve(c))}).error(i),h.promise},find:function(c,d){var e,f=this._getRoute(c._url),g={},h=null,i=b.defer(),j=this._getErrorCallback(i),k=this,l=c.getKey();if(!l||2!==arguments.length||"number"!=typeof d&&"string"!=typeof d)e=this.findQuery.apply(this,arguments),e.limit(1),g=e.getSimpleJSON();else{if(h=this.cache(c._table,d))return i.resolve(h),i.promise;g={},g[l]=d}return a.get(f.urlGet(g)).success(function(a,b,d,e){return k._isValidResponseObject(a,c)?(a instanceof Array&&(a=a.shift()),void i.resolve(c.inflate(a))):void j.apply(this,arguments)}).error(j),i.promise},findAll:function(c){var d=this.findQuery.apply(this,arguments),e=this._getRoute(c._url),f=d.getSimpleJSON(),g=b.defer(),h=this._getErrorCallback(g);return a.get(e.urlGet(f)).success(function(a,b,d,e){return"object"!=typeof a||a.error||a.errors&&a.errors.length?void h.apply(this,arguments):(a instanceof Array||(a=[a]),void g.resolve(c.inflateArray(a)))}).error(h),g.promise},countAll:function(c){var d=this.findQuery.apply(this,arguments).setAction(dabl.Query.ACTION_COUNT),e=this._getRoute(c._url),f=d.getSimpleJSON(),g=b.defer(),h=this._getErrorCallback(g);return a.get(e.urlGet(f)).success(function(a,b,c,d){var e=parseInt(a.total,10);return isNaN(e)||"object"!=typeof a||a.error||a.errors&&a.errors.length?void h.apply(this,arguments):void g.resolve(e)}).error(h),g.promise}});return dabl.AngularRESTAdapter=c,dabl}])}({},function(){return this}()); \ No newline at end of file diff --git a/dist/scripts/dabl.adapter.rest.min.js b/dist/scripts/dabl.adapter.rest.min.js index 6a95de4..60209d2 100644 --- a/dist/scripts/dabl.adapter.rest.min.js +++ b/dist/scripts/dabl.adapter.rest.min.js @@ -1 +1 @@ -!function(a,b){function c(a){return d(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function d(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(b?null:/%20/g,"+")}function e(a,b){this.template=a,this.defaults=b||{};for(var c=this.urlParams={},d=a.split(/\W/),e=0,f=d.length;f>e;++e){var g=d[e];!new RegExp("^\\d+$").test(g)&&g&&new RegExp("(^|[^\\\\]):"+g+"(\\W|$)").test(a)&&(c[g]=!0)}this.template=a.replace(/\\:/g,":")}b["true"]=a,e.prototype={url:function(a){var b,d,e=this,f=this.template;a=a||{};for(var g in this.urlParams)b="undefined"!=typeof a[g]||a.hasOwnProperty(g)?a[g]:e.defaults[g],"undefined"!=typeof b&&null!==b?(d=c(b),f=f.replace(new RegExp(":"+g+"(\\W)","g"),d+"$1")):(f=f.replace(new RegExp("(/?):"+g+"(\\W)","g"),function(a,b,c){return"/"===c.charAt(0)?c:b+c}),f=("/"===f.charAt(0)&&"."===f.charAt(1)?"/":"")+f.replace("/.","."));return f},urlGet:function(a){var b=this.url(a);a=a||{},b=b.replace(/\/?#$/,"");var c=[];for(var e in a)this.urlParams[e]||c.push(d(e)+"="+d(a[e]));return c.sort(),b=b.replace(/\/*$/,""),b+(c.length?"?"+c.join("&"):"")}};var f=dabl.Adapter.extend({_routes:{},_urlBase:"",init:function(a){this._super(),a&&(this._urlBase=a)},_getRoute:function(a){if(!a)throw new Error("Cannot create RESTful route for empty url.");return this._routes[a]?this._routes[a]:this._routes[a]=new e(this._urlBase+a)},_getErrorCallback:function(a){return function(b,c,d){var e;try{e=b.responseText?JSON.parse(b.responseText):null}catch(f){e=null}var g=d||"Request failed.";e&&(e.error?g=e.error:e.errors&&(g=e.errors.join("\n"))),a.reject(g,e,b)}},_isValidResponseObject:function(a,b){var c=b.getKey();return"object"!=typeof a||a.error||a.errors&&0!==a.errors.length||c&&"undefined"==typeof a[c]?!1:!0},_save:function(a,b){var c,d,e=a.constructor,f=this._getRoute(e._url),g={},h=e.getKey(),i=this,j=dabl.Deferred(),k=this._getErrorCallback(j);for(c in e._fields){var l=e._fields[c];d=a[c],e.isTemporalType(l.type)&&(d=this.formatDate(d,l.type)),g[c]=d}return jQuery.ajax({url:f.url(g),type:"POST",data:JSON.stringify(g),contentType:"application/json;charset=utf-8",dataType:"json",headers:{"X-HTTP-Method-Override":b},success:function(b,c,d){return i._isValidResponseObject(b,e)?(a.fromJSON(b).resetModified().setNew(!1),h&&"undefined"!=typeof a[h]&&i.cache(e._table,a[h],a),void j.resolve(a)):void k(d,c,"Invalid response.")},error:k}),j.promise()},formatDateTime:function(a){if(!a)return null;a instanceof Date||(a=dabl.constructDate(a));var b=-a.getTimezoneOffset()/60;return b=(b>0?"+":"-")+dabl.sPad(Math.abs(b)),a.getFullYear()+"-"+dabl.sPad(a.getMonth()+1)+"-"+dabl.sPad(a.getDate())+" "+dabl.sPad(a.getHours())+":"+dabl.sPad(a.getMinutes())+":"+dabl.sPad(a.getSeconds())+" "+b+"00"},insert:function(a){return this._save(a,"POST")},update:function(a){if(!a.isModified()){var b=dabl.Deferred();return b.resolve(a),b.promise()}return this._save(a,"PUT")},remove:function(a){var b=a.constructor,c=this._getRoute(b._url),d=b.getKey(),e=this,f=dabl.Deferred(),g=this._getErrorCallback(f);return jQuery.ajax({url:c.url(a.toJSON()),type:"POST",data:{},contentType:"application/json;charset=utf-8",dataType:"json",headers:{"X-HTTP-Method-Override":"DELETE"},success:function(c,h,i){return c&&(c.error||c.errors&&c.errors.length)?void g(i,h,"Invalid response."):(d&&a[d]&&e.cache(b._table,a[d],null),void f.resolve(a))},error:g}),f.promise()},find:function(a,b){var c,d=this._getRoute(a._url),e={},f=null,g=dabl.Deferred(),h=this._getErrorCallback(g),i=this,j=a.getKey();if(!j||2!==arguments.length||"number"!=typeof b&&"string"!=typeof b)c=this.findQuery.apply(this,arguments),c.limit(1),e=c.getSimpleJSON();else{if(f=this.cache(a._table,b))return g.resolve(f),g.promise();e={},e[j]=b}return jQuery.get(d.urlGet(e),function(b,c,d){return i._isValidResponseObject(b,a)?(b instanceof Array&&(b=b.shift()),void g.resolve(a.inflate(b))):void h(d,c,"Invalid response.")}).fail(h),g.promise()},findAll:function(a){var b=this.findQuery.apply(this,arguments),c=this._getRoute(a._url),d=b.getSimpleJSON(),e=dabl.Deferred(),f=this._getErrorCallback(e);return jQuery.get(c.urlGet(d),function(b,c,d){return"object"!=typeof b||b.error||b.errors&&b.errors.length?void f(d,c,"Invalid response."):(b instanceof Array||(b=[b]),void e.resolve(a.inflateArray(b)))}).fail(f),e.promise()},countAll:function(a){var b=this.findQuery.apply(this,arguments).setAction(dabl.Query.ACTION_COUNT),c=this._getRoute(a._url),d=b.getSimpleJSON(),e=dabl.Deferred(),f=this._getErrorCallback(e);return jQuery.get(c.urlGet(d),function(a,b,c){var d=parseInt(a.total,10);return isNaN(d)||"object"!=typeof a||a.error||a.errors&&a.errors.length?void f(c,b,"Invalid response."):void e.resolve(d)}).fail(f),e.promise()}});dabl.RESTAdapter=f}({},function(){return this}()); \ No newline at end of file +!function(a,b){function c(a){return d(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function d(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(b?null:/%20/g,"+")}function e(a,b){this.template=a,this.defaults=b||{};for(var c=this.urlParams={},d=a.split(/\W/),e=0,f=d.length;f>e;++e){var g=d[e];!new RegExp("^\\d+$").test(g)&&g&&new RegExp("(^|[^\\\\]):"+g+"(\\W|$)").test(a)&&(c[g]=!0)}this.template=a.replace(/\\:/g,":")}b["true"]=a,e.prototype={url:function(a){var b,d,e=this,f=this.template;a=a||{};for(var g in this.urlParams)b="undefined"!=typeof a[g]||a.hasOwnProperty(g)?a[g]:e.defaults[g],"undefined"!=typeof b&&null!==b?(d=c(b),f=f.replace(new RegExp(":"+g+"(\\b)","g"),d+"$1")):(f=f.replace(new RegExp("(/?):"+g+"(\\b)","g"),function(a,b,c){return"/"===c.charAt(0)?c:b+c}),f=("/"===f.charAt(0)&&"."===f.charAt(1)?"/":"")+f.replace("/.","."));return f},urlGet:function(a){var b=this.url(a);a=a||{},b=b.replace(/\/?#$/,"");var c=[];for(var e in a)this.urlParams[e]||c.push(d(e)+"="+d(a[e]));return c.sort(),b=b.replace(/\/*$/,""),b+(c.length?"?"+c.join("&"):"")}};var f=dabl.Adapter.extend({_routes:{},_urlBase:"",init:function(a){this._super(),a&&(this._urlBase=a)},_getRoute:function(a){if(!a)throw new Error("Cannot create RESTful route for empty url.");return this._routes[a]?this._routes[a]:this._routes[a]=new e(this._urlBase+a)},_getErrorCallback:function(a){return function(b,c,d){var e;try{e=b.responseText?JSON.parse(b.responseText):null}catch(f){e=null}var g=d||"Request failed.";e&&(e.error?g=e.error:e.errors&&(g=e.errors.join("\n"))),a.reject(g,e,b)}},_isValidResponseObject:function(a,b){var c=b.getKey();return"object"!=typeof a||a.error||a.errors&&0!==a.errors.length||c&&"undefined"==typeof a[c]?!1:!0},_save:function(a,b){var c,d,e=a.constructor,f=this._getRoute(e._url),g={},h=e.getKey(),i=this,j=dabl.Deferred(),k=this._getErrorCallback(j);for(c in e._fields){var l=e._fields[c];d=a[c],e.isTemporalType(l.type)&&(d=this.formatDate(d,l.type)),g[c]=d}return jQuery.ajax({url:f.url(g),type:b,data:JSON.stringify(g),contentType:"application/json;charset=utf-8",dataType:"json",success:function(b,c,d){return i._isValidResponseObject(b,e)?(a.fromJSON(b).resetModified().setNew(!1),h&&"undefined"!=typeof a[h]&&i.cache(e._table,a[h],a),void j.resolve(a)):void k(d,c,"Invalid response.")},error:k}),j.promise()},formatDateTime:function(a){if(!a)return null;a instanceof Date||(a=dabl.constructDate(a));var b=-a.getTimezoneOffset()/60;return b=(b>0?"+":"-")+dabl.sPad(Math.abs(b)),a.getFullYear()+"-"+dabl.sPad(a.getMonth()+1)+"-"+dabl.sPad(a.getDate())+" "+dabl.sPad(a.getHours())+":"+dabl.sPad(a.getMinutes())+":"+dabl.sPad(a.getSeconds())+" "+b+"00"},insert:function(a){return this._save(a,"POST")},update:function(a){if(!a.isModified()){var b=dabl.Deferred();return b.resolve(a),b.promise()}return this._save(a,"PUT")},remove:function(a){var b=a.constructor,c=this._getRoute(b._url),d=b.getKey(),e=this,f=dabl.Deferred(),g=this._getErrorCallback(f);return jQuery.ajax({url:c.url(a.toJSON()),contentType:"application/json;charset=utf-8",dataType:"json",method:"DELETE",success:function(c,h,i){return c&&(c.error||c.errors&&c.errors.length)?void g(i,h,"Invalid response."):(d&&a[d]&&e.cache(b._table,a[d],null),void f.resolve(a))},error:g}),f.promise()},find:function(a,b){var c,d=this._getRoute(a._url),e={},f=null,g=dabl.Deferred(),h=this._getErrorCallback(g),i=this,j=a.getKey();if(!j||2!==arguments.length||"number"!=typeof b&&"string"!=typeof b)c=this.findQuery.apply(this,arguments),c.limit(1),e=c.getSimpleJSON();else{if(f=this.cache(a._table,b))return g.resolve(f),g.promise();e={},e[j]=b}return jQuery.get(d.urlGet(e),function(b,c,d){return i._isValidResponseObject(b,a)?(b instanceof Array&&(b=b.shift()),void g.resolve(a.inflate(b))):void h(d,c,"Invalid response.")}).fail(h),g.promise()},findAll:function(a){var b=this.findQuery.apply(this,arguments),c=this._getRoute(a._url),d=b.getSimpleJSON(),e=dabl.Deferred(),f=this._getErrorCallback(e);return jQuery.get(c.urlGet(d),function(b,c,d){return"object"!=typeof b||b.error||b.errors&&b.errors.length?void f(d,c,"Invalid response."):(b instanceof Array||(b=[b]),void e.resolve(a.inflateArray(b)))}).fail(f),e.promise()},countAll:function(a){var b=this.findQuery.apply(this,arguments).setAction(dabl.Query.ACTION_COUNT),c=this._getRoute(a._url),d=b.getSimpleJSON(),e=dabl.Deferred(),f=this._getErrorCallback(e);return jQuery.get(c.urlGet(d),function(a,b,c){var d=parseInt(a.total,10);return isNaN(d)||"object"!=typeof a||a.error||a.errors&&a.errors.length?void f(c,b,"Invalid response."):void e.resolve(d)}).fail(f),e.promise()}});dabl.RESTAdapter=f}({},function(){return this}()); \ No newline at end of file diff --git a/dist/scripts/dabl.adapter.sql.min.js b/dist/scripts/dabl.adapter.sql.min.js index 67aaf3f..b038134 100644 --- a/dist/scripts/dabl.adapter.sql.min.js +++ b/dist/scripts/dabl.adapter.sql.min.js @@ -1 +1 @@ -!function(a,b){b["true"]=a;var c=dabl.Model,d=dabl.Query,e=dabl.Adapter.extend({_db:null,init:function(a){this._db=a,this._super()},execute:function(a,b){if(a instanceof d&&(a=a.getQuery(this)),a instanceof d.Statement)return a.setConnection(this),this.execute(a.getString(),a.getParams());var c,e,f,g,h,i,j=[];if(b&&0!==(g=b.length)){for(f=0;g>f;++f)i=b[f],i instanceof Date&&(b[f]=0===i.getSeconds()&&0===i.getMinutes()&&0===i.getHours()?this.formatDate(i):this.formatDateTime(i));c=this._db.execute(a,b)}else c=this._db.execute(a);if(j.rowsAffected=parseInt(this._db.rowsAffected)||0,null===c)return j;for(;c.isValidRow();){for(e={},f=0,g=c.getFieldCount();g>f;++f)h=c.getFieldName(f),e[h]=c.field(f);j.push(e),c.next()}return c.close(),j},count:function(a,b){a="SELECT COUNT(0) AS rCount FROM ("+a+") AS a";var c=this.execute(a,b);return parseInt(c[0].rCount,10)||0},transaction:function(a){a.apply(this)},lastInsertId:function(){return this._db.lastInsertRowId},quoteIdentifier:function(a){return a},applyLimit:function(a,b,c){return c>0?a=a+"\nLIMIT "+c+(b>0?" OFFSET "+b:""):b>0&&(a=a+"\nLIMIT -1 OFFSET "+b),a},prepareInput:function(a){if(a instanceof Array){a=a.slice(0);for(var b=0,c=a.length;c>b;++b)a[b]=this.prepareInput(a[b]);return a}return a===!0||a===!1?a?1:0:null===a||"undefined"==typeof a?"NULL":parseInt(a,10)===a?a:(a instanceof Date&&(a=0===a.getSeconds()&&0===a.getMinutes()&&0===a.getHours()?this.formatDate(a):this.formatDateTime(a)),this.quote(a))},quote:function(a){return"'"+a.replace("'","''")+"'"},find:function(a){var b=this.findQuery.apply(this,arguments).setLimit(1);return this.select(a,b).shift()||null},findAll:function(a){return this.select(a,this.findQuery.apply(this,arguments))},selectRS:function(a,b){return b=b||new d,b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName()),this.execute(b.getSelectQuery(this))},fromResult:function(a,b){return a.inflateArray(b)},countAll:function(a,b){b=b instanceof d?b:new d(b),b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName());var c=this.execute(b.getCountQuery(this));return parseInt(c[0],10)||0},removeAll:function(a,b){return b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName()),this.emptyCache(a._table),this.execute(b.getDeleteQuery(this)).rowsAffected},select:function(a,b){return b=b instanceof d?b:new d(b),this.fromResult(a,this.selectRS(a,b))},updateAll:function(a,b,c){var e,f,g=this.quoteIdentifier(a.getTableName()),h=[],i=[],j=new d.Statement(this),k=c.getWhereClause(this);for(e in b)h.push(this.quoteIdentifier(e)+" = ?"),i.push(b[e]);if(0===h.length)return 0;f="UPDATE "+g+" SET "+h.join(", ")+" WHERE "+k.getString(),j.setString(f),j.setParams(i),j.addParams(k.getParams());var l=this.execute(j);return this.emptyCache(a._table),l.rowsAffected||0},insert:function(a){var b,c,e,f,g,h=a.constructor,i=h.getKey(),j=[],k=[],l=[],m=new d.Statement(this);for(c in h._fields){var n=h._fields[c];e=a[c],h.isTemporalType(n.type)&&(e=this.formatDate(e,n.type)),(null!==e||a.isModified(c))&&(j.push(c),k.push(e),l.push("?"))}return b="INSERT INTO "+h.getTableName()+" ("+j.join(",")+") VALUES ("+l.join(",")+") ",m.setString(b),m.setParams(k),f=this.execute(m),i&&h.isAutoIncrement()&&(g=this.lastInsertId(),null!==g&&(a[i]=g)),a.resetModified(),a.setNew(!1),i&&a[i]&&this.cache(h._table,a[i],a),f.rowsAffected},update:function(a){var b,c,e,f,g,h,i={},j=new d,k=a.constructor,l=k.getKeys(),m=a.getModified();if(!a.isModified())return 0;if(0===l.length)throw new Error("This table has no primary keys");for(e in m){var n=k._fields[e];h=a[e],k.isTemporalType(n.type)&&(h=this.formatDate(h,n.type)),i[e]=h}for(b=0,c=l.length;c>b;++b){if(f=l[b],g=a[f],null===g)throw new Error("Cannot remove using NULL primary key.");j.and(f,g)}var o=this.updateAll(k,i,j);return a.resetModified(),o},remove:function(a){var b,c,e,f,g=a.constructor,h=g.getKeys(),i=new d;if(0===h.length)throw new Error("This table has no primary keys");for(b=0,c=h.length;c>b;++b){if(e=h[b],f=a[e],null===f)throw new Error("Cannot remove using NULL primary key.");i.and(e,f)}return this.removeAll(g,i)}});e.Migration=dabl.Class.extend({adapter:null,schema:null,init:function(a){this.adapter=a,this.schema=c.extend("schema_definitions",{adapter:a,fields:{id:{type:c.FIELD_TYPE_INTEGER,computed:!0,key:!0},table_name:c.FIELD_TYPE_TEXT,column_names:c.FIELD_TYPE_INTEGER,column_types:c.FIELD_TYPE_INTEGER}})},migrate:function(a){a||(a={});var b,d,e,f,g={};if(a.refresh){for(b in c.models)this.adapter.execute("DROP TABLE IF EXISTS "+b);this.setupSchema(!0)}else this.setupSchema();if(this.adapter.migrations&&(g=this.adapter.migrations),g[1]&&g[1].constructor===Object){d=this.currentSchemaVersion(),e=1/0,null!==a.number&&"undefined"!=typeof a.number?e=a.number:"number"==typeof a&&(e=a),f=d;do{if(f===e)return;if(e>f){if(f+=1,null===g[f]||"undefined"==typeof g[f])break;g[f].up()}else g[f].down(),f-=1;this.updateSchemaVersion(f)}while(g[f])}a&&a.refresh&&this.loadFixtures()},setupSchema:function(a){var b;this.createTable("schema_migrations",{version:c.FIELD_TYPE_TEXT}),0===this.adapter.count("SELECT * FROM schema_migrations")&&(b="INSERT INTO schema_migrations (version) VALUES(0)",this.adapter.execute(b)),a&&1===this.adapter.count("SELECT * FROM schema_migrations")&&(b="UPDATE schema_migrations set version = 0",this.adapter.execute(b)),this.createTable("schema_definitions",{id:c.FIELD_TYPE_INTEGER,table_name:c.FIELD_TYPE_TEXT,column_names:c.FIELD_TYPE_INTEGER,column_types:c.FIELD_TYPE_INTEGER})},writeSchema:function(a,b){if("schema_definitions"!==a&&"schema_migrations"!==a){var c,d,e,f=[],g=[];for(var h in b)f.push(h),g.push(b[h]);c=f.join(),d=f.join(),e=this.schema.findBy("table_name",a),e?(e.column_names=c,e.column_types=d,e.save()):(e=new this.schema,e.fromJSON({table_name:a,column_names:c,column_types:d}),e.save())}},readSchema:function(a){if("schema_definitions"===a||"schema_migrations"===a)return null;for(var b,c=this.schema.findBy("table_name",a),d=c.column_names.split(","),e=c.column_types.split(","),f={},g=0,h=d.length;h>g;++g)b=d[g],f[b]=e[g];return f},currentSchemaVersion:function(){var a="SELECT version FROM schema_migrations LIMIT 1";return parseInt(this.adapter.execute(a)[0].version,10)},updateSchemaVersion:function(a){var b="UPDATE schema_migrations SET version = "+a;return this.adapter.execute(b)},modifyColumn:function(a,b,d){if(!d)throw new Error("MIGRATION_EXCEPTION: Not a valid column modification");var e,f,g=this.readSchema(a),h={};for(e in g)switch(f=g[e],d.modification){case"remove":e!==b&&(h[e]=f);break;case"rename":e!==b?h[e]=f:h[d.newName]=f;break;case"change":h[e]=e!==b?f:d.newType;break;default:throw"MIGRATION_EXCEPTION: Not a valid column modification"}this.adapter.transaction(function(){var e=this.adapter.execute("SELECT * FROM "+a);if(0!==e.length)throw new Error("Modify column not quite ready yet...");this.dropTable(a),this.createTable(a,h);for(var f=0,g=e.length;g>f;++f){var i=e[f];switch(d.modification){case"remove":delete i[b],c.insert(a,i);break;case"rename":i[d.newName]=i[b],delete i[b],c.insert(a,i);break;case"change":c.insert(a,i);break;default:throw"MIGRATION_EXCEPTION: Not a valid column modification"}}})},createTable:function(a,b){if(a&&b){var d,e,f="CREATE TABLE IF NOT EXISTS "+a+"\n",g=0;f+="(";for(d in b)e=b[d],0!==g&&(f+=",\n"),f+=d+" "+e,e===c.FIELD_TYPE_INTEGER&&"id"===d&&(f+=" PRIMARY KEY AUTOINCREMENT"),++g;f+=")",this.adapter.execute(f),this.writeSchema(a,b)}},dropTable:function(a){var b,c="DROP TABLE IF EXISTS "+a;this.adapter.execute(c),b=this.schema.findBy("table_name",a),b.remove()},renameTable:function(a,b){var c,d="ALTER TABLE "+a+" RENAME TO "+b;this.adapter.execute(d),c=this.schema.findBy("table_name",a),c.table_name=b,c.save()},addColumn:function(a,b,c){var d,e="ALTER TABLE "+a+" ADD COLUMN "+b+" "+c;this.adapter.execute(e),d=this.readSchema(a),d[b]=c,this.writeSchema(a,d)},removeColumn:function(a,b){return this.modifyColumn(a,b,{modification:"remove"})},renameColumn:function(a,b,c){var d={modification:"rename",newName:c};return this.modifyColumn(a,b,d)},changeColumn:function(a,b,c){var d={modification:"change",newType:c};return this.modifyColumn(a,b,d)},addIndex:function(a,b,c){var d="CREATE"+(c?" UNIQUE ":" ")+"INDEX IF NOT EXISTS "+a+"_"+b+"_index ON "+a+" ("+b+")";return this.adapter.execute(d)},removeIndex:function(a,b){var c="DROP INDEX IF EXISTS "+a+"_"+b+"_index";return this.adapter.execute(c)},loadFixtures:function(){}}),e.TiDebugDB=dabl.Class.extend({lastInsertRowId:null,rowsAffected:null,lastSQL:null,lastParams:null,execute:function(a,b){return"undefined"!=typeof console&&console.log(a,b),this.lastSQL=a,this.lastParams=b,0===a.toUpperCase().indexOf("INSERT")&&(null===this.lastInsertRowId?this.lastInsertRowId=1:++this.lastInsertRowId,this.rowsAffected=1),(0===a.toUpperCase().indexOf("DELETE")||0===a.toUpperCase().indexOf("UPDATE"))&&(this.rowsAffected=1),{sql:a,params:b,isValidRow:function(){return!1},getRowCount:function(){return 0},getFieldCount:function(){return 0},getFieldName:function(){return""},field:function(){return""},next:function(){},close:function(){}}}}),dabl.SQLAdapter=e}({},function(){return this}()); \ No newline at end of file +!function(a,b){b["true"]=a;var c=dabl.Model,d=dabl.Query,e=dabl.Adapter.extend({_db:null,init:function(a){this._db=a,this._super()},execute:function(a,b){if(a instanceof d&&(a=a.getQuery(this)),a instanceof d.Statement)return a.setConnection(this),this.execute(a.getString(),a.getParams());var c,e,f,g,h,i,j=[];if(b&&0!==(g=b.length)){for(f=0;g>f;++f)i=b[f],i instanceof Date&&(0===i.getSeconds()&&0===i.getMinutes()&&0===i.getHours()?b[f]=this.formatDate(i):b[f]=this.formatDateTime(i));c=this._db.execute(a,b)}else c=this._db.execute(a);if(j.rowsAffected=parseInt(this._db.rowsAffected)||0,null===c)return j;for(;c.isValidRow();){for(e={},f=0,g=c.getFieldCount();g>f;++f)h=c.getFieldName(f),e[h]=c.field(f);j.push(e),c.next()}return c.close(),j},count:function(a,b){a="SELECT COUNT(0) AS rCount FROM ("+a+") AS a";var c=this.execute(a,b);return parseInt(c[0].rCount,10)||0},transaction:function(a){a.apply(this)},lastInsertId:function(){return this._db.lastInsertRowId},quoteIdentifier:function(a){return a},applyLimit:function(a,b,c){return c>0?a=a+"\nLIMIT "+c+(b>0?" OFFSET "+b:""):b>0&&(a=a+"\nLIMIT -1 OFFSET "+b),a},prepareInput:function(a){if(a instanceof Array){a=a.slice(0);for(var b=0,c=a.length;c>b;++b)a[b]=this.prepareInput(a[b]);return a}return a===!0||a===!1?a?1:0:null===a||"undefined"==typeof a?"NULL":parseInt(a,10)===a?a:(a instanceof Date&&(a=0===a.getSeconds()&&0===a.getMinutes()&&0===a.getHours()?this.formatDate(a):this.formatDateTime(a)),this.quote(a))},quote:function(a){return"'"+a.replace("'","''")+"'"},find:function(a){var b=this.findQuery.apply(this,arguments).setLimit(1);return this.select(a,b).shift()||null},findAll:function(a){return this.select(a,this.findQuery.apply(this,arguments))},selectRS:function(a,b){return b=b||new d,b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName()),this.execute(b.getSelectQuery(this))},fromResult:function(a,b){return a.inflateArray(b)},countAll:function(a,b){b=b instanceof d?b:new d(b),b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName());var c=this.execute(b.getCountQuery(this));return parseInt(c[0],10)||0},removeAll:function(a,b){return b.getTable()&&a.getTableName()===b.getTable()||b.setTable(a.getTableName()),this.emptyCache(a._table),this.execute(b.getDeleteQuery(this)).rowsAffected},select:function(a,b){return b=b instanceof d?b:new d(b),this.fromResult(a,this.selectRS(a,b))},updateAll:function(a,b,c){var e,f,g=this.quoteIdentifier(a.getTableName()),h=[],i=[],j=new d.Statement(this),k=c.getWhereClause(this);for(e in b)h.push(this.quoteIdentifier(e)+" = ?"),i.push(b[e]);if(0===h.length)return 0;f="UPDATE "+g+" SET "+h.join(", ")+" WHERE "+k.getString(),j.setString(f),j.setParams(i),j.addParams(k.getParams());var l=this.execute(j);return this.emptyCache(a._table),l.rowsAffected||0},insert:function(a){var b,c,e,f,g,h=a.constructor,i=h.getKey(),j=[],k=[],l=[],m=new d.Statement(this);for(c in h._fields){var n=h._fields[c];e=a[c],h.isTemporalType(n.type)&&(e=this.formatDate(e,n.type)),(null!==e||a.isModified(c))&&(j.push(c),k.push(e),l.push("?"))}return b="INSERT INTO "+h.getTableName()+" ("+j.join(",")+") VALUES ("+l.join(",")+") ",m.setString(b),m.setParams(k),f=this.execute(m),i&&h.isAutoIncrement()&&(g=this.lastInsertId(),null!==g&&(a[i]=g)),a.resetModified(),a.setNew(!1),i&&a[i]&&this.cache(h._table,a[i],a),f.rowsAffected},update:function(a){var b,c,e,f,g,h,i={},j=new d,k=a.constructor,l=k.getKeys(),m=a.getModified();if(!a.isModified())return 0;if(0===l.length)throw new Error("This table has no primary keys");for(e in m){var n=k._fields[e];h=a[e],k.isTemporalType(n.type)&&(h=this.formatDate(h,n.type)),i[e]=h}for(b=0,c=l.length;c>b;++b){if(f=l[b],g=a[f],null===g)throw new Error("Cannot remove using NULL primary key.");j.and(f,g)}var o=this.updateAll(k,i,j);return a.resetModified(),o},remove:function(a){var b,c,e,f,g=a.constructor,h=g.getKeys(),i=new d;if(0===h.length)throw new Error("This table has no primary keys");for(b=0,c=h.length;c>b;++b){if(e=h[b],f=a[e],null===f)throw new Error("Cannot remove using NULL primary key.");i.and(e,f)}return this.removeAll(g,i)}});e.Migration=dabl.Class.extend({adapter:null,schema:null,init:function(a){this.adapter=a,this.schema=c.extend("schema_definitions",{adapter:a,fields:{id:{type:c.FIELD_TYPE_INTEGER,computed:!0,key:!0},table_name:c.FIELD_TYPE_TEXT,column_names:c.FIELD_TYPE_INTEGER,column_types:c.FIELD_TYPE_INTEGER}})},migrate:function(a){a||(a={});var b,d,e,f,g={};if(a.refresh){for(b in c.models)this.adapter.execute("DROP TABLE IF EXISTS "+b);this.setupSchema(!0)}else this.setupSchema();if(this.adapter.migrations&&(g=this.adapter.migrations),g[1]&&g[1].constructor===Object){d=this.currentSchemaVersion(),e=1/0,null!==a.number&&"undefined"!=typeof a.number?e=a.number:"number"==typeof a&&(e=a),f=d;do{if(f===e)return;if(e>f){if(f+=1,null===g[f]||"undefined"==typeof g[f])break;g[f].up()}else g[f].down(),f-=1;this.updateSchemaVersion(f)}while(g[f])}a&&a.refresh&&this.loadFixtures()},setupSchema:function(a){var b;this.createTable("schema_migrations",{version:c.FIELD_TYPE_TEXT}),0===this.adapter.count("SELECT * FROM schema_migrations")&&(b="INSERT INTO schema_migrations (version) VALUES(0)",this.adapter.execute(b)),a&&1===this.adapter.count("SELECT * FROM schema_migrations")&&(b="UPDATE schema_migrations set version = 0",this.adapter.execute(b)),this.createTable("schema_definitions",{id:c.FIELD_TYPE_INTEGER,table_name:c.FIELD_TYPE_TEXT,column_names:c.FIELD_TYPE_INTEGER,column_types:c.FIELD_TYPE_INTEGER})},writeSchema:function(a,b){if("schema_definitions"!==a&&"schema_migrations"!==a){var c,d,e,f=[],g=[];for(var h in b)f.push(h),g.push(b[h]);c=f.join(),d=f.join(),e=this.schema.findBy("table_name",a),e?(e.column_names=c,e.column_types=d,e.save()):(e=new this.schema,e.fromJSON({table_name:a,column_names:c,column_types:d}),e.save())}},readSchema:function(a){if("schema_definitions"===a||"schema_migrations"===a)return null;for(var b,c=this.schema.findBy("table_name",a),d=c.column_names.split(","),e=c.column_types.split(","),f={},g=0,h=d.length;h>g;++g)b=d[g],f[b]=e[g];return f},currentSchemaVersion:function(){var a="SELECT version FROM schema_migrations LIMIT 1";return parseInt(this.adapter.execute(a)[0].version,10)},updateSchemaVersion:function(a){var b="UPDATE schema_migrations SET version = "+a;return this.adapter.execute(b)},modifyColumn:function(a,b,d){if(!d)throw new Error("MIGRATION_EXCEPTION: Not a valid column modification");var e,f,g=this.readSchema(a),h={};for(e in g)switch(f=g[e],d.modification){case"remove":e!==b&&(h[e]=f);break;case"rename":e!==b?h[e]=f:h[d.newName]=f;break;case"change":e!==b?h[e]=f:h[e]=d.newType;break;default:throw"MIGRATION_EXCEPTION: Not a valid column modification"}this.adapter.transaction(function(){var e=this.adapter.execute("SELECT * FROM "+a);if(0!==e.length)throw new Error("Modify column not quite ready yet...");this.dropTable(a),this.createTable(a,h);for(var f=0,g=e.length;g>f;++f){var i=e[f];switch(d.modification){case"remove":delete i[b],c.insert(a,i);break;case"rename":i[d.newName]=i[b],delete i[b],c.insert(a,i);break;case"change":c.insert(a,i);break;default:throw"MIGRATION_EXCEPTION: Not a valid column modification"}}})},createTable:function(a,b){if(a&&b){var d,e,f="CREATE TABLE IF NOT EXISTS "+a+"\n",g=0;f+="(";for(d in b)e=b[d],0!==g&&(f+=",\n"),f+=d+" "+e,e===c.FIELD_TYPE_INTEGER&&"id"===d&&(f+=" PRIMARY KEY AUTOINCREMENT"),++g;f+=")",this.adapter.execute(f),this.writeSchema(a,b)}},dropTable:function(a){var b,c="DROP TABLE IF EXISTS "+a;this.adapter.execute(c),b=this.schema.findBy("table_name",a),b.remove()},renameTable:function(a,b){var c,d="ALTER TABLE "+a+" RENAME TO "+b;this.adapter.execute(d),c=this.schema.findBy("table_name",a),c.table_name=b,c.save()},addColumn:function(a,b,c){var d,e="ALTER TABLE "+a+" ADD COLUMN "+b+" "+c;this.adapter.execute(e),d=this.readSchema(a),d[b]=c,this.writeSchema(a,d)},removeColumn:function(a,b){return this.modifyColumn(a,b,{modification:"remove"})},renameColumn:function(a,b,c){var d={modification:"rename",newName:c};return this.modifyColumn(a,b,d)},changeColumn:function(a,b,c){var d={modification:"change",newType:c};return this.modifyColumn(a,b,d)},addIndex:function(a,b,c){var d="CREATE"+(c?" UNIQUE ":" ")+"INDEX IF NOT EXISTS "+a+"_"+b+"_index ON "+a+" ("+b+")";return this.adapter.execute(d)},removeIndex:function(a,b){var c="DROP INDEX IF EXISTS "+a+"_"+b+"_index";return this.adapter.execute(c)},loadFixtures:function(){}}),e.TiDebugDB=dabl.Class.extend({lastInsertRowId:null,rowsAffected:null,lastSQL:null,lastParams:null,execute:function(a,b){return"undefined"!=typeof console&&console.log(a,b),this.lastSQL=a,this.lastParams=b,0===a.toUpperCase().indexOf("INSERT")&&(null===this.lastInsertRowId?this.lastInsertRowId=1:++this.lastInsertRowId,this.rowsAffected=1),(0===a.toUpperCase().indexOf("DELETE")||0===a.toUpperCase().indexOf("UPDATE"))&&(this.rowsAffected=1),{sql:a,params:b,isValidRow:function(){return!1},getRowCount:function(){return 0},getFieldCount:function(){return 0},getFieldName:function(){return""},field:function(){return""},next:function(){},close:function(){}}}}),dabl.SQLAdapter=e}({},function(){return this}()); \ No newline at end of file diff --git a/dist/scripts/dabl.min.js b/dist/scripts/dabl.min.js index f9218b5..c988591 100644 --- a/dist/scripts/dabl.min.js +++ b/dist/scripts/dabl.min.js @@ -1,2 +1,2 @@ -!function(a,b){function c(a){return"[object Array]"===Object.prototype.toString.call(a)}function d(a,b){if(c(a))for(var d=0;d1&&arguments[1]&&this.fail(arguments[1]),arguments.length>0&&arguments[0]&&this.done(arguments[0]),arguments.length>2&&arguments[2]&&this.progress(arguments[2]),this},promise:function(a){if(null==a)return j;for(var b in j)a[b]=j[b];return a},state:function(){return b},debug:function(){console.log("[debug]",f,g,b)},isRejected:function(){return"rejected"===b},isResolved:function(){return"resolved"===b},pipe:function(a,b){return e(function(c){d(a,function(a){k.done("function"==typeof a?function(){var b=a.apply(this,arguments);b&&"function"==typeof b?b.promise().then(c.resolve,c.reject,c.notify):c.resolve(b)}:c.resolve)}),d(b,function(a){k.fail("function"==typeof a?function(){var b=a.apply(this,arguments);b&&"function"==typeof b?b.promise().then(c.resolve,c.reject,c.notify):c.reject(b)}:c.reject)})}).promise()}},k={resolveWith:function(a){if("pending"===b){b="resolved";for(var c=i=arguments.length>1?arguments[1]:[],d=0;d1?arguments[1]:[],d=0;d1?arguments[1]:[],d=0;dh;++h)g[h]=null!==b[h]&&"function"==typeof b[h].toJSON?b[h].toJSON():dabl.copy(b[h]);b=g}else b=c===JSON?JSON.stringify(b):c===k.FIELD_TYPE_DATE?dabl.formatDate(b):null!==b&&"function"==typeof b.toJSON?b.toJSON():dabl.copy(b);d[a]=b}return delete this._inToJSON,d},hasKeyValues:function(){var a=this.constructor,b=a._keys;if(0===b.length)return!1;a.coerceValues(this);for(var c=0,d=b.length;d>c;++c){var e=b[c];if(null===this[e])return!1}return!0},getKeyValues:function(){var a={},b=this.constructor,c=b._keys;b.coerceValues(this);for(var d=0,e=c.length;e>d;++d){var f=c[d];a[f]=this[f]}return a},isNew:function(){return this._isNew},setNew:function(a){return this._isNew=a===!0,this},validate:function(){this._validationErrors=[];var a=this.constructor;a.coerceValues(this);for(var b in a._fields){var c=a._fields[b];if(c.required){var d=this[b];(!d||d instanceof Array&&0===d.length)&&this._validationErrors.push(b+" is required.")}}return 0===this._validationErrors.length},getValidationErrors:function(){return this._validationErrors},save:function(a,b){return this.isNew()?this.insert(a,b):this.update(a,b)},insert:function(a,b){return this.callAsync(function(){var a=this.constructor;if(!this.validate())throw new Error("Cannot save "+a._table+" with validation errors:\n"+this.getValidationErrors().join("\n"));return this.isNew()&&a.hasField("created")&&!this.isModified("created")&&(this.created=new Date),(this.isNew()||this.isModified())&&a.hasField("updated")&&!this.isModified("updated")&&(this.updated=new Date),this.constructor._adapter.insert(this)},a,b)},update:function(a,b,c){return"function"==typeof a&&(b=a,c=b),this.callAsync(function(){var b=this.constructor;if(!this.validate())throw new Error("Cannot save "+b._table+" with validation errors:\n"+this.getValidationErrors().join("\n"));if(0===b._keys.length)throw new Error("Cannot update without primary keys");return this.isNew()&&b.hasField("created")&&!this.isModified("created")&&(this.created=new Date),(this.isNew()||this.isModified())&&b.hasField("updated")&&!this.isModified("updated")&&(this.updated=new Date),"object"==typeof a&&this.fromJSON(a),b._adapter.update(this)},b,c)},remove:function(a,b){return this.callAsync(function(){return this.constructor._adapter.remove(this)},a,b)}});k.models={},k._fields=k._keys=k._table=null,k._autoIncrement=!1,k.FIELD_TYPE_TEXT="TEXT",k.FIELD_TYPE_NUMERIC="NUMERIC",k.FIELD_TYPE_INTEGER="INTEGER",k.FIELD_TYPE_DATE="DATE",k.FIELD_TYPE_TIME="TIME",k.FIELD_TYPE_TIMESTAMP="TIMESTAMP",k.FIELD_TYPES={TEXT:k.FIELD_TYPE_TEXT,NUMERIC:k.FIELD_TYPE_NUMERIC,INTEGER:k.FIELD_TYPE_INTEGER,DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.TEXT_TYPES={TEXT:k.FIELD_TYPE_TEXT,DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.INTEGER_TYPES={INTEGER:k.FIELD_TYPE_INTEGER},k.TEMPORAL_TYPES={DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.NUMERIC_TYPES={INTEGER:k.FIELD_TYPE_INTEGER,NUMERIC:k.FIELD_TYPE_NUMERIC},k.isFieldType=function(a){return a in k.FIELD_TYPES||this.isObjectType(a)},k.isTemporalType=function(a){return a in this.TEMPORAL_TYPES},k.isTextType=function(a){return a in this.TEXT_TYPES},k.isNumericType=function(a){return a in this.NUMERIC_TYPES},k.isIntegerType=function(a){return a in this.INTEGER_TYPES},k.isObjectType=function(a){return a===JSON||"function"==typeof a},k.coerceValue=function(a,b){var c=b.type;if("undefined"==typeof a||null===a){if(c!==Array)return null;a=[]}var d=this.isTemporalType(c),e=this.isNumericType(c);if((e||d)&&""===a)return null;if(e){if(this.isIntegerType(c)){if(a=parseInt(a,10),isNaN(a))throw new Error(a+" is not a valid integer")}else if(a=parseFloat(a,10),isNaN(a))throw new Error(a+" is not a valid float")}else if(d)a instanceof Date||(a=dabl.constructDate(a));else if(c===Array){if(b.elementType){this.convertArray(a,b.elementType);for(var f=0,g=a.length;g>f;++f)a[f]=this.coerceValue(a[f],{type:b.elementType})}}else c===JSON?"string"==typeof a&&(a=JSON.parse(a)):c===this.FIELD_TYPE_TEXT?"string"!=typeof a&&(a+=""):this.isObjectType(c)&&c.isModel&&a.constructor!==c&&(a=c.inflate(a));return a},k.coerceValues=function(a){if(null===a||"undefined"==typeof a)return this;for(var b in this._fields)b in a&&(a[b]=this.coerceValue(a[b],this._fields[b]));return this},k.convertArray=function(a,b){if(!a.modelCollection){a.modelCollection=!0;var c=this;a.push=function(){return Array.prototype.push.apply(this,c.coerceValue(arguments,{type:Array,elementType:b}))},a.unshift=function(){return Array.prototype.unshift.apply(this,c.coerceValue(arguments,{type:Array,elementType:b}))},a.pop=function(){return c.coerceValue(Array.prototype.pop.apply(this,arguments),{type:b})},a.shift=function(){return c.coerceValue(Array.prototype.shift.apply(this,arguments),{type:b})},a.slice=function(){return c.coerceValue(Array.prototype.slice.apply(this,arguments),{type:Array,elementType:b})},a.concat=function(){return c.coerceValue(Array.prototype.concat.apply(this,arguments),{type:Array,elementType:b})},a.splice=function(){for(var a=2,d=arguments.length;d>a;++a)arguments[a]=c.coerceValue(arguments[a],{type:b});return c.coerceValue(Array.prototype.splice.apply(this,arguments),{type:Array,elementType:b})};for(var d=["forEach","every","some","filter","map"],e=0,f=d.length;f>e;++e){var g=d[e];a[g]=function(a){return function(d,e){return Array.prototype[a].call(this,function(){return arguments[0]=c.coerceValue(arguments[0],{type:b}),d.apply(this,arguments)},e)}}(g)}}},k.getAdapter=function(){return this._adapter},k.setAdapter=function(a){return this._adapter=a,this},k.inflate=function(a){var b,c=this.getKey(),d=this._adapter;if(c&&a[c]&&(b=d.cache(this._table,a[c]))){if(b.isModified())return b;b.fromJSON(a)}return b||(b=new this(a)),b.resetModified().setNew(!1),c&&b[c]&&d.cache(this._table,b[c],b),b},k.inflateArray=function(a){var b,c,d;if(a.constructor!==Array){if("undefined"==typeof d.length)throw new Error("Unknown array type for collection.");d=[]}else d=a;for(b=0,c=a.length;c>b;++b)d[b]=this.inflate(a[b]);return this.convertArray(d,this),d},k.getTableName=function(){return this._table},k.getFields=function(){return dabl.copy(this._fields)},k.getField=function(a){return dabl.copy(this._fields[a])},k.getFieldType=function(a){return this._fields[a].type},k.hasField=function(a){return a in this._fields},k.getKeys=function(){return this._keys.slice(0)},k.getKey=function(){return 1===this._keys.length?this._keys[0]:null},k.isAutoIncrement=function(){return this._autoIncrement},k.addField=function(a,b){switch(b.type||(b={type:b}),"string"==typeof b.type&&(b.type=b.type.toUpperCase()),b.type){case"STRING":case String:b.type=this.FIELD_TYPE_TEXT;break;case Number:b.type=this.FIELD_TYPE_NUMERIC;break;case Date:b.type=this.FIELD_TYPE_TIMESTAMP;break;case"INT":b.type=this.FIELD_TYPE_INTEGER}if(b.key&&this._keys.push(a),b.computed&&(this._autoIncrement=!0),!this.isFieldType(b.type))throw new Error(b.type+" is not a valide field type");b.type.isModel&&this._relations.push(a),this._fields[a]=b},k.extend=function(a,b){var c,d,e;if(b=b||{},"undefined"==typeof a)throw new Error("Must provide a table when exending Model");if(c=j.extend.call(this,b.prototype),delete b.prototype,this._table||this._fields)c._keys=dabl.copy(this._keys),c._fields=dabl.copy(this._fields),c._relations=dabl.copy(this._relations);else{if(!b.fields)throw new Error("Must provide fields when exending Model");c._keys=[],c._fields={},c._relations=[]}c._table=a;for(e in b)switch(e){case"url":case"adapter":c["_"+e]=b[e];break;default:c[e]=b[e]}for(d in b.fields)c.addField(d,b.fields[d]);return k.models[a]=c,c},k.isModel=!0,k.toString=function(){return this._table};for(var l=["countAll","findAll","find","removeAll","updateAll"],m=0,n=l.length;n>m;++m){var o=l[m];k[o]=function(a){return function(){for(var b=Array.prototype.slice.call(arguments),c=this.getAdapter(),d=null,e=null,f=b.length-1;f>-1&&!(b[f]instanceof k)&&"function"==typeof b[f];){if(d){e=d,d=b.pop();break}d=b.pop(),--f}return b.unshift(this),this.callAsync(function(){return c[a].apply(c,b)},d,e)}}(o)}for(var p=["findBy","retrieveByField","retrieveByPK","retrieveByPKs","findByPKs"],q=0,r=p.length;r>q;++q)k[p[q]]=k.find;dabl.Model=k;var s=dabl.Class.extend({_conds:null,init:function(){this._conds=[],0!==arguments.length&&this.and.apply(this,arguments)},_preprocessCondition:function(a,b,c,d){switch(arguments.length){case 0:return null;case 1:return a instanceof t.Statement||a instanceof s&&0!==a._conds.length?[a]:null;case 2:c=b,b=s.EQUAL;case 3:d=s.QUOTE_RIGHT}var e=c instanceof t,f=c instanceof Array;if(f||e){if(!1===e||1!==c.getLimit())switch(b){case s.BETWEEN:break;case s.IN:case s.EQUAL:case"eq":b=s.IN;break;case"ne":case s.NOT_IN:case s.NOT_EQUAL:case s.ALT_NOT_EQUAL:b=s.NOT_IN;break;default:throw new Error(b+" unknown for comparing an array.")}if(f&&0===c.length&&b===s.NOT_IN)return null;if(e){if(!c.getTable())throw new Error("right does not have a table, so it cannot be nested.");d!==s.QUOTE_LEFT&&(d=s.QUOTE_NONE)}}else null===c&&(b===s.NOT_EQUAL||b===s.ALT_NOT_EQUAL||"ne"===b?b=s.IS_NOT_NULL:(b===s.EQUAL||"eq"===b)&&(b=s.IS_NULL)),(b===s.IS_NULL||b===s.IS_NOT_NULL)&&(c=null,d!==s.QUOTE_LEFT&&(d=s.QUOTE_NONE));return[a,b,c,d]},_processCondition:function(a,b,c,d){if(1===arguments.length){if(a instanceof t.Statement)return a;if(a instanceof s)return e=a.getQueryStatement(),e.setString("("+e._qString+")"),e}var e,f,g,h=new t.Statement,i=c instanceof t,j=c instanceof Array;if(!(b in s.SQL.operators))throw new Error('Unsupported SQL operator: "'+b+'"');if("substringof"===b){var k=a;a=c,c=k}if(b=s.SQL.operators[b],(d===s.QUOTE_LEFT||d===s.QUOTE_BOTH)&&(h.addParam(a),a="?"),b===s.CONTAINS?(b=s.LIKE,c="%"+c+"%"):b===s.BEGINS_WITH?(b=s.LIKE,c+="%"):b===s.ENDS_WITH&&(b=s.LIKE,c="%"+c),j||i){if(i)e=c.getQuery(),c="("+e._qString+")",h.addParams(e._params);else if(j){if(g=c.length,2===g&&b===s.BETWEEN)return h.setString(a+" "+b+" ? AND ?"),h.addParams(c),h;if(0===g){if(b===s.IN)return h.setString("(0 = 1)"),h}else if(d===s.QUOTE_RIGHT||d===s.QUOTE_BOTH){h.addParams(c);var l="(";for(f=0;g>f;++f)f>0&&(l+=","),l+="?";c=l+")"}}}else b===s.IS_NULL||b===s.IS_NOT_NULL||d!==s.QUOTE_RIGHT&&d!==s.QUOTE_BOTH||(h.addParam(c),c="?");return h.setString(a+" "+b+(null===c?"":" "+c)),h},prepareInput:function(a){if(a instanceof Array){a=a.slice(0);for(var b=0,c=a.length;c>b;++b)a[b]=this.prepareInput(a[b]);return a}return a===!0||a===!1?a?1:0:null===a||"undefined"==typeof a?"null":parseInt(a,10)===a?a:this.quote(a)},quote:function(a){return"'"+a.replace("'","''")+"'"},_processODataCondition:function(a,b,c,d){if(1===arguments.length){if(a instanceof t.Statement)throw new Error("Unable to use Query.Statement within a Condition to build an OData query");if(a instanceof s)return"("+a.getODataFilter()+")"}if(c instanceof t)throw new Error("Unable to use Query within a Condition to build an OData query");var e,f,g=c instanceof Array;switch((d===s.QUOTE_LEFT||d===s.QUOTE_BOTH)&&(a=this.prepareInput(a)),b){case"startswith":case"endswith":case"substringof":case s.LIKE:case s.CONTAINS:case s.BEGINS_WITH:case s.ENDS_WITH:if(-1!==c.indexOf("%"))throw new Error("Cannot use % in OData queries")}if(b===s.IS_NULL?(b=s.EQUAL,c="null"):b===s.IS_NOT_NULL?(b=s.NOT_EQUAL,c="null"):(d===s.QUOTE_RIGHT||d===s.QUOTE_BOTH)&&(c=this.prepareInput(c)),g){if(f=c.length,2===f&&b===s.BETWEEN)return"("+a+" ge "+c[0]+" and "+a+" le "+c[1]+")";if(0===f&&b===s.IN)return"(0 eq 1)";var h;b===s.IN?(b=" eq ",h=" or "):(b=" ne ",h=" and ");var i="(";for(e=0;f>e;++e)i+=(0!==e?h:"")+a+b+c[e];return i+")"}if(b in s.OData.operators)return b=s.OData.operators[b],a+" "+b+" "+c;if(b in s.OData.functions){var j=s.OData.functions[b],k=j.indexOf("@"),l=j.indexOf("?");return k>l?(j=j.substring(0,k)+c+j.substr(k+1),j=j.substring(0,l)+a+j.substr(l+1)):(j=j.substring(0,l)+a+j.substr(l+1),j=j.substring(0,k)+c+j.substr(k+1)),j}throw new Error("Unexpected arguments: "+arguments.join(", "))},and:function(a){var b;if(a.constructor===Object){for(b in a)this.and(b,a[b]);return this}var c=this._preprocessCondition.apply(this,arguments);return null===c?this:(c.type="AND",this._conds.push(c),this)},addAnd:function(){return this.and.apply(this,arguments)},add:function(){return this.and.apply(this,arguments)},filter:function(){return this.and.apply(this,arguments)},where:function(){return this.and.apply(this,arguments)},or:function(a){var b;if(a.constructor===Object){for(b in a)this.or(b,a[b]);return this}var c=this._preprocessCondition.apply(this,arguments);return null===c?this:(c.type="OR",this._conds.push(c),this)},addOr:function(){return this.or.apply(this,arguments)},orWhere:function(){return this.or.apply(this,arguments)},andNot:function(a,b){return this.and(a,s.NOT_EQUAL,b)},andLike:function(a,b){return this.and(a,s.LIKE,b)},andNotLike:function(a,b){return this.and(a,s.NOT_LIKE,b)},andGreater:function(a,b){return this.and(a,s.GREATER_THAN,b)},andGreaterEqual:function(a,b){return this.and(a,s.GREATER_EQUAL,b)},andLess:function(a,b){return this.and(a,s.LESS_THAN,b)},andLessEqual:function(a,b){return this.and(a,s.LESS_EQUAL,b)},andNull:function(a){return this.and(a,null)},andNotNull:function(a){return this.and(a,s.NOT_EQUAL,null)},andBetween:function(a,b,c){return this.and(a,s.BETWEEN,[b,c])},andBeginsWith:function(a,b){return this.and(a,s.BEGINS_WITH,b)},andEndsWith:function(a,b){return this.and(a,s.ENDS_WITH,b)},andContains:function(a,b){return this.and(a,s.CONTAINS,b)},orNot:function(a,b){return this.or(a,s.NOT_EQUAL,b)},orLike:function(a,b){return this.or(a,s.LIKE,b)},orNotLike:function(a,b){return this.or(a,s.NOT_LIKE,b)},orGreater:function(a,b){return this.or(a,s.GREATER_THAN,b)},orGreaterEqual:function(a,b){return this.or(a,s.GREATER_EQUAL,b)},orLess:function(a,b){return this.or(a,s.LESS_THAN,b)},orLessEqual:function(a,b){return this.or(a,s.LESS_EQUAL,b)},orNull:function(a){return this.or(a,null)},orNotNull:function(a){return this.or(a,s.NOT_EQUAL,null)},orBetween:function(a,b,c){return this.or(a,s.BETWEEN,[b,c])},orBeginsWith:function(a,b){return this.or(a,s.BEGINS_WITH,b)},orEndsWith:function(a,b){return this.or(a,s.ENDS_WITH,b)},orContains:function(a,b){return this.or(a,s.CONTAINS,b)},getQueryStatement:function(a){if(0===this._conds.length)return null;var b,c,d=new t.Statement(a),e="",f=this._conds,g=f.length;for(b=0;g>b;++b)c=this._processCondition.apply(this,f[b]),null!==c&&(e+="\n ",0!==b&&(e+=(1===b&&"OR"===f[0].type?"OR":f[b].type)+" "),e+=c._qString,d.addParams(c._params));return d.setString(e),d},getODataFilter:function(){if(0===this._conds.length)return null;var a,b,c="",d=this._conds,e=d.length;for(a=0;e>a;++a)b=this._processODataCondition.apply(this,d[a]),null!==b&&(0!==a&&(c+=" "+(1===a&&"or"===d[0].type?"or":"OR"===d[a].type?"or":"and")+" "),c+=b);return c},toString:function(){return this.getQueryStatement().toString()},getSimpleJSON:function(){var a={};if(0===this._conds.length)return{};var b,c,d=this._conds,e=d.length;for(b=0;e>b;++b){var c=d[b];if("AND"!==c.type)throw new Error("OR conditions not supported.");if(2===c.length)a[c[0]]=c[1];else{if(c[1]!==s.EQUAL)throw new Error('Cannot export complex condition: "'+this._processCondition.apply(this,c)+'"');a[c[0]]=c[2]}}return a}});s.EQUAL="=",s.NOT_EQUAL="<>",s.ALT_NOT_EQUAL="!=",s.GREATER_THAN=">",s.LESS_THAN="<",s.GREATER_EQUAL=">=",s.LESS_EQUAL="<=",s.LIKE="LIKE",s.BEGINS_WITH="BEGINS_WITH",s.ENDS_WITH="ENDS_WITH",s.CONTAINS="CONTAINS",s.NOT_LIKE="NOT LIKE",s.IN="IN",s.NOT_IN="NOT IN",s.IS_NULL="IS NULL",s.IS_NOT_NULL="IS NOT NULL",s.BETWEEN="BETWEEN",s.BINARY_AND="&",s.BINARY_OR="|",s.SQL={operators:{eq:"=",ne:"<>",gt:">",lt:"<",ge:">=",le:"<=","=":"=","<>":"<>","!=":"<>",">":">","<":"<",">=":">=","<=":"<=","&":"&","|":"|",startswith:"BEGINS_WITH",BEGINS_WITH:"BEGINS_WITH",endswith:"ENDS_WITH",ENDS_WITH:"BEGINS_WITH",substringof:"CONTAINS",CONTAINS:"CONTAINS",LIKE:"LIKE","NOT LIKE":"NOT LIKE",IN:"IN","NOT IN":"NOT IN","IS NULL":"IS NULL","IS NOT NULL":"IS NOT NULL",BETWEEN:"BETWEEN"}},s.OData={operators:{eq:"eq",ne:"ne",gt:"gt",lt:"lt",ge:"ge",le:"le","=":"eq","<>":"ne","!=":"ne",">":"gt","<":"lt",">=":"ge","<=":"le","&":"&","|":"|"},functions:{startswith:"startswith(?, @)",endswith:"endswith(?, @)",substringof:"substringof(@, ?)",BEGINS_WITH:"startswith(?, @)",ENDS_WITH:"endswith(?, @)",CONTAINS:"substringof(@, ?)",LIKE:"tolower(@) eq tolower(?)","NOT LIKE":"tolower(@) ne tolower(?)"}},s.QUOTE_LEFT=1,s.QUOTE_RIGHT=2,s.QUOTE_BOTH=3,s.QUOTE_NONE=4,dabl.Condition=s;var t=s.extend({_action:"SELECT",_columns:null,_table:null,_tableAlias:null,_extraTables:null,_joins:null,_orders:null,_groups:null,_having:null,_limit:null,_offset:0,_distinct:!1,init:function(a,b){this._super(),this._columns=[],this._joins=[],this._orders=[],this._groups=[],a&&(a.constructor===Object?this.and(a):a&&this.setTable(a,b))},setDistinct:function(a){"undefined"==typeof a&&(a=!0),this._distinct=a===!0},setAction:function(a){switch(a){case"SELECT":case"DELETE":case"COUNT":break;default:throw new Error('"'+a+'" is not an allowed Query action.')}return this._action=a,this},getAction:function(){return this._action},addColumn:function(a){return this._columns.push(a),this},setColumns:function(a){return this._columns=a.slice(0),this},select:function(){return this.setColumns.apply(this,arguments)},getColumns:function(){return this._columns},setGroups:function(a){return this._groups=a,this},getGroups:function(){return this._groups},setTable:function(a,b){if(a instanceof t&&!b)throw new Error("The nested query must have an alias.");return b&&this.setAlias(b),this._table=a,this},from:function(){return this.setTable.apply(this,arguments)},getTable:function(){return this._table},setAlias:function(a){return this._tableAlias=a,this},getAlias:function(){return this._tableAlias},addTable:function(a,b){if(a instanceof t){if(!b)throw new Error("The nested query must have an alias.")}else"undefined"==typeof b&&(b=a);if(b===this._tableAlias||b===this._table)throw new Error('The alias "'+b+'" is is already in use');return null===this._extraTables&&(this._extraTables={}),this._extraTables[b]=a,this},addJoin:function(a,b,c){if(a instanceof t.Join)return this._joins.push(a),this;if(null===b){if(c===t.JOIN||c===t.INNER_JOIN)return this.addTable(a),this;b="1 = 1"}return this._joins.push(new t.Join(a,b,c)),this},join:function(a,b,c){return this.addJoin(a,b,c)},innerJoin:function(a,b){return this.addJoin(a,b,t.INNER_JOIN)},leftJoin:function(a,b){return this.addJoin(a,b,t.LEFT_JOIN)},rightJoin:function(a,b){return this.addJoin(a,b,t.RIGHT_JOIN)},outerJoin:function(a,b){return this.addJoin(a,b,t.OUTER_JOIN)},getJoins:function(){return this._joins},setJoins:function(a){return this._joins=a,this},groupBy:function(a){return this._groups.push(a),this},setHaving:function(a){if(null!==a&&!(a instanceof s))throw new Error("setHaving must be given an instance of Condition");return this._having=a,this},getHaving:function(){return this._having},orderBy:function(){return this._orders.push(arguments),this},limit:function(a,b){if(a=parseInt(a),isNaN(a))throw new Error("Not a number");return this._limit=a,arguments.length>1&&this.setOffset(b),this},top:function(){return this.limit.apply(this,arguments)},getLimit:function(){return this._limit},offset:function(a){if(a=parseInt(a),isNaN(a))throw new Error("Not a number.");return this._offset=a,this},skip:function(){return this.offset.apply(this,arguments)},setPage:function(a){if(a=parseInt(a),isNaN(a))throw new Error("Not a number.");if(2>a)return this._offset=null,this;if(!this._limit)throw new Error("Cannot set page without first setting limit.");return this._offset=a*this._limit-this._limit,this},hasAggregates:function(){if(0!==this._groups.length)return!0;for(var a=0,b=this._columns.length;b>a;++a)if(-1!==this._columns[a].indexOf("("))return!0;return!1},needsComplexCount:function(){return this.hasAggregates()||null!==this._having||this._distinct},getQuery:function(a){"undefined"==typeof a&&(a=new SQLAdapter);var b,c,d,e,f,g,h,i,j,k=new t.Statement(a);switch(b="",this._action){default:case t.ACTION_COUNT:case t.ACTION_SELECT:c=this.getColumnsClause(a),k.addParams(c._params),b+="SELECT "+c._qString;break;case t.ACTION_DELETE:b+="DELETE"}if(d=this.getTablesClause(a),k.addParams(d._params),b+="\nFROM "+d._qString,0!==this._joins.length)for(e=0,f=this._joins.length;f>e;++e)g=this._joins[e],h=g.getQueryStatement(a),b+="\n "+h._qString,k.addParams(h._params);if(i=this.getWhereClause(),null!==i&&(b+="\nWHERE "+i._qString,k.addParams(i._params)),0!==this._groups.length&&(b+="\nGROUP BY "+this._groups.join(", ")),null!==this.getHaving()&&(j=this.getHaving().getQueryStatement(),j&&(b+="\nHAVING "+j._qString,k.addParams(j._params))),this._action!==t.ACTION_COUNT&&0!==this._orders.length)for(b+="\nORDER BY ",e=0,f=this._orders.length;f>e;++e){var l=this._orders[e][0],m=this._orders[e][1];null!==m&&"undefined"!=typeof m&&(l=l+" "+m),0!==e&&(b+=", "),b+=l}return null!==this._limit&&(a?b=a.applyLimit(b,this._offset,this._limit):b+="\nLIMIT "+(this._offset?this._offset+", ":"")+this._limit),this._action===t.ACTION_COUNT&&this.needsComplexCount()&&(b="SELECT count(0)\nFROM ("+b+") a"),k.setString(b),k},getTablesClause:function(a){var b,c,d,e,f,g,h,i,j=this._table;if(!j)throw new Error("No table specified.");switch(b=new t.Statement(a),c=this._tableAlias,j instanceof t?(d=j.getQuery(a),f="("+d._qString+")"):(d=null,f=j),this._action){case t.ACTION_COUNT:case t.ACTION_SELECT:if(null!==d&&b.addParams(d._params),c&&(f=f+" AS "+c),null!==this._extraTables)for(e in this._extraTables)g=this._extraTables[e],g instanceof t?(h=g.getQuery(a),i="("+h._qString+") AS "+e,b.addParams(h._params)):(i=g,e!==g&&(i=i+" AS "+e)),f=f+", "+i;b.setString(f);break;case t.ACTION_DELETE:null!==d&&b.addParams(d._params),c&&(f=f+" AS "+c),b.setString(f)}return b},getColumnsClause:function(a){var b,c,d,e,f,g=this._table,h=new t.Statement(a),i=this._tableAlias,j=this._action;if(j===t.ACTION_DELETE)return h;if(!g)throw new Error("No table specified.");if(j===t.ACTION_COUNT){if(!this.needsComplexCount())return h.setString("count(0)"),h;if(0!==this._groups.length)return h.setString(this._groups.join(", ")),h;if(!this._distinct&&null===this.getHaving()&&0!==this._columns.length){for(e=[],c=0,d=this._columns.length;d>c;++c)b=this._columns[c],-1!==b.indexOf("(")&&e.push(b);if(0!==e.length)return h.setString(e.join(", ")),h}}return f=0!==this._columns.length?this._columns.join(", "):i?i+".*":g+".*",this._distinct&&(f="DISTINCT "+f),h.setString(f),h},getWhereClause:function(a){return this.getQueryStatement(a)},toString:function(){return this._table||this.setTable("{UNSPECIFIED-TABLE}"),this.getQuery().toString()},getCountQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_COUNT),this.getQuery(a)},getDeleteQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_DELETE),this.getQuery(a)},getSelectQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_SELECT),this.getQuery(a)},getODataQuery:function(){if(this._joins&&0!==this._joins.length)throw new Error("JOINS cannot be exported.");if(this._extraTables&&0!==this._extraTables.length)throw new Error("Extra tables cannot be exported.");if(this._having&&0!==this._having.length)throw new Error("Having cannot be exported.");if(this._groups&&0!==this._groups.length)throw new Error("Grouping cannot be exported.");var a={};0!==this._columns.length&&(a.$select=this._columns.join(","));var b=this.getODataFilter();return b&&(a.$filter=b),this._limit&&(a.$top=this._limit,this._offset&&(a.$skip=this._offset)),this._orders&&0!==this._orders.length&&(a.$orderby=this._orders[0][0],this._orders[0][1]===t.DESC&&(a.$orderby+=" desc")),a},getSimpleJSON:function(){if(this._joins&&0!==this._joins.length)throw new Error("JOINS cannot be exported.");if(this._extraTables&&0!==this._extraTables.length)throw new Error("Extra tables cannot be exported.");if(this._having&&0!==this._having.length)throw new Error("Having cannot be exported.");if(this._groups&&0!==this._groups.length)throw new Error("Grouping cannot be exported.");var a=this._super();return this._limit&&(a.limit=this._limit,this._offset&&(a.offset=this._offset,a.page=Math.floor(this._offset/this._limit)+1)),this._orders&&0!==this._orders.length&&(a.order_by=this._orders[0][0],this._orders[0][1]===t.DESC&&(a.dir=t.DESC)),this._action===t.ACTION_COUNT&&(a.count_only=1),a}});t.ACTION_COUNT="COUNT",t.ACTION_DELETE="DELETE",t.ACTION_SELECT="SELECT",t.JOIN="JOIN",t.LEFT_JOIN="LEFT JOIN",t.RIGHT_JOIN="RIGHT JOIN",t.INNER_JOIN="INNER JOIN",t.OUTER_JOIN="OUTER JOIN",t.ASC="ASC",t.DESC="DESC",dabl.Query=t;var u=/^\w+\.\w+$/,v=function(a,b,c){return arguments.length<3&&(c=t.JOIN),a instanceof t||b instanceof s||!u.test(b)||!u.test(a)?void this.setTable(a).setOnClause(b).setJoinType(c):(this._isLikePropel=!0,this._leftColumn=a,this._rightColumn=b,this._table=b.substring(0,b.indexOf(".")),void(this._joinType=c))};v.prototype={_table:null,_alias:null,_onClause:null,_isLikePropel:!1,_leftColumn:null,_rightColumn:null,_joinType:t.JOIN,toString:function(){return this.getTable()||this.setTable("{UNSPECIFIED-TABLE}"),this.getQueryStatement().toString() -},setTable:function(a){var b=a.lastIndexOf(" "),c=-1===b?-1:a.toUpperCase().lastIndexOf(" AS ");return c!==b-3&&(c=-1),-1!==b&&(this.setAlias(a.substr(b+1)),a=a.substring(0,-1===c?b:c)),this._table=a,this},setAlias:function(a){return this._alias=a,this},setOnClause:function(a){return this._isLikePropel=!1,this._onClause=a,this},setJoinType:function(a){return this._joinType=a,this},getQueryStatement:function(a){var b,c,d=this._table,e=this._onClause,f=this._joinType,g=this._alias;return d instanceof t?(b=d.getQuery(a),d="("+b._qString+")",b.setString("")):b=new t.Statement(a),g&&(d+=" AS "+g),this._isLikePropel?e=this._leftColumn+" = "+this._rightColumn:null===e?e="1 = 1":e instanceof s&&(c=e.getQueryStatement(),e=c._qString,b.addParams(c.getParams())),""!==e&&(e="ON ("+e+")"),b.setString(f+" "+d+" "+e),b},getTable:function(){return this._table},getAlias:function(){return this._alias},getOnClause:function(){return this._isLikePropel?this._leftColumn+" = "+this._rightColumn:this._onClause},getJoinType:function(){return this._joinType}},dabl.Query.Join=v;var w=function(a){this._params=[],a&&(this._conn=a)};w.embedParams=function(a,b,c){c&&(b=c.prepareInput(b));var d="?";if(a.split(d).length-1!==b.length)throw new Error("The number of occurances of "+d+" do not match the number of _params.");if(0===b.length)return a;var e,f,g=a.length,h=d.length;for(e=b.length-1;e>=0;--e){if(f=b[e],g=a.lastIndexOf(d,g),-1===g)throw new Error("The number of occurances of "+d+" do not match the number of _params.");a=a.substring(0,g)+f+a.substr(g+h)}return a},w.prototype={_qString:"",_params:null,_conn:null,setConnection:function(a){this._conn=a},getConnection:function(){return this._conn},setString:function(a){this._qString=a},getString:function(){return this._qString},addParams:function(a){this._params=this._params.concat(a)},setParams:function(a){this._params=a.slice(0)},addParam:function(a){this._params.push(a)},getParams:function(){return this._params.slice(0)},toString:function(){return t.Statement.embedParams(this._qString,this._params.slice(0),this._conn)}},dabl.Query.Statement=w;var x=dabl.Class.extend({_cache:null,init:function(){this._cache={}},cache:function(a,b,c){return this._cache[a]||(this._cache[a]={}),arguments.length<3?this._cache[a][b]?this._cache[a][b]:null:(this._cache[a][b]=c,this)},emptyCache:function(a){delete this._cache[a]},formatDate:function(a,b){return a?b&&b===dabl.Model.FIELD_TYPE_TIMESTAMP?this.formatDateTime(a):(a instanceof Date||(a=dabl.constructDate(a)),a.getUTCFullYear()+"-"+dabl.sPad(a.getUTCMonth()+1)+"-"+dabl.sPad(a.getUTCDate())):null},formatDateTime:function(a){return a?(a instanceof Date||(a=dabl.constructDate(a)),a.getFullYear()+"-"+dabl.sPad(a.getMonth()+1)+"-"+dabl.sPad(a.getDate())+" "+dabl.sPad(a.getHours())+":"+dabl.sPad(a.getMinutes())+":"+dabl.sPad(a.getSeconds())):null},findQuery:function(a){var b=Array.prototype.slice.call(arguments),c=(new t).setTable(a.getTableName()),d=a.getKey();b.shift();var e=b.length;if(0===e)return c;if(1===e){if("object"==typeof b[0]){if(b[0]instanceof t)return b[0].getTable()||b[0].setTable(a.getTableName()),b[0];c.and(b[0])}else if(d){var f=parseInt(b[0],10);isNaN(f)?c.and(d,b[0]):c.and(d,f)}}else{if(2!==e&&3!==e&&4!==e||"string"!=typeof b[0])throw new Error("Unknown arguments for find: ("+b.join(", ")+")");c.and.apply(c,b)}return c},find:function(){throw new Error("find not implemented for this adapter")},findAll:function(){throw new Error("findAll not implemented for this adapter")},countAll:function(){throw new Error("countAll not implemented for this adapter")},removeAll:function(){throw new Error("removeAll not implemented for this adapter")},insert:function(){throw new Error("insert not implemented for this adapter")},update:function(){throw new Error("update not implemented for this adapter")},remove:function(){throw new Error("remove not implemented for this adapter")}});dabl.Adapter=x}({},function(){return this}()); \ No newline at end of file +!function(a,b){function c(a){return"[object Array]"===Object.prototype.toString.call(a)}function d(a,b){if(c(a))for(var d=0;d1&&arguments[1]&&this.fail(arguments[1]),arguments.length>0&&arguments[0]&&this.done(arguments[0]),arguments.length>2&&arguments[2]&&this.progress(arguments[2]),this},promise:function(a){if(null==a)return j;for(var b in j)a[b]=j[b];return a},state:function(){return b},debug:function(){console.log("[debug]",f,g,b)},isRejected:function(){return"rejected"===b},isResolved:function(){return"resolved"===b},pipe:function(a,b,c){return e(function(c){d(a,function(a){"function"==typeof a?k.done(function(){var b=a.apply(this,arguments);b&&"function"==typeof b?b.promise().then(c.resolve,c.reject,c.notify):c.resolve(b)}):k.done(c.resolve)}),d(b,function(a){"function"==typeof a?k.fail(function(){var b=a.apply(this,arguments);b&&"function"==typeof b?b.promise().then(c.resolve,c.reject,c.notify):c.reject(b)}):k.fail(c.reject)})}).promise()}},k={resolveWith:function(a){if("pending"===b){b="resolved";for(var c=i=arguments.length>1?arguments[1]:[],d=0;d1?arguments[1]:[],d=0;d1?arguments[1]:[],d=0;dh;++h)null!==b[h]&&"function"==typeof b[h].toJSON?g[h]=b[h].toJSON():g[h]=dabl.copy(b[h]);b=g}else b=c===JSON?JSON.stringify(b):c===k.FIELD_TYPE_DATE?dabl.formatDate(b):null!==b&&"function"==typeof b.toJSON?b.toJSON():dabl.copy(b);d[a]=b}return delete this._inToJSON,d},hasKeyValues:function(){var a=this.constructor,b=a._keys;if(0===b.length)return!1;a.coerceValues(this);for(var c=0,d=b.length;d>c;++c){var e=b[c];if(null===this[e])return!1}return!0},getKeyValues:function(){var a={},b=this.constructor,c=b._keys;b.coerceValues(this);for(var d=0,e=c.length;e>d;++d){var f=c[d];a[f]=this[f]}return a},isNew:function(){return this._isNew},setNew:function(a){return this._isNew=a===!0,this},validate:function(){this._validationErrors=[];var a=this.constructor;a.coerceValues(this);for(var b in a._fields){var c=a._fields[b];if(c.required){var d=this[b];(!d||d instanceof Array&&0===d.length)&&this._validationErrors.push(b+" is required.")}}return 0===this._validationErrors.length},getValidationErrors:function(){return this._validationErrors},save:function(a,b){return this.isNew()?this.insert(a,b):this.update(a,b)},insert:function(a,b){return this.callAsync(function(){var a=this.constructor;if(!this.validate())throw new Error("Cannot save "+a._table+" with validation errors:\n"+this.getValidationErrors().join("\n"));return this.isNew()&&a.hasField("created")&&!this.isModified("created")&&(this.created=new Date),(this.isNew()||this.isModified())&&a.hasField("updated")&&!this.isModified("updated")&&(this.updated=new Date),this.constructor._adapter.insert(this)},a,b)},update:function(a,b,c){return"function"==typeof a&&(b=a,c=b),this.callAsync(function(){var b=this.constructor;if(!this.validate())throw new Error("Cannot save "+b._table+" with validation errors:\n"+this.getValidationErrors().join("\n"));if(0===b._keys.length)throw new Error("Cannot update without primary keys");return this.isNew()&&b.hasField("created")&&!this.isModified("created")&&(this.created=new Date),(this.isNew()||this.isModified())&&b.hasField("updated")&&!this.isModified("updated")&&(this.updated=new Date),"object"==typeof a&&this.fromJSON(a),b._adapter.update(this)},b,c)},remove:function(a,b){return this.callAsync(function(){return this.constructor._adapter.remove(this)},a,b)}});k.models={},k._fields=k._keys=k._table=null,k._autoIncrement=!1,k.FIELD_TYPE_TEXT="TEXT",k.FIELD_TYPE_NUMERIC="NUMERIC",k.FIELD_TYPE_INTEGER="INTEGER",k.FIELD_TYPE_DATE="DATE",k.FIELD_TYPE_TIME="TIME",k.FIELD_TYPE_TIMESTAMP="TIMESTAMP",k.FIELD_TYPES={TEXT:k.FIELD_TYPE_TEXT,NUMERIC:k.FIELD_TYPE_NUMERIC,INTEGER:k.FIELD_TYPE_INTEGER,DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.TEXT_TYPES={TEXT:k.FIELD_TYPE_TEXT,DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.INTEGER_TYPES={INTEGER:k.FIELD_TYPE_INTEGER},k.TEMPORAL_TYPES={DATE:k.FIELD_TYPE_DATE,TIME:k.FIELD_TYPE_TIME,TIMESTAMP:k.FIELD_TYPE_TIMESTAMP},k.NUMERIC_TYPES={INTEGER:k.FIELD_TYPE_INTEGER,NUMERIC:k.FIELD_TYPE_NUMERIC},k.isFieldType=function(a){return a in k.FIELD_TYPES||this.isObjectType(a)},k.isTemporalType=function(a){return a in this.TEMPORAL_TYPES},k.isTextType=function(a){return a in this.TEXT_TYPES},k.isNumericType=function(a){return a in this.NUMERIC_TYPES},k.isIntegerType=function(a){return a in this.INTEGER_TYPES},k.isObjectType=function(a){return a===JSON||"function"==typeof a},k.coerceValue=function(a,b){var c=b.type;if("undefined"==typeof a||null===a){if(c!==Array)return null;a=[]}var d=this.isTemporalType(c),e=this.isNumericType(c);if((e||d)&&""===a)return null;if(e){if(this.isIntegerType(c)){if(a=parseInt(a,10),isNaN(a))throw new Error(a+" is not a valid integer")}else if(a=parseFloat(a,10),isNaN(a))throw new Error(a+" is not a valid float")}else if(d)a instanceof Date||(a=dabl.constructDate(a));else if(c===Array){if(b.elementType){this.convertArray(a,b.elementType);for(var f=0,g=a.length;g>f;++f)a[f]=this.coerceValue(a[f],{type:b.elementType})}}else c===JSON?"string"==typeof a&&(a=JSON.parse(a)):c===this.FIELD_TYPE_TEXT?"string"!=typeof a&&(a+=""):this.isObjectType(c)&&c.isModel&&a.constructor!==c&&(a=c.inflate(a));return a},k.coerceValues=function(a){if(null===a||"undefined"==typeof a)return this;for(var b in this._fields)b in a&&(a[b]=this.coerceValue(a[b],this._fields[b]));return this},k.convertArray=function(a,b){if(!a.modelCollection){a.modelCollection=!0;var c=this;a.push=function(){return Array.prototype.push.apply(this,c.coerceValue(arguments,{type:Array,elementType:b}))},a.unshift=function(){return Array.prototype.unshift.apply(this,c.coerceValue(arguments,{type:Array,elementType:b}))},a.pop=function(){return c.coerceValue(Array.prototype.pop.apply(this,arguments),{type:b})},a.shift=function(){return c.coerceValue(Array.prototype.shift.apply(this,arguments),{type:b})},a.slice=function(){return c.coerceValue(Array.prototype.slice.apply(this,arguments),{type:Array,elementType:b})},a.concat=function(){return c.coerceValue(Array.prototype.concat.apply(this,arguments),{type:Array,elementType:b})},a.splice=function(){for(var a=2,d=arguments.length;d>a;++a)arguments[a]=c.coerceValue(arguments[a],{type:b});return c.coerceValue(Array.prototype.splice.apply(this,arguments),{type:Array,elementType:b})};for(var d=["forEach","every","some","filter","map"],e=0,f=d.length;f>e;++e){var g=d[e];a[g]=function(a){return function(d,e){return Array.prototype[a].call(this,function(){return arguments[0]=c.coerceValue(arguments[0],{type:b}),d.apply(this,arguments)},e)}}(g)}}},k.getAdapter=function(){return this._adapter},k.setAdapter=function(a){return this._adapter=a,this},k.inflate=function(a){var b,c=this.getKey(),d=this._adapter;if(c&&a[c]&&(b=d.cache(this._table,a[c]))){if(b.isModified())return b;b.fromJSON(a)}return b||(b=new this(a)),b.resetModified().setNew(!1),c&&b[c]&&d.cache(this._table,b[c],b),b},k.inflateArray=function(a){var b,c,d;if(a.constructor!==Array){if("undefined"==typeof d.length)throw new Error("Unknown array type for collection.");d=[]}else d=a;for(b=0,c=a.length;c>b;++b)d[b]=this.inflate(a[b]);return this.convertArray(d,this),d},k.getTableName=function(){return this._table},k.getFields=function(){return dabl.copy(this._fields)},k.getField=function(a){return dabl.copy(this._fields[a])},k.getFieldType=function(a){return this._fields[a].type},k.hasField=function(a){return a in this._fields},k.getKeys=function(){return this._keys.slice(0)},k.getKey=function(){return 1===this._keys.length?this._keys[0]:null},k.isAutoIncrement=function(){return this._autoIncrement},k.addField=function(a,b){switch(b.type||(b={type:b}),"string"==typeof b.type&&(b.type=b.type.toUpperCase()),b.type){case"STRING":case String:b.type=this.FIELD_TYPE_TEXT;break;case Number:b.type=this.FIELD_TYPE_NUMERIC;break;case Date:b.type=this.FIELD_TYPE_TIMESTAMP;break;case"INT":b.type=this.FIELD_TYPE_INTEGER}if(b.key&&this._keys.push(a),b.computed&&(this._autoIncrement=!0),!this.isFieldType(b.type))throw new Error(b.type+" is not a valide field type");b.type.isModel&&this._relations.push(a),this._fields[a]=b},k.extend=function(a,b){var c,d,e;if(b=b||{},"undefined"==typeof a)throw new Error("Must provide a table when exending Model");if(c=j.extend.call(this,b.prototype),delete b.prototype,this._table||this._fields)c._keys=dabl.copy(this._keys),c._fields=dabl.copy(this._fields),c._relations=dabl.copy(this._relations);else{if(!b.fields)throw new Error("Must provide fields when exending Model");c._keys=[],c._fields={},c._relations=[]}c._table=a;for(e in b)switch(e){case"url":case"adapter":c["_"+e]=b[e];break;default:c[e]=b[e]}for(d in b.fields)c.addField(d,b.fields[d]);return k.models[a]=c,c},k.isModel=!0,k.toString=function(){return this._table};for(var l=["countAll","findAll","find","removeAll","updateAll"],m=0,n=l.length;n>m;++m){var o=l[m];k[o]=function(a){return function(){for(var b=Array.prototype.slice.call(arguments),c=this.getAdapter(),d=null,e=null,f=b.length-1;f>-1&&!(b[f]instanceof k)&&"function"==typeof b[f];){if(d){e=d,d=b.pop();break}d=b.pop(),--f}return b.unshift(this),this.callAsync(function(){return c[a].apply(c,b)},d,e)}}(o)}for(var p=["findBy","retrieveByField","retrieveByPK","retrieveByPKs","findByPKs"],q=0,r=p.length;r>q;++q)k[p[q]]=k.find;dabl.Model=k;var s=dabl.Class.extend({_conds:null,init:function(a,b,c,d){this._conds=[],0!==arguments.length&&this.and.apply(this,arguments)},_preprocessCondition:function(a,b,c,d){switch(arguments.length){case 0:return null;case 1:return a instanceof t.Statement||a instanceof s&&0!==a._conds.length?[a]:null;case 2:c=b,b=s.EQUAL;case 3:d=s.QUOTE_RIGHT}var e=c instanceof t,f=c instanceof Array;if(f||e){if(!1===e||1!==c.getLimit())switch(b){case s.BETWEEN:break;case s.IN:case s.EQUAL:case"eq":b=s.IN;break;case"ne":case s.NOT_IN:case s.NOT_EQUAL:case s.ALT_NOT_EQUAL:b=s.NOT_IN;break;default:throw new Error(b+" unknown for comparing an array.")}if(f&&0===c.length&&b===s.NOT_IN)return null;if(e){if(!c.getTable())throw new Error("right does not have a table, so it cannot be nested.");d!==s.QUOTE_LEFT&&(d=s.QUOTE_NONE)}}else null===c&&(b===s.NOT_EQUAL||b===s.ALT_NOT_EQUAL||"ne"===b?b=s.IS_NOT_NULL:(b===s.EQUAL||"eq"===b)&&(b=s.IS_NULL)),(b===s.IS_NULL||b===s.IS_NOT_NULL)&&(c=null,d!==s.QUOTE_LEFT&&(d=s.QUOTE_NONE));return[a,b,c,d]},_processCondition:function(a,b,c,d){if(1===arguments.length){if(a instanceof t.Statement)return a;if(a instanceof s)return e=a.getQueryStatement(),e.setString("("+e._qString+")"),e}var e,f,g,h=new t.Statement,i=c instanceof t,j=c instanceof Array;if(!(b in s.SQL.operators))throw new Error('Unsupported SQL operator: "'+b+'"');if("substringof"===b){var k=a;a=c,c=k}if(b=s.SQL.operators[b],(d===s.QUOTE_LEFT||d===s.QUOTE_BOTH)&&(h.addParam(a),a="?"),b===s.CONTAINS?(b=s.LIKE,c="%"+c+"%"):b===s.BEGINS_WITH?(b=s.LIKE,c+="%"):b===s.ENDS_WITH&&(b=s.LIKE,c="%"+c),j||i){if(i)e=c.getQuery(),c="("+e._qString+")",h.addParams(e._params);else if(j){if(g=c.length,2===g&&b===s.BETWEEN)return h.setString(a+" "+b+" ? AND ?"),h.addParams(c),h;if(0===g){if(b===s.IN)return h.setString("(0 = 1)"),h}else if(d===s.QUOTE_RIGHT||d===s.QUOTE_BOTH){h.addParams(c);var l="(";for(f=0;g>f;++f)f>0&&(l+=","),l+="?";c=l+")"}}}else b===s.IS_NULL||b===s.IS_NOT_NULL||d!==s.QUOTE_RIGHT&&d!==s.QUOTE_BOTH||(h.addParam(c),c="?");return h.setString(a+" "+b+(null===c?"":" "+c)),h},prepareInput:function(a){if(a instanceof Array){a=a.slice(0);for(var b=0,c=a.length;c>b;++b)a[b]=this.prepareInput(a[b]);return a}return a===!0||a===!1?a?1:0:null===a||"undefined"==typeof a?"null":parseInt(a,10)===a?a:this.quote(a)},quote:function(a){return"'"+a.replace("'","''")+"'"},_processODataCondition:function(a,b,c,d){if(1===arguments.length){if(a instanceof t.Statement)throw new Error("Unable to use Query.Statement within a Condition to build an OData query");if(a instanceof s)return"("+a.getODataFilter()+")"}if(c instanceof t)throw new Error("Unable to use Query within a Condition to build an OData query");var e,f,g=c instanceof Array;switch((d===s.QUOTE_LEFT||d===s.QUOTE_BOTH)&&(a=this.prepareInput(a)),b){case"startswith":case"endswith":case"substringof":case s.LIKE:case s.CONTAINS:case s.BEGINS_WITH:case s.ENDS_WITH:if(-1!==c.indexOf("%"))throw new Error("Cannot use % in OData queries")}if(b===s.IS_NULL?(b=s.EQUAL,c="null"):b===s.IS_NOT_NULL?(b=s.NOT_EQUAL,c="null"):(d===s.QUOTE_RIGHT||d===s.QUOTE_BOTH)&&(c=this.prepareInput(c)),g){if(f=c.length,2===f&&b===s.BETWEEN)return"("+a+" ge "+c[0]+" and "+a+" le "+c[1]+")";if(0===f&&b===s.IN)return"(0 eq 1)";var h;b===s.IN?(b=" eq ",h=" or "):(b=" ne ",h=" and ");var i="(";for(e=0;f>e;++e)i+=(0!==e?h:"")+a+b+c[e];return i+")"}if(b in s.OData.operators)return b=s.OData.operators[b],a+" "+b+" "+c;if(b in s.OData.functions){var j=s.OData.functions[b],k=j.indexOf("@"),l=j.indexOf("?");return k>l?(j=j.substring(0,k)+c+j.substr(k+1),j=j.substring(0,l)+a+j.substr(l+1)):(j=j.substring(0,l)+a+j.substr(l+1),j=j.substring(0,k)+c+j.substr(k+1)),j}throw new Error("Unexpected arguments: "+arguments.join(", "))},and:function(a,b,c,d){var e;if(a.constructor===Object){for(e in a)this.and(e,a[e]);return this}var f=this._preprocessCondition.apply(this,arguments);return null===f?this:(f.type="AND",this._conds.push(f),this)},addAnd:function(a,b,c,d){return this.and.apply(this,arguments)},add:function(a,b,c,d){return this.and.apply(this,arguments)},filter:function(a,b,c,d){return this.and.apply(this,arguments)},where:function(a,b,c,d){return this.and.apply(this,arguments)},or:function(a,b,c,d){var e;if(a.constructor===Object){for(e in a)this.or(e,a[e]);return this}var f=this._preprocessCondition.apply(this,arguments);return null===f?this:(f.type="OR",this._conds.push(f),this)},addOr:function(a,b,c,d){return this.or.apply(this,arguments)},orWhere:function(a,b,c,d){return this.or.apply(this,arguments)},andNot:function(a,b){return this.and(a,s.NOT_EQUAL,b)},andLike:function(a,b){return this.and(a,s.LIKE,b)},andNotLike:function(a,b){return this.and(a,s.NOT_LIKE,b)},andGreater:function(a,b){return this.and(a,s.GREATER_THAN,b)},andGreaterEqual:function(a,b){return this.and(a,s.GREATER_EQUAL,b)},andLess:function(a,b){return this.and(a,s.LESS_THAN,b)},andLessEqual:function(a,b){return this.and(a,s.LESS_EQUAL,b)},andNull:function(a){return this.and(a,null)},andNotNull:function(a){return this.and(a,s.NOT_EQUAL,null)},andBetween:function(a,b,c){return this.and(a,s.BETWEEN,[b,c])},andBeginsWith:function(a,b){return this.and(a,s.BEGINS_WITH,b)},andEndsWith:function(a,b){return this.and(a,s.ENDS_WITH,b)},andContains:function(a,b){return this.and(a,s.CONTAINS,b)},orNot:function(a,b){return this.or(a,s.NOT_EQUAL,b)},orLike:function(a,b){return this.or(a,s.LIKE,b)},orNotLike:function(a,b){return this.or(a,s.NOT_LIKE,b)},orGreater:function(a,b){return this.or(a,s.GREATER_THAN,b)},orGreaterEqual:function(a,b){return this.or(a,s.GREATER_EQUAL,b)},orLess:function(a,b){return this.or(a,s.LESS_THAN,b)},orLessEqual:function(a,b){return this.or(a,s.LESS_EQUAL,b)},orNull:function(a){return this.or(a,null)},orNotNull:function(a){return this.or(a,s.NOT_EQUAL,null)},orBetween:function(a,b,c){return this.or(a,s.BETWEEN,[b,c])},orBeginsWith:function(a,b){return this.or(a,s.BEGINS_WITH,b)},orEndsWith:function(a,b){return this.or(a,s.ENDS_WITH,b)},orContains:function(a,b){return this.or(a,s.CONTAINS,b)},getQueryStatement:function(a){if(0===this._conds.length)return null;var b,c,d=new t.Statement(a),e="",f=this._conds,g=f.length;for(b=0;g>b;++b)c=this._processCondition.apply(this,f[b]),null!==c&&(e+="\n ",0!==b&&(e+=(1===b&&"OR"===f[0].type?"OR":f[b].type)+" "),e+=c._qString,d.addParams(c._params));return d.setString(e),d},getODataFilter:function(){if(0===this._conds.length)return null;var a,b,c="",d=this._conds,e=d.length;for(a=0;e>a;++a)b=this._processODataCondition.apply(this,d[a]),null!==b&&(0!==a&&(c+=" "+(1===a&&"or"===d[0].type?"or":"OR"===d[a].type?"or":"and")+" "),c+=b);return c},toString:function(){return this.getQueryStatement().toString()},getSimpleJSON:function(){var a={};if(0===this._conds.length)return{};var b,c,d=this._conds,e=d.length;for(b=0;e>b;++b){var c=d[b];if("AND"!==c.type)throw new Error("OR conditions not supported.");if(2===c.length)a[c[0]]=c[1];else{if(c[1]!==s.EQUAL)throw new Error('Cannot export complex condition: "'+this._processCondition.apply(this,c)+'"');a[c[0]]=c[2]}}return a}});s.EQUAL="=",s.NOT_EQUAL="<>",s.ALT_NOT_EQUAL="!=",s.GREATER_THAN=">",s.LESS_THAN="<",s.GREATER_EQUAL=">=",s.LESS_EQUAL="<=",s.LIKE="LIKE",s.BEGINS_WITH="BEGINS_WITH",s.ENDS_WITH="ENDS_WITH",s.CONTAINS="CONTAINS",s.NOT_LIKE="NOT LIKE",s.IN="IN",s.NOT_IN="NOT IN",s.IS_NULL="IS NULL",s.IS_NOT_NULL="IS NOT NULL",s.BETWEEN="BETWEEN",s.BINARY_AND="&",s.BINARY_OR="|",s.SQL={operators:{eq:"=",ne:"<>",gt:">",lt:"<",ge:">=",le:"<=","=":"=","<>":"<>","!=":"<>",">":">","<":"<",">=":">=","<=":"<=","&":"&","|":"|",startswith:"BEGINS_WITH",BEGINS_WITH:"BEGINS_WITH",endswith:"ENDS_WITH",ENDS_WITH:"BEGINS_WITH",substringof:"CONTAINS",CONTAINS:"CONTAINS",LIKE:"LIKE","NOT LIKE":"NOT LIKE",IN:"IN","NOT IN":"NOT IN","IS NULL":"IS NULL","IS NOT NULL":"IS NOT NULL",BETWEEN:"BETWEEN"}},s.OData={operators:{eq:"eq",ne:"ne",gt:"gt",lt:"lt",ge:"ge",le:"le","=":"eq","<>":"ne","!=":"ne",">":"gt","<":"lt",">=":"ge","<=":"le","&":"&","|":"|"},functions:{startswith:"startswith(?, @)",endswith:"endswith(?, @)",substringof:"substringof(@, ?)",BEGINS_WITH:"startswith(?, @)",ENDS_WITH:"endswith(?, @)",CONTAINS:"substringof(@, ?)",LIKE:"tolower(@) eq tolower(?)","NOT LIKE":"tolower(@) ne tolower(?)"}},s.QUOTE_LEFT=1,s.QUOTE_RIGHT=2,s.QUOTE_BOTH=3,s.QUOTE_NONE=4,dabl.Condition=s;var t=s.extend({_action:"SELECT",_columns:null,_table:null,_tableAlias:null,_extraTables:null,_joins:null,_orders:null,_groups:null,_having:null,_limit:null,_offset:0,_distinct:!1,init:function(a,b){this._super(),this._columns=[],this._joins=[],this._orders=[],this._groups=[],a&&(a.constructor===Object?this.and(a):a&&this.setTable(a,b))},setDistinct:function(a){"undefined"==typeof a&&(a=!0),this._distinct=a===!0},setAction:function(a){switch(a){case"SELECT":case"DELETE":case"COUNT":break;default:throw new Error('"'+a+'" is not an allowed Query action.')}return this._action=a,this},getAction:function(){return this._action},addColumn:function(a){return this._columns.push(a),this},setColumns:function(a){return this._columns=a.slice(0),this},select:function(a){return this.setColumns.apply(this,arguments)},getColumns:function(){return this._columns},setGroups:function(a){return this._groups=a,this},getGroups:function(){return this._groups},setTable:function(a,b){if(a instanceof t&&!b)throw new Error("The nested query must have an alias.");return b&&this.setAlias(b),this._table=a,this},from:function(a,b){return this.setTable.apply(this,arguments)},getTable:function(){return this._table},setAlias:function(a){return this._tableAlias=a,this},getAlias:function(){return this._tableAlias},addTable:function(a,b){if(a instanceof t){if(!b)throw new Error("The nested query must have an alias.")}else"undefined"==typeof b&&(b=a);if(b===this._tableAlias||b===this._table)throw new Error('The alias "'+b+'" is is already in use');return null===this._extraTables&&(this._extraTables={}),this._extraTables[b]=a,this},addJoin:function(a,b,c){if(a instanceof t.Join)return this._joins.push(a),this;if(null===b){if(c===t.JOIN||c===t.INNER_JOIN)return this.addTable(a),this;b="1 = 1"}return this._joins.push(new t.Join(a,b,c)),this},join:function(a,b,c){return this.addJoin(a,b,c)},innerJoin:function(a,b){return this.addJoin(a,b,t.INNER_JOIN)},leftJoin:function(a,b){return this.addJoin(a,b,t.LEFT_JOIN)},rightJoin:function(a,b){return this.addJoin(a,b,t.RIGHT_JOIN)},outerJoin:function(a,b){return this.addJoin(a,b,t.OUTER_JOIN)},getJoins:function(){return this._joins},setJoins:function(a){return this._joins=a,this},groupBy:function(a){return this._groups.push(a),this},setHaving:function(a){if(null!==a&&!(a instanceof s))throw new Error("setHaving must be given an instance of Condition");return this._having=a,this},getHaving:function(){return this._having},orderBy:function(a,b){return this._orders.push(arguments),this},limit:function(a,b){if(a=parseInt(a),isNaN(a))throw new Error("Not a number");return this._limit=a,arguments.length>1&&this.setOffset(b),this},top:function(a,b){return this.limit.apply(this,arguments)},getLimit:function(){return this._limit},offset:function(a){if(a=parseInt(a),isNaN(a))throw new Error("Not a number.");return this._offset=a,this},skip:function(a){return this.offset.apply(this,arguments)},setPage:function(a){if(a=parseInt(a),isNaN(a))throw new Error("Not a number.");if(2>a)return this._offset=null,this;if(!this._limit)throw new Error("Cannot set page without first setting limit.");return this._offset=a*this._limit-this._limit,this},hasAggregates:function(){if(0!==this._groups.length)return!0;for(var a=0,b=this._columns.length;b>a;++a)if(-1!==this._columns[a].indexOf("("))return!0;return!1},needsComplexCount:function(){return this.hasAggregates()||null!==this._having||this._distinct},getQuery:function(a){"undefined"==typeof a&&(a=new SQLAdapter);var b,c,d,e,f,g,h,i,j,k=new t.Statement(a);switch(b="",this._action){default:case t.ACTION_COUNT:case t.ACTION_SELECT:c=this.getColumnsClause(a),k.addParams(c._params),b+="SELECT "+c._qString;break;case t.ACTION_DELETE:b+="DELETE"}if(d=this.getTablesClause(a),k.addParams(d._params),b+="\nFROM "+d._qString,0!==this._joins.length)for(e=0,f=this._joins.length;f>e;++e)g=this._joins[e],h=g.getQueryStatement(a),b+="\n "+h._qString,k.addParams(h._params);if(i=this.getWhereClause(),null!==i&&(b+="\nWHERE "+i._qString,k.addParams(i._params)),0!==this._groups.length&&(b+="\nGROUP BY "+this._groups.join(", ")),null!==this.getHaving()&&(j=this.getHaving().getQueryStatement(),j&&(b+="\nHAVING "+j._qString,k.addParams(j._params))),this._action!==t.ACTION_COUNT&&0!==this._orders.length)for(b+="\nORDER BY ",e=0,f=this._orders.length;f>e;++e){var l=this._orders[e][0],m=this._orders[e][1];null!==m&&"undefined"!=typeof m&&(l=l+" "+m),0!==e&&(b+=", "),b+=l}return null!==this._limit&&(a?b=a.applyLimit(b,this._offset,this._limit):b+="\nLIMIT "+(this._offset?this._offset+", ":"")+this._limit),this._action===t.ACTION_COUNT&&this.needsComplexCount()&&(b="SELECT count(0)\nFROM ("+b+") a"),k.setString(b),k},getTablesClause:function(a){var b,c,d,e,f,g,h,i,j=this._table;if(!j)throw new Error("No table specified.");switch(b=new t.Statement(a),c=this._tableAlias,j instanceof t?(d=j.getQuery(a),f="("+d._qString+")"):(d=null,f=j),this._action){case t.ACTION_COUNT:case t.ACTION_SELECT:if(null!==d&&b.addParams(d._params),c&&(f=f+" AS "+c),null!==this._extraTables)for(e in this._extraTables)g=this._extraTables[e],g instanceof t?(h=g.getQuery(a),i="("+h._qString+") AS "+e,b.addParams(h._params)):(i=g,e!==g&&(i=i+" AS "+e)),f=f+", "+i;b.setString(f);break;case t.ACTION_DELETE:null!==d&&b.addParams(d._params),c&&(f=f+" AS "+c),b.setString(f)}return b},getColumnsClause:function(a){var b,c,d,e,f,g=this._table,h=new t.Statement(a),i=this._tableAlias,j=this._action;if(j===t.ACTION_DELETE)return h;if(!g)throw new Error("No table specified.");if(j===t.ACTION_COUNT){if(!this.needsComplexCount())return h.setString("count(0)"),h;if(0!==this._groups.length)return h.setString(this._groups.join(", ")),h;if(!this._distinct&&null===this.getHaving()&&0!==this._columns.length){for(e=[],c=0,d=this._columns.length;d>c;++c)b=this._columns[c],-1!==b.indexOf("(")&&e.push(b);if(0!==e.length)return h.setString(e.join(", ")),h}}return f=0!==this._columns.length?this._columns.join(", "):i?i+".*":g+".*",this._distinct&&(f="DISTINCT "+f),h.setString(f),h},getWhereClause:function(a){return this.getQueryStatement(a)},toString:function(){return this._table||this.setTable("{UNSPECIFIED-TABLE}"),this.getQuery().toString()},getCountQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_COUNT),this.getQuery(a)},getDeleteQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_DELETE),this.getQuery(a)},getSelectQuery:function(a){if(!this._table)throw new Error("No table specified.");return this.setAction(t.ACTION_SELECT),this.getQuery(a)},getODataQuery:function(){if(this._joins&&0!==this._joins.length)throw new Error("JOINS cannot be exported.");if(this._extraTables&&0!==this._extraTables.length)throw new Error("Extra tables cannot be exported.");if(this._having&&0!==this._having.length)throw new Error("Having cannot be exported.");if(this._groups&&0!==this._groups.length)throw new Error("Grouping cannot be exported.");var a={};0!==this._columns.length&&(a.$select=this._columns.join(","));var b=this.getODataFilter();return b&&(a.$filter=b),this._limit&&(a.$top=this._limit,this._offset&&(a.$skip=this._offset)),this._orders&&0!==this._orders.length&&(a.$orderby=this._orders[0][0],this._orders[0][1]===t.DESC&&(a.$orderby+=" desc")),a},getSimpleJSON:function(){if(this._joins&&0!==this._joins.length)throw new Error("JOINS cannot be exported.");if(this._extraTables&&0!==this._extraTables.length)throw new Error("Extra tables cannot be exported.");if(this._having&&0!==this._having.length)throw new Error("Having cannot be exported.");if(this._groups&&0!==this._groups.length)throw new Error("Grouping cannot be exported.");var a=this._super();return this._limit&&(a.limit=this._limit,this._offset&&(a.offset=this._offset,a.page=Math.floor(this._offset/this._limit)+1)),this._orders&&0!==this._orders.length&&(a.order_by=this._orders[0][0],this._orders[0][1]===t.DESC&&(a.dir=t.DESC)),this._action===t.ACTION_COUNT&&(a.count_only=1),a}});t.ACTION_COUNT="COUNT",t.ACTION_DELETE="DELETE",t.ACTION_SELECT="SELECT",t.JOIN="JOIN",t.LEFT_JOIN="LEFT JOIN",t.RIGHT_JOIN="RIGHT JOIN",t.INNER_JOIN="INNER JOIN",t.OUTER_JOIN="OUTER JOIN",t.ASC="ASC",t.DESC="DESC",dabl.Query=t;var u=/^\w+\.\w+$/,v=function(a,b,c){return arguments.length<3&&(c=t.JOIN),a instanceof t||b instanceof s||!u.test(b)||!u.test(a)?void this.setTable(a).setOnClause(b).setJoinType(c):(this._isLikePropel=!0,this._leftColumn=a,this._rightColumn=b,this._table=b.substring(0,b.indexOf(".")),void(this._joinType=c))};v.prototype={_table:null,_alias:null,_onClause:null,_isLikePropel:!1,_leftColumn:null,_rightColumn:null,_joinType:t.JOIN, +toString:function(){return this.getTable()||this.setTable("{UNSPECIFIED-TABLE}"),this.getQueryStatement().toString()},setTable:function(a){var b=a.lastIndexOf(" "),c=-1===b?-1:a.toUpperCase().lastIndexOf(" AS ");return c!==b-3&&(c=-1),-1!==b&&(this.setAlias(a.substr(b+1)),a=a.substring(0,-1===c?b:c)),this._table=a,this},setAlias:function(a){return this._alias=a,this},setOnClause:function(a){return this._isLikePropel=!1,this._onClause=a,this},setJoinType:function(a){return this._joinType=a,this},getQueryStatement:function(a){var b,c,d=this._table,e=this._onClause,f=this._joinType,g=this._alias;return d instanceof t?(b=d.getQuery(a),d="("+b._qString+")",b.setString("")):b=new t.Statement(a),g&&(d+=" AS "+g),this._isLikePropel?e=this._leftColumn+" = "+this._rightColumn:null===e?e="1 = 1":e instanceof s&&(c=e.getQueryStatement(),e=c._qString,b.addParams(c.getParams())),""!==e&&(e="ON ("+e+")"),b.setString(f+" "+d+" "+e),b},getTable:function(){return this._table},getAlias:function(){return this._alias},getOnClause:function(){return this._isLikePropel?this._leftColumn+" = "+this._rightColumn:this._onClause},getJoinType:function(){return this._joinType}},dabl.Query.Join=v;var w=function(a){this._params=[],a&&(this._conn=a)};w.embedParams=function(a,b,c){c&&(b=c.prepareInput(b));var d="?";if(a.split(d).length-1!==b.length)throw new Error("The number of occurances of "+d+" do not match the number of _params.");if(0===b.length)return a;var e,f,g=a.length,h=d.length;for(e=b.length-1;e>=0;--e){if(f=b[e],g=a.lastIndexOf(d,g),-1===g)throw new Error("The number of occurances of "+d+" do not match the number of _params.");a=a.substring(0,g)+f+a.substr(g+h)}return a},w.prototype={_qString:"",_params:null,_conn:null,setConnection:function(a){this._conn=a},getConnection:function(){return this._conn},setString:function(a){this._qString=a},getString:function(){return this._qString},addParams:function(a){this._params=this._params.concat(a)},setParams:function(a){this._params=a.slice(0)},addParam:function(a){this._params.push(a)},getParams:function(){return this._params.slice(0)},toString:function(){return t.Statement.embedParams(this._qString,this._params.slice(0),this._conn)}},dabl.Query.Statement=w;var x=dabl.Class.extend({_cache:null,init:function(){this._cache={}},cache:function(a,b,c){this._cache[a]||(this._cache[a]={});var d=""===b||0===b||null===b||"undefined"==typeof b||isNaN(b);return arguments.length<3?d||!this._cache[a][b]?null:this._cache[a][b]:(d||(this._cache[a][b]=c),this)},emptyCache:function(a){delete this._cache[a]},formatDate:function(a,b){return a?b&&b===dabl.Model.FIELD_TYPE_TIMESTAMP?this.formatDateTime(a):(a instanceof Date||(a=dabl.constructDate(a)),a.getUTCFullYear()+"-"+dabl.sPad(a.getUTCMonth()+1)+"-"+dabl.sPad(a.getUTCDate())):null},formatDateTime:function(a){return a?(a instanceof Date||(a=dabl.constructDate(a)),a.getFullYear()+"-"+dabl.sPad(a.getMonth()+1)+"-"+dabl.sPad(a.getDate())+" "+dabl.sPad(a.getHours())+":"+dabl.sPad(a.getMinutes())+":"+dabl.sPad(a.getSeconds())):null},findQuery:function(a){var b=Array.prototype.slice.call(arguments),c=(new t).setTable(a.getTableName()),d=a.getKey();b.shift();var e=b.length;if(0===e)return c;if(1===e){if("object"==typeof b[0]){if(b[0]instanceof t)return b[0].getTable()||b[0].setTable(a.getTableName()),b[0];c.and(b[0])}else if(d){var f=parseInt(b[0],10);isNaN(f)?c.and(d,b[0]):c.and(d,f)}}else{if(2!==e&&3!==e&&4!==e||"string"!=typeof b[0])throw new Error("Unknown arguments for find: ("+b.join(", ")+")");c.and.apply(c,b)}return c},find:function(a){throw new Error("find not implemented for this adapter")},findAll:function(a){throw new Error("findAll not implemented for this adapter")},countAll:function(a,b){throw new Error("countAll not implemented for this adapter")},removeAll:function(a,b){throw new Error("removeAll not implemented for this adapter")},insert:function(a){throw new Error("insert not implemented for this adapter")},update:function(a){throw new Error("update not implemented for this adapter")},remove:function(a){throw new Error("remove not implemented for this adapter")}});dabl.Adapter=x}({},function(){return this}()); \ No newline at end of file diff --git a/dist/scripts/modules.min.js b/dist/scripts/modules.min.js index 78b7293..b83fe3b 100644 --- a/dist/scripts/modules.min.js +++ b/dist/scripts/modules.min.js @@ -1,7 +1 @@ -!function(a,b){b["true"]=a,function(a,b){function c(a){var b=a.length,c=ib.type(a);return ib.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||"function"!==c&&(0===b||"number"==typeof b&&b>0&&b-1 in a)}function d(a){var b=xb[a]={};return ib.each(a.match(kb)||[],function(a,c){b[c]=!0}),b}function e(a,c,d,e){if(ib.acceptData(a)){var f,g,h=ib.expando,i="string"==typeof c,j=a.nodeType,k=j?ib.cache:a,l=j?a[h]:a[h]&&h;if(l&&k[l]&&(e||k[l].data)||!i||d!==b)return l||(j?a[h]=l=_.pop()||ib.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=ib.noop)),("object"==typeof c||"function"==typeof c)&&(e?k[l]=ib.extend(k[l],c):k[l].data=ib.extend(k[l].data,c)),f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[ib.camelCase(c)]=d),i?(g=f[c],null==g&&(g=f[ib.camelCase(c)])):g=f,g}}function f(a,b,c){if(ib.acceptData(a)){var d,e,f,g=a.nodeType,i=g?ib.cache:a,j=g?a[ib.expando]:ib.expando;if(i[j]){if(b&&(f=c?i[j]:i[j].data)){ib.isArray(b)?b=b.concat(ib.map(b,ib.camelCase)):b in f?b=[b]:(b=ib.camelCase(b),b=b in f?[b]:b.split(" "));for(d=0,e=b.length;e>d;d++)delete f[b[d]];if(!(c?h:ib.isEmptyObject)(f))return}(c||(delete i[j].data,h(i[j])))&&(g?ib.cleanData([a],!0):ib.support.deleteExpando||i!=i.window?delete i[j]:i[j]=null)}}}function g(a,c,d){if(d===b&&1===a.nodeType){var e="data-"+c.replace(zb,"-$1").toLowerCase();if(d=a.getAttribute(e),"string"==typeof d){try{d="true"===d?!0:"false"===d?!1:"null"===d?null:+d+""===d?+d:yb.test(d)?ib.parseJSON(d):d}catch(f){}ib.data(a,c,d)}else d=b}return d}function h(a){var b;for(b in a)if(("data"!==b||!ib.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function i(){return!0}function j(){return!1}function k(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}function l(a,b,c){if(b=b||0,ib.isFunction(b))return ib.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return ib.grep(a,function(a){return a===b===c});if("string"==typeof b){var d=ib.grep(a,function(a){return 1===a.nodeType});if(Rb.test(b))return ib.filter(b,d,!c);b=ib.filter(b,d)}return ib.grep(a,function(a){return ib.inArray(a,b)>=0===c})}function m(a){var b=Ub.split("|"),c=a.createDocumentFragment();if(c.createElement)for(;b.length;)c.createElement(b.pop());return c}function n(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function o(a){var b=a.getAttributeNode("type");return a.type=(b&&b.specified)+"/"+a.type,a}function p(a){var b=ec.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function q(a,b){for(var c,d=0;null!=(c=a[d]);d++)ib._data(c,"globalEval",!b||ib._data(b[d],"globalEval"))}function r(a,b){if(1===b.nodeType&&ib.hasData(a)){var c,d,e,f=ib._data(a),g=ib._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)ib.event.add(b,c,h[c][d])}g.data&&(g.data=ib.extend({},g.data))}}function s(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!ib.support.noCloneEvent&&b[ib.expando]){e=ib._data(b);for(d in e.events)ib.removeEvent(b,d,e.handle);b.removeAttribute(ib.expando)}"script"===c&&b.text!==a.text?(o(b).text=a.text,p(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),ib.support.html5Clone&&a.innerHTML&&!ib.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&bc.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}function t(a,c){var d,e,f=0,g=typeof a.getElementsByTagName!==V?a.getElementsByTagName(c||"*"):typeof a.querySelectorAll!==V?a.querySelectorAll(c||"*"):b;if(!g)for(g=[],d=a.childNodes||a;null!=(e=d[f]);f++)!c||ib.nodeName(e,c)?g.push(e):ib.merge(g,t(e,c));return c===b||c&&ib.nodeName(a,c)?ib.merge([a],g):g}function u(a){bc.test(a.type)&&(a.defaultChecked=a.checked)}function v(a,b){if(b in a)return b;for(var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=yc.length;e--;)if(b=yc[e]+c,b in a)return b;return d}function w(a,b){return a=b||a,"none"===ib.css(a,"display")||!ib.contains(a.ownerDocument,a)}function x(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=ib._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&w(d)&&(f[g]=ib._data(d,"olddisplay",B(d.nodeName)))):f[g]||(e=w(d),(c&&"none"!==c||!e)&&ib._data(d,"olddisplay",e?c:ib.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function y(a,b,c){var d=rc.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=ib.css(a,c+xc[f],!0,e)),d?("content"===c&&(g-=ib.css(a,"padding"+xc[f],!0,e)),"margin"!==c&&(g-=ib.css(a,"border"+xc[f]+"Width",!0,e))):(g+=ib.css(a,"padding"+xc[f],!0,e),"padding"!==c&&(g+=ib.css(a,"border"+xc[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=kc(a),g=ib.support.boxSizing&&"border-box"===ib.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=lc(a,b,f),(0>e||null==e)&&(e=a.style[b]),sc.test(e))return e;d=g&&(ib.support.boxSizingReliable||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a){var b=W,c=uc[a];return c||(c=C(a,b),"none"!==c&&c||(jc=(jc||ib("