"use strict";!function(t,e){"function"==typeof define&&define.amd?define("storkjs",[],function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(global):t.Stork=e(t)}(this,function(t,e){function n(t){return!!(t&&t.constructor&&t.call&&t.apply)}function i(t){return"object"==typeof t&&null!==t}function s(t){return"number"==typeof t&&!isNaN(t)}function r(t){return t instanceof Array}function a(t){return"string"==typeof t}function u(t){return"undefined"==typeof t}function o(t){return"undefined"!=typeof t}function c(t,e){t.length=0,t.push.apply(t,e)}function h(t,e,n,i){return o(t)?t:o(e)?e:o(n)?n:i}function f(t,e,n){var i=t[e];t[e]=t[n],t[n]=i}function l(t,e){for(var n in t)e[n]=t[n];return e}function d(){return(65536*(1+Math.random())|0).toString(16).substring(1)}function v(){return d()+d()+"-"+d()+"-"+d()+"-"+d()+"-"+d()+d()+d()}function p(t,e){var n=e.priority-t.priority;return 0===n?0:0>n?-1:1}function g(t,e){return function(){var n=new y(this,success,failure);if(this.handlePending(this[t],arguments,n))return n;var i=Array.prototype.slice.call(arguments);return i.pop(),i.pop(),i.push(n),e.apply(this,i),n}}function m(t){if(t)for(var e=0;e<$.adapters.length;e++){var n=$.adapters[e];if(n.name===t&&n.definition.valid())return n}if(!m.chosen){$.adapters.sort(p);for(var e=0;e<$.adapters.length;e++){var n=$.adapters[e];if(n.definition.valid())return m.chosen=n}}return m.chosen}function $(t,e,n){if(!(this instanceof $))return new $(t,e,n);if(!JSON)throw"JSON unavailable! Include http://www.json.org/json2.js to fix.";this.options=t=t||{},this.key=h(t.key,"id"),this.name=h(t.name,""),this.lazy=h(t.lazy,!1),this.cache=new w,this.pending=[],this.initialized=!1,this.loaded=!1,this.adapter=m(t.adapter),l(this.adapter.definition,this);for(var i=0;i<$.plugins.length;i++)$.plugins[i](this);this.initializing=this.init(this.options,e,n)}function y(t,e,n,i){this.context=t,this.root=i||this,this.next=null,this.nextPromise=null,this.state=y.PENDING,this.successes=[],this.failures=[],this.errors=[],this.args=null,this.chainFailureResult=!1,this.$queue(e,n)}function w(t){this.values=[],this.keys=[],this.okeys=[],this.indices={},this.putMap(t)}var E=JSON.stringify,S=JSON.parse;return $.prototype={decode:S,encode:E,handlePending:function(t,e,n){var i=!this.initialized;return i&&(this.pending.push({method:t,arguments:Array.prototype.slice.call(e),promise:n}),n&&n.$reset()),i},finishInitialization:function(t,e){if(!this.initialized){this.initialized=!0,t.$success(e);for(var n=0;nn;n++)f(this.values,n,t-n),f(this.keys,n,t-n),f(this.okeys,n,t-n);return this.rebuildIndex(),this},sort:function(t){function e(e,n){for(var s=i.values[Math.floor((n+e)/2)],r=e,a=n;a>=r;){for(;t(i.values[r],s)<0;)r++;for(;t(i.values[a],s)>0;)a--;a>=r&&(f(i.values,r,a),f(i.keys,r,a),f(i.okeys,r,a),r++,a--)}return r}function n(t,i){var s=e(t,i);s-1>t&&n(t,s-1),i>s&&n(s,i)}var i=this,s=this.size()-1;return s>0&&(n(0,s),this.rebuildIndex()),this},rebuildIndex:function(){this.indices={};for(var t=0,e=this.keys.length;e>t;t++)this.indices[this.keys[t]]=t;return this}},$.plugins=[],$.plugin=function(t){return n(t)&&$.plugins.push(t),$},$.adapters=[],$.adapter=function(t,e,i){return $.adapters.push({name:t,priority:e,definition:n(i)?i():i}),$},$.plugin(function(){function t(t,e,n,s){var r=function(r,a){for(var u=0;u0&&(u.push(f),o.push(s[c]))}}e.$success([u,o])},s=function(n){e.$failure([t,n])};this.all(n,s)}function n(t,e,n){var i=function(){var i=this.cache;i.sort(t),e&&i.reverse(),n.$success([i.values,i.okeys])},s=function(t){n.$failure([t])};this.all(i,s)}var s={where:g("where",t),select:g("select",e),sort:g("sort",n)};return function(t){l(s,t)}}()),$.adapter("chrome-storage-local",4,function(){function t(){return chrome&&chrome.runtime&&chrome.runtime.lastError}var n=window.chrome&&chrome.storage?chrome.storage.local:!1;return{encode:function(t){return this.prefix+E(t)},decode:function(t){return S(t.substring(this.prefix.length))},valid:function(){if(!n)return!1;try{var t=Math.random(),e={};return e[t]=t,n.set(e),n.remove(t),!0}catch(i){return!1}},init:function(t,e,n){var i=new y(this,e,n);return this.prefix=h(t.prefix,this.name+"-"),this.lazy?this._finishInitialization(i,[this]):i.$bindTo(this.reload(),[this]),i},reload:function(e,i){var s=new y(this,e,i),r=this,a=this.prefix,u=new w;return n.get(null,function(e){if(t())s.$failure([t()]);else{for(var n in e)n.substring(0,a.length)===a&&u.put(n,e[n],r.decode(n));r.cache.overwrite(u),r.loaded=!0,r.finishReload(s)}}),s},_get:function(i,s,r){var a=this;n.get(s,function(n){if(t())r.$failure([i,t()]);else if(n.length){var u=S(n[0]);a.cache.put(s,u,i),r.$success([u,i])}else r.$success([e,i])})},_destroy:function(e){var i=this,s=function(){n.remove(this.cache.keys,function(){t()?e.$failure([t()]):(i.cache.reset(),e.$success())})},r=function(t){e.$failure([t])};this.loaded?s():this.reload(s,r)},_resetPromise:function(t,e,n,i){return new y(this,n,i)},_reset:function(e,i,s,r,a){var u=this,o=function(t){a.$failure([e,i,t])},c=function(){for(var r={},c=0;cn||n>=e.length?t:e[n]})}var n="stork",i='CREATE TABLE IF NOT EXISTS "{0}" ("id" TEXT PRIMARY KEY, "value" TEXT)',s='SELECT "value" FROM "{0}" WHERE "id" = ?',r='SELECT "id", "value" FROM "{0}"',a='SELECT "id", "value" FROM "{0}" WHERE "id" IN ({1})',o='INSERT OR REPLACE INTO "{0}" ("id", "value") VALUES (?, ?)',c='DELETE FROM "{0}" WHERE "id" = ?',f='SELECT COUNT(*) as "count" FROM "{0}"',l='DELETE FROM "{0}"',d='DELETE FROM "{0}" WHERE "id" IN ({1})';return{valid:function(){return!!window.openDatabase},init:function(e,a,u){var d=new y(this,a,u),v=h(e.database,n),p=h(e.size,65536),g=h(e.version,"1.0"),m=this,$=function(t,e){d.$failure([e])},w=function(t){t.executeSql(m.SQL_CREATE,[],E,$)},E=function(t,e){m.lazy?m.finishInitialization(d,[m]):d.$bindTo(m.reload(),[m])};return this.SQL_CREATE=t(i,[this.name]),this.SQL_SELECT=t(s,[this.name]),this.SQL_SELECT_ALL=t(r,[this.name]),this.SQL_INSERT=t(o,[this.name]),this.SQL_DELETE=t(c,[this.name]),this.SQL_DESTROY=t(l,[this.name]),this.SQL_COUNT=t(f,[this.name]),this.db=openDatabase(v,g,v,p),this.db.transaction(w,$),d},reload:function(t,e){var n=new y(this,t,e),i=this,s=function(t,e){n.$failure([e])},r=function(t){t.executeSql(i.SQL_SELECT_ALL,[],a,s)},a=function(t,e){var s=new w;try{for(var r=0;r