/*
	Kailash Nadh (http://kailashnadh.name)
	
	localStorageDB
	September 2011
	A simple database layer for localStorage

	License	:	MIT License
*/

function localStorageDB(a){function A(a,b){var c="",d={};for(var f in e.tables[a].fields){c=e.tables[a].fields[f];d[c]=b[c]?b[c]:null}return d}function z(a,b){var c="",d={};for(var f in e.tables[a].fields){c=e.tables[a].fields[f];if(b[c]){d[c]=b[c]}}return d}function y(a){return a.match(/[^a-z_0-9]/ig)?false:true}function x(a){var b={};for(var c in a){b[c]=a[c]}return b}function w(a){throw new Error(a)}function v(){return JSON.stringify(e)}function u(){localStorage[c]=JSON.stringify(e)}function t(a,b,c){var d="",f=0;for(var g in b){d=b[g];var h=c(x(e.data[a][d]));if(h){delete h["ID"];var i=e.data[a][d];for(var j in h){i[j]=h[j]}e.data[a][d]=z(a,i);f++}}return f}function s(a,b){for(var c in b){delete e.data[a][b[c]]}return b.length}function r(a,b){var c=[];for(var d in e.data[a]){c.push(d);if(c.length==b){break}}return c}function q(a,b,c){var d=[],f=false,g=null;for(var h in e.data[a]){g=e.data[a][h];if(b(x(g))==true){d.push(h)}if(d.length==c){break}}return d}function p(a,b,c){var d=[],f=false,g=null;for(var h in e.data[a]){g=e.data[a][h];f=false;for(var i in b){if(typeof b[i]=="string"){if(g[i].toString().toLowerCase()==b[i].toString().toLowerCase()){f=true;break}}else{if(g[i]==b[i]){f=true;break}}}if(f){d.push(h)}if(d.length==c){break}}return d}function o(a,b){var c=null,d=[],f=null;for(var g in b){c=b[g];f=e.data[a][c];d.push(x(f))}return d}function n(a,b){b.ID=e.tables[a].auto_increment;e.data[a][e.tables[a].auto_increment]=b;e.tables[a].auto_increment++;return b.ID}function m(a){var b=0;for(var c in e.data[a]){b++}return b}function l(a){e.tables[a].auto_increment=1;e.data[a]={}}function k(a){delete e.tables[a];delete e.data[a]}function j(a,b){e.tables[a]={fields:b,auto_increment:1};e.data[a]={}}function i(a){if(!h(a)){w("The table '"+a+"' does not exist.")}}function h(a){return e.tables[a]?true:false}function g(){var a=0;for(var b in e.tables){a++}return a}function f(){delete localStorage[c];e=null}var b="db_",c=b+a,d=false,e=null;e=localStorage[c];if(!(e&&(e=JSON.parse(e))&&e.tables&&e.data)){if(!y(a)){w("The name '"+a+"'"+" contains invalid characters.")}else{e={tables:{},data:{}};u();d=true}}return{commit:function(){u()},isNew:function(){return d},drop:function(){f()},serialize:function(){return v()},tableExists:function(a){return h(a)},tableCount:function(){return g()},createTable:function(a,b){var c=false;if(!y(a)){w("The database name '"+a+"'"+" contains invalid characters.")}else if(this.tableExists(a)){w("The table name '"+a+"' already exists.")}else{var d=true;for(var e in b){if(!y(b[e])){d=false;break}}if(d){var f={};for(var e in b){f[b[e]]=true}delete f["ID"];b=["ID"];for(var g in f){b.push(g)}j(a,b);c=true}else{w("One or more field names in the table definition contains invalid characters.")}}return c},dropTable:function(a){i(a);k(a)},truncate:function(a){i(a);l(a)},rowCount:function(a){i(a);return m(a)},insert:function(a,b){i(a);return n(a,A(a,b))},update:function(a,b,c){i(a);var d=[];if(!b){d=r(a)}else if(typeof b=="object"){d=p(a,z(a,b))}else if(typeof b=="function"){d=q(a,b)}return t(a,d,c)},query:function(a,b,c){i(a);var d=[];if(!b){d=r(a,c)}else if(typeof b=="object"){d=p(a,z(a,b),c)}else if(typeof b=="function"){d=q(a,b,c)}return o(a,d,c)},deleteRows:function(a,b){i(a);var c=[];if(!b){c=r(a)}else if(typeof b=="object"){c=p(a,z(a,b))}else if(typeof b=="function"){c=q(a,b)}return s(a,c)}}}
