/*! MonguitoDB v0.0.1 | Thu May 14 2015 00:54:07 | (c) Juan Cuartas | MIT license */ !function(a){function b(){var a={};this.length=0,this.key=function(b){var c=0;for(var d in a)if(c++===b)return d;return null},this.getItem=function(b){return a[b+""]||null},this.setItem=function(b,c){b+="",c+="";var d=this.getItem(b);d!==c&&(a[b]=c,null===d&&this.length++)},this.removeItem=function(b){b+="";var c=this.getItem(b);null!==c&&(delete a[b],this.length--)},this.clear=function(){this.length&&(a={},this.length=0)},this.toString=function(){return"[object Storage]"}}function c(a,b,c,d){var e=function(){return a&&(a.update=g,a.remove=h,a.pretty=i),a},g=function(e){var g="MonguitoDB.Document.update()";if(void 0!==e){f.validateArguments(arguments,1,g),f.validateObject(e,"arg[0]:obj",g);for(var h in e)"_id"!==h&&(a[h]=e[h])}var i=c(),j=i.ids.indexOf(a._id);if(j>=0){var k=d(a._id),l=JSON.stringify(a);return b.setItem(k,l),a}throw new Error(g+", _id:"+a._id+" doesn't exist.")},h=function(){var e="MonguitoDB.Document.remove()";f.validateArguments(arguments,0,e);var g=c(),h=g.ids.indexOf(a._id);if(!(h>=0))throw new Error(e+", _id:"+a._id+" doesn't exist.");b.removeItem(d(a._id)),g.ids.splice(h,1),g.save()},i=function(){var b="MonguitoDB.Document.pretty()";return f.validateArguments(arguments,0,b),f.prettyJSON(a)};return e()}function d(a){var b=function(){return a&&(a.update=c,a.remove=e,a.get=g,a.find=h,a.findOne=i,a.sort=j,a.first=k,a.last=l,a.pretty=m,a.count=n),a},c=function(b){if(void 0!==b){var c="MonguitoDB.Cursor.update()";f.validateArguments(arguments,1,c),f.validateObject(b,"arg[0]:obj",c)}return a.forEach(function(a){a.update(b)}),a},e=function(){var b="MonguitoDB.Cursor.remove()";f.validateArguments(arguments,0,b),a.forEach(function(a){a.remove()}),a.length=0},g=function(b){var c="MonguitoDB.Cursor.get()";return f.validateArguments(arguments,1,c),f.validateDocumentId(b,"arg[0]:documentId",c),a.findOne({_id:b})},h=function(b){if(void 0!==b){var c="MonguitoDB.Cursor.find()";f.validateArguments(arguments,1,c),f.validateObjectOrFunction(b,"arg[0]:query",c)}return d(f.filterArray(a,b))},i=function(b){if(void 0!==b){var c="MonguitoDB.Cursor.findOne()";f.validateArguments(arguments,1,c),f.validateObjectOrFunction(b,"arg[0]:query",c)}return f.firstInArray(f.filterArray(a,b))},j=function(b){var c="MonguitoDB.Cursor.sort()";return f.validateArguments(arguments,1,c),f.validateString(b,"arg[0]:sortExpression",c),d(f.sortArray(a,b))},k=function(){var b="MonguitoDB.Cursor.first()";return f.validateArguments(arguments,0,b),f.firstInArray(a)},l=function(){var b="MonguitoDB.Cursor.last()";return f.validateArguments(arguments,0,b),f.lastInArray(a)},m=function(){var b="MonguitoDB.Cursor.pretty()";return f.validateArguments(arguments,0,b),f.prettyJSON(a)},n=function(){var b="MonguitoDB.Cursor.count()";return f.validateArguments(arguments,0,b),a.length};return b()}function e(a,b){var e=function(a){return f.isValidUUID(a)?a:b+"-"+a},g=function(){var c=a.getItem(b);return c=null===c?{identity:1,ids:[]}:JSON.parse(c),c.save=function(){var c=JSON.stringify(this);a.setItem(b,c)},c},h=function(b){var d="MonguitoDB.Collection.insert()";f.validateArguments(arguments,1,d),f.validateObject(b,"arg[0]:obj",d);var h=g();if(b.hasOwnProperty("_id")){if("uuid"!==b._id)throw new TypeError(d+", invalid _id value, only 'uuid' is allowed.");b._id=f.generateUUID()}else b._id=h.identity++;var i=e(b._id),j=JSON.stringify(b);return a.setItem(i,j),h.ids.push(b._id),h.save(),c(b,a,g,e)},i=function(b){var d="MonguitoDB.Collection.get()";f.validateArguments(arguments,1,d),f.validateDocumentId(b,"arg[0]:documentId",d);var h=e(b),i=a.getItem(h);if(null!==i){var j=JSON.parse(i);return c(j,a,g,e)}return null},j=function(a){if(void 0!==a){var b="MonguitoDB.Collection.find()";f.validateArguments(arguments,1,b),f.validateObjectOrFunction(a,"arg[0]:query",b)}var c=[];return g().ids.forEach(function(a){c.push(i(a))}),"undefined"!=typeof a&&(c=f.filterArray(c,a)),d(c)},k=function(a){if(void 0!==a){var b="MonguitoDB.Collection.findOne()";f.validateArguments(arguments,1,b),f.validateObjectOrFunction(a,"arg[0]:query",b)}return j(a).first()},l=function(){return f.validateArguments(arguments,0,"MonguitoDB.Collection.count()"),g().ids.length},m=function(a,b){var c="MonguitoDB.Collection.update()";f.validateArguments(arguments,2,c),f.validateObjectOrFunction(a,"arg[0]:query",c),f.validateObject(b,"arg[1]:obj",c);var d=j(a);return d.forEach(function(a){a.update(b)}),d},n=function(a){if(void 0!==a){var b="MonguitoDB.Collection.remove()";f.validateArguments(arguments,1,b),f.validateObjectOrFunction(a,"arg[0]:query",b)}j(a).forEach(function(a){a.remove()})};return{insert:h,get:i,find:j,findOne:k,count:l,update:m,remove:n}}var f=f||{};f.filterArray=function(a,b){if("[object Array]"!==Object.prototype.toString.call(a))throw new TypeError("util.filterArray(), invalid arg[0]:array, expecting array.");var c=a.slice(0);if("function"==typeof b)for(var d=0;d1&&(g=e[1].toUpperCase()),"DESC"===g){if(a[f]>c[f])return-1;if(a[f]c[f])return 1}}return 0}),c},f.firstInArray=function(a){if("[object Array]"!==Object.prototype.toString.call(a))throw new TypeError("util.firstInArray(), invalid arg[0]:array, expecting array.");return a.length?a[0]:null},f.lastInArray=function(a){if("[object Array]"!==Object.prototype.toString.call(a))throw new TypeError("util.lastInArray(), invalid arg[0]:array, expecting array.");return a.length?a[a.length-1]:null},f.isValidNaturalNumber=function(a){return"number"==typeof a&&a%1===0&&a>=0},f.isValidVariableName=function(a){return"string"==typeof a&&/^[$A-Z_][0-9A-Z_$]*$/i.test(a)},f.isValidUUID=function(a){if("string"!=typeof a||36!==a.length)return!1;a=a.toUpperCase();for(var b=function(a,b){return[8,13,18,23].indexOf(b)>=0?"-"===a:14===b?"4"===a:19===b?["8","9","A","B"].indexOf(a)>=0:["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"].indexOf(a)>=0},c=0;c