!function(n,t){function i(n,i){function nt(){e.hasOwnProperty(h)&&delete e[h];r=null}function tt(){var n=0,t;for(t in r.tables)r.tables.hasOwnProperty(t)&&n++;return n}function it(n){return r.tables[n].fields}function w(n){return r.tables[n]?!0:!1}function f(n){w(n)||u("The table '"+n+"' does not exist")}function rt(n,t){var i=!1,u=r.tables[n].fields,f;for(f in u)if(u[f]==t){i=!0;break}return i}function ut(n,t){r.tables[n]={fields:t,auto_increment:1};r.data[n]={}}function ft(n){delete r.tables[n];delete r.data[n]}function et(n){r.tables[n].auto_increment=1;r.data[n]={}}function b(n,t,i){var u,f;if(r.tables[n].fields=r.tables[n].fields.concat(t),typeof i!="undefined")for(u in r.data[n])if(r.data[n].hasOwnProperty(u))for(f in t)r.data[n][u][t[f]]=typeof i=="object"?i[t[f]]:i}function ot(n){var t=0,i;for(i in r.data[n])r.data[n].hasOwnProperty(i)&&t++;return t}function v(n,t){return t.ID=r.tables[n].auto_increment,r.data[n][r.tables[n].auto_increment]=t,r.tables[n].auto_increment++,t.ID}function st(n,i,u,f,e,o){for(var p=null,h=[],w=null,c,a,l,v,s=0;s<i.length;s++)p=i[s],w=r.data[n][p],h.push(y(w));if(e&&e instanceof Array)for(s=0;s<e.length;s++)h.sort(ht(e[s][0],e[s].length>1?e[s][1]:null));if(o&&o instanceof Array){for(c=0;c<o.length;c++)for(a={},l=o[c],s=0;s<h.length;s++)h[s]!==t&&(h[s].hasOwnProperty(l)&&a.hasOwnProperty(h[s][l])?delete h[s]:a[h[s][l]]=1);for(v=[],s=0;s<h.length;s++)h[s]!==t&&v.push(h[s]);h=v}return u=u&&typeof u=="number"?u:null,f=f&&typeof f=="number"?f:null,u&&f?h=h.slice(u,u+f):u?h=h.slice(u):f&&(h=h.slice(u,f)),h}function ht(n,t){return function(i,r){var u=typeof i[n]=="string"?i[n].toLowerCase():i[n],f=typeof r[n]=="string"?r[n].toLowerCase():r[n];return t==="DESC"?u==f?0:u<f?1:-1:u==f?0:u>f?1:-1}}function c(n,t){var o=[],u=!1,f=null,e,i;for(e in r.data[n])if(r.data[n].hasOwnProperty(e)){f=r.data[n][e];u=!0;for(i in t)if(t.hasOwnProperty(i))if(typeof t[i]=="string"){if(f[i]===null||f[i].toString().toLowerCase()!=t[i].toString().toLowerCase()){u=!1;break}}else if(f[i]!=t[i]){u=!1;break}u&&o.push(e)}return o}function l(n,t){var u=[],f=null,i;for(i in r.data[n])r.data[n].hasOwnProperty(i)&&(f=r.data[n][i],t(y(f))==!0&&u.push(i));return u}function a(n){var i=[],t;for(t in r.data[n])r.data[n].hasOwnProperty(t)&&i.push(t);return i}function ct(n,t){for(var i=0;i<t.length;i++)r.data[n].hasOwnProperty(t[i])&&delete r.data[n][t[i]];return t.length}function k(n,t,i){for(var f="",c=0,u,h,o,e=0;e<t.length;e++)if(f=t[e],u=i(y(r.data[n][f])),u){delete u.ID;h=r.data[n][f];for(o in u)u.hasOwnProperty(o)&&(h[o]=u[o]);r.data[n][f]=s(n,h);c++}return c}function d(){try{return e.setItem(h,JSON.stringify(r)),!0}catch(n){return!1}}function lt(){return JSON.stringify(r)}function u(n){throw new Error(n);}function y(n){var i={},t;for(t in n)n.hasOwnProperty(t)&&(i[t]=n[t]);return i}function o(n){return n.toString().match(/[^a-z_0-9]/ig)?!1:!0}function s(n,i){for(var u="",e={},f=0;f<r.tables[n].fields.length;f++)u=r.tables[n].fields[f],i[u]!==t&&(e[u]=i[u]);return e}function g(n,i){for(var u="",e={},f=0;f<r.tables[n].fields.length;f++)u=r.tables[n].fields[f],e[u]=i[u]===null||i[u]===t?null:i[u];return e}var h="db_"+n,p=!1,r=null,e;try{e=i==sessionStorage?sessionStorage:localStorage}catch(at){e=i}return r=e[h],r&&(r=JSON.parse(r))&&r.tables&&r.data||(o(n)?(r={tables:{},data:{}},d(),p=!0):u("The name '"+n+"' contains invalid characters")),{commit:function(){return d()},isNew:function(){return p},drop:function(){nt()},serialize:function(){return lt()},tableExists:function(n){return w(n)},tableFields:function(n){return it(n)},tableCount:function(){return tt()},columnExists:function(n,t){return rt(n,t)},createTable:function(n,t){var s=!1,f,r,i,e;if(o(n))if(this.tableExists(n))u("The table name '"+n+"' already exists.");else{for(f=!0,i=0;i<t.length;i++)if(!o(t[i])){f=!1;break}if(f){for(r={},i=0;i<t.length;i++)r[t[i]]=!0;delete r.ID;t=["ID"];for(e in r)r.hasOwnProperty(e)&&t.push(e);ut(n,t);s=!0}else u("One or more field names in the table definition contains invalid characters")}else u("The database name '"+n+"' contains invalid characters.");return s},createTableWithData:function(n,t){var r,i;if((typeof t!="object"||!t.length||t.length<1)&&u("Data supplied isn't in object form. Example: [{k:v,k:v},{k:v,k:v} ..]"),r=Object.keys(t[0]),this.createTable(n,r)){for(this.commit(),i=0;i<t.length;i++)v(n,t[i])||u("Failed to insert record: ["+JSON.stringify(t[i])+"]");this.commit()}return!0},dropTable:function(n){f(n);ft(n)},truncate:function(n){f(n);et(n)},alterTable:function(n,t,i){var e=!1,s,f,r,h,c;if(o(n))if(typeof t=="object"){for(s=!0,r=0;r<t.length;r++)if(!o(t[r])){s=!1;break}if(s){for(f={},r=0;r<t.length;r++)f[t[r]]=!0;delete f.ID;t=[];for(h in f)f.hasOwnProperty(h)&&t.push(h);b(n,t,i);e=!0}else u("One or more field names in the table definition contains invalid characters")}else typeof t=="string"&&(o(t)?(c=[],c.push(t),b(n,c,i),e=!0):u("One or more field names in the table definition contains invalid characters"));else u("The database name '"+n+"' contains invalid characters");return e},rowCount:function(n){return f(n),ot(n)},insert:function(n,t){return f(n),v(n,g(n,t))},insertOrUpdate:function(n,t,i){var r,u,e;if(f(n),r=[],t?typeof t=="object"?r=c(n,s(n,t)):typeof t=="function"&&(r=l(n,t)):r=a(n),r.length==0)return v(n,g(n,i));for(u=[],e=0;e<r.length;e++)k(n,r,function(n){return u.push(n.ID),i});return u},update:function(n,t,i){f(n);var r=[];return t?typeof t=="object"?r=c(n,s(n,t)):typeof t=="function"&&(r=l(n,t)):r=a(n),k(n,r,i)},query:function(n,t,i,r,u,e){f(n);var o=[];return t?typeof t=="object"?o=c(n,s(n,t),i,r):typeof t=="function"&&(o=l(n,t,i,r)):o=a(n,i,r),st(n,o,r,i,u,e)},queryAll:function(n,t){return t?this.query(n,t.hasOwnProperty("query")?t.query:null,t.hasOwnProperty("limit")?t.limit:null,t.hasOwnProperty("start")?t.start:null,t.hasOwnProperty("sort")?t.sort:null,t.hasOwnProperty("distinct")?t.distinct:null):this.query(n)},deleteRows:function(n,t){f(n);var i=[];return t?typeof t=="object"?i=c(n,s(n,t)):typeof t=="function"&&(i=l(n,t)):i=a(n),ct(n,i)}}}typeof define=="function"&&define.amd?define(function(){return i}):n.localStorageDB=i}(window)