/*

Software License Agreement (BSD License)
http://taffydb.com/?oa=agree
Copyright (c) 2008
All rights reserved.
Version 1.5.1
*/
if(typeof TAFFY=="undefined"||!TAFFY){var TAFFY=function(F){var E=TAFFY;var K=(E.isString(F))?E.JSON.parse(F):F;var H=K,A=[],L=true,I=false;var G=function(){A=[];for(var M=0;M<H.length;M++){A[A.length]=M}};G();var J={pickTest:function(M){return(M=="equal")?"is":(M=="notequal")?"not":(M=="startswith")?"starts":(M=="endswith")?"ends":(M=="greaterthan")?"gt":(M=="lessthan")?"lt":(M=="regexppass")?"regexppass":(M=="arraycontains")?"has":(M=="contains")?"has":M},regex:function(N,M){return(M.test(N))?L:I},regexpfail:function(N,M){return(!M.test(N))?L:I},lt:function(N,M){return(N<M)?L:I},gt:function(N,M){return(N>M)?L:I},starts:function(N,M){return(N.indexOf(M)===0)?L:I},ends:function(N,M){return(N.substring((N.length-M.length))==M)?L:I},like:function(N,M){return(N.indexOf(M)>=0)?L:I},notlike:function(N,M){return(N.indexOf(M)===-1)?L:I},is:function(N,M){return(N==M)?L:I},not:function(N,M){switch(E.typeOf(M)){case"object":return(!E.isSameObject(N,M))?L:I;break;case"array":return(!E.isArray(N)||N.join(",")!=M.join(","))?L:I;break}return(N!=M)?L:I},has:function(N,M){return E.has(N,M)},hasAll:function(N,M){return E.hasAll(N,M)},length:function(P,M){var O=(!E.isUndefined(P.length))?P.length:0;if(TisObject(M)){for(var N in M){return J[N](O,M[N])}}return(O==M)?L:I}};(function(M){for(var N=0;N<M.length;N++){(function(O){J["is"+O]=function(Q,P){return(TAFFY["is"+O](Q)==P)?L:I};J["isNot"+O]=function(Q,P){return(!TAFFY["is"+O](Q)==P)?L:I}}(M[N]))}}(["TAFFY","String","Number","Object","Array","Boolean","Null","Function","Undefined","Numeric","SameArray","SameObject"]));var D=function(M,N){var O=[];if(!E.isArray(M)&&TAFFY.isNumber(M)){O[O.length]=M}else{if(E.isArray(M)){O=M}else{if(E.isObject(M)){O=N(M)}else{if(!E.isArray(M)&&!E.isNumber(M)){O=A}}}}return O};var B=function(O){var M=[0],N="none";if(!E.isNull(O)&&!E.isUndefined(O)){for(var Q=0;Q<O.length;Q++){var P=O.slice(Q,(Q+1));if(E.isNumeric(P)){if(N!="number"){M[M.length]=P;N="number"}else{M[(M.length-1)]=M[(M.length-1)]+""+P}}else{if(N!="string"){M[M.length]=P;N="string"}else{M[(M.length-1)]=M[(M.length-1)]+P}}}for(var Q=0;Q<M.length;Q++){if(E.isNumeric(M[Q])){M[Q]=parseFloat(M[Q])}}}else{M[M.length]=null}return M};var C=function(O){var P=[],N=[];if(E.isString(O)){N[0]=O}else{if(E.isObject(O)){N=[O]}else{N=O}}if(E.isArray(N)){for(var M=0;M<N.length;M++){if(E.isString(N[M])){if(E.isString(H[0][N[M]])){P[P.length]={sortCol:N[M],sortDir:"asc",type:"string"}}else{P[P.length]={sortCol:N[M],sortDir:"asc",type:"number"}}}else{if(E.isObject(N[M])){for(var Q in N[M]){if(E.isString(H[0][N[M].sortCol])){P[P.length]={sortCol:Q,sortDir:N[M][Q],type:"string"}}else{P[P.length]={sortCol:Q,sortDir:N[M][Q],type:"number"}}}}}}}return function(X,W){var T=0,S=X,R=W,Y,V;for(var Z=0;Z<P.length;Z++){if(T===0){Y=S[P[Z]["sortCol"]];V=R[P[Z]["sortCol"]];if(P[Z].type=="string"){Y=(E.isString(Y))?Y.toLowerCase():Y;V=(E.isString(V))?V.toLowerCase():V}if(P[Z].sortDir=="desc"){if(E.isNull(V)||E.isUndefined(V)||V<Y){T=-1}else{if(E.isNull(Y)||E.isUndefined(Y)||Y<V){T=1}}}else{if(P[Z].sortDir=="logical"){Y=B(Y);V=B(V);for(var U=0;U<V.length;U++){if(Y[U]<V[U]&&U<Y.length){T=-1;break}else{if(Y[U]>V[U]){T=1;break}}}if(Y.length<V.length&&T==0){T=-1}else{if(Y.length>V.length&&T==0){T=1}}}else{if(P[Z].sortDir=="logicaldesc"){Y=B(Y);V=B(V);for(var U=0;U<V.length;U++){if(Y[U]>V[U]&&U<Y.length){T=-1;break}else{if(Y[U]<V[U]){T=1;break}}}if(Y.length<V.length&&T==0){T=1}else{if(Y.length>V.length&&T==0){T=-1}}}else{if(E.isNull(Y)||E.isUndefined(Y)||Y<V){T=-1}else{if(E.isNull(V)||E.isUndefined(V)||Y>V){T=1}}}}}}}return T}};return{TAFFY:true,raw:K,length:H.length,lastModifyDate:new Date(),find:function(R,X){var N=0;if(E.isArray(X)){var P=X}else{var P=A}if(E.isFunction(R)){var Q=[];for(var T=0;T<P.length;T++){if(R(H[T],T)){Q[Q.length]=P[T]}}P=Q}else{for(var S in R){var O="is",M="",W=S;if(E.isObject(R[S])){for(var V in R[S]){O=J.pickTest(V);M=R[S][V]}}else{M=R[S]}var Q=[];for(var T=0;T<P.length;T++){if(E.isArray(M)&&O!="isSameArray"&&O!="hasAll"){for(var U=0;U<M.length;U++){if(J[O](H[P[T]][W],M[U])){Q[Q.length]=P[T]}}}else{if(E.isFunction(M)&&M(H[P[T]][W],T)){Q[Q.length]=P[T]}else{if(J[O](H[P[T]][W],M)){Q[Q.length]=P[T]}}}}P=Q}}P=E.gatherUniques(P);return P},remove:function(M){var P=D(M,this.find);for(var Q=0;Q<P.length;Q++){if(this.onRemove!=null){this.onRemove(H[P[Q]])}H[P[Q]]="remove"}var N=function(){for(var R=0;R<H.length;R++){if(H[R]==="remove"){return L}}return I};while(N()){for(var O=0;O<H.length;O++){if(H[O]==="remove"){H.splice(O,1);this.lastModifyDate=new Date()}}}this.length=H.length;G();return P},insert:function(M){if(this.onInsert!=null){this.onInsert(M)}H[H.length]=M;this.lastModifyDate=new Date();this.length=H.length;A[A.length]=H.length-1;return[H.length-1]},update:function(O,N){var Q=D(N,this.find),M=0;for(var R=0;R<Q.length;R++){var P=Q[R];if(this.onUpdate!=null){this.onUpdate(O,H[P])}H[P]=E.mergeObj(H[P],O);M++}return Q},get:function(M){var N=[];var P=D(M,this.find);for(var O=0;O<P.length;O++){N[N.length]=H[P[O]]}return N},first:function(M){var N=D(M,this.find);return(N.length>0)?H[N[0]]:false},last:function(M){var N=D(M,this.find);return(N.length>0)?H[N[(N.length-1)]]:false},stringify:function(M){return E.JSON.stringify(this.get(M))},orderBy:function(M){if(this.length>0){var N=C(M);H.sort(N);this.lastModifyDate=new Date()}},forEach:function(Q,M){var P=D(M,this.find);var R;for(var N=0;N<P.length;N++){R=H[P[N]];var O=Q(R,P[N]);if(E.isObject(O)){this.update(O,P[N])}}},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(C,A){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}};