﻿/*
Software License Agreement (BSD License)
http://taffydb.com/?oa=agree
*/
if(typeof TAFFY=="undefined"||!TAFFY){var TAFFY=function(F){var J={template:null},E=TAFFY,M=(E.isString(F))?E.JSON.parse(F):F,H=M,A=[],N=true,I=false;var L=function(Q,P){var P=(TAFFY.isUndefined(P))?J.template:P;if(!TAFFY.isNull(P)){for(var O=0;O<Q.length;O++){H[Q[O]]=TAFFY.mergeObj(H[Q[O]],P)}}};var G=function(){A=[];for(var O=0;O<H.length;O++){A[A.length]=O}};G();var K={pickTest:function(P){var O=(P.indexOf("!")===0)?I:N;if(!O){P=P.substring(1,P.length)}return{test:(P=="equal")?"is":(P=="notequal")?"not":(P=="startswith")?"starts":(P=="endswith")?"ends":(P=="greaterthan")?"gt":(P=="lessthan")?"lt":(P=="regexppass")?"regex":P,mode:(O)?{s:N,f:I}:{s:I,f:N}}},run:function(Q,R,P,O){return((Q=="regex")?(P.test(R)):(Q=="lt")?(R<P):(Q=="gt")?(R>P):(Q=="starts")?(R.indexOf(P)===0):(Q=="ends")?(R.substring((R.length-P.length))==P):(Q=="like")?(R.indexOf(P)>=0):(Q=="is")?(R==P):(Q=="has")?(E.has(R,P)):(Q=="hasAll")?(E.hasAll(R,P)):(Q=="length")?(K.length(R,P,O)):K[Q](R,P))?O.s:O.f},length:function(T,P,O){var S=(!E.isUndefined(T.length))?T.length:(!E.isUndefined(T.getLength))?T.getLength():0;if(E.isObject(P)){for(var R in P){if(P.hasOwnProperty(R)){var Q=K.pickTest(R);return K.run(Q.test,S,P[R],Q.mode)?N:I}}}return S==P?O.s:O.f}};(function(){for(var O in TAFFY){if(TAFFY.hasOwnProperty(O)&&O.indexOf("is")===0){(function(P){K["is"+P]=function(S,R,Q){return(TAFFY["is"+P](S)==R)?N:I}}(O.substring(2,O.length)))}}}());var D=function(O,P){var Q=[];if(!E.isArray(O)&&TAFFY.isNumber(O)){Q[Q.length]=O}else{if(E.isArray(O)){Q=O}else{if(E.isObject(O)){Q=P(O)}else{if(!E.isArray(O)&&!E.isNumber(O)){Q=A}}}}return Q};var B=function(Q){var O=[0],P="none";if(!E.isNull(Q)&&!E.isUndefined(Q)){for(var S=0;S<Q.length;S++){var R=Q.slice(S,(S+1));if(E.isNumeric(R)){if(P!="number"){O[O.length]=R;P="number"}else{O[(O.length-1)]=O[(O.length-1)]+""+R}}else{if(P!="string"){O[O.length]=R;P="string"}else{O[(O.length-1)]=O[(O.length-1)]+R}}}for(var S=0;S<O.length;S++){if(E.isNumeric(O[S])){O[S]=parseFloat(O[S])}}}else{O[O.length]=null}return O};var C=function(Q){var R=[],P=[];if(E.isString(Q)){P[0]=Q}else{if(E.isObject(Q)){P=[Q]}else{P=Q}}if(E.isArray(P)){for(var O=0;O<P.length;O++){if(E.isString(P[O])){if(E.isString(H[0][P[O]])){R[R.length]={sortCol:P[O],sortDir:"asc",type:"string"}}else{R[R.length]={sortCol:P[O],sortDir:"asc",type:"number"}}}else{if(E.isObject(P[O])){for(var S in P[O]){if(P[O].hasOwnProperty(S)){if(E.isString(H[0][P[O].sortCol])){R[R.length]={sortCol:S,sortDir:P[O][S],type:"string"}}else{R[R.length]={sortCol:S,sortDir:P[O][S],type:"number"}}}}}}}}return function(Z,Y){var V=0,U=Z,T=Y,c,X;for(var d=0;d<R.length;d++){if(V===0){c=U[R[d]["sortCol"]];X=T[R[d]["sortCol"]];if(R[d].type=="string"){c=(E.isString(c))?c.toLowerCase():c;X=(E.isString(X))?X.toLowerCase():X}if(R[d].sortDir=="desc"){if(E.isNull(X)||E.isUndefined(X)||X<c){V=-1}else{if(E.isNull(c)||E.isUndefined(c)||c<X){V=1}}}else{if(R[d].sortDir=="logical"){c=B(c);X=B(X);for(var W=0;W<X.length;W++){if(c[W]<X[W]&&W<c.length){V=-1;break}else{if(c[W]>X[W]){V=1;break}}}if(c.length<X.length&&V==0){V=-1}else{if(c.length>X.length&&V==0){V=1}}}else{if(R[d].sortDir=="logicaldesc"){c=B(c);X=B(X);for(var W=0;W<X.length;W++){if(c[W]>X[W]&&W<c.length){V=-1;break}else{if(c[W]<X[W]){V=1;break}}}if(c.length<X.length&&V==0){V=1}else{if(c.length>X.length&&V==0){V=-1}}}else{if(E.isNull(c)||E.isUndefined(c)||c<X){V=-1}else{if(E.isNull(X)||E.isUndefined(X)||c>X){V=1}}}}}}}return V}};return{TAFFY:true,getLength:function(){return H.length},lastModifyDate:new Date(),find:function(T,b){var P=0;if(E.isArray(b)){var R=b}else{var R=A}if(E.isFunction(T)){var S=[];for(var V=0;V<R.length;V++){if(T(H[V],V)){S[S.length]=R[V]}}R=S}else{for(var U in T){var Q="is",O="",a=U,X={s:N,f:I},Z={};if(E.isObject(T[U])){for(var Y in T[U]){Z=K.pickTest(Y);Q=Z.test;X=Z.mode;O=T[U][Y]}}else{O=T[U]}var S=[];for(var V=0;V<R.length;V++){if(E.isArray(O)&&Q!="isSameArray"&&Q!="hasAll"){for(var W=0;W<O.length;W++){if(K.run(Q,H[R[V]][a],O[W],X)){S[S.length]=R[V]}}}else{if(E.isFunction(O)&&O(H[R[V]][a],V)){S[S.length]=R[V]}else{if(K.run(Q,H[R[V]][a],O,X)){S[S.length]=R[V]}}}}R=S}}R=E.gatherUniques(R);return R},remove:function(O){var R=D(O,this.find);for(var S=0;S<R.length;S++){if(this.onRemove!=null){this.onRemove(H[R[S]])}H[R[S]]="remove"}var P=function(){for(var T=0;T<H.length;T++){if(H[T]==="remove"){return N}}return I};while(P()){for(var Q=0;Q<H.length;Q++){if(H[Q]==="remove"){H.splice(Q,1);this.lastModifyDate=new Date()}}}G();return R},insert:function(O){if(this.onInsert!=null){this.onInsert(O)}H[H.length]=(TAFFY.isNull(J.template))?O:TAFFY.mergeObj(J.template,O);this.lastModifyDate=new Date();A[A.length]=H.length-1;return[H.length-1]},update:function(Q,P){var S=D(P,this.find),O=0;for(var T=0;T<S.length;T++){var R=S[T];if(this.onUpdate!=null){this.onUpdate(Q,H[R])}H[R]=E.mergeObj(H[R],Q);O++}return S},get:function(O){var P=[];var R=D(O,this.find);for(var Q=0;Q<R.length;Q++){P[P.length]=H[R[Q]]}return P},first:function(O){var P=D(O,this.find);return(P.length>0)?H[P[0]]:false},last:function(O){var P=D(O,this.find);return(P.length>0)?H[P[(P.length-1)]]:false},stringify:function(O){return E.JSON.stringify(this.get(O))},orderBy:function(O){if(H.length>0){var P=C(O);H.sort(P);this.lastModifyDate=new Date()}},forEach:function(S,O){var R=D(O,this.find);var T;for(var P=0;P<R.length;P++){T=H[R[P]];var Q=S(T,R[P]);if(E.isObject(Q)){if(TAFFY.isSameObject(Q,TAFFY.EXIT)){break}else{this.update(Q,R[P])}}}},config:{set:function(P,O){J[P]=O;if(P=="template"&&!TAFFY.isNull(O)){L(A,O)}},get:function(O){return J[O]}},applyTemplate:function(P,O){var Q=D(O,this.find);L(Q,P)},onUpdate:null,onRemove:null,onInsert:null}};TAFFY.typeOf=function(A){var B=typeof A;if(B==="object"){if(A){if(typeof A.length==="number"&&!(A.propertyIsEnumerable("length"))&&typeof A.splice==="function"){B="array"}}else{B="null"}}return B};TAFFY.JSON=function(){function f(n){return n<10?"0"+n:n}Date.prototype.toJSON=function(){return this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z"};var m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};function stringify(value,whitelist){var a,i,k,l,r=/["\\\x00-\x1f\x7f-\x9f]/g,v;switch(typeof value){case"string":return r.test(value)?'"'+value.replace(r,function(a){var c=m[a];if(c){return c}c=a.charCodeAt();return"\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16)})+'"':'"'+value+'"';case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}if(typeof value.toJSON==="function"){return stringify(value.toJSON())}a=[];if(typeof value.length==="number"&&!(value.propertyIsEnumerable("length"))){l=value.length;for(i=0;i<l;i+=1){a.push(stringify(value[i],whitelist)||"null")}return"["+a.join(",")+"]"}if(whitelist){l=whitelist.length;for(i=0;i<l;i+=1){k=whitelist[i];if(typeof k==="string"){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+":"+v)}}}}else{for(k in value){if(typeof k==="string"){v=stringify(value[k],whitelist);if(v){a.push(stringify(k)+":"+v)}}}}return"{"+a.join(",")+"}"}return""}return{stringify:stringify,parse:function(text,filter){var j;function walk(k,v){var i,n;if(v&&typeof v==="object"){for(i in v){if(Object.prototype.hasOwnProperty.apply(v,[i])){n=walk(i,v[i]);if(n!==undefined){v[i]=n}else{delete v[i]}}}}return filter(k,v)}if(/^[\],:{}\s]*$/.test(text.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof filter==="function"?walk("",j):j}throw new SyntaxError("parseJSON")}}}();TAFFY.mergeObj=function(D,A){var C={};for(var B in D){if(D.hasOwnProperty(B)){C[B]=D[B]}}for(var B in A){if(A.hasOwnProperty(B)){C[B]=A[B]}}return C};TAFFY.getObjectKeys=function(A){var B=[];for(var C in A){if(A.hasOwnProperty(C)){B[B.length]=C}}B.sort();return B};TAFFY.isSameArray=function(B,A){return(TAFFY.isArray(B)&&TAFFY.isArray(A)&&B.join(",")==A.join(","))?true:false};TAFFY.isSameObject=function(D,B){var A=TAFFY;if(A.isObject(D)&&A.isObject(B)){if(A.isSameArray(A.getObjectKeys(D),A.getObjectKeys(B))){for(var C in D){if(D.hasOwnProperty(C)){if((A.isObject(D[C])&&A.isObject(B[C])&&A.isSameObject(D[C],B[C]))||(A.isArray(D[C])&&A.isArray(B[C])&&A.isSameArray(D[C],B[C]))||(D[C]==B[C])){}else{return false}}}}else{return false}}else{return false}return true};TAFFY.has=function(E,D){var B=TAFFY;var C=true;if(B.isTAFFY(E)){C=E.find(D);if(C.length>0){return true}else{return false}}else{switch(B.typeOf(E)){case"object":if(B.isObject(D)){for(var A in D){if(C==true&&D.hasOwnProperty(A)&&!B.isUndefined(E[A])&&E.hasOwnProperty(A)){C=B.has(E[A],D[A])}else{return false}}return C}else{if(B.isArray(D)){for(var A=0;A<D.length;A++){C=B.has(E,D[A]);if(C==true){return true}}}else{if(B.isString(D)&&E[D]!=undefined){return true}}}break;case"array":if(B.isObject(D)){for(var F=0;F<E.length;F++){C=B.has(E[F],D);if(C==true){return true}}}else{if(B.isArray(D)){for(var A=0;A<D.length;A++){for(var F=0;F<E.length;F++){C=B.has(E[F],D[A]);if(C==true){return true}}}}else{if(B.isString(D)){for(var F=0;F<E.length;F++){C=B.has(E[F],D);if(C==true){return true}}}}}break;case"string":if(B.isString(D)&&D==E){return true}break;default:if(B.typeOf(E)==B.typeOf(D)&&E==D){return true}break}}return false};TAFFY.hasAll=function(E,D){var B=TAFFY;if(B.isArray(D)){var A=true;for(var C=0;C<D.length;C++){A=B.has(E,D[C]);if(A==false){return A}}return true}else{return B.has(E,D)}};TAFFY.gatherUniques=function(A){var E=[];for(var C=0;C<A.length;C++){var B=true;for(var D=0;D<E.length;D++){if(E[D]==A[C]){B=false}}if(B==true){E[E.length]=A[C]}}return E};(function(A){for(var B=0;B<A.length;B++){(function(C){TAFFY["is"+C]=function(D){return(TAFFY.typeOf(D)==C.toLowerCase())?true:false}}(A[B]))}}(["String","Number","Object","Array","Boolean","Null","Function","Undefined"]));TAFFY.isNumeric=function(B){var C="0123456789";var A=true;for(var D=0;D<B.length&&A==true;D++){if(C.indexOf(B.charAt(D))==-1){return false}}return A};TAFFY.isTAFFY=function(A){return(TAFFY.isObject(A)&&A.TAFFY)?true:false};TAFFY.EXIT={EXIT:true}};
