/*

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