From 0e44c6a4a316a9b026a2c3ce7362c3338e8f3dca Mon Sep 17 00:00:00 2001 From: Leif Date: Sun, 13 Sep 2015 12:10:33 -0600 Subject: [PATCH 01/49] Update for iOS 9 and Safari 9 compatibility Add workaround for isArray check failing due to Arguments not being recognized as an Array in Safari 9. --- taffy.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/taffy.js b/taffy.js index 350fb47..7357ff2 100644 --- a/taffy.js +++ b/taffy.js @@ -35,10 +35,10 @@ var TAFFY, exports, T; isIndexable, returnFilter, runFilters, numcharsplit, orderByCol, run, intersection, filter, makeCid, safeForJson, - isRegexp + isRegexp, sortArgs ; - - + + if ( ! TAFFY ){ // TC = Counter for Taffy DBs on page, used for unique IDs // cmax = size of charnumarray conversion cache @@ -49,6 +49,11 @@ var TAFFY, exports, T; cmax = 1000; API = {}; + sortArgs = function(args) { + var v = Array.prototype.slice.call(args); + return v.sort(); + } + protectJSON = function ( t ) { // **************************************** // * @@ -163,7 +168,7 @@ var TAFFY, exports, T; // * // **************************************** API[m] = function () { - return f.apply( this, arguments ); + return f.apply( this, sortArgs(arguments) ); }; }; @@ -633,7 +638,7 @@ var TAFFY, exports, T; }); nc.q = nq; // Hadnle passing of ___ID or a record on lookup. - each( arguments, function ( f ) { + each( sortArgs(arguments), function ( f ) { nc.q.push( returnFilter( f ) ); nc.filterRaw.push( f ); }); @@ -719,7 +724,7 @@ var TAFFY, exports, T; // * // * Takes: a object and passes it off DBI update method for all matched records // **************************************** - var runEvent = true, o = {}, args = arguments, that; + var runEvent = true, o = {}, args = sortArgs(arguments), that; if ( TAFFY.isString( arg0 ) && (arguments.length === 2 || arguments.length === 3) ) { @@ -848,7 +853,7 @@ var TAFFY, exports, T; // **************************************** var total = 0, that = this; run.call( that ); - each( arguments, function ( c ) { + each( sortArgs(arguments), function ( c ) { each( that.context().results, function ( r ) { total = total + (r[c] || 0); }); @@ -979,7 +984,7 @@ var TAFFY, exports, T; fnMain = function ( table ) { var right_table, i, - arg_list = arguments, + arg_list = sortArgs(arguments), arg_length = arg_list.length, result_list = [] ; @@ -1053,7 +1058,7 @@ var TAFFY, exports, T; // * Note if more than one column is given an array of arrays is returned // **************************************** - var ra = [], args = arguments; + var ra = [], args = sortArgs(arguments); run.call( this ); if ( arguments.length === 1 ){ @@ -1080,7 +1085,7 @@ var TAFFY, exports, T; // * Returns: array of values // * Note if more than one column is given an array of arrays is returned // **************************************** - var ra = [], args = arguments; + var ra = [], args = sortArgs(arguments); run.call( this ); if ( arguments.length === 1 ){ @@ -1600,7 +1605,7 @@ var TAFFY, exports, T; // * // * Call the query method to setup a new query // **************************************** - each( arguments, function ( f ) { + each( sortArgs(arguments), function ( f ) { if ( isIndexable( f ) ){ context.index.push( f ); @@ -2014,4 +2019,3 @@ var TAFFY, exports, T; if ( typeof(exports) === 'object' ){ exports.taffy = TAFFY; } - From 9286afcf0a009d2c3920995fcab5d74c045e17d1 Mon Sep 17 00:00:00 2001 From: mmikowski Date: Thu, 22 Oct 2015 14:03:44 -0700 Subject: [PATCH 02/49] Updated tests to check for regressions --- taffy-test.html | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/taffy-test.html b/taffy-test.html index 08c85aa..dd7f4e2 100644 --- a/taffy-test.html +++ b/taffy-test.html @@ -109,12 +109,14 @@ // Begin runTests runTests = function () { var - friend_db, taffy_map, - key_name, data_val, msg_text, var_type; + test_idx = 0, + + friend_db, test_map, val_map, key_name, + data_val, msg_text, val_text, var_type; friend_db = TAFFY( getFriendList() ); - taffy_map = { + test_map = { by_city : friend_db({ city : "Seattle, WA"}), by_id : friend_db({ id : 1}), by_id_f : friend_db({ id : '1'}), @@ -126,31 +128,51 @@ filter_list : friend_db().filter({ city : "Seattle, WA"}) }; - for ( key_name in taffy_map ){ - if ( taffy_map.hasOwnProperty( key_name ) ) { - data_val = taffy_map[ key_name ]; + val_map = { + by_city : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + by_id : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + by_id_f : '[]', + by_name : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + kelly_by_id : '{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}', + kelly_last_name : '"Ruth"', + id_list : '[1,2,3,4]', + city_list : '["Seattle, WA","Dallas, TX","Washington, D.C."]', + filter_list : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]' + }; + + for ( key_name in test_map ){ + test_idx += 1; + + if ( test_map.hasOwnProperty( key_name ) ) { + data_val = test_map[ key_name ]; var_type = getVarType( data_val ); - msg_text = key_name + ': \n ===================\n'; + msg_text = String( test_idx ) + ' : Test: ' + key_name + ' : '; switch ( var_type ){ case 'Object' : if ( data_val.hasOwnProperty( 'get' ) ){ - msg_text += JSON.stringify( data_val.get() ); + val_text = JSON.stringify( data_val.get() ); } else { - msg_text += JSON.stringify( data_val ); + val_text = JSON.stringify( data_val ); } break; case 'Number' : - msg_text += String( data_val ); + val_text = String( data_val ); break; default : - msg_text += JSON.stringify( data_val ); + val_text = JSON.stringify( data_val ); } - msg_text += '\n\n'; - + if ( val_map[ key_name ] === val_text ) { + msg_text += 'pass'; + } + else { + msg_text += 'FAIL\n'; + msg_text += ' ACTUAL : ' + val_text + '\n'; + msg_text += ' EXPECTED : ' + val_map[ key_name ] + '\n\n'; + } console.log( msg_text ); } } From 82964a34ac91022129471863ad684066f49a50be Mon Sep 17 00:00:00 2001 From: mmikowski Date: Thu, 22 Oct 2015 14:06:55 -0700 Subject: [PATCH 03/49] Updated minified to latest source; passes regression tests --- taffy-min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taffy-min.js b/taffy-min.js index 1b5116e..3150be1 100644 --- a/taffy-min.js +++ b/taffy-min.js @@ -1 +1 @@ -var TAFFY,exports,T;(function(){var f,q,p,t,d,b,n,m,r,e,c,u,w,v,h,g,j,o,i,l,a,s,k;if(!TAFFY){d="2.7";b=1;n="000000";m=1000;r={};e=function(x){if(TAFFY.isArray(x)||TAFFY.isObject(x)){return x}else{return JSON.parse(x)}};i=function(y,x){return l(y,function(z){return x.indexOf(z)>=0})};l=function(A,z,y){var x=[];if(A==null){return x}if(Array.prototype.filter&&A.filter===Array.prototype.filter){return A.filter(z,y)}c(A,function(D,B,C){if(z.call(y,D,B,C)){x[x.length]=D}});return x};k=function(x){return Object.prototype.toString.call(x)==="[object RegExp]"};s=function(z){var x=T.isArray(z)?[]:T.isObject(z)?{}:null;if(z===null){return z}for(var y in z){x[y]=k(z[y])?z[y].toString():T.isArray(z[y])||T.isObject(z[y])?s(z[y]):z[y]}return x};a=function(y){var x=JSON.stringify(y);if(x.match(/regex/)===null){return x}return JSON.stringify(s(y))};c=function(B,A,C){var E,D,z,F;if(B&&((T.isArray(B)&&B.length===1)||(!T.isArray(B)))){A((T.isArray(B))?B[0]:B,0)}else{for(E,D,z=0,B=(T.isArray(B))?B:[B],F=B.length;z4){c(A,function(B){if(h(z,B)){x=true}})}break}});return x};v=function(y){var x=[];if(T.isString(y)&&/[t][0-9]*[r][0-9]*/i.test(y)){y={___id:y}}if(T.isArray(y)){c(y,function(z){x.push(v(z))});y=function(){var A=this,z=false;c(x,function(B){if(h(A,B)){z=true}});return z};return y}if(T.isObject(y)){if(T.isObject(y)&&y.___id&&y.___s){y={___id:y.___id}}u(y,function(z,A){if(!T.isObject(z)){z={is:z}}u(z,function(B,C){var E=[],D;D=(C==="hasAll")?function(F,G){G(F)}:c;D(B,function(G){var F=true,H=false,I;I=function(){var N=this[A],M="==",O="!=",Q="===",R="<",L=">",S="<=",P=">=",K="!==",J;if(typeof N==="undefined"){return false}if((C.indexOf("!")===0)&&C!==O&&C!==K){F=false;C=C.substring(1,C.length)}J=((C==="regex")?(G.test(N)):(C==="lt"||C===R)?(NG):(C==="lte"||C===S)?(N<=G):(C==="gte"||C===P)?(N>=G):(C==="left")?(N.indexOf(G)===0):(C==="leftnocase")?(N.toLowerCase().indexOf(G.toLowerCase())===0):(C==="right")?(N.substring((N.length-G.length))===G):(C==="rightnocase")?(N.toLowerCase().substring((N.length-G.length))===G.toLowerCase()):(C==="like")?(N.indexOf(G)>=0):(C==="likenocase")?(N.toLowerCase().indexOf(G.toLowerCase())>=0):(C===Q||C==="is")?(N===G):(C===M)?(N==G):(C===K)?(N!==G):(C===O)?(N!=G):(C==="isnocase")?(N.toLowerCase?N.toLowerCase()===G.toLowerCase():N===G):(C==="has")?(T.has(N,G)):(C==="hasall")?(T.hasAll(N,G)):(C==="contains")?(TAFFY.isArray(N)&&N.indexOf(G)>-1):(C.indexOf("is")===-1&&!TAFFY.isNull(N)&&!TAFFY.isUndefined(N)&&!TAFFY.isObject(G)&&!TAFFY.isArray(G))?(G===N[C]):(T[C]&&T.isFunction(T[C])&&C.indexOf("is")===0)?T[C](N)===G:(T[C]&&T.isFunction(T[C]))?T[C](N,G):(false));J=(J&&!F)?false:(!J&&!F)?true:J;return J};E.push(I)});if(E.length===1){x.push(E[0])}else{x.push(function(){var G=this,F=false;c(E,function(H){if(H.apply(G)){F=true}});return F})}})});y=function(){var A=this,z=true;z=(x.length===1&&!x[0].apply(A))?false:(x.length===2&&(!x[0].apply(A)||!x[1].apply(A)))?false:(x.length===3&&(!x[0].apply(A)||!x[1].apply(A)||!x[2].apply(A)))?false:(x.length===4&&(!x[0].apply(A)||!x[1].apply(A)||!x[2].apply(A)||!x[3].apply(A)))?false:true;if(x.length>4){c(x,function(B){if(!h(A,B)){z=false}})}return z};return y}if(T.isFunction(y)){return y}};j=function(x,y){var z=function(B,A){var C=0;T.each(y,function(F){var H,E,D,I,G;H=F.split(" ");E=H[0];D=(H.length===1)?"logical":H[1];if(D==="logical"){I=g(B[E]);G=g(A[E]);T.each((I.length<=G.length)?I:G,function(J,K){if(I[K]G[K]){C=1;return TAFFY.EXIT}}})}else{if(D==="logicaldesc"){I=g(B[E]);G=g(A[E]);T.each((I.length<=G.length)?I:G,function(J,K){if(I[K]>G[K]){C=-1;return TAFFY.EXIT}else{if(I[K]A[E]){C=1;return T.EXIT}else{if(D==="desc"&&B[E]>A[E]){C=-1;return T.EXIT}else{if(D==="desc"&&B[E]G.length){C=1}else{if(C===0&&D==="logicaldesc"&&I.length>G.length){C=-1}else{if(C===0&&D==="logicaldesc"&&I.lengthm){x={};y=0}return x["_"+z]||(function(){var D=String(z),C=[],G="_",B="",A,E,F;for(A=0,E=D.length;A=48&&F<=57)||F===46){if(B!=="n"){B="n";C.push(G.toLowerCase());G=""}G=G+D.charAt(A)}else{if(B!=="s"){B="s";C.push(parseFloat(G));G=""}G=G+D.charAt(A)}}C.push((B==="n")?parseFloat(G):G.toLowerCase());C.shift();x["_"+z]=C;y++;return C}())}}());o=function(){this.context({results:this.getDBI().query(this.context())})};r.extend("filter",function(){var y=TAFFY.mergeObj(this.context(),{run:null}),x=[];c(y.q,function(z){x.push(z)});y.q=x;c(arguments,function(z){y.q.push(v(z));y.filterRaw.push(z)});return this.getroot(y)});r.extend("order",function(z){z=z.split(",");var y=[],A;c(z,function(x){y.push(x.replace(/^\s*/,"").replace(/\s*$/,""))});A=TAFFY.mergeObj(this.context(),{sort:null});A.order=y;return this.getroot(A)});r.extend("limit",function(z){var y=TAFFY.mergeObj(this.context(),{}),x;y.limit=z;if(y.run&&y.sort){x=[];c(y.results,function(B,A){if((A+1)>z){return TAFFY.EXIT}x.push(B)});y.results=x}return this.getroot(y)});r.extend("start",function(z){var y=TAFFY.mergeObj(this.context(),{}),x;y.start=z;if(y.run&&y.sort&&!y.limit){x=[];c(y.results,function(B,A){if((A+1)>z){x.push(B)}});y.results=x}else{y=TAFFY.mergeObj(this.context(),{run:null,start:z})}return this.getroot(y)});r.extend("update",function(A,z,x){var B=true,D={},y=arguments,C;if(TAFFY.isString(A)&&(arguments.length===2||arguments.length===3)){D[A]=z;if(arguments.length===3){B=x}}else{D=A;if(y.length===2){B=z}}C=this;o.call(this);c(this.context().results,function(E){var F=D;if(TAFFY.isFunction(F)){F=F.apply(TAFFY.mergeObj(E,{}))}else{if(T.isFunction(F)){F=F(TAFFY.mergeObj(E,{}))}}if(TAFFY.isObject(F)){C.getDBI().update(E.___id,F,B)}});if(this.context().results.length){this.context({run:null})}return this});r.extend("remove",function(x){var y=this,z=0;o.call(this);c(this.context().results,function(A){y.getDBI().remove(A.___id);z++});if(this.context().results.length){this.context({run:null});y.getDBI().removeCommit(x)}return z});r.extend("count",function(){o.call(this);return this.context().results.length});r.extend("callback",function(z,x){if(z){var y=this;setTimeout(function(){o.call(y);z.call(y.getroot(y.context()))},x||0)}return null});r.extend("get",function(){o.call(this);return this.context().results});r.extend("stringify",function(){return JSON.stringify(this.get())});r.extend("first",function(){o.call(this);return this.context().results[0]||false});r.extend("last",function(){o.call(this);return this.context().results[this.context().results.length-1]||false});r.extend("sum",function(){var y=0,x=this;o.call(x);c(arguments,function(z){c(x.context().results,function(A){y=y+(A[z]||0)})});return y});r.extend("min",function(y){var x=null;o.call(this);c(this.context().results,function(z){if(x===null||z[y]":return C>F;case"<=":return C<=F;case">=":return C>=F;case"==":return C==F;case"!=":return C!=F;default:throw String(H)+" is not supported"}};y=function(C,F){var B={},D,E;for(D in C){if(C.hasOwnProperty(D)){B[D]=C[D]}}for(D in F){if(F.hasOwnProperty(D)&&D!=="___id"&&D!=="___s"){E=!TAFFY.isUndefined(B[D])?"right_":"";B[E+String(D)]=F[D]}}return B};z=function(F){var B,D,C=arguments,E=C.length,G=[];if(typeof F.filter!=="function"){if(F.TAFFY){B=F()}else{throw"TAFFY DB or result not supplied"}}else{B=F}this.context({results:this.getDBI().query(this.context())});TAFFY.each(this.context().results,function(H){B.each(function(K){var I,J=true;CONDITION:for(D=1;Dx){x=z[y]}});return x});r.extend("select",function(){var y=[],x=arguments;o.call(this);if(arguments.length===1){c(this.context().results,function(z){y.push(z[x[0]])})}else{c(this.context().results,function(z){var A=[];c(x,function(B){A.push(z[B])});y.push(A)})}return y});r.extend("distinct",function(){var y=[],x=arguments;o.call(this);if(arguments.length===1){c(this.context().results,function(A){var z=A[x[0]],B=false;c(y,function(C){if(z===C){B=true;return TAFFY.EXIT}});if(!B){y.push(z)}})}else{c(this.context().results,function(z){var B=[],A=false;c(x,function(C){B.push(z[C])});c(y,function(D){var C=true;c(x,function(F,E){if(B[E]!==D[E]){C=false;return TAFFY.EXIT}});if(C){A=true;return TAFFY.EXIT}});if(!A){y.push(B)}})}return y});r.extend("supplant",function(y,x){var z=[];o.call(this);c(this.context().results,function(A){z.push(y.replace(/\{([^\{\}]*)\}/g,function(C,B){var D=A[B];return typeof D==="string"||typeof D==="number"?D:C}))});return(!x)?z.join(""):z});r.extend("each",function(x){o.call(this);c(this.context().results,x);return this});r.extend("map",function(x){var y=[];o.call(this);c(this.context().results,function(z){y.push(x(z))});return y});T=function(F){var C=[],G={},D=1,z={template:false,onInsert:false,onUpdate:false,onRemove:false,onDBChange:false,storageName:false,forcePropertyCase:null,cacheSize:100,name:""},B=new Date(),A=0,y=0,I={},E,x,H;x=function(L){var K=[],J=false;if(L.length===0){return C}c(L,function(M){if(T.isString(M)&&/[t][0-9]*[r][0-9]*/i.test(M)&&C[G[M]]){K.push(C[G[M]]);J=true}if(T.isObject(M)&&M.___id&&M.___s&&C[G[M.___id]]){K.push(C[G[M.___id]]);J=true}if(T.isArray(M)){c(M,function(N){c(x(N),function(O){K.push(O)})})}});if(J&&K.length>1){K=[]}return K};E={dm:function(J){if(J){B=J;I={};A=0;y=0}if(z.onDBChange){setTimeout(function(){z.onDBChange.call(C)},0)}if(z.storageName){setTimeout(function(){localStorage.setItem("taffy_"+z.storageName,JSON.stringify(C))})}return B},insert:function(M,N){var L=[],K=[],J=e(M);c(J,function(P,Q){var O,R;if(T.isArray(P)&&Q===0){c(P,function(S){L.push((z.forcePropertyCase==="lower")?S.toLowerCase():(z.forcePropertyCase==="upper")?S.toUpperCase():S)});return true}else{if(T.isArray(P)){O={};c(P,function(U,S){O[L[S]]=U});P=O}else{if(T.isObject(P)&&z.forcePropertyCase){R={};u(P,function(U,S){R[(z.forcePropertyCase==="lower")?S.toLowerCase():(z.forcePropertyCase==="upper")?S.toUpperCase():S]=P[S]});P=R}}}D++;P.___id="T"+String(n+b).slice(-6)+"R"+String(n+D).slice(-6);P.___s=true;K.push(P.___id);if(z.template){P=T.mergeObj(z.template,P)}C.push(P);G[P.___id]=C.length-1;if(z.onInsert&&(N||TAFFY.isUndefined(N))){z.onInsert.call(P)}E.dm(new Date())});return H(K)},sort:function(J){C=j(C,J.split(","));G={};c(C,function(L,K){G[L.___id]=K});E.dm(new Date());return true},update:function(Q,M,L){var P={},O,N,J,K;if(z.forcePropertyCase){u(M,function(R,S){P[(z.forcePropertyCase==="lower")?S.toLowerCase():(z.forcePropertyCase==="upper")?S.toUpperCase():S]=R});M=P}O=C[G[Q]];N=T.mergeObj(O,M);J={};K=false;u(N,function(R,S){if(TAFFY.isUndefined(O[S])||O[S]!==R){J[S]=R;K=true}});if(K){if(z.onUpdate&&(L||TAFFY.isUndefined(L))){z.onUpdate.call(N,C[G[Q]],J)}C[G[Q]]=N;E.dm(new Date())}},remove:function(J){C[G[J]].___s=false},removeCommit:function(K){var J;for(J=C.length-1;J>-1;J--){if(!C[J].___s){if(z.onRemove&&(K||TAFFY.isUndefined(K))){z.onRemove.call(C[J])}G[C[J].___id]=undefined;C.splice(J,1)}}G={};c(C,function(M,L){G[M.___id]=L});E.dm(new Date())},query:function(L){var O,P,K,N,M,J;if(z.cacheSize){P="";c(L.filterRaw,function(Q){if(T.isFunction(Q)){P="nocache";return TAFFY.EXIT}});if(P===""){P=a(T.mergeObj(L,{q:false,run:false,sort:false}))}}if(!L.results||!L.run||(L.run&&E.dm()>L.run)){K=[];if(z.cacheSize&&I[P]){I[P].i=A++;return I[P].results}else{if(L.q.length===0&&L.index.length===0){c(C,function(Q){K.push(Q)});O=K}else{N=x(L.index);c(N,function(Q){if(L.q.length===0||h(Q,L.q)){K.push(Q)}});O=K}}}else{O=L.results}if(L.order.length>0&&(!L.run||!L.sort)){O=j(O,L.order)}if(O.length&&((L.limit&&L.limit=L.start)){if(L.limit){J=(L.start)?(Q+1)-L.start:Q;if(JL.limit){return TAFFY.EXIT}}}else{M.push(R)}}});O=M}if(z.cacheSize&&P!=="nocache"){y++;setTimeout(function(){var Q,R;if(y>=z.cacheSize*2){y=0;Q=A-z.cacheSize;R={};u(function(U,S){if(U.i>=Q){R[S]=U}});I=R}},0);I[P]={i:A++,results:O}}return O}};H=function(){var K,J;K=TAFFY.mergeObj(TAFFY.mergeObj(r,{insert:undefined}),{getDBI:function(){return E},getroot:function(L){return H.call(L)},context:function(L){if(L){J=TAFFY.mergeObj(J,L.hasOwnProperty("results")?TAFFY.mergeObj(L,{run:new Date(),sort:new Date()}):L)}return J},extend:undefined});J=(this&&this.q)?this:{limit:false,start:false,q:[],filterRaw:[],index:[],order:[],results:false,run:null,sort:null,settings:z};c(arguments,function(L){if(w(L)){J.index.push(L)}else{J.q.push(v(L))}J.filterRaw.push(L)});return K};b++;if(F){E.insert(F)}H.insert=E.insert;H.merge=function(M,L,N){var K={},J=[],O={};N=N||false;L=L||"id";c(M,function(Q){var P;K[L]=Q[L];J.push(Q[L]);P=H(K).first();if(P){E.update(P.___id,Q,N)}else{E.insert(Q,N)}});O[L]=J;return H(O)};H.TAFFY=true;H.sort=E.sort;H.settings=function(J){if(J){z=TAFFY.mergeObj(z,J);if(J.template){H().update(J.template)}}return z};H.store=function(L){var K=false,J;if(localStorage){if(L){J=localStorage.getItem("taffy_"+L);if(J&&J.length>0){H.insert(J);K=true}if(C.length>0){setTimeout(function(){localStorage.setItem("taffy_"+z.storageName,JSON.stringify(C))})}}H.settings({storageName:L})}return H};return H};TAFFY=T;T.each=c;T.eachin=u;T.extend=r.extend;TAFFY.EXIT="TAFFYEXIT";TAFFY.mergeObj=function(z,x){var y={};u(z,function(A,B){y[B]=z[B]});u(x,function(A,B){y[B]=x[B]});return y};TAFFY.has=function(z,y){var x=false,A;if((z.TAFFY)){x=z(y);if(x.length>0){return true}else{return false}}else{switch(T.typeOf(z)){case"object":if(T.isObject(y)){u(y,function(B,C){if(x===true&&!T.isUndefined(z[C])&&z.hasOwnProperty(C)){x=T.has(z[C],y[C])}else{x=false;return TAFFY.EXIT}})}else{if(T.isArray(y)){c(y,function(B,C){x=T.has(z,y[C]);if(x){return TAFFY.EXIT}})}else{if(T.isString(y)){if(!TAFFY.isUndefined(z[y])){return true}else{return false}}}}return x;case"array":if(T.isObject(y)){c(z,function(B,C){x=T.has(z[C],y);if(x===true){return TAFFY.EXIT}})}else{if(T.isArray(y)){c(y,function(C,B){c(z,function(E,D){x=T.has(z[D],y[B]);if(x===true){return TAFFY.EXIT}});if(x===true){return TAFFY.EXIT}})}else{if(T.isString(y)||T.isNumber(y)){x=false;for(A=0;A=0})},_v_=function(_t_,_e_,_n_){var _r_=[];return null==_t_?_r_:Array.prototype.filter&&_t_.filter===Array.prototype.filter?_t_.filter(_e_,_n_):(_l_(_t_,function(_t_,_i_,_s_){_e_.call(_n_,_t_,_i_,_s_)&&(_r_[_r_.length]=_t_)}),_r_)},___=function(_t_){return"[object RegExp]"===Object.prototype.toString.call(_t_)},_m_=function(_t_){var _e_=T.isArray(_t_)?[]:T.isObject(_t_)?{}:null;if(null===_t_)return _t_;for(var _n_ in _t_)_e_[_n_]=___(_t_[_n_])?_t_[_n_].toString():T.isArray(_t_[_n_])||T.isObject(_t_[_n_])?_m_(_t_[_n_]):_t_[_n_];return _e_},_y_=function(_t_){var _e_=JSON.stringify(_t_);return null===_e_.match(/regex/)?_e_:JSON.stringify(_m_(_t_))},_l_=function(_t_,_e_,_n_){var _r_,_i_,_s_,_u_;if(_t_&&(T.isArray(_t_)&&1===_t_.length||!T.isArray(_t_)))_e_(T.isArray(_t_)?_t_[0]:_t_,0);else for(_s_=0,_t_=T.isArray(_t_)?_t_:[_t_],_u_=_t_.length;_u_>_s_&&(_i_=_t_[_s_],T.isUndefined(_i_)&&!_n_||(_r_=_e_(_i_,_s_),_r_!==T.EXIT));_s_++);},_f_=function(_t_,_e_){var _n_,_r_,_i_=0;for(_r_ in _t_)if(_t_.hasOwnProperty(_r_)&&(_n_=_e_(_t_[_r_],_r_,_i_++),_n_===T.EXIT))break},_c_.extend=function(_t_,_e_){_c_[_t_]=function(){return _e_.apply(this,_x_(arguments))}},_h_=function(_t_){var _e_;return T.isString(_t_)&&/[t][0-9]*[r][0-9]*/i.test(_t_)?!0:T.isObject(_t_)&&_t_.___id&&_t_.___s?!0:T.isArray(_t_)?(_e_=!0,_l_(_t_,function(_t_){return _h_(_t_)?void 0:(_e_=!1,TAFFY.EXIT)}),_e_):!1},_g_=function(_t_,_e_){var _n_=!0;return _l_(_e_,function(_e_){switch(T.typeOf(_e_)){case"function":if(!_e_.apply(_t_))return _n_=!1,TAFFY.EXIT;break;case"array":_n_=1===_e_.length?_g_(_t_,_e_[0]):2===_e_.length?_g_(_t_,_e_[0])||_g_(_t_,_e_[1]):3===_e_.length?_g_(_t_,_e_[0])||_g_(_t_,_e_[1])||_g_(_t_,_e_[2]):4===_e_.length?_g_(_t_,_e_[0])||_g_(_t_,_e_[1])||_g_(_t_,_e_[2])||_g_(_t_,_e_[3]):!1,_e_.length>4&&_l_(_e_,function(_e_){_g_(_t_,_e_)&&(_n_=!0)})}}),_n_},_T_=function(_t_){var _e_=[];return T.isString(_t_)&&/[t][0-9]*[r][0-9]*/i.test(_t_)&&(_t_={___id:_t_}),T.isArray(_t_)?(_l_(_t_,function(_t_){_e_.push(_T_(_t_))}),_t_=function(){var _t_=this,_n_=!1;return _l_(_e_,function(_e_){_g_(_t_,_e_)&&(_n_=!0)}),_n_}):T.isObject(_t_)?(T.isObject(_t_)&&_t_.___id&&_t_.___s&&(_t_={___id:_t_.___id}),_f_(_t_,function(_t_,_n_){T.isObject(_t_)||(_t_={is:_t_}),_f_(_t_,function(_t_,_r_){var _i_,_s_=[];_i_="hasAll"===_r_?function(_t_,_e_){_e_(_t_)}:_l_,_i_(_t_,function(_t_){var _e_,_i_=!0;_e_=function(){var _e_,_s_=this[_n_],_u_="==",_o_="!=",_c_="===",_a_="<",_l_=">",_f_="<=",_h_=">=",_T_="!==";return"undefined"==typeof _s_?!1:(0===_r_.indexOf("!")&&_r_!==_o_&&_r_!==_T_&&(_i_=!1,_r_=_r_.substring(1,_r_.length)),_e_="regex"===_r_?_t_.test(_s_):"lt"===_r_||_r_===_a_?_t_>_s_:"gt"===_r_||_r_===_l_?_s_>_t_:"lte"===_r_||_r_===_f_?_t_>=_s_:"gte"===_r_||_r_===_h_?_s_>=_t_:"left"===_r_?0===_s_.indexOf(_t_):"leftnocase"===_r_?0===_s_.toLowerCase().indexOf(_t_.toLowerCase()):"right"===_r_?_s_.substring(_s_.length-_t_.length)===_t_:"rightnocase"===_r_?_s_.toLowerCase().substring(_s_.length-_t_.length)===_t_.toLowerCase():"like"===_r_?_s_.indexOf(_t_)>=0:"likenocase"===_r_?_s_.toLowerCase().indexOf(_t_.toLowerCase())>=0:_r_===_c_||"is"===_r_?_s_===_t_:_r_===_u_?_s_==_t_:_r_===_T_?_s_!==_t_:_r_===_o_?_s_!=_t_:"isnocase"===_r_?_s_.toLowerCase?_s_.toLowerCase()===_t_.toLowerCase():_s_===_t_:"has"===_r_?T.has(_s_,_t_):"hasall"===_r_?T.hasAll(_s_,_t_):"contains"===_r_?TAFFY.isArray(_s_)&&_s_.indexOf(_t_)>-1:-1!==_r_.indexOf("is")||TAFFY.isNull(_s_)||TAFFY.isUndefined(_s_)||TAFFY.isObject(_t_)||TAFFY.isArray(_t_)?T[_r_]&&T.isFunction(T[_r_])&&0===_r_.indexOf("is")?T[_r_](_s_)===_t_:T[_r_]&&T.isFunction(T[_r_])?T[_r_](_s_,_t_):!1:_t_===_s_[_r_],_e_=_e_&&!_i_?!1:_e_||_i_?_e_:!0)},_s_.push(_e_)}),_e_.push(1===_s_.length?_s_[0]:function(){var _t_=this,_e_=!1;return _l_(_s_,function(_n_){_n_.apply(_t_)&&(_e_=!0)}),_e_})})}),_t_=function(){var _t_=this,_n_=!0;return _n_=(1!==_e_.length||_e_[0].apply(_t_))&&(2!==_e_.length||_e_[0].apply(_t_)&&_e_[1].apply(_t_))&&(3!==_e_.length||_e_[0].apply(_t_)&&_e_[1].apply(_t_)&&_e_[2].apply(_t_))&&(4!==_e_.length||_e_[0].apply(_t_)&&_e_[1].apply(_t_)&&_e_[2].apply(_t_)&&_e_[3].apply(_t_))?!0:!1,_e_.length>4&&_l_(_e_,function(_e_){_g_(_t_,_e_)||(_n_=!1)}),_n_}):T.isFunction(_t_)?_t_:void 0},_p_=function(_t_,_e_){var _n_=function(_t_,_n_){var _r_=0;return T.each(_e_,function(_e_){var _i_,_s_,_u_,_o_,_c_;if(_i_=_e_.split(" "),_s_=_i_[0],_u_=1===_i_.length?"logical":_i_[1],"logical"===_u_)_o_=_F_(_t_[_s_]),_c_=_F_(_n_[_s_]),T.each(_o_.length<=_c_.length?_o_:_c_,function(_t_,_e_){return _o_[_e_]<_c_[_e_]?(_r_=-1,TAFFY.EXIT):_o_[_e_]>_c_[_e_]?(_r_=1,TAFFY.EXIT):void 0});else if("logicaldesc"===_u_)_o_=_F_(_t_[_s_]),_c_=_F_(_n_[_s_]),T.each(_o_.length<=_c_.length?_o_:_c_,function(_t_,_e_){return _o_[_e_]>_c_[_e_]?(_r_=-1,TAFFY.EXIT):_o_[_e_]<_c_[_e_]?(_r_=1,TAFFY.EXIT):void 0});else{if("asec"===_u_&&_t_[_s_]<_n_[_s_])return _r_=-1,T.EXIT;if("asec"===_u_&&_t_[_s_]>_n_[_s_])return _r_=1,T.EXIT;if("desc"===_u_&&_t_[_s_]>_n_[_s_])return _r_=-1,T.EXIT;if("desc"===_u_&&_t_[_s_]<_n_[_s_])return _r_=1,T.EXIT}return 0===_r_&&"logical"===_u_&&_o_.length<_c_.length?_r_=-1:0===_r_&&"logical"===_u_&&_o_.length>_c_.length?_r_=1:0===_r_&&"logicaldesc"===_u_&&_o_.length>_c_.length?_r_=-1:0===_r_&&"logicaldesc"===_u_&&_o_.length<_c_.length&&(_r_=1),0!==_r_?T.EXIT:void 0}),_r_};return _t_&&_t_.push?_t_.sort(_n_):_t_},function(){var _t_={},_e_=0;_F_=function(_n_){return _e_>_o_&&(_t_={},_e_=0),_t_["_"+_n_]||function(){var _r_,_i_,_s_,_u_=String(_n_),_o_=[],_c_="_",_a_="";for(_r_=0,_i_=_u_.length;_i_>_r_;_r_++)_s_=_u_.charCodeAt(_r_),_s_>=48&&57>=_s_||46===_s_?("n"!==_a_&&(_a_="n",_o_.push(_c_.toLowerCase()),_c_=""),_c_+=_u_.charAt(_r_)):("s"!==_a_&&(_a_="s",_o_.push(parseFloat(_c_)),_c_=""),_c_+=_u_.charAt(_r_));return _o_.push("n"===_a_?parseFloat(_c_):_c_.toLowerCase()),_o_.shift(),_t_["_"+_n_]=_o_,_e_++,_o_}()}}(),_d_=function(){this.context({results:this.getDBI().query(this.context())})},_c_.extend("filter",function(){var _t_=TAFFY.mergeObj(this.context(),{run:null}),_e_=[];return _l_(_t_.q,function(_t_){_e_.push(_t_)}),_t_.q=_e_,_l_(_x_(arguments),function(_e_){_t_.q.push(_T_(_e_)),_t_.filterRaw.push(_e_)}),this.getroot(_t_)}),_c_.extend("order",function(_t_){_t_=_t_.split(",");var _e_,_n_=[];return _l_(_t_,function(_t_){_n_.push(_t_.replace(/^\s*/,"").replace(/\s*$/,""))}),_e_=TAFFY.mergeObj(this.context(),{sort:null}),_e_.order=_n_,this.getroot(_e_)}),_c_.extend("limit",function(_t_){var _e_,_n_=TAFFY.mergeObj(this.context(),{});return _n_.limit=_t_,_n_.run&&_n_.sort&&(_e_=[],_l_(_n_.results,function(_n_,_r_){return _r_+1>_t_?TAFFY.EXIT:void _e_.push(_n_)}),_n_.results=_e_),this.getroot(_n_)}),_c_.extend("start",function(_t_){var _e_,_n_=TAFFY.mergeObj(this.context(),{});return _n_.start=_t_,_n_.run&&_n_.sort&&!_n_.limit?(_e_=[],_l_(_n_.results,function(_n_,_r_){_r_+1>_t_&&_e_.push(_n_)}),_n_.results=_e_):_n_=TAFFY.mergeObj(this.context(),{run:null,start:_t_}),this.getroot(_n_)}),_c_.extend("update",function(_t_,_e_,_n_){var _r_,_i_=!0,_s_={},_u_=_x_(arguments);return!TAFFY.isString(_t_)||2!==arguments.length&&3!==arguments.length?(_s_=_t_,2===_u_.length&&(_i_=_e_)):(_s_[_t_]=_e_,3===arguments.length&&(_i_=_n_)),_r_=this,_d_.call(this),_l_(this.context().results,function(_t_){var _e_=_s_;TAFFY.isFunction(_e_)?_e_=_e_.apply(TAFFY.mergeObj(_t_,{})):T.isFunction(_e_)&&(_e_=_e_(TAFFY.mergeObj(_t_,{}))),TAFFY.isObject(_e_)&&_r_.getDBI().update(_t_.___id,_e_,_i_)}),this.context().results.length&&this.context({run:null}),this}),_c_.extend("remove",function(_t_){var _e_=this,_n_=0;return _d_.call(this),_l_(this.context().results,function(_t_){_e_.getDBI().remove(_t_.___id),_n_++}),this.context().results.length&&(this.context({run:null}),_e_.getDBI().removeCommit(_t_)),_n_}),_c_.extend("count",function(){return _d_.call(this),this.context().results.length}),_c_.extend("callback",function(_t_,_e_){if(_t_){var _n_=this;setTimeout(function(){_d_.call(_n_),_t_.call(_n_.getroot(_n_.context()))},_e_||0)}return null}),_c_.extend("get",function(){return _d_.call(this),this.context().results}),_c_.extend("stringify",function(){return JSON.stringify(this.get())}),_c_.extend("first",function(){return _d_.call(this),this.context().results[0]||!1}),_c_.extend("last",function(){return _d_.call(this),this.context().results[this.context().results.length-1]||!1}),_c_.extend("sum",function(){var _t_=0,_e_=this;return _d_.call(_e_),_l_(_x_(arguments),function(_n_){_l_(_e_.context().results,function(_e_){_t_+=_e_[_n_]||0})}),_t_}),_c_.extend("min",function(_t_){var _e_=null;return _d_.call(this),_l_(this.context().results,function(_n_){(null===_e_||_n_[_t_]<_e_)&&(_e_=_n_[_t_])}),_e_}),function(){var _t_=function(){var _t_,_e_,_n_;return _t_=function(_t_,_e_,_n_){var _r_,_i_,_s_;switch(2===_n_.length?(_r_=_t_[_n_[0]],_s_="===",_i_=_e_[_n_[1]]):(_r_=_t_[_n_[0]],_s_=_n_[1],_i_=_e_[_n_[2]]),_s_){case"===":return _r_===_i_;case"!==":return _r_!==_i_;case"<":return _i_>_r_;case">":return _r_>_i_;case"<=":return _i_>=_r_;case">=":return _r_>=_i_;case"==":return _r_==_i_;case"!=":return _r_!=_i_;default:throw String(_s_)+" is not supported"}},_e_=function(_t_,_e_){var _n_,_r_,_i_={};for(_n_ in _t_)_t_.hasOwnProperty(_n_)&&(_i_[_n_]=_t_[_n_]);for(_n_ in _e_)_e_.hasOwnProperty(_n_)&&"___id"!==_n_&&"___s"!==_n_&&(_r_=TAFFY.isUndefined(_i_[_n_])?"":"right_",_i_[_r_+String(_n_)]=_e_[_n_]);return _i_},_n_=function(_n_){var _r_,_i_,_s_=_x_(arguments),_u_=_s_.length,_o_=[];if("function"!=typeof _n_.filter){if(!_n_.TAFFY)throw"TAFFY DB or result not supplied";_r_=_n_()}else _r_=_n_;return this.context({results:this.getDBI().query(this.context())}),TAFFY.each(this.context().results,function(_n_){_r_.each(function(_r_){var _c_,_a_=!0;t:for(_i_=1;_u_>_i_&&(_c_=_s_[_i_],_a_="function"==typeof _c_?_c_(_n_,_r_):"object"==typeof _c_&&_c_.length?_t_(_n_,_r_,_c_):!1,_a_);_i_++);_a_&&_o_.push(_e_(_n_,_r_))})}),TAFFY(_o_)()}}();_c_.extend("join",_t_)}(),_c_.extend("max",function(_t_){var _e_=null;return _d_.call(this),_l_(this.context().results,function(_n_){(null===_e_||_n_[_t_]>_e_)&&(_e_=_n_[_t_])}),_e_}),_c_.extend("select",function(){var _t_=[],_e_=_x_(arguments);return _d_.call(this),1===arguments.length?_l_(this.context().results,function(_n_){_t_.push(_n_[_e_[0]])}):_l_(this.context().results,function(_n_){var _r_=[];_l_(_e_,function(_t_){_r_.push(_n_[_t_])}),_t_.push(_r_)}),_t_}),_c_.extend("distinct",function(){var _t_=[],_e_=_x_(arguments);return _d_.call(this),1===arguments.length?_l_(this.context().results,function(_n_){var _r_=_n_[_e_[0]],_i_=!1;_l_(_t_,function(_t_){return _r_===_t_?(_i_=!0,TAFFY.EXIT):void 0}),_i_||_t_.push(_r_)}):_l_(this.context().results,function(_n_){var _r_=[],_i_=!1;_l_(_e_,function(_t_){_r_.push(_n_[_t_])}),_l_(_t_,function(_t_){var _n_=!0;return _l_(_e_,function(_e_,_i_){return _r_[_i_]!==_t_[_i_]?(_n_=!1,TAFFY.EXIT):void 0}),_n_?(_i_=!0,TAFFY.EXIT):void 0}),_i_||_t_.push(_r_)}),_t_}),_c_.extend("supplant",function(_t_,_e_){var _n_=[];return _d_.call(this),_l_(this.context().results,function(_e_){_n_.push(_t_.replace(/\{([^\{\}]*)\}/g,function(_t_,_n_){var _r_=_e_[_n_];return"string"==typeof _r_||"number"==typeof _r_?_r_:_t_}))}),_e_?_n_:_n_.join("")}),_c_.extend("each",function(_t_){return _d_.call(this),_l_(this.context().results,_t_),this}),_c_.extend("map",function(_t_){var _e_=[];return _d_.call(this),_l_(this.context().results,function(_n_){_e_.push(_t_(_n_))}),_e_}),T=function(_t_){var _e_,_n_,_r_,_i_=[],_o_={},_F_=1,_d_={template:!1,onInsert:!1,onUpdate:!1,onRemove:!1,onDBChange:!1,storageName:!1,forcePropertyCase:null,cacheSize:100,name:""},_A_=new Date,_v_=0,_m_=0,___={};return _n_=function(_t_){var _e_=[],_r_=!1;return 0===_t_.length?_i_:(_l_(_t_,function(_t_){T.isString(_t_)&&/[t][0-9]*[r][0-9]*/i.test(_t_)&&_i_[_o_[_t_]]&&(_e_.push(_i_[_o_[_t_]]),_r_=!0),T.isObject(_t_)&&_t_.___id&&_t_.___s&&_i_[_o_[_t_.___id]]&&(_e_.push(_i_[_o_[_t_.___id]]),_r_=!0),T.isArray(_t_)&&_l_(_t_,function(_t_){_l_(_n_(_t_),function(_t_){_e_.push(_t_)})})}),_r_&&_e_.length>1&&(_e_=[]),_e_)},_e_={dm:function(_t_){return _t_&&(_A_=_t_,___={},_v_=0,_m_=0),_d_.onDBChange&&setTimeout(function(){_d_.onDBChange.call(_i_)},0),_d_.storageName&&setTimeout(function(){localStorage.setItem("taffy_"+_d_.storageName,JSON.stringify(_i_))}),_A_},insert:function(_t_,_n_){var _c_=[],_h_=[],_T_=_a_(_t_);return _l_(_T_,function(_t_,_r_){var _a_,_T_;return T.isArray(_t_)&&0===_r_?(_l_(_t_,function(_t_){_c_.push("lower"===_d_.forcePropertyCase?_t_.toLowerCase():"upper"===_d_.forcePropertyCase?_t_.toUpperCase():_t_)}),!0):(T.isArray(_t_)?(_a_={},_l_(_t_,function(_t_,_e_){_a_[_c_[_e_]]=_t_}),_t_=_a_):T.isObject(_t_)&&_d_.forcePropertyCase&&(_T_={},_f_(_t_,function(_e_,_n_){_T_["lower"===_d_.forcePropertyCase?_n_.toLowerCase():"upper"===_d_.forcePropertyCase?_n_.toUpperCase():_n_]=_t_[_n_]}),_t_=_T_),_F_++,_t_.___id="T"+String(_u_+_s_).slice(-6)+"R"+String(_u_+_F_).slice(-6),_t_.___s=!0,_h_.push(_t_.___id),_d_.template&&(_t_=T.mergeObj(_d_.template,_t_)),_i_.push(_t_),_o_[_t_.___id]=_i_.length-1,_d_.onInsert&&(_n_||TAFFY.isUndefined(_n_))&&_d_.onInsert.call(_t_),void _e_.dm(new Date))}),_r_(_h_)},sort:function(_t_){return _i_=_p_(_i_,_t_.split(",")),_o_={},_l_(_i_,function(_t_,_e_){_o_[_t_.___id]=_e_}),_e_.dm(new Date),!0},update:function(_t_,_n_,_r_){var _s_,_u_,_c_,_a_,_l_={};_d_.forcePropertyCase&&(_f_(_n_,function(_t_,_e_){_l_["lower"===_d_.forcePropertyCase?_e_.toLowerCase():"upper"===_d_.forcePropertyCase?_e_.toUpperCase():_e_]=_t_}),_n_=_l_),_s_=_i_[_o_[_t_]],_u_=T.mergeObj(_s_,_n_),_c_={},_a_=!1,_f_(_u_,function(_t_,_e_){(TAFFY.isUndefined(_s_[_e_])||_s_[_e_]!==_t_)&&(_c_[_e_]=_t_,_a_=!0)}),_a_&&(_d_.onUpdate&&(_r_||TAFFY.isUndefined(_r_))&&_d_.onUpdate.call(_u_,_i_[_o_[_t_]],_c_),_i_[_o_[_t_]]=_u_,_e_.dm(new Date))},remove:function(_t_){_i_[_o_[_t_]].___s=!1},removeCommit:function(_t_){var _n_;for(_n_=_i_.length-1;_n_>-1;_n_--)_i_[_n_].___s||(_d_.onRemove&&(_t_||TAFFY.isUndefined(_t_))&&_d_.onRemove.call(_i_[_n_]),_o_[_i_[_n_].___id]=void 0,_i_.splice(_n_,1));_o_={},_l_(_i_,function(_t_,_e_){_o_[_t_.___id]=_e_}),_e_.dm(new Date)},query:function(_t_){var _r_,_s_,_u_,_o_,_c_,_a_;if(_d_.cacheSize&&(_s_="",_l_(_t_.filterRaw,function(_t_){return T.isFunction(_t_)?(_s_="nocache",TAFFY.EXIT):void 0}),""===_s_&&(_s_=_y_(T.mergeObj(_t_,{q:!1,run:!1,sort:!1})))),!_t_.results||!_t_.run||_t_.run&&_e_.dm()>_t_.run){if(_u_=[],_d_.cacheSize&&___[_s_])return ___[_s_].i=_v_++,___[_s_].results;0===_t_.q.length&&0===_t_.index.length?(_l_(_i_,function(_t_){_u_.push(_t_)}),_r_=_u_):(_o_=_n_(_t_.index),_l_(_o_,function(_e_){(0===_t_.q.length||_g_(_e_,_t_.q))&&_u_.push(_e_)}),_r_=_u_)}else _r_=_t_.results;return!(_t_.order.length>0)||_t_.run&&_t_.sort||(_r_=_p_(_r_,_t_.order)),_r_.length&&(_t_.limit&&_t_.limit<_r_.length||_t_.start)&&(_c_=[],_l_(_r_,function(_e_,_n_){if(!_t_.start||_t_.start&&_n_+1>=_t_.start)if(_t_.limit){if(_a_=_t_.start?_n_+1-_t_.start:_n_,_a_<_t_.limit)_c_.push(_e_);else if(_a_>_t_.limit)return TAFFY.EXIT}else _c_.push(_e_)}),_r_=_c_),_d_.cacheSize&&"nocache"!==_s_&&(_m_++,setTimeout(function(){var _t_,_e_;_m_>=2*_d_.cacheSize&&(_m_=0,_t_=_v_-_d_.cacheSize,_e_={},_f_(function(_n_,_r_){_n_.i>=_t_&&(_e_[_r_]=_n_)}),___=_e_)},0),___[_s_]={i:_v_++,results:_r_}),_r_}},_r_=function(){var _t_,_n_;return _t_=TAFFY.mergeObj(TAFFY.mergeObj(_c_,{insert:void 0}),{getDBI:function(){return _e_},getroot:function(_t_){return _r_.call(_t_)},context:function(_t_){return _t_&&(_n_=TAFFY.mergeObj(_n_,_t_.hasOwnProperty("results")?TAFFY.mergeObj(_t_,{run:new Date,sort:new Date}):_t_)),_n_},extend:void 0}),_n_=this&&this.q?this:{limit:!1,start:!1,q:[],filterRaw:[],index:[],order:[],results:!1,run:null,sort:null,settings:_d_},_l_(_x_(arguments),function(_t_){_h_(_t_)?_n_.index.push(_t_):_n_.q.push(_T_(_t_)),_n_.filterRaw.push(_t_)}),_t_},_s_++,_t_&&_e_.insert(_t_),_r_.insert=_e_.insert,_r_.merge=function(_t_,_n_,_i_){var _s_={},_u_=[],_o_={};return _i_=_i_||!1,_n_=_n_||"id",_l_(_t_,function(_t_){var _o_;_s_[_n_]=_t_[_n_],_u_.push(_t_[_n_]),_o_=_r_(_s_).first(),_o_?_e_.update(_o_.___id,_t_,_i_):_e_.insert(_t_,_i_)}),_o_[_n_]=_u_,_r_(_o_)},_r_.TAFFY=!0,_r_.sort=_e_.sort,_r_.settings=function(_t_){return _t_&&(_d_=TAFFY.mergeObj(_d_,_t_),_t_.template&&_r_().update(_t_.template)),_d_},_r_.store=function(_t_){var _e_,_n_=!1;return localStorage&&(_t_&&(_e_=localStorage.getItem("taffy_"+_t_),_e_&&_e_.length>0&&(_r_.insert(_e_),_n_=!0),_i_.length>0&&setTimeout(function(){localStorage.setItem("taffy_"+_d_.storageName,JSON.stringify(_i_))})),_r_.settings({storageName:_t_})),_r_},_r_},TAFFY=T,T.each=_l_,T.eachin=_f_,T.extend=_c_.extend,TAFFY.EXIT="TAFFYEXIT",TAFFY.mergeObj=function(_t_,_e_){var _n_={};return _f_(_t_,function(_e_,_r_){_n_[_r_]=_t_[_r_]}),_f_(_e_,function(_t_,_r_){_n_[_r_]=_e_[_r_]}),_n_},TAFFY.has=function(_t_,_e_){var _n_,_r_=!1;if(_t_.TAFFY)return _r_=_t_(_e_),_r_.length>0?!0:!1;switch(T.typeOf(_t_)){case"object":if(T.isObject(_e_))_f_(_e_,function(_n_,_i_){return _r_!==!0||T.isUndefined(_t_[_i_])||!_t_.hasOwnProperty(_i_)?(_r_=!1,TAFFY.EXIT):void(_r_=T.has(_t_[_i_],_e_[_i_]))});else if(T.isArray(_e_))_l_(_e_,function(_n_,_i_){return _r_=T.has(_t_,_e_[_i_]),_r_?TAFFY.EXIT:void 0});else if(T.isString(_e_))return TAFFY.isUndefined(_t_[_e_])?!1:!0;return _r_;case"array":if(T.isObject(_e_))_l_(_t_,function(_n_,_i_){return _r_=T.has(_t_[_i_],_e_),_r_===!0?TAFFY.EXIT:void 0});else if(T.isArray(_e_))_l_(_e_,function(_n_,_i_){return _l_(_t_,function(_n_,_s_){return _r_=T.has(_t_[_s_],_e_[_i_]),_r_===!0?TAFFY.EXIT:void 0}),_r_===!0?TAFFY.EXIT:void 0});else if(T.isString(_e_)||T.isNumber(_e_))for(_r_=!1,_n_=0;_n_<_t_.length;_n_++)if(_r_=T.has(_t_[_n_],_e_))return!0;return _r_;case"string":if(T.isString(_e_)&&_e_===_t_)return!0;break;default:if(T.typeOf(_t_)===T.typeOf(_e_)&&_t_===_e_)return!0}return!1},TAFFY.hasAll=function(_t_,_e_){var _n_,_r_=TAFFY;return _r_.isArray(_e_)?(_n_=!0,_l_(_e_,function(_e_){return _n_=_r_.has(_t_,_e_),_n_===!1?TAFFY.EXIT:void 0}),_n_):_r_.has(_t_,_e_)},TAFFY.typeOf=function(_t_){var _e_=typeof _t_;return"object"===_e_&&(_t_?"number"!=typeof _t_.length||_t_.propertyIsEnumerable("length")||(_e_="array"):_e_="null"),_e_},TAFFY.getObjectKeys=function(_t_){var _e_=[];return _f_(_t_,function(_t_,_n_){_e_.push(_n_)}),_e_.sort(),_e_},TAFFY.isSameArray=function(_t_,_e_){return TAFFY.isArray(_t_)&&TAFFY.isArray(_e_)&&_t_.join(",")===_e_.join(",")?!0:!1},TAFFY.isSameObject=function(_t_,_e_){var _n_=TAFFY,_r_=!0;return _n_.isObject(_t_)&&_n_.isObject(_e_)&&_n_.isSameArray(_n_.getObjectKeys(_t_),_n_.getObjectKeys(_e_))?_f_(_t_,function(_i_,_s_){return _n_.isObject(_t_[_s_])&&_n_.isObject(_e_[_s_])&&_n_.isSameObject(_t_[_s_],_e_[_s_])||_n_.isArray(_t_[_s_])&&_n_.isArray(_e_[_s_])&&_n_.isSameArray(_t_[_s_],_e_[_s_])||_t_[_s_]===_e_[_s_]?void 0:(_r_=!1,TAFFY.EXIT)}):_r_=!1,_r_},_t_=["String","Number","Object","Array","Boolean","Null","Function","Undefined"],_e_=function(_t_){return function(_e_){return TAFFY.typeOf(_e_)===_t_.toLowerCase()?!0:!1}},_n_=0;_n_<_t_.length;_n_++)_r_=_t_[_n_],TAFFY["is"+_r_]=_e_(_r_)}(),"object"==typeof exports&&(exports.taffy=TAFFY); \ No newline at end of file From 0561c21b74cd8591252d90420155523e3605886e Mon Sep 17 00:00:00 2001 From: mmikowski Date: Fri, 23 Oct 2015 11:45:51 -0700 Subject: [PATCH 04/49] Upgraded test framework and README.md --- README.md | 24 +++++ node-demo.js | 99 --------------------- nodeunit_suite.js | 168 +++++++++++++++++++++++++++++++++++ package.json | 18 ++-- taffy-test.html | 220 ---------------------------------------------- 5 files changed, 202 insertions(+), 327 deletions(-) delete mode 100644 node-demo.js create mode 100644 nodeunit_suite.js delete mode 100644 taffy-test.html diff --git a/README.md b/README.md index 2b449bb..f324867 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,30 @@ View more docs and examples, get support, and get notified of updates: Web: http://taffydb.com Twitter: http://twitter.com/biastoact +## Automated regression tests + +### Purpose + +TaffyDB has been used and refined for years for numerous production tools and +commercial products. It is therefore is quite stable and reliable. However, +we want expand our regression test suite so that it provides excellent coverage. +That will allow us to improve the code with the confidence that we are +unlikely to break exising tools and processes. + +### Running the tests + +Running the nodeunit suite is simple: + + cd taffydb + npm install + nodeunit ./nodeunit_suite.js + +### Help us out! +We wish to substantially expand the number of tests, and your +help is certainly welcome! The nodeunit code is quite easy to adjust, so if +you want to provide a pull request for a change, that would be welcome. +Alternately, if you just send along the code for a test scenario, we'd be +happy to include it in the suite. ## Software License Agreement (BSD License) Copyright (c) diff --git a/node-demo.js b/node-demo.js deleted file mode 100644 index 35cb657..0000000 --- a/node-demo.js +++ /dev/null @@ -1,99 +0,0 @@ -var TAFFY = require("./taffy").taffy; - -console.log(TAFFY); - -var friendList = [ - {"id":1,"gender":"M","first":"John","last":"Smith", - "city":"Seattle, WA","status":"Active"}, - {"id":2,"gender":"F","first":"Kelly","last":"Ruth", - "city":"Dallas, TX","status":"Active"}, - {"id":3,"gender":"M","first":"Jeff","last":"Stevenson", - "city":"Washington, D.C.","status":"Active"}, - {"id":4,"gender":"F","first":"Jennifer","last":"Gill", - "city":"Seattle, WA","status":"Active"} -]; - -var friend_db = TAFFY(friendList); - -var taffy_map = { - by_city : friend_db({ city : "Seattle, WA"}), - by_id : friend_db({ id : 1}), - by_id_f : friend_db({ id : '1'}), - by_name : friend_db({ first : 'John',last:'Smith'}), - kelly_by_id : friend_db({ id : 2}).first(), - kelly_last_name : friend_db({ id : 2}).first().last, - id_list : friend_db().select( 'id' ), - city_list : friend_db().distinct( 'city' ), - filter_list : friend_db().filter({ city : "Seattle, WA"}) -}; - -for ( key_name in taffy_map ){ - if ( taffy_map.hasOwnProperty( key_name ) ) { - data_val = taffy_map[ key_name ]; - - var var_type = null; - - if (undefined === data_val ){ - var_type = 'Undefined'; - } - else if (data_val === null ){ - var_type = 'Null'; - } - else{ - var_type = {}.toString.call(data_val).slice(8, -1); - } - - msg_text = key_name + ': \n ===================\n'; - - switch ( var_type ){ - case 'Object' : - if ( data_val.hasOwnProperty( 'get' ) ){ - msg_text += JSON.stringify( data_val.get() ); - } - else { - msg_text += JSON.stringify( data_val ); - } - break; - case 'Number' : - msg_text += String( data_val ); - break; - - default : - msg_text += JSON.stringify( data_val ); - } - - msg_text += '\n\n'; - - console.log( msg_text ); - } -} - -console.log( 'Example filter bug - rows changed without using ' - + '.update() will filter by their original values. ' -); -friend_db().each(function ( row_map, idx ) { - if ( row_map.city === 'Seattle, WA' ){ - row_map.city = 'WallaWalla, WA'; - } -}); - -console.log( 'We expect 0 rows, but get 2... ' ); -console.log( - friend_db().filter({ city : 'Seattle, WA'}).get() -); -console.log( '...even though the city has changed in the collection.' ); -console.log( friend_db().get() ); -console.log( '' ); - -console.log( 'Example filter when .update() is used.'); -friend_db = TAFFY( friendList ); - -friend_db({ city : 'Seattle, WA' }) - .update({ city : 'WallaWalla, WA' }); - -console.log( 'now we get the correct response (0 rows) ...' ); -console.log( - friend_db().filter({ city : 'Seattle, WA'}).get() -); -console.log( friend_db().get() ); -console.log( '... that reflects the taffy collection.' ); \ No newline at end of file diff --git a/nodeunit_suite.js b/nodeunit_suite.js new file mode 100644 index 0000000..ac658f0 --- /dev/null +++ b/nodeunit_suite.js @@ -0,0 +1,168 @@ +/*jslint node : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, vars : false, white : true + unparam : true, sloppy : true, +*/ +/*global global, module, require, $, KI, document, window */ +// global global, module, require, $, KI, document, window + + 'use strict'; + // BEGIN module-scope vars + var + TAFFY = require("./taffy").taffy, + + // Load libraries + // Declare data sources + cfgMap = { + friend_list : [ + {"id":1,"gender":"M","first":"John","last":"Smith", + "city":"Seattle, WA","status":"Active"}, + {"id":2,"gender":"F","first":"Kelly","last":"Ruth", + "city":"Dallas, TX","status":"Active"}, + {"id":3,"gender":"M","first":"Jeff","last":"Stevenson", + "city":"Washington, D.C.","status":"Active"}, + {"id":4,"gender":"F","first":"Jennifer","last":"Gill", + "city":"Seattle, WA","status":"Active"} + ] + }, + // Declare utlities + getVarType, cloneFriendList, + // Declare init used to reset state for tests + + // Declare tests + testSmoke, testShowBug, testDummy + ; + // END module-scope vars + + // BEGIN public utility /getVarType/ + // Returns 'Function', 'Object', 'Array', + // 'String', 'Number', 'Boolean', or 'Undefined', + getVarType = function ( data ) { + if (undefined === data ){ return 'Undefined'; } + if (data === null ){ return 'Null'; } + return {}.toString.call(data).slice(8, -1); + }; + // END public utility /getVarType/ + + // BEGIN cloneFriendList + cloneFriendList = function () { return cfgMap.friend_list.slice(); }; + // END cloneFriendList + + // BEGIN testSmoke + testSmoke = function ( test_obj ) { + var + friend_db, test_map, val_map, key_name, + data_val, msg_str, val_str, var_type + ; + + test_obj.expect( 9 ); + friend_db = TAFFY( cloneFriendList() ); + + test_map = { + by_city : friend_db({ city : "Seattle, WA"}), + by_id : friend_db({ id : 1}), + by_id_f : friend_db({ id : '1'}), + by_name : friend_db({ first : 'John',last:'Smith'}), + kelly_by_id : friend_db({ id : 2}).first(), + kelly_last_name : friend_db({ id : 2}).first().last, + id_list : friend_db().select( 'id' ), + city_list : friend_db().distinct( 'city' ), + filter_list : friend_db().filter({ city : "Seattle, WA"}) + }; + val_map = { + by_city : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + by_id : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + by_id_f : '[]', + by_name : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + kelly_by_id : '{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}', + kelly_last_name : '"Ruth"', + id_list : '[1,2,3,4]', + city_list : '["Seattle, WA","Dallas, TX","Washington, D.C."]', + filter_list : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]' + }; + + for ( key_name in test_map ){ + if ( test_map.hasOwnProperty( key_name ) ) { + data_val = test_map[ key_name ]; + var_type = getVarType( data_val ); + + switch ( var_type ){ + case 'Object' : + if ( data_val.hasOwnProperty( 'get' ) ){ + val_str = JSON.stringify( data_val.get() ); + } + else { + val_str = JSON.stringify( data_val ); + } + break; + case 'Number' : + val_str = String( data_val ); + break; + + default : + val_str = JSON.stringify( data_val ); + } + // msg_str = 'Test: ' + key_name + ' === ' + val_str; + test_obj.equal( val_str, val_map[ key_name ] ); //, msg_str ); + } + } + test_obj.done(); + }; + // END testSmoke + + // BEGIN testShowBug + testShowBug = function ( test_obj ) { + var friend_db = TAFFY( cloneFriendList() ); + test_obj.expect( 0 ); + + friend_db().each(function ( row_map, idx ) { + if ( row_map.city === 'Seattle, WA' ){ + row_map.city = 'WallaWalla, WA'; + } + }); + + // console.log( 'Example filter bug - rows changed without using ' + // + '.update() will filter by their original values. ' + // ); + // console.log( 'We expect 0 rows, but get 2... ' ); + // console.log( + // friend_db().filter({ city : 'Seattle, WA'}).get() + // ); + // console.log( '...even though the city has changed in the collection.' ); + // console.log( friend_db().get() ); + // console.log( '' ); + // + // console.log( 'Example filter when .update() is used.'); + // friend_db = TAFFY( cloneFriendList() ); + // + // friend_db({ city : 'Seattle, WA' }) + // .update({ city : 'WallaWalla, WA' }); + // + // console.log( 'now we get the correct response (0 rows) ...' ); + // console.log( + // friend_db().filter({ city : 'Seattle, WA'}).get() + // ); + // console.log( friend_db().get() ); + // console.log( '... that reflects the taffy collection.' ); + + test_obj.done(); + }; + // END testShowBug + + testDummy = function ( test_obj ) { + test_obj.expect( 0 ); + test_obj.done(); + + // See http://stackoverflow.com/questions/10952806 + // Suprisingly, a non-zero exit value (echo $?) is provided + // when the tests do not pass, which is awesome! + // + // setTimeout( function (){ process.exit(0); }, 100 ); + }; + + module.exports = { + testSmoke : testSmoke, + testShowBug : testShowBug, + testDummy : testDummy + }; diff --git a/package.json b/package.json index 75b6bef..12df659 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,19 @@ }, "contributors": [ { - "name":"Ian Smith" + "name": "Ian Smith" }, { - "name":"Todd Chambery", - "email":"todd.chambery@gmail.com" + "name": "Todd Chambery", + "email": "todd.chambery@gmail.com" }, { - "name":"Daniel Ruf", - "email":"kontakt@daniel-ruf.de" + "name": "Daniel Ruf", + "email": "kontakt@daniel-ruf.de" }, { - "name":"Michael Mikowski", - "email":"mmikowski@snaplogic.com" + "name": "Michael Mikowski", + "email": "mmikowski@snaplogic.com" }, { "name": "Matthew Chase Whittemore", @@ -32,6 +32,8 @@ "type": "git", "url": "git://github.com/typicaljoe/taffydb.git" }, - "dependencies": {}, + "dependencies": { + "nodeunit": "^0.9.1" + }, "devDependencies": {} } diff --git a/taffy-test.html b/taffy-test.html deleted file mode 100644 index dd7f4e2..0000000 --- a/taffy-test.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - taffy test - - - - - - -
-Please open your javascript console to see test results -
- - From 73e0fd8cc42567390927b47595c7e82abda0f4a1 Mon Sep 17 00:00:00 2001 From: mmikowski Date: Fri, 23 Oct 2015 12:53:23 -0700 Subject: [PATCH 05/49] Updated .gitignore, merged node info to readme --- .gitignore | 2 +- README.md | 88 +++++++++++++++++++++++++++++------------------ how-to-node.md | 0 nodeunit_suite.js | 2 +- 4 files changed, 57 insertions(+), 35 deletions(-) delete mode 100644 how-to-node.md diff --git a/.gitignore b/.gitignore index dbf0821..27f1db5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -node_modules/* \ No newline at end of file +node_modules \ No newline at end of file diff --git a/README.md b/README.md index f324867..d1abecf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,20 @@ # TaffyDB (taffy.js) -TaffyDB is an opensouce library that brings database features into your JavaScript applications. +TaffyDB is an opensouce library that brings database features +into your JavaScript applications. ## Introduction -How you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have something that atcs a lot like a database table? TaffyDB brings powerful database funtionality to that concept and rapidly improves the way you work with data inside of JavaScript. +TaffyDB brings powerful SQL-like database capabilities to JavaScript, +and can greatly improve the way you with with data in your applications. +It can also greatly reduce development time and improve the speed and +quality of your code. + +How you ever noticed how JavaScript object literals look a lot like +records? And that if you wrap a group of them up in an array you have +something that acts a lot like a database table? We did too, and +TaffyDB provides you with a rich set of tools to manipulate lists of +objects with a fast, uniform API. ## What makes it sticky @@ -16,60 +26,66 @@ How you ever noticed how JavaScript object literals look a lot like records? And - Compatible with any DOM library (jQuery, YUI, Dojo, etc) ## Create a DB +Just pass in a JSON array: -Just pass in JSON: + var product_db = TAFFY([ + { "item" : 1, + "name" : "Blue Ray Player", + "price" : 99.99 + }, + { "item" : 2, + "name" : "3D TV", + "price" : 1799.99 + } + ]); - var products = TAFFY([{ - "item":1, - "name":"Blue Ray Player", - "price":99.99 - }, { - "item":2, - name:"3D TV", - price:1799.99 - }]); +## Example queries + // where item is equal to 1 + var item1 = products({item:1}); -## Find data + // where price is less than 100 + var lowPricedItems = products({price:{lt:100}}); -Use JSON to compare: + // where name is like "Blue Ray" + var blueRayPlayers = products({name:{like:"Blue Ray"}}); - var item1 = products({item:1}); - // where item is equal to 1 - var lowPricedItems = products({price:{lt:100}}); - // where price is less than 100 - var blueRayPlayers = products({name:{like:"Blue Ray"}}); - // where name is like "Blue Ray" + // get first record + products().first(); -## Use data + // get last record + products().last(); + +## Example record manipulation // update the price of the Blue Ray Player to 89.99 products({item:1}).update({price:89.99}); + // loop over the records and call a function products().each(function (r) {alert(r.name)}); - // get first record - products().first(); - // get last record - products().last(); + // sort the records by price descending products.sort("price desc"); + // select only the item names into an array products().select("name"); // returns ["3D TV","Blue Ray Player"] - // inject values from a record into a string template + + // Inject values from a record into a string template. + // Row value will be set to "3D TV17999.99" var row = products({item:2}).supplant("{name}{price}"); - // row now equal to "3D TV17999.99" -## Documentation, support, updates +## Use it in Node.JS +Node is easy to use in Node.JS. Simply install using `npm` and `require` the +package: -View more docs and examples, get support, and get notified of updates: + TAFFY = require( 'taffy' ).taffy; -Web: http://taffydb.com -Twitter: http://twitter.com/biastoact +The automated regression test file `nodeunit_suite.js` is an excellent +example. ## Automated regression tests ### Purpose - TaffyDB has been used and refined for years for numerous production tools and commercial products. It is therefore is quite stable and reliable. However, we want expand our regression test suite so that it provides excellent coverage. @@ -77,7 +93,6 @@ That will allow us to improve the code with the confidence that we are unlikely to break exising tools and processes. ### Running the tests - Running the nodeunit suite is simple: cd taffydb @@ -91,6 +106,13 @@ you want to provide a pull request for a change, that would be welcome. Alternately, if you just send along the code for a test scenario, we'd be happy to include it in the suite. +## Documentation, support, updates +View more docs and examples, get support, and get notified of updates: + +Web: http://taffydb.com +Twitter: http://twitter.com/biastoact + + ## Software License Agreement (BSD License) Copyright (c) All rights reserved. diff --git a/how-to-node.md b/how-to-node.md deleted file mode 100644 index e69de29..0000000 diff --git a/nodeunit_suite.js b/nodeunit_suite.js index ac658f0..c3eb364 100644 --- a/nodeunit_suite.js +++ b/nodeunit_suite.js @@ -10,7 +10,7 @@ 'use strict'; // BEGIN module-scope vars var - TAFFY = require("./taffy").taffy, + TAFFY = require( './taffy' ).taffy, // Load libraries // Declare data sources From e2c483ccf08751211b6132a16dafe315ad6d331e Mon Sep 17 00:00:00 2001 From: mmikowski Date: Fri, 23 Oct 2015 12:57:55 -0700 Subject: [PATCH 06/49] Minor typo in README --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d1abecf..f88b272 100644 --- a/README.md +++ b/README.md @@ -88,9 +88,8 @@ example. ### Purpose TaffyDB has been used and refined for years for numerous production tools and commercial products. It is therefore is quite stable and reliable. However, -we want expand our regression test suite so that it provides excellent coverage. -That will allow us to improve the code with the confidence that we are -unlikely to break exising tools and processes. +we want expand our regression test coverage so we can easily improve the code +with the confidence that we are unlikely to break exising capabilities. ### Running the tests Running the nodeunit suite is simple: From b49e983f430a1e8b69104b9c9835e891e0361368 Mon Sep 17 00:00:00 2001 From: mmikowski Date: Fri, 23 Oct 2015 17:49:04 -0700 Subject: [PATCH 07/49] Doubled regression tests and make more flexible, added jslint --- jslint | 1 + nodeunit_suite.js | 160 +++++++++++++++++++++++++++++++--------------- package.json | 1 + 3 files changed, 110 insertions(+), 52 deletions(-) create mode 120000 jslint diff --git a/jslint b/jslint new file mode 120000 index 0000000..6aab4db --- /dev/null +++ b/jslint @@ -0,0 +1 @@ +node_modules/jslint/bin/jslint.js \ No newline at end of file diff --git a/nodeunit_suite.js b/nodeunit_suite.js index c3eb364..c74f3f7 100644 --- a/nodeunit_suite.js +++ b/nodeunit_suite.js @@ -1,8 +1,8 @@ -/*jslint node : true, continue : true, - devel : true, indent : 2, maxerr : 50, - newcap : true, nomen : true, plusplus : true, - regexp : true, vars : false, white : true - unparam : true, sloppy : true, +/*jslint node : true, continue : true, + devel : true, indent : 2, maxerr : 50, + newcap : true, nomen : true, plusplus : true, + regexp : true, vars : false, white : true + unparam : true, sloppy : true, todo : true */ /*global global, module, require, $, KI, document, window */ // global global, module, require, $, KI, document, window @@ -32,7 +32,7 @@ // Declare tests testSmoke, testShowBug, testDummy - ; + ; // END module-scope vars // BEGIN public utility /getVarType/ @@ -52,60 +52,116 @@ // BEGIN testSmoke testSmoke = function ( test_obj ) { var - friend_db, test_map, val_map, key_name, - data_val, msg_str, val_str, var_type + friend_db, query_list, query_count, initial_list, expect_map, + idx, bit_list, key_name, data_val, expect_str, actual_str, msg_str, + + partial, chain_list, chain_count, i, chain_map ; - test_obj.expect( 9 ); friend_db = TAFFY( cloneFriendList() ); - test_map = { - by_city : friend_db({ city : "Seattle, WA"}), - by_id : friend_db({ id : 1}), - by_id_f : friend_db({ id : '1'}), - by_name : friend_db({ first : 'John',last:'Smith'}), - kelly_by_id : friend_db({ id : 2}).first(), - kelly_last_name : friend_db({ id : 2}).first().last, - id_list : friend_db().select( 'id' ), - city_list : friend_db().distinct( 'city' ), - filter_list : friend_db().filter({ city : "Seattle, WA"}) - }; - val_map = { - by_city : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - by_id : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', - by_id_f : '[]', - by_name : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + initial_list = friend_db().get(); + + // Data to to build test function calls like + // friend_db({city: "Seattle, // WA"}).get(); + query_list = [ + [ 'filter_city', [ { city : "Seattle, WA"}, { key: 'get' } ] ], + [ 'filter_id_num', [ { id : 1 }, { key : 'get' } ] ], + [ 'filter_id_str', [ { id : '1'}, { key : 'get' } ] ], + [ 'filter_name', [ { first : 'John', last : 'Smith' }, { key : 'get' } ] ], + [ 'kelly_by_id', [ { id : 2}, { key : 'first' } ] ], + [ 'kelly_last_name', [ { id : 2}, { key : 'first' }, { _xprop : 'last' } ] ], + [ 'id_list', [ null, { key : 'select', val : 'id' } ] ], + [ 'city_list', [ null, { key : 'distinct', val : 'city' } ] ], + [ 'filter_001', [ null, { key : 'filter', val : { city : "Seattle, WA"} }, { key : 'get' } ] ], + + // should match initial order + [ 'order_001', [ null, { key : 'get' } ] ], + [ 'order_002', [ null, { key : 'order', val : 'gender' }, { key : 'get' } ] ], + [ 'order_003', [ null, { key : 'order', val : 'gender desc' }, { key : 'get' } ] ], + [ 'order_004', [ null, { key : 'order', val : 'gender, last' }, { key : 'get' } ] ], + [ 'order_005', [ null, { key : 'order', val : 'gender desc, last desc' }, { key : 'get' } ] ], + // TODO: asec is not really supported, but is default sort. + // Also should the abbreviation be 'asc' or similar? + [ 'order_006', [ null, { key : 'order', val : 'first' }, { key : 'get' } ] ], + [ 'order_007', [ null, { key : 'order', val : 'last' }, { key : 'get' } ] ], + [ 'order_008', [ null, { key : 'order', val : 'first desc' }, { key : 'get' } ] ], + [ 'order_009', [ null, { key : 'order', val : 'last desc' }, { key : 'get' } ] ], + // should match initial order + [ 'order_001', [ null, { key : 'get' } ] ], + [ 'sort_001_002', [ { _xsort : 'last' }, { key : 'get' } ] ], + // should match changed order + [ 'sort_001_002', [ null, { key : 'get'} ] ], + ]; + + query_count = query_list.length; + test_obj.expect( query_count ); + + expect_map = { + filter_city : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + filter_id_num : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', + filter_id_str : '[]', + filter_name : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', kelly_by_id : '{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}', kelly_last_name : '"Ruth"', id_list : '[1,2,3,4]', city_list : '["Seattle, WA","Dallas, TX","Washington, D.C."]', - filter_list : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]' + filter_001 : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + order_001 : JSON.stringify( initial_list ), + order_002 : '[{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', + order_003 : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + order_004 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', + order_005 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + order_006 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}]', + order_007 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', + order_008 : '[{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', + order_009 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', + order_010 : JSON.stringify( initial_list ), + sort_001_002 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', }; - for ( key_name in test_map ){ - if ( test_map.hasOwnProperty( key_name ) ) { - data_val = test_map[ key_name ]; - var_type = getVarType( data_val ); - - switch ( var_type ){ - case 'Object' : - if ( data_val.hasOwnProperty( 'get' ) ){ - val_str = JSON.stringify( data_val.get() ); - } - else { - val_str = JSON.stringify( data_val ); - } - break; - case 'Number' : - val_str = String( data_val ); - break; - - default : - val_str = JSON.stringify( data_val ); + for ( idx = 0; idx < query_count; idx++ ) { + bit_list = query_list[ idx ]; + key_name = bit_list[ 0 ]; + data_val = bit_list[ 1 ]; + expect_str = expect_map[ key_name ] || ''; + + chain_list = data_val; + chain_count = chain_list.length; + + _PARTIAL_: + for ( i = 0; i < chain_count; i++ ) { + chain_map = chain_list[ i ]; + + if ( i === 0 ) { + if ( ! chain_map ) { + partial = friend_db(); + } + else if ( chain_map._xsort ) { + friend_db.sort( chain_map._xsort ); + partial = friend_db(); + } + else { + partial = friend_db( chain_map ); + } + } + + else { + if ( chain_map._xprop ) { + partial = partial[ chain_map._xprop ]; + } + else if ( chain_map.val ) { + partial = partial[ chain_map.key ]( chain_map.val ); + } + else { + partial = partial[ chain_map.key ](); + } } - // msg_str = 'Test: ' + key_name + ' === ' + val_str; - test_obj.equal( val_str, val_map[ key_name ] ); //, msg_str ); } + + actual_str = JSON.stringify( partial ); + msg_str = actual_str + ' === ' + expect_str; + test_obj.equal( actual_str, expect_str, msg_str ); } test_obj.done(); }; @@ -132,13 +188,13 @@ // console.log( '...even though the city has changed in the collection.' ); // console.log( friend_db().get() ); // console.log( '' ); - // + // // console.log( 'Example filter when .update() is used.'); // friend_db = TAFFY( cloneFriendList() ); - // + // // friend_db({ city : 'Seattle, WA' }) // .update({ city : 'WallaWalla, WA' }); - // + // // console.log( 'now we get the correct response (0 rows) ...' ); // console.log( // friend_db().filter({ city : 'Seattle, WA'}).get() @@ -158,7 +214,7 @@ // Suprisingly, a non-zero exit value (echo $?) is provided // when the tests do not pass, which is awesome! // - // setTimeout( function (){ process.exit(0); }, 100 ); + setTimeout( function (){ process.exit(0); }, 100 ); }; module.exports = { diff --git a/package.json b/package.json index 12df659..c734275 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "url": "git://github.com/typicaljoe/taffydb.git" }, "dependencies": { + "jslint": "^0.9.3", "nodeunit": "^0.9.1" }, "devDependencies": {} From 32106acffaa6054ece71186523fc8d274ca87755 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Sat, 24 Oct 2015 17:15:24 -0700 Subject: [PATCH 08/49] Initial merge for install_dev.sh --- .gitignore | 3 ++- README.md | 9 ++++++--- package.json | 10 ++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 27f1db5..ed4598e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +bin diff --git a/README.md b/README.md index f88b272..52224af 100644 --- a/README.md +++ b/README.md @@ -95,10 +95,14 @@ with the confidence that we are unlikely to break exising capabilities. Running the nodeunit suite is simple: cd taffydb - npm install - nodeunit ./nodeunit_suite.js + install_dev.sh # this installs development dependencies + bin/nodeunit ./nodeunit_suite.js ### Help us out! +If you want to help with taffydb development, run the `install_dev.sh` +script to install development utilities such as jslint, nodeunit, and +uglifyjs to the `bin` directory. + We wish to substantially expand the number of tests, and your help is certainly welcome! The nodeunit code is quite easy to adjust, so if you want to provide a pull request for a change, that would be welcome. @@ -111,7 +115,6 @@ View more docs and examples, get support, and get notified of updates: Web: http://taffydb.com Twitter: http://twitter.com/biastoact - ## Software License Agreement (BSD License) Copyright (c) All rights reserved. diff --git a/package.json b/package.json index c734275..7183bf7 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, { "name": "Michael Mikowski", - "email": "mmikowski@snaplogic.com" + "email": "mike.mikowski@gmail.com" }, { "name": "Matthew Chase Whittemore", @@ -33,8 +33,10 @@ "url": "git://github.com/typicaljoe/taffydb.git" }, "dependencies": { - "jslint": "^0.9.3", - "nodeunit": "^0.9.1" }, - "devDependencies": {} + "devDependencies": { + "jslint": "^0.9.3", + "nodeunit": "^0.9.1", + "uglifyjs": "^2.4.10" + } } From 6091546e775751af3dd901879028b9a26f358ff1 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Sat, 24 Oct 2015 17:26:36 -0700 Subject: [PATCH 09/49] Added install_dev.sh --- install_dev.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ jslint | 1 - 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100755 install_dev.sh delete mode 120000 jslint diff --git a/install_dev.sh b/install_dev.sh new file mode 100755 index 0000000..ace7c46 --- /dev/null +++ b/install_dev.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +echo "Install developer libraries?" +echo " WARNING: this will remove the following directories:" +echo " node_modules" +echo " bin" +echo " It will then install the taffydb node libraries" +echo " and create symbolic links in the bin directory" +echo " to the utilities used for taffydb development." +echo +echo " If you do not want this, press CTRL+C NOW!" +echo " Otherwise, press return." +echo + +read LINE; + +echo "Removing directories ..." + rm -rf node_modules bin; + +echo "Installing taffydb developer dependencies..." + node -e ' + var devMap=require("./package.json").devDependencies; + Object.keys(devMap).map( + function(key){ console.log( key + "@" + devMap[ key ] ) } + );' | xargs npm install; + +echo "Creating symbolic links ..." + mkdir bin; + cd bin + ln -s ../node_modules/jslint/bin/jslint.js jslint; + ln -s ../node_modules/nodeunit/bin/nodeunit nodeunit; + ln -s ../node_modules/uglifyjs/bin/uglifyjs uglifyjs; + cd ../ + +echo +echo "Done. Installed utilities are below:" + ls -1 bin; +echo +echo "Happy taffydb development!" +echo + +exit 0; diff --git a/jslint b/jslint deleted file mode 120000 index 6aab4db..0000000 --- a/jslint +++ /dev/null @@ -1 +0,0 @@ -node_modules/jslint/bin/jslint.js \ No newline at end of file From 8d172683fa6f13281c54eaa88e7fc842fe7255b7 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Sat, 24 Oct 2015 17:41:39 -0700 Subject: [PATCH 10/49] Revised development section --- README.md | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 52224af..ab26c3b 100644 --- a/README.md +++ b/README.md @@ -83,31 +83,38 @@ package: The automated regression test file `nodeunit_suite.js` is an excellent example. -## Automated regression tests +## Help improve taffydb -### Purpose TaffyDB has been used and refined for years for numerous production tools and commercial products. It is therefore is quite stable and reliable. However, we want expand our regression test coverage so we can easily improve the code with the confidence that we are unlikely to break exising capabilities. -### Running the tests -Running the nodeunit suite is simple: +### Getting started with development + +Run the `install_dev.sh` script to install development utilities such as `jslint`, +`nodeunit`, and `uglifyjs` to the `bin` directory. + + ./install_dev.sh + + +### Running regression tests +Running the nodeunit regression test suite is simple: cd taffydb - install_dev.sh # this installs development dependencies + ./install_dev.sh # as above + bin/nodeunit ./nodeunit_suite.js -### Help us out! -If you want to help with taffydb development, run the `install_dev.sh` -script to install development utilities such as jslint, nodeunit, and -uglifyjs to the `bin` directory. +Please do not send a pull request unless your changes have passed these +tests. We check, you know :) +### Adding to regression tests We wish to substantially expand the number of tests, and your -help is certainly welcome! The nodeunit code is quite easy to adjust, so if -you want to provide a pull request for a change, that would be welcome. -Alternately, if you just send along the code for a test scenario, we'd be -happy to include it in the suite. +help is welcome! The code, `nodeunit_suite.js`, should be easy to adjust. +Pull requests that include regression test inclusions are very much +appreciated. Alternately, if you just send along a test scenario, we'd be +happy to include it in the suite, time permitting. ## Documentation, support, updates View more docs and examples, get support, and get notified of updates: From 28ce9540a0281196299152550f9c6d01afcb2d14 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Sat, 24 Oct 2015 17:42:34 -0700 Subject: [PATCH 11/49] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab26c3b..9540125 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ into your JavaScript applications. ## Introduction TaffyDB brings powerful SQL-like database capabilities to JavaScript, -and can greatly improve the way you with with data in your applications. +and can greatly improve the way you manipulate data in your applications. It can also greatly reduce development time and improve the speed and quality of your code. From 688594c7ce97defbb729bcbe10f44757fe0b834d Mon Sep 17 00:00:00 2001 From: "Michael S. Mikowski" Date: Tue, 27 Oct 2015 10:39:52 -0700 Subject: [PATCH 12/49] Update README.md --- README.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9540125..185c1bc 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,21 @@ into your JavaScript applications. ## Introduction TaffyDB brings powerful SQL-like database capabilities to JavaScript, -and can greatly improve the way you manipulate data in your applications. -It can also greatly reduce development time and improve the speed and -quality of your code. +and can greatly simply data manipulation in web applications. +It can also greatly reduce development time, improve performance, and +enhance quality. -How you ever noticed how JavaScript object literals look a lot like +Have you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have -something that acts a lot like a database table? We did too, and -TaffyDB provides you with a rich set of tools to manipulate lists of -objects with a fast, uniform API. +something that looks a lot like a database table? We did too. +TaffyDB provides you with a rich set of tools to quickly manipulate +these 'tables' efficiently with a consistent, SQL-like interface. ## What makes it sticky - Extremely fast - - Powerful JavaScript centric data selection engine - - Database inspired features such as insert, update, unique, count, etc + - Powerful JavaScript-centric data selection engine + - SQL inspired features such as insert, update, unique, count, etc. - Robust cross browser support - Easily extended with your own functions - Compatible with any DOM library (jQuery, YUI, Dojo, etc) @@ -44,7 +44,7 @@ Just pass in a JSON array: // where item is equal to 1 var item1 = products({item:1}); - // where price is less than 100 + // where price is less than 100 var lowPricedItems = products({price:{lt:100}}); // where name is like "Blue Ray" @@ -78,6 +78,9 @@ Just pass in a JSON array: Node is easy to use in Node.JS. Simply install using `npm` and `require` the package: + $ npm install --production taffy + + # and then in your code TAFFY = require( 'taffy' ).taffy; The automated regression test file `nodeunit_suite.js` is an excellent From 24b23bd0c6c0aa938d928f0e02251f3053368031 Mon Sep 17 00:00:00 2001 From: mmikowski Date: Tue, 10 Nov 2015 11:48:35 -0800 Subject: [PATCH 13/49] Added update assert, changed to deepEqual --- nodeunit_suite.js | 67 +++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/nodeunit_suite.js b/nodeunit_suite.js index c74f3f7..fe47147 100644 --- a/nodeunit_suite.js +++ b/nodeunit_suite.js @@ -53,17 +53,19 @@ testSmoke = function ( test_obj ) { var friend_db, query_list, query_count, initial_list, expect_map, - idx, bit_list, key_name, data_val, expect_str, actual_str, msg_str, + idx, bit_list, key_name, val_data, expect_data, actual_str, msg_str, partial, chain_list, chain_count, i, chain_map ; friend_db = TAFFY( cloneFriendList() ); - initial_list = friend_db().get(); - // Data to to build test function calls like - // friend_db({city: "Seattle, // WA"}).get(); + // Fast clone; see stackoverflow.com/questions/122102/5344074 + initial_list = JSON.parse(JSON.stringify(friend_db().get())); + + // query data + // query_list = [ [ 'filter_city', [ { city : "Seattle, WA"}, { key: 'get' } ] ], [ 'filter_id_num', [ { id : 1 }, { key : 'get' } ] ], @@ -92,41 +94,44 @@ [ 'sort_001_002', [ { _xsort : 'last' }, { key : 'get' } ] ], // should match changed order [ 'sort_001_002', [ null, { key : 'get'} ] ], + [ 'get_ruth', [ { "last" : "Ruth" }, { key : 'update', val : { first : 'KelBel' } }, { key : 'first' } ] ] ]; query_count = query_list.length; test_obj.expect( query_count ); expect_map = { - filter_city : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - filter_id_num : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', - filter_id_str : '[]', - filter_name : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}]', - kelly_by_id : '{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}', - kelly_last_name : '"Ruth"', - id_list : '[1,2,3,4]', - city_list : '["Seattle, WA","Dallas, TX","Washington, D.C."]', - filter_001 : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - order_001 : JSON.stringify( initial_list ), - order_002 : '[{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', - order_003 : '[{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - order_004 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', - order_005 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - order_006 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}]', - order_007 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', - order_008 : '[{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', - order_009 : '[{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}]', - order_010 : JSON.stringify( initial_list ), - sort_001_002 : '[{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}]', + filter_city : [{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}], + filter_id_num : [{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}], + filter_id_str : [], + filter_name : [{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true}], + kelly_by_id : {"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}, + kelly_last_name : 'Ruth', + id_list : [1,2,3,4], + city_list : ["Seattle, WA","Dallas, TX","Washington, D.C."], + filter_001 : [{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}], + order_001 : initial_list, + order_002 : [{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}], + order_003 : [{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}], + order_004 : [{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}], + order_005 : [{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}], + order_006 : [{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true}], + order_007 : [{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}], + order_008 : [{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}], + order_009 : [{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true}], + order_010 : initial_list, + sort_001_002 : [{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active","___id":"T000002R000005","___s":true},{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true},{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active","___id":"T000002R000002","___s":true},{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active","___id":"T000002R000004","___s":true}], + get_ruth : {"id":2,"gender":"F","first":"KelBel","last":"Ruth","city":"Dallas, TX","status":"Active","___id":"T000002R000003","___s":true} }; for ( idx = 0; idx < query_count; idx++ ) { - bit_list = query_list[ idx ]; - key_name = bit_list[ 0 ]; - data_val = bit_list[ 1 ]; - expect_str = expect_map[ key_name ] || ''; + bit_list = query_list[ idx ]; + key_name = bit_list[ 0 ]; + val_data = bit_list[ 1 ]; + expect_data = expect_map[ key_name ] || ''; + - chain_list = data_val; + chain_list = val_data; chain_count = chain_list.length; _PARTIAL_: @@ -160,8 +165,8 @@ } actual_str = JSON.stringify( partial ); - msg_str = actual_str + ' === ' + expect_str; - test_obj.equal( actual_str, expect_str, msg_str ); + msg_str = actual_str + ' === ' + JSON.stringify( expect_data ); + test_obj.deepEqual( partial, expect_data, msg_str ); } test_obj.done(); }; From db0279861a8e3f6f0b58409be52f2b1b622c20d2 Mon Sep 17 00:00:00 2001 From: mmikowski Date: Tue, 10 Nov 2015 11:50:33 -0800 Subject: [PATCH 14/49] Spacing --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 185c1bc..06dac5f 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,8 @@ Just pass in a JSON array: // Inject values from a record into a string template. // Row value will be set to "3D TV17999.99" - var row = products({item:2}).supplant("{name}{price}"); + var row = products({item:2}) + .supplant("{name}{price}"); ## Use it in Node.JS Node is easy to use in Node.JS. Simply install using `npm` and `require` the From 8ed451881f05de8249e35ca3d3b90d6e6b0710f5 Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Thu, 12 Nov 2015 17:51:04 -0800 Subject: [PATCH 15/49] Added "license" field to package.json. Adding a "license" field to package.json. The license for this project appears to be a 2-Clause BSD license, so that's what I selected. If another license from (this list)[https://spdx.org/licenses/] makes more sense, please let me know! --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 7183bf7..7cbc3a0 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "email": "mcwhittemore@gmail.com" } ], + "license": "BSD-2-Clause", "name": "taffydb", "main": "./taffy", "description": "TaffyDB is an opensouce library that brings database features into your JavaScript applications.", From 4b9e3bef169e4849acfe7631cd947f281574fb66 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Fri, 27 Nov 2015 11:48:43 -0800 Subject: [PATCH 16/49] Revised README.md --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 06dac5f..4164e1f 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,25 @@ # TaffyDB (taffy.js) -TaffyDB is an opensouce library that brings database features -into your JavaScript applications. +TaffyDB is an open source JavaScript library that provides powerful +in-memory database capabilities to both browser and server applications. ## Introduction -TaffyDB brings powerful SQL-like database capabilities to JavaScript, -and can greatly simply data manipulation in web applications. -It can also greatly reduce development time, improve performance, and -enhance quality. - Have you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have something that looks a lot like a database table? We did too. -TaffyDB provides you with a rich set of tools to quickly manipulate -these 'tables' efficiently with a consistent, SQL-like interface. +We created TaffyDB easily and efficiently manipulate these 'tables' +with a uniform and familiar SQL-like interface. + +We use TaffyDB instead of ad-hoc data manipulation routines throughout +our applications. This reduces development time, improves performance, +simplifies maintenance, *and* increases quality. ## What makes it sticky - Extremely fast - Powerful JavaScript-centric data selection engine - - SQL inspired features such as insert, update, unique, count, etc. + - SQL inspired features such as insert, update, unique, count, and more - Robust cross browser support - Easily extended with your own functions - Compatible with any DOM library (jQuery, YUI, Dojo, etc) From 03372488c28a3fddf765408d5f6b050f1c67a937 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Fri, 27 Nov 2015 21:34:35 -0800 Subject: [PATCH 17/49] Added compatible browser and server list. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4164e1f..ce4565f 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,13 @@ simplifies maintenance, *and* increases quality. - Extremely fast - Powerful JavaScript-centric data selection engine - SQL inspired features such as insert, update, unique, count, and more - - Robust cross browser support + - Robust cross browser support - Easily extended with your own functions - Compatible with any DOM library (jQuery, YUI, Dojo, etc) +TaffyDB is compatible with all modern browsers: IE9+, FF3+, Safari 5+, +and Chrome 1.0+. It also works in NodeJS 0.10+. + ## Create a DB Just pass in a JSON array: From c88fd85462f4aa495064f39c4dd7af3131304151 Mon Sep 17 00:00:00 2001 From: Michael Mikowski Date: Sun, 18 Sep 2016 10:47:03 -0700 Subject: [PATCH 18/49] Streamlined npm cfg to standards, support for npm test. --- .gitignore | 5 +- README.md | 95 ++++++++++++++++++++-------------- install_dev.sh | 42 --------------- package.json | 48 +++++++++-------- nodeunit_suite.js => test/t.js | 2 +- 5 files changed, 85 insertions(+), 107 deletions(-) delete mode 100755 install_dev.sh rename nodeunit_suite.js => test/t.js (99%) diff --git a/.gitignore b/.gitignore index ed4598e..4f13519 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ +.idea +.git +*.swp +npm-debug.log node_modules -bin diff --git a/README.md b/README.md index ce4565f..9e064d8 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ We use TaffyDB instead of ad-hoc data manipulation routines throughout our applications. This reduces development time, improves performance, simplifies maintenance, *and* increases quality. +Please see the [official website](http://www.taffydb.com) for more +complete documentation. + ## What makes it sticky - Extremely fast @@ -30,61 +33,69 @@ and Chrome 1.0+. It also works in NodeJS 0.10+. ## Create a DB Just pass in a JSON array: - var product_db = TAFFY([ - { "item" : 1, - "name" : "Blue Ray Player", - "price" : 99.99 - }, - { "item" : 2, - "name" : "3D TV", - "price" : 1799.99 - } - ]); +```js +var product_db = TAFFY([ + { "item" : 1, + "name" : "Blue Ray Player", + "price" : 99.99 + }, + { "item" : 2, + "name" : "3D TV", + "price" : 1799.99 + } +]); +``` ## Example queries - // where item is equal to 1 - var item1 = products({item:1}); +```js +// where item is equal to 1 +var item1 = products({item:1}); - // where price is less than 100 - var lowPricedItems = products({price:{lt:100}}); +// where price is less than 100 +var lowPricedItems = products({price:{lt:100}}); - // where name is like "Blue Ray" - var blueRayPlayers = products({name:{like:"Blue Ray"}}); +// where name is like "Blue Ray" +var blueRayPlayers = products({name:{like:"Blue Ray"}}); - // get first record - products().first(); +// get first record +products().first(); - // get last record - products().last(); +// get last record +products().last(); +``` ## Example record manipulation - // update the price of the Blue Ray Player to 89.99 - products({item:1}).update({price:89.99}); +```js +// update the price of the Blue Ray Player to 89.99 +products({item:1}).update({price:89.99}); - // loop over the records and call a function - products().each(function (r) {alert(r.name)}); +// loop over the records and call a function +products().each(function (r) {alert(r.name)}); - // sort the records by price descending - products.sort("price desc"); +// sort the records by price descending +products.sort("price desc"); - // select only the item names into an array - products().select("name"); // returns ["3D TV","Blue Ray Player"] +// select only the item names into an array +products().select("name"); // returns ["3D TV","Blue Ray Player"] - // Inject values from a record into a string template. - // Row value will be set to "3D TV17999.99" - var row = products({item:2}) - .supplant("{name}{price}"); +// Inject values from a record into a string template. +// Row value will be set to "3D TV17999.99" +var row = products({item:2}) + .supplant("{name}{price}"); +``` ## Use it in Node.JS Node is easy to use in Node.JS. Simply install using `npm` and `require` the package: - $ npm install --production taffy - - # and then in your code - TAFFY = require( 'taffy' ).taffy; +```js +$ npm install --production taffy + +# and then in your code +TAFFY = require( 'taffy' ).taffy; +``` The automated regression test file `nodeunit_suite.js` is an excellent example. @@ -101,16 +112,20 @@ with the confidence that we are unlikely to break exising capabilities. Run the `install_dev.sh` script to install development utilities such as `jslint`, `nodeunit`, and `uglifyjs` to the `bin` directory. - ./install_dev.sh +```js +./install_dev.sh +``` ### Running regression tests Running the nodeunit regression test suite is simple: - cd taffydb - ./install_dev.sh # as above +```js +cd taffydb +./install_dev.sh # as above - bin/nodeunit ./nodeunit_suite.js +bin/nodeunit ./nodeunit_suite.js +``` Please do not send a pull request unless your changes have passed these tests. We check, you know :) diff --git a/install_dev.sh b/install_dev.sh deleted file mode 100755 index ace7c46..0000000 --- a/install_dev.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -echo "Install developer libraries?" -echo " WARNING: this will remove the following directories:" -echo " node_modules" -echo " bin" -echo " It will then install the taffydb node libraries" -echo " and create symbolic links in the bin directory" -echo " to the utilities used for taffydb development." -echo -echo " If you do not want this, press CTRL+C NOW!" -echo " Otherwise, press return." -echo - -read LINE; - -echo "Removing directories ..." - rm -rf node_modules bin; - -echo "Installing taffydb developer dependencies..." - node -e ' - var devMap=require("./package.json").devDependencies; - Object.keys(devMap).map( - function(key){ console.log( key + "@" + devMap[ key ] ) } - );' | xargs npm install; - -echo "Creating symbolic links ..." - mkdir bin; - cd bin - ln -s ../node_modules/jslint/bin/jslint.js jslint; - ln -s ../node_modules/nodeunit/bin/nodeunit nodeunit; - ln -s ../node_modules/uglifyjs/bin/uglifyjs uglifyjs; - cd ../ - -echo -echo "Done. Installed utilities are below:" - ls -1 bin; -echo -echo "Happy taffydb development!" -echo - -exit 0; diff --git a/package.json b/package.json index 7cbc3a0..4db2991 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,45 @@ { - "author": { - "name": "Ian Smith" + "name": "taffydb", + "version": "2.7.3", + "description": "TaffyDB is an opensouce library that brings database features into your JavaScript applications.", + "keywords": [ + "database", "browser", "json", "collection", "records", "node", "nodejs" + ], + "main": "taffy.js", + "scripts": { + "test": "node_modules/.bin/nodeunit test/t.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/typicaljoe/taffydb.git" }, + "author": { "name": "Ian Smith" }, "contributors": [ - { - "name": "Ian Smith" - }, - { - "name": "Todd Chambery", + { "name": "Ian Smith" }, + { "name": "Todd Chambery", "email": "todd.chambery@gmail.com" }, - { - "name": "Daniel Ruf", + { "name": "Daniel Ruf", "email": "kontakt@daniel-ruf.de" }, - { - "name": "Michael Mikowski", + { "name": "Michael Mikowski", "email": "mike.mikowski@gmail.com" }, - { - "name": "Matthew Chase Whittemore", + { "name": "Matthew Chase Whittemore", "email": "mcwhittemore@gmail.com" } ], "license": "BSD-2-Clause", - "name": "taffydb", - "main": "./taffy", - "description": "TaffyDB is an opensouce library that brings database features into your JavaScript applications.", - "version": "2.7.2", - "homepage": "http://taffydb.com/", - "repository": { - "type": "git", - "url": "git://github.com/typicaljoe/taffydb.git" - }, - "dependencies": { + "bugs": { + "url": "https://github.com/typicaljoe/taffydb/issues" }, + "homepage": "http://www.taffydb.com", + "dependencies": {}, "devDependencies": { "jslint": "^0.9.3", "nodeunit": "^0.9.1", + "nodeunit-b": "^4.0.0", + "node-inspector" : "^0.12.5", "uglifyjs": "^2.4.10" } } diff --git a/nodeunit_suite.js b/test/t.js similarity index 99% rename from nodeunit_suite.js rename to test/t.js index fe47147..658d80a 100644 --- a/nodeunit_suite.js +++ b/test/t.js @@ -10,7 +10,7 @@ 'use strict'; // BEGIN module-scope vars var - TAFFY = require( './taffy' ).taffy, + TAFFY = require( '../taffy.js' ).taffy, // Load libraries // Declare data sources From 36a2e33cf2cddc1dd22f333305c454781d038f5c Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 09:38:07 -0700 Subject: [PATCH 19/49] Create index.html --- docs/index.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/index.html diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..6c9c0d3 --- /dev/null +++ b/docs/index.html @@ -0,0 +1 @@ +Test TaffyDB.com From 673f92dbc69682cf68fe6be643aa939a1e0aa897 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 09:39:05 -0700 Subject: [PATCH 20/49] Set theme jekyll-theme-slate --- docs/_config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 0000000..c741881 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-slate \ No newline at end of file From fba6d215f105d810c20003be6323d0274ce7bbbf Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 09:45:43 -0700 Subject: [PATCH 21/49] Upload landing page --- docs/index.html | 303 +- docs/index_files/XRegExp.js.download | 10 + docs/index_files/bootstrap-alert.js.download | 10 + docs/index_files/bootstrap-button.js.download | 10 + .../bootstrap-carousel.js.download | 10 + .../bootstrap-collapse.js.download | 10 + .../bootstrap-dropdown.js.download | 10 + docs/index_files/bootstrap-modal.js.download | 10 + .../index_files/bootstrap-popover.js.download | 10 + docs/index_files/bootstrap-responsive.css | 815 +++ .../bootstrap-scrollspy.js.download | 10 + docs/index_files/bootstrap-tab.js.download | 10 + .../index_files/bootstrap-tooltip.js.download | 10 + .../bootstrap-transition.js.download | 10 + .../bootstrap-typeahead.js.download | 10 + docs/index_files/bootstrap.css | 4983 +++++++++++++++++ docs/index_files/ga.js.download | 77 + docs/index_files/jquery.js.download | 10 + docs/index_files/saved_resource(1).html | 3 + docs/index_files/saved_resource.html | 1591 ++++++ docs/index_files/shBrushJScript.js.download | 10 + docs/index_files/shCore.js.download | 10 + docs/index_files/taffydbboxV3.jpg | Bin 0 -> 22686 bytes ...9317855a58aa2366562a395f9e40ef.js.download | 1 + docs/index_files/widgets.js.download | 11 + 25 files changed, 7943 insertions(+), 1 deletion(-) create mode 100644 docs/index_files/XRegExp.js.download create mode 100644 docs/index_files/bootstrap-alert.js.download create mode 100644 docs/index_files/bootstrap-button.js.download create mode 100644 docs/index_files/bootstrap-carousel.js.download create mode 100644 docs/index_files/bootstrap-collapse.js.download create mode 100644 docs/index_files/bootstrap-dropdown.js.download create mode 100644 docs/index_files/bootstrap-modal.js.download create mode 100644 docs/index_files/bootstrap-popover.js.download create mode 100644 docs/index_files/bootstrap-responsive.css create mode 100644 docs/index_files/bootstrap-scrollspy.js.download create mode 100644 docs/index_files/bootstrap-tab.js.download create mode 100644 docs/index_files/bootstrap-tooltip.js.download create mode 100644 docs/index_files/bootstrap-transition.js.download create mode 100644 docs/index_files/bootstrap-typeahead.js.download create mode 100644 docs/index_files/bootstrap.css create mode 100644 docs/index_files/ga.js.download create mode 100644 docs/index_files/jquery.js.download create mode 100644 docs/index_files/saved_resource(1).html create mode 100644 docs/index_files/saved_resource.html create mode 100644 docs/index_files/shBrushJScript.js.download create mode 100644 docs/index_files/shCore.js.download create mode 100644 docs/index_files/taffydbboxV3.jpg create mode 100644 docs/index_files/timeline.619317855a58aa2366562a395f9e40ef.js.download create mode 100644 docs/index_files/widgets.js.download diff --git a/docs/index.html b/docs/index.html index 6c9c0d3..4fa091c 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1 +1,302 @@ -Test TaffyDB.com + + + + + + TaffyDB - The JavaScript Database + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + +

The JavaScript Database

+ +

An opensouce library that brings database features into your JavaScript applications.

+

Introduction

+ +

How you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have something that looks a lot like a database table? TaffyDB is a libary to bring powerful database funtionality to that concept and rapidly improve the way you work with data inside of JavaScript.

+ +

What makes it sticky

+ +
    +
  • Small file size, extremely fast queries
  • +
  • Powerful JavaScript centric data selection engine
  • +
  • Database inspired features such as count, update, and insert
  • +
  • Robust cross browser support
  • +
  • Easily extended with your own functions
  • +
  • Compatible with any DOM library (jQuery, YUI, Dojo, etc)
  • +
  • Compatible with Server Side JS
  • +
+

Create a Database

+
// Create DB and fill it with records
+var friends = TAFFY([
+	{"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active"},
+	{"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active"},
+	{"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active"},
+	{"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active"}	
+]);
+
+ +

Filter using the database name and object comparison

+
// Find all the friends in Seattle
+friends({city:"Seattle, WA"});
+
+// Find John Smith, by ID
+friends({id:1});
+
+// Find John Smith, by Name
+friends({first:"John",last:"Smith"});
+
+ +

Access data easily

+
// Kelly's record
+var kelly = friends({id:2}).first();
+
+// Kelly's last name
+var kellyslastname = kelly.last;
+
+// Get an array of record ids
+var cities = friends().select("id");
+
+// Get an array of distinct cities
+var cities = friends().distinct("city");
+
+// Apply a function to all the male friends
+friends({gender:"M"}).each(function (r) {
+   alert(r.name + "!");
+});
+
+ +

Modify data on the fly

+
// Move John Smith to Las Vegas
+friends({first:"John",last:"Smith"}).update({city:"Las Vegas, NV:"});
+
+// Remove Jennifer Gill as a friend
+friends({id:4}).remove();
+
+// insert a new friend
+friends.insert({"id":5,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Active"});
+
+ +

Download »

+ + + +
+
+ +
+
+

Beginner's Guide

+

A quick intro to getting your first DB up in running from scratch.

+

View details »

+
+ +
+

Writing queries

+

The heart of TaffyDB and any database is running queries against your data. This is done after creation of your database by calling the root function and building Filter Objects.

+

View details »

+
+
+

Using and modifying data

+ +

The basics for ordering, inserting, updating, deleting, and using your data in an application.

+

View details »

+
+
+
+
+

Extensions

+ +

TaffyDB is easy to extend. Write your own plugins or model whole applications with TaffyDB as the backbone.

+

View details »

+
+
+

Discussion List

+

A great place to get help, suggest ideas, and contribute to the TaffyDB community.

+

View details »

+ +
+
+

Fork It!

+

Use and modify the library for your own projects and contribute code back to the master library

+

View details »

+
+
+ +
+ + +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index_files/XRegExp.js.download b/docs/index_files/XRegExp.js.download new file mode 100644 index 0000000..c22fa76 --- /dev/null +++ b/docs/index_files/XRegExp.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/SyntaxHighlighter/scripts/XRegExp.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-alert.js.download b/docs/index_files/bootstrap-alert.js.download new file mode 100644 index 0000000..f9cf9c8 --- /dev/null +++ b/docs/index_files/bootstrap-alert.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-alert.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-button.js.download b/docs/index_files/bootstrap-button.js.download new file mode 100644 index 0000000..8336fda --- /dev/null +++ b/docs/index_files/bootstrap-button.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-button.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-carousel.js.download b/docs/index_files/bootstrap-carousel.js.download new file mode 100644 index 0000000..3ddeec3 --- /dev/null +++ b/docs/index_files/bootstrap-carousel.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-carousel.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-collapse.js.download b/docs/index_files/bootstrap-collapse.js.download new file mode 100644 index 0000000..d420e0e --- /dev/null +++ b/docs/index_files/bootstrap-collapse.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-collapse.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-dropdown.js.download b/docs/index_files/bootstrap-dropdown.js.download new file mode 100644 index 0000000..d6829c4 --- /dev/null +++ b/docs/index_files/bootstrap-dropdown.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-dropdown.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-modal.js.download b/docs/index_files/bootstrap-modal.js.download new file mode 100644 index 0000000..22bbb05 --- /dev/null +++ b/docs/index_files/bootstrap-modal.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-modal.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-popover.js.download b/docs/index_files/bootstrap-popover.js.download new file mode 100644 index 0000000..2fe45ba --- /dev/null +++ b/docs/index_files/bootstrap-popover.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-popover.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-responsive.css b/docs/index_files/bootstrap-responsive.css new file mode 100644 index 0000000..06e55c0 --- /dev/null +++ b/docs/index_files/bootstrap-responsive.css @@ -0,0 +1,815 @@ +/*! + * Bootstrap Responsive v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +@media (max-width: 767px) { + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 18px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .modal { + position: absolute; + top: 10px; + right: 10px; + left: 10px; + width: auto; + margin: 0; + } + .modal.fade.in { + top: auto; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + [class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: auto; + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 20px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.762430939%; + *margin-left: 2.709239449638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 99.999999993%; + *width: 99.9468085036383%; + } + .row-fluid .span11 { + width: 91.436464082%; + *width: 91.38327259263829%; + } + .row-fluid .span10 { + width: 82.87292817100001%; + *width: 82.8197366816383%; + } + .row-fluid .span9 { + width: 74.30939226%; + *width: 74.25620077063829%; + } + .row-fluid .span8 { + width: 65.74585634900001%; + *width: 65.6926648596383%; + } + .row-fluid .span7 { + width: 57.182320438000005%; + *width: 57.129128948638304%; + } + .row-fluid .span6 { + width: 48.618784527%; + *width: 48.5655930376383%; + } + .row-fluid .span5 { + width: 40.055248616%; + *width: 40.0020571266383%; + } + .row-fluid .span4 { + width: 31.491712705%; + *width: 31.4385212156383%; + } + .row-fluid .span3 { + width: 22.928176794%; + *width: 22.874985304638297%; + } + .row-fluid .span2 { + width: 14.364640883%; + *width: 14.311449393638298%; + } + .row-fluid .span1 { + width: 5.801104972%; + *width: 5.747913482638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 714px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 652px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 590px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 528px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 466px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 404px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 342px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 280px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 218px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 156px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 94px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 32px; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 30px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.564102564%; + *margin-left: 2.510911074638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145300001%; + *width: 91.3997999636383%; + } + .row-fluid .span10 { + width: 82.905982906%; + *width: 82.8527914166383%; + } + .row-fluid .span9 { + width: 74.358974359%; + *width: 74.30578286963829%; + } + .row-fluid .span8 { + width: 65.81196581200001%; + *width: 65.7587743226383%; + } + .row-fluid .span7 { + width: 57.264957265%; + *width: 57.2117657756383%; + } + .row-fluid .span6 { + width: 48.717948718%; + *width: 48.6647572286383%; + } + .row-fluid .span5 { + width: 40.170940171000005%; + *width: 40.117748681638304%; + } + .row-fluid .span4 { + width: 31.623931624%; + *width: 31.5707401346383%; + } + .row-fluid .span3 { + width: 23.076923077%; + *width: 23.0237315876383%; + } + .row-fluid .span2 { + width: 14.529914530000001%; + *width: 14.4767230406383%; + } + .row-fluid .span1 { + width: 5.982905983%; + *width: 5.929714493638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1160px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1060px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 960px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 860px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 760px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 660px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 560px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 460px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 360px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 260px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 160px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 60px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 18px; + } + .navbar-fixed-bottom { + margin-top: 18px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 9px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #999999; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 6px 15px; + font-weight: bold; + color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #222222; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: block; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 9px 15px; + margin: 9px 0; + border-top: 1px solid #222222; + border-bottom: 1px solid #222222; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/docs/index_files/bootstrap-scrollspy.js.download b/docs/index_files/bootstrap-scrollspy.js.download new file mode 100644 index 0000000..0e0f7eb --- /dev/null +++ b/docs/index_files/bootstrap-scrollspy.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-scrollspy.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-tab.js.download b/docs/index_files/bootstrap-tab.js.download new file mode 100644 index 0000000..b363ad8 --- /dev/null +++ b/docs/index_files/bootstrap-tab.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-tab.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-tooltip.js.download b/docs/index_files/bootstrap-tooltip.js.download new file mode 100644 index 0000000..109bd8f --- /dev/null +++ b/docs/index_files/bootstrap-tooltip.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-tooltip.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-transition.js.download b/docs/index_files/bootstrap-transition.js.download new file mode 100644 index 0000000..3b992f8 --- /dev/null +++ b/docs/index_files/bootstrap-transition.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-transition.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap-typeahead.js.download b/docs/index_files/bootstrap-typeahead.js.download new file mode 100644 index 0000000..182c4fc --- /dev/null +++ b/docs/index_files/bootstrap-typeahead.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/bootstrap-typeahead.js was not found on this server.

+

+ diff --git a/docs/index_files/bootstrap.css b/docs/index_files/bootstrap.css new file mode 100644 index 0000000..bb40c85 --- /dev/null +++ b/docs/index_files/bootstrap.css @@ -0,0 +1,4983 @@ +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} + +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} + +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} + +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} + +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} + +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} + +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} + +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} + +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} + +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} + +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} + +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h3 small { + font-size: 14px; +} + +h4, +h5, +h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, +dd { + line-height: 18px; +} + +dt { + font-weight: bold; + line-height: 17px; +} + +dd { + margin-left: 9px; +} + +.dl-horizontal dt { + float: left; + width: 120px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 130px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} + +input, +textarea { + width: 210px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} + +select { + width: 220px; + border: 1px solid #bbb; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 930px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 850px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 770px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 690px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 610px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 530px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 450px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 370px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 290px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 210px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 130px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 50px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; + border-color: #ddd; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +:-moz-placeholder { + color: #999999; +} + +:-ms-input-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block, +.help-inline { + color: #555555; +} + +.help-block { + display: block; + margin-bottom: 9px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-prepend, +.input-append { + margin-bottom: 5px; +} + +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} + +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend .active, +.input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 9px; +} + +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 160px; +} + +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert-heading { + color: inherit; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 18px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 18px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar { + color: #999999; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .brand { + display: block; + float: left; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #999999; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar .navbar-link { + color: #999999; +} + +.navbar .navbar-link:hover { + color: #ffffff; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #626262; + border: 1px solid #151515; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav > li { + display: block; + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} + +.navbar .btn-group { + padding: 5px 5px 6px; + margin: 0; +} + +.navbar .nav > li > a:hover { + color: #ffffff; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + width: 1px; + height: 40px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-right: 0; + margin-left: 10px; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + background-color: #2c2c2c; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #080808 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} + +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-bottom: 18px; + margin-left: 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .dropdown-menu { + z-index: 2050; +} + +.modal-open .dropdown.open { + *z-index: 2050; +} + +.modal-open .popover { + z-index: 2060; +} + +.modal-open .tooltip { + z-index: 2070; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -ms-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -2px; +} + +.tooltip.right { + margin-left: 2px; +} + +.tooltip.bottom { + margin-top: 2px; +} + +.tooltip.left { + margin-left: -2px; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} + +.popover.top { + margin-top: -5px; +} + +.popover.right { + margin-left: 5px; +} + +.popover.bottom { + margin-top: 5px; +} + +.popover.left { + margin-left: -5px; +} + +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover-inner { + width: 280px; + padding: 3px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} + +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} + +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; +} + +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 18px; + margin-bottom: 18px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + width: 0; + height: 18px; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} + +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); +} + +.progress-warning.progress-striped .bar { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} diff --git a/docs/index_files/ga.js.download b/docs/index_files/ga.js.download new file mode 100644 index 0000000..b670916 --- /dev/null +++ b/docs/index_files/ga.js.download @@ -0,0 +1,77 @@ +(function(){var E;function Aa(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:return!!a;case 3:return 1E3*a}return a}function Ba(a){return"function"==typeof a}function Ca(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")}function F(a,b){return void 0==a||"-"==a&&!b||""==a}function Da(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t".indexOf(a.charAt(0));)a=a.substring(1);for(;a&&-1<" \n\r\t".indexOf(a.charAt(a.length-1));)a=a.substring(0,a.length-1);return a} +function Ea(){return Math.round(2147483647*Math.random())}function Fa(){}function G(a,b){if(encodeURIComponent instanceof Function)return b?encodeURI(a):encodeURIComponent(a);H(68);return escape(a)}function I(a){a=a.split("+").join(" ");if(decodeURIComponent instanceof Function)try{return decodeURIComponent(a)}catch(b){H(17)}else H(68);return unescape(a)}var Ga=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}; +function Ia(a,b){if(a){var c=J.createElement("script");c.type="text/javascript";c.async=!0;c.src=a;c.id=b;var d=J.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);return c}}function K(a){return a&&0a.split("/")[0].indexOf(":")&&(a=k+f[2].substring(0,f[2].lastIndexOf("/"))+ +"/"+a):a=k+f[2]+(a||Be);d.href=a;e=c(d);return{protocol:(d.protocol||"").toLowerCase(),host:e[0],port:e[1],path:e[2],Oa:d.search||"",url:a||""}}function Na(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b).push(c)}for(var d=Da(b).split("&"),e=0;ef?c(d[e],"1"):c(d[e].substring(0,f),d[e].substring(f+1))}} +function Pa(a,b){if(F(a)||"["==a.charAt(0)&&"]"==a.charAt(a.length-1))return"-";var c=J.domain;return a.indexOf(c+(b&&"/"!=b?b:""))==(0==a.indexOf("http://")?7:0==a.indexOf("https://")?8:0)?"0":a};var Qa=0;function Ra(a,b,c){1<=Qa||1<=100*Math.random()||ld()||(a=["utmt=error","utmerr="+a,"utmwv=5.6.7","utmn="+Ea(),"utmsp=1"],b&&a.push("api="+b),c&&a.push("msg="+G(c.substring(0,100))),M.w&&a.push("aip=1"),Sa(a.join("&")),Qa++)};var Ta=0,Ua={};function N(a){return Va("x"+Ta++,a)}function Va(a,b){Ua[a]=!!b;return a} +var Wa=N(),Xa=Va("anonymizeIp"),Ya=N(),$a=N(),ab=N(),bb=N(),O=N(),P=N(),cb=N(),db=N(),eb=N(),fb=N(),gb=N(),hb=N(),ib=N(),jb=N(),kb=N(),lb=N(),nb=N(),ob=N(),pb=N(),qb=N(),rb=N(),sb=N(),tb=N(),ub=N(),vb=N(),wb=N(),xb=N(),yb=N(),zb=N(),Ab=N(),Bb=N(),Cb=N(),Db=N(),Eb=N(),Fb=N(!0),Gb=Va("currencyCode"),Hb=Va("page"),Ib=Va("title"),Jb=N(),Kb=N(),Lb=N(),Mb=N(),Nb=N(),Ob=N(),Pb=N(),Qb=N(),Rb=N(),Q=N(!0),Sb=N(!0),Tb=N(!0),Ub=N(!0),Vb=N(!0),Wb=N(!0),Zb=N(!0),$b=N(!0),ac=N(!0),bc=N(!0),cc=N(!0),R=N(!0),dc=N(!0), +ec=N(!0),fc=N(!0),gc=N(!0),hc=N(!0),ic=N(!0),jc=N(!0),S=N(!0),kc=N(!0),lc=N(!0),mc=N(!0),nc=N(!0),oc=N(!0),pc=N(!0),qc=N(!0),rc=Va("campaignParams"),sc=N(),tc=Va("hitCallback"),uc=N();N();var vc=N(),wc=N(),xc=N(),yc=N(),zc=N(),Ac=N(),Bc=N(),Cc=N(),Dc=N(),Ec=N(),Fc=N(),Gc=N(),Hc=N(),Ic=N();N();var Mc=N(),Nc=N(),Yb=N(),Jc=N(),Kc=N(),Lc=Va("utmtCookieName"),Cd=Va("displayFeatures"),Oc=N(),of=Va("gtmid"),Oe=Va("uaName"),Pe=Va("uaDomain"),Qe=Va("uaPath"),pf=Va("linkid");var Re=function(){function a(a,c,d){T(qf.prototype,a,c,d)}a("_createTracker",qf.prototype.hb,55);a("_getTracker",qf.prototype.oa,0);a("_getTrackerByName",qf.prototype.u,51);a("_getTrackers",qf.prototype.pa,130);a("_anonymizeIp",qf.prototype.aa,16);a("_forceSSL",qf.prototype.la,125);a("_getPlugin",Pc,120)},Se=function(){function a(a,c,d){T(U.prototype,a,c,d)}Qc("_getName",$a,58);Qc("_getAccount",Wa,64);Qc("_visitCode",Q,54);Qc("_getClientInfo",ib,53,1);Qc("_getDetectTitle",lb,56,1);Qc("_getDetectFlash", +jb,65,1);Qc("_getLocalGifPath",wb,57);Qc("_getServiceMode",xb,59);V("_setClientInfo",ib,66,2);V("_setAccount",Wa,3);V("_setNamespace",Ya,48);V("_setAllowLinker",fb,11,2);V("_setDetectFlash",jb,61,2);V("_setDetectTitle",lb,62,2);V("_setLocalGifPath",wb,46,0);V("_setLocalServerMode",xb,92,void 0,0);V("_setRemoteServerMode",xb,63,void 0,1);V("_setLocalRemoteServerMode",xb,47,void 0,2);V("_setSampleRate",vb,45,1);V("_setCampaignTrack",kb,36,2);V("_setAllowAnchor",gb,7,2);V("_setCampNameKey",ob,41);V("_setCampContentKey", +tb,38);V("_setCampIdKey",nb,39);V("_setCampMediumKey",rb,40);V("_setCampNOKey",ub,42);V("_setCampSourceKey",qb,43);V("_setCampTermKey",sb,44);V("_setCampCIdKey",pb,37);V("_setCookiePath",P,9,0);V("_setMaxCustomVariables",yb,0,1);V("_setVisitorCookieTimeout",cb,28,1);V("_setSessionCookieTimeout",db,26,1);V("_setCampaignCookieTimeout",eb,29,1);V("_setReferrerOverride",Jb,49);V("_setSiteSpeedSampleRate",Dc,132);a("_trackPageview",U.prototype.Fa,1);a("_trackEvent",U.prototype.F,4);a("_trackPageLoadTime", +U.prototype.Ea,100);a("_trackSocial",U.prototype.Ga,104);a("_trackTrans",U.prototype.Ia,18);a("_sendXEvent",U.prototype.ib,78);a("_createEventTracker",U.prototype.ia,74);a("_getVersion",U.prototype.qa,60);a("_setDomainName",U.prototype.B,6);a("_setAllowHash",U.prototype.va,8);a("_getLinkerUrl",U.prototype.na,52);a("_link",U.prototype.link,101);a("_linkByPost",U.prototype.ua,102);a("_setTrans",U.prototype.za,20);a("_addTrans",U.prototype.$,21);a("_addItem",U.prototype.Y,19);a("_clearTrans",U.prototype.ea, +105);a("_setTransactionDelim",U.prototype.Aa,82);a("_setCustomVar",U.prototype.wa,10);a("_deleteCustomVar",U.prototype.ka,35);a("_getVisitorCustomVar",U.prototype.ra,50);a("_setXKey",U.prototype.Ca,83);a("_setXValue",U.prototype.Da,84);a("_getXKey",U.prototype.sa,76);a("_getXValue",U.prototype.ta,77);a("_clearXKey",U.prototype.fa,72);a("_clearXValue",U.prototype.ga,73);a("_createXObj",U.prototype.ja,75);a("_addIgnoredOrganic",U.prototype.W,15);a("_clearIgnoredOrganic",U.prototype.ba,97);a("_addIgnoredRef", +U.prototype.X,31);a("_clearIgnoredRef",U.prototype.ca,32);a("_addOrganic",U.prototype.Z,14);a("_clearOrganic",U.prototype.da,70);a("_cookiePathCopy",U.prototype.ha,30);a("_get",U.prototype.ma,106);a("_set",U.prototype.xa,107);a("_addEventListener",U.prototype.addEventListener,108);a("_removeEventListener",U.prototype.removeEventListener,109);a("_addDevId",U.prototype.V);a("_getPlugin",Pc,122);a("_setPageGroup",U.prototype.ya,126);a("_trackTiming",U.prototype.Ha,124);a("_initData",U.prototype.initData, +2);a("_setVar",U.prototype.Ba,22);V("_setSessionTimeout",db,27,3);V("_setCookieTimeout",eb,25,3);V("_setCookiePersistence",cb,24,1);a("_setAutoTrackOutbound",Fa,79);a("_setTrackOutboundSubdomains",Fa,81);a("_setHrefExamineLimit",Fa,80)};function Pc(a){var b=this.plugins_;if(b)return b.get(a)} +var T=function(a,b,c,d){a[b]=function(){try{return void 0!=d&&H(d),c.apply(this,arguments)}catch(a){throw Ra("exc",b,a&&a.name),a;}}},Qc=function(a,b,c,d){U.prototype[a]=function(){try{return H(c),Aa(this.a.get(b),d)}catch(e){throw Ra("exc",a,e&&e.name),e;}}},V=function(a,b,c,d,e){U.prototype[a]=function(f){try{H(c),void 0==e?this.a.set(b,Aa(f,d)):this.a.set(b,e)}catch(Be){throw Ra("exc",a,Be&&Be.name),Be;}}},Te=function(a,b){return{type:b,target:a,stopPropagation:function(){throw"aborted";}}};var Rc=new RegExp(/(^|\.)doubleclick\.net$/i),Sc=function(a,b){return Rc.test(J.location.hostname)?!0:"/"!==b?!1:0!=a.indexOf("www.google.")&&0!=a.indexOf(".google.")&&0!=a.indexOf("google.")||-1b.length||ad(b[0],c))return!1;b=b.slice(1).join(".").split("|"); +0=b.length)return!0;b=b[1].split(-1==b[1].indexOf(",")?"^":",");for(c=0;cb.length||ad(b[0],c))return a.set(ec,void 0),a.set(fc,void 0),a.set(gc,void 0),a.set(ic,void 0),a.set(jc,void 0),a.set(nc,void 0),a.set(oc,void 0),a.set(pc,void 0),a.set(qc,void 0),a.set(S,void 0),a.set(kc,void 0),a.set(lc,void 0),a.set(mc,void 0),!1;a.set(ec,1*b[1]);a.set(fc,1*b[2]);a.set(gc,1*b[3]); +Ve(a,b.slice(4).join("."));return!0},Ve=function(a,b){function c(a){return(a=b.match(a+"=(.*?)(?:\\|utm|$)"))&&2==a.length?a[1]:void 0}function d(b,c){c?(c=e?I(c):c.split("%20").join(" "),a.set(b,c)):a.set(b,void 0)}-1==b.indexOf("=")&&(b=I(b));var e="2"==c("utmcvr");d(ic,c("utmcid"));d(jc,c("utmccn"));d(nc,c("utmcsr"));d(oc,c("utmcmd"));d(pc,c("utmctr"));d(qc,c("utmcct"));d(S,c("utmgclid"));d(kc,c("utmgclsrc"));d(lc,c("utmdclid"));d(mc,c("utmdsid"))},ad=function(a,b){return b?a!=b:!/^\d+$/.test(a)};var Uc=function(){this.filters=[]};Uc.prototype.add=function(a,b){this.filters.push({name:a,s:b})};Uc.prototype.cb=function(a){try{for(var b=0;b=100*a.get(vb)&&a.stopPropagation()}function kd(a){ld(a.get(Wa))&&a.stopPropagation()}function md(a){"file:"==J.location.protocol&&a.stopPropagation()}function Ge(a){He()&&a.stopPropagation()} +function nd(a){a.get(Ib)||a.set(Ib,J.title,!0);a.get(Hb)||a.set(Hb,J.location.pathname+J.location.search,!0)}function lf(a){a.get(Wa)&&"UA-XXXXX-X"!=a.get(Wa)||a.stopPropagation()};var od=new function(){var a=[];this.set=function(b){a[b]=!0};this.encode=function(){for(var b=[],c=0;c=b[0]||0>=b[1]?"":b.join("x");a.Wa=d}catch(k){H(135)}qd=a}},td=function(){sd();for(var a=qd,b=W.navigator,a=b.appName+b.version+a.language+b.platform+b.userAgent+a.javaEnabled+a.jb+a.P+(J.cookie?J.cookie:"")+(J.referrer?J.referrer:""),b=a.length,c=W.history.length;0d?(this.i=b.substring(0,d),this.l=b.substring(d+1,c),this.h=b.substring(c+1)):(this.i=b.substring(0,d),this.h=b.substring(d+1));this.Xa=a.slice(1);this.Ma=!this.l&&"_require"==this.h;this.J=!this.i&&!this.l&&"_provide"==this.h}},Y=function(){T(Y.prototype, +"push",Y.prototype.push,5);T(Y.prototype,"_getPlugin",Pc,121);T(Y.prototype,"_createAsyncTracker",Y.prototype.Sa,33);T(Y.prototype,"_getAsyncTracker",Y.prototype.Ta,34);this.I=new nf;this.eb=[]};E=Y.prototype;E.Na=function(a,b,c){var d=this.I.get(a);if(!Ba(d))return!1;b.plugins_=b.plugins_||new nf;b.plugins_.set(a,new d(b,c||{}));return!0};E.push=function(a){var b=Z.Va.apply(this,arguments),b=Z.eb.concat(b);for(Z.eb=[];0e?b+"#"+d:b+"&"+d;c="";f=b.indexOf("?");0f?b+"?"+d+c:b+"&"+d+c},$d=function(a,b,c,d){for(var e=0;3>e;e++){for(var f= +0;3>f;f++){if(d==Yc(a+b+c))return H(127),[b,c];var Be=b.replace(/ /g,"%20"),k=c.replace(/ /g,"%20");if(d==Yc(a+Be+k))return H(128),[Be,k];Be=Be.replace(/\+/g,"%20");k=k.replace(/\+/g,"%20");if(d==Yc(a+Be+k))return H(129),[Be,k];try{var Ja=b.match("utmctr=(.*?)(?:\\|utm|$)");if(Ja&&2==Ja.length&&(Be=b.replace(Ja[1],G(I(Ja[1]))),d==Yc(a+Be+c)))return H(139),[Be,c]}catch(t){}b=I(b)}c=I(c)}};var de="|",fe=function(a,b,c,d,e,f,Be,k,Ja){var t=ee(a,b);t||(t={},a.get(Cb).push(t));t.id_=b;t.affiliation_=c;t.total_=d;t.tax_=e;t.shipping_=f;t.city_=Be;t.state_=k;t.country_=Ja;t.items_=t.items_||[];return t},ge=function(a,b,c,d,e,f,Be){a=ee(a,b)||fe(a,b,"",0,0,0,"","","");var k;a:{if(a&&a.items_){k=a.items_;for(var Ja=0;Jab.length||!/^\d+$/.test(b[0])||(b[0]=""+c,Fd(a,"__utmx",b.join("."),void 0))},be=function(a,b){var c=$c(a.get(O),pd("__utmx"));"-"==c&&(c="");return b?G(c):c},Ye=function(a){try{var b=La(J.location.href,!1),c=decodeURIComponent(L(b.R.get("utm_referrer")))||"";c&&a.set(Jb,c);var d=decodeURIComponent(K(b.R.get("utm_expid")))||"";d&&(d=d.split(".")[0],a.set(Oc,""+d))}catch(e){H(146)}},l=function(a){var b=W.gaData&&W.gaData.expId;b&&a.set(Oc, +""+b)};var ke=function(a,b){var c=Math.min(a.b(Dc,0),100);if(a.b(Q,0)%100>=c)return!1;c=Ze()||$e();if(void 0==c)return!1;var d=c[0];if(void 0==d||Infinity==d||isNaN(d))return!1;0a[b])return!1;return!0},le=function(a){return isNaN(a)||0>a?0:5E3>a?10*Math.floor(a/10):5E4>a?100*Math.floor(a/100):41E5>a?1E3*Math.floor(a/1E3):41E5},je=function(a){for(var b=new yd,c=0;cc.length)){for(var d=[],e=0;e=f)return!1;c=1*(""+c);if(""==a||!wd(a)||""==b||!wd(b)||!xd(c)||isNaN(c)||0>c||0>f||100=a||a>e.get(yb))a=!1;else if(!b||!c||128=a&&Ca(b)&&""!=b){var c=this.get(Fc)||[];c[a]=b;this.set(Fc,c)}};E.V=function(a){a=""+a;if(a.match(/^[A-Za-z0-9]{1,5}$/)){var b=this.get(Ic)||[];b.push(a);this.set(Ic,b)}};E.initData=function(){this.a.load()}; +E.Ba=function(a){a&&""!=a&&(this.set(Tb,a),this.a.j("var"))};var ne=function(a){"trans"!==a.get(sc)&&500<=a.b(cc,0)&&a.stopPropagation();if("event"===a.get(sc)){var b=(new Date).getTime(),c=a.b(dc,0),d=a.b(Zb,0),c=Math.floor((b-(c!=d?c:1E3*c))/1E3*1);0=a.b(R,0)&&a.stopPropagation()}},pe=function(a){"event"===a.get(sc)&&a.set(R,Math.max(0,a.b(R,10)-1))};var qe=function(){var a=[];this.add=function(b,c,d){d&&(c=G(""+c));a.push(b+"="+c)};this.toString=function(){return a.join("&")}},re=function(a,b){(b||2!=a.get(xb))&&a.Za(cc)},se=function(a,b){b.add("utmwv","5.6.7");b.add("utms",a.get(cc));b.add("utmn",Ea());var c=J.location.hostname;F(c)||b.add("utmhn",c,!0);c=a.get(vb);100!=c&&b.add("utmsp",c,!0)},te=function(a,b){b.add("utmht",(new Date).getTime());b.add("utmac",Da(a.get(Wa)));a.get(Oc)&&b.add("utmxkey",a.get(Oc),!0);a.get(vc)&&b.add("utmni",1); +a.get(of)&&b.add("utmgtm",a.get(of),!0);var c=a.get(Ic);c&&0=a.length)gf(a,b,c);else if(8192>=a.length){if(0<=W.navigator.userAgent.indexOf("Firefox")&&![].reduce)throw new De(a.length);df(a,b)||ef(a,b)||Ee(a,b)||b()}else throw new Ce(a.length);},gf=function(a,b,c){c=c||Ne()+"/__utm.gif?"; +var d=new Image(1,1);d.src=c+a;d.onload=function(){d.onload=null;d.onerror=null;b()};d.onerror=function(){d.onload=null;d.onerror=null;b()}},ef=function(a,b){if(0!=Ne().indexOf(J.location.protocol))return!1;var c;c=W.XDomainRequest;if(!c)return!1;c=new c;c.open("POST",Ne()+"/p/__utm.gif");c.onerror=function(){b()};c.onload=b;c.send(a);return!0},df=function(a,b){var c=W.XMLHttpRequest;if(!c)return!1;var d=new c;if(!("withCredentials"in d))return!1;d.open("POST",Ne()+"/p/__utm.gif",!0);d.withCredentials= +!0;d.setRequestHeader("Content-Type","text/plain");d.onreadystatechange=function(){4==d.readyState&&(b(),d=null)};d.send(a);return!0},Ee=function(a,b){if(!J.body)return We(function(){Ee(a,b)},100),!0;a=encodeURIComponent(a);try{var c=J.createElement('')}catch(d){c=J.createElement("iframe"),c.name=a}c.height="0";c.width="0";c.style.display="none";c.style.visibility="hidden";var e=Ne()+"/u/post_iframe.html";Ga(W,"beforeunload",function(){c.src="";c.parentNode&&c.parentNode.removeChild(c)}); +setTimeout(b,1E3);J.body.appendChild(c);c.src=e;return!0};var qf=function(){this.G=this.w=!1;0==Ea()%1E4&&(H(142),this.G=!0);this.C={};this.D=[];this.U=0;this.S=[["www.google-analytics.com","","/plugins/"]];this._gasoCPath=this._gasoDomain=this.bb=void 0;Re();Se()};E=qf.prototype;E.oa=function(a,b){return this.hb(a,void 0,b)};E.hb=function(a,b,c){b&&H(23);c&&H(67);void 0==b&&(b="~"+M.U++);a=new U(b,a,c);M.C[b]=a;M.D.push(a);return a};E.u=function(a){a=a||"";return M.C[a]||M.hb(void 0,a)};E.pa=function(){return M.D.slice(0)};E.ab=function(){return M.D.length}; +E.aa=function(){this.w=!0};E.la=function(){this.G=!0};var Fe=function(a){if("prerender"==J.visibilityState)return!1;a();return!0};var M=new qf;var Ha=W._gat;Ha&&Ba(Ha._getTracker)?M=Ha:W._gat=M;var Z=new Y;(function(a){if(!Fe(a)){H(123);var b=!1,c=function(){if(!b&&Fe(a)){b=!0;var d=J,e=c;d.removeEventListener?d.removeEventListener("visibilitychange",e,!1):d.detachEvent&&d.detachEvent("onvisibilitychange",e)}};Ga(J,"visibilitychange",c)}})(function(){var a=W._gaq,b=!1;if(a&&Ba(a.push)&&(b="[object Array]"==Object.prototype.toString.call(Object(a)),!b)){Z=a;return}W._gaq=Z;b&&Z.push.apply(Z,a)});function Yc(a){var b=1,c=0,d;if(a)for(b=0,d=a.length-1;0<=d;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=0!=c?b^c>>21:b;return b};})(); diff --git a/docs/index_files/jquery.js.download b/docs/index_files/jquery.js.download new file mode 100644 index 0000000..d55db4b --- /dev/null +++ b/docs/index_files/jquery.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/jquery.js was not found on this server.

+

+ diff --git a/docs/index_files/saved_resource(1).html b/docs/index_files/saved_resource(1).html new file mode 100644 index 0000000..cb7eda5 --- /dev/null +++ b/docs/index_files/saved_resource(1).html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docs/index_files/saved_resource.html b/docs/index_files/saved_resource.html new file mode 100644 index 0000000..c837b3c --- /dev/null +++ b/docs/index_files/saved_resource.html @@ -0,0 +1,1591 @@ + + +
+ +
+ + +

Tweets

+ + + + + +
+ + +
+ + +
+ +
    + + +
  1. + + +
    +
    + + + + + +

    Good grief. Just tuned into Judge Gorsuch hearings and the question was : would you rather fight 100 duck size horses or 1 horse size duck?

    + + + + + + +
    + +
  2. + + + +
  3. + + +
    +
    + + + + + +

    This seems pretty cool. A digital take anywhere library. http://buff.ly/2nd9ydG 

    + +
    + +
    + + + + + + + +
    +
    + + + + + + +
    + + + + + +
    + +
  4. + + + +
  5. + + +
    +
    + + + + + +

    + +
    + + + +
    +
    + +
    +
    + View image on Twitter +
    +
    +
    + +
    + + + + +
    + + + + + +
    + +
  6. + + + +
  7. + + +
    +
    + + + + + +

    Word

    + +
    + + + +
    +
    + +
    +
    + View image on Twitter +
    +
    +
    + +
    + + + + +
    + + + + + +
    + +
  8. + + + +
  9. + + +
    +
    + + + + + +

    Something to remember when you run up against the mental obstacles that keep you from from telling a good story with your life.

    + +
    + + + +
    +
    + +
    +
    + View image on Twitter +
    +
    +
    + +
    + + + + +
    + + + + + +
    + +
  10. + + + +
  11. + + +
    +
    + + + + + +

    This is one of the saddest things I've read. And that's in 2017 so that's saying a lot. http://buff.ly/2mMH4oB 

    + + + + + + +
    + +
  12. + + + +
  13. + + +
    +
    + + + + + +

    Welcome to spring traffic in Seattle. Actually never mind, traffic so bad can't get to Seattle.

    + + + + + + +
    + +
  14. + + + +
  15. + + +
    +
    + + + + + +

    I just lost on CloseTheBox for iOS! The probability is so low... will you close the box? http://itunes.com/app/closethebox 

    + + + + + + +
    + +
  16. + + + +
  17. + + +
    +
    + + + + + +

    This is a protest I can get behind.

    + +
    + + + +
    +
    + +
    +
    + View image on Twitter +
    +
    +
    + +
    + + + + +
    + + + + + +
    + +
  18. + + + +
  19. + + +
    +
    + + + + + +

    Those that live in glass houses, and get in water ballon fights, can't tell which sides of the windows are wet.

    + + + + + + +
    + +
  20. + + + +
  21. + + +
    +
    + + + + + +

    World ends today at 5:30. We'll have more at 11.

    + +
    + + + +
    +
    + +
    +
    + View image on Twitter +
    +
    +
    + +
    + + + + +
    + + + + + +
    + +
  22. + + + +
  23. + + +
    +
    + + + + + +

    Conversations in Seattle: +-I'm busy. +-I'm busy too! +-I'm committed to more unfulfilling activities at opposite ends of the city than you!

    + + + + + + +
    + +
  24. + + + +
  25. + + +
    +
    + + + + + +

    Shut the Box - a brown bag game review with the kids http://buff.ly/2ld2gmH 

    + + + + + + +
    + +
  26. + + + +
  27. + + +
    +
    + + + + + +

    I believe our political leaders have two kinds of power over us. http://buff.ly/2jPpFOy 

    + +
    + +
    + + + + + + + +
    +
    + + + + + + +
    + + + + + +
    + +
  28. + + + +
  29. + + +
    +
    + + + + + +

    Shut the Box - a brown bag game review with the kids http://buff.ly/2k8VXAe 

    + + + + + + +
    + +
  30. + + + +
  31. + + +
    +
    + + + + + +

    Attention McDonalds: if you are going to serve breakfast all day you should at least start lunch earlier.

    + + + + + + +
    + +
  32. + + + +
  33. + + +
    +
    + +
    +
    + Ian Smith Retweeted +
    + + + + +

    Classic "Risk" strategy: invade Australia first.

    + + + + + + +
    + +
  34. + + + +
  35. + + +
    +
    + + + + + +

    @muzach Yep, they are all using Twilio or something similar to detect answering machines which comes with a delay. They have to cover.

    + + + + + + +
    + +
  36. + + + +
  37. + + +
    +
    + + + + + +

    "Hi, sorry, problem with my headset" - now commonly said telemarketers to explain away the delay between pickup and matching to the rep.

    + + + + + + +
    + +
  38. + + + +
  39. + + +
    +
    + + + + + +

    Today's Children's Museum Fatality Level Is : low

    + + + + + + +
    + +
  40. + + + +
+ +
+ + +
+ +
+
+ + + + +
\ No newline at end of file diff --git a/docs/index_files/shBrushJScript.js.download b/docs/index_files/shBrushJScript.js.download new file mode 100644 index 0000000..0591729 --- /dev/null +++ b/docs/index_files/shBrushJScript.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/SyntaxHighlighter/scripts/shBrushJScript.js was not found on this server.

+

+ diff --git a/docs/index_files/shCore.js.download b/docs/index_files/shCore.js.download new file mode 100644 index 0000000..e0fff3f --- /dev/null +++ b/docs/index_files/shCore.js.download @@ -0,0 +1,10 @@ + + + +404 Not Found + + +

Error: Not Found

+

The requested URL /js/SyntaxHighlighter/scripts/shCore.js was not found on this server.

+

+ diff --git a/docs/index_files/taffydbboxV3.jpg b/docs/index_files/taffydbboxV3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ba603f6d9abad9d33feebc76994addd59c212cb GIT binary patch literal 22686 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 literal 0 HcmV?d00001 diff --git a/docs/index_files/timeline.619317855a58aa2366562a395f9e40ef.js.download b/docs/index_files/timeline.619317855a58aa2366562a395f9e40ef.js.download new file mode 100644 index 0000000..88d3fcc --- /dev/null +++ b/docs/index_files/timeline.619317855a58aa2366562a395f9e40ef.js.download @@ -0,0 +1 @@ +__twttrll([6],{189:function(e,t,i){var r=i(84);e.exports=r.build([i(190),i(194),i(149),i(150),i(100),i(96),i(195),i(196),i(139),i(140),i(135),i(138),i(199),i(200),i(201),i(202),i(204),i(207),i(148),i(208),i(210),i(141),i(142),i(152),i(212)],{pageForAudienceImpression:"timeline",productName:"embeddedtimeline",breakpoints:[330,430,550,660,820,970]})},190:function(e,t,i){function r(e){e.params({dataSource:{required:!0},lang:{required:!0,transform:p.matchLanguage,fallback:"en"},useLegacyDefaults:{required:!0,fallback:!1},width:{validate:m,transform:m},height:{validate:m,transform:m},theme:{fallback:[h(o.val,o,"widgets:theme")],validate:g},tweetLimit:{transform:d.asInt},partner:{fallback:h(o.val,o,"partner")},staticContent:{required:!1,transform:d.asBoolean}}),e.selectors({header:".timeline-Header",footer:".timeline-Footer",viewport:".timeline-Viewport",tweetList:".timeline-TweetList",tweetsInStream:".timeline-Tweet"}),e.around("scribeNamespace",function(e){return u.aug(e(),{page:"timeline"})}),e.around("scribeData",function(e){var t=this.params.dataSource.id;return u.aug(e(),{widget_id:d.isNumber(t)?t:void 0,widget_data_source:t,message:this.params.partner,query:this.el&&this.el.getAttribute("data-search-query"),profile_id:this.el&&this.el.getAttribute("data-profile-id")})}),e.around("widgetDataAttributes",function(e){return u.aug({"widget-id":this.params.dataSource.id,"user-id":this.el&&this.el.getAttribute("data-profile-id"),"search-query":this.el&&this.el.getAttribute("data-search-query")},e())}),e.define("updateViewportHeight",function(){var e,t=this.sandbox,i=this.selectOne("header"),r=this.selectOne("footer"),n=this.selectOne("viewport");return a.read(function(){e=t.height-2*A,e-=i?i.offsetHeight:0,e-=r?r.offsetHeight:0}),a.write(function(){n.style.height=e+"px"})}),e.define("adjustWidgetSize",function(){return this.isFullyExpanded?this.sandbox.matchHeightToContent():this.updateViewportHeight()}),e.define("reconfigureWithServerSideParams",function(e){e=e||{},this.params.linkColor=this.params.linkColor||e.linkColor,this.params.theme=this.params.theme||e.theme||"light",this.params.height=m(this.params.height||e.height),this.isFullyExpanded=this.isStaticTimeline||!this.params.useLegacyDefaults&&!this.params.height,this.isFullyExpanded||this.params.height||(this.params.height=y)}),e.define("scribeImpressionsForInitialTweetSet",function(e){var t=f(this.select("tweetsInStream")),i=Object.keys(t),r=i.length?"results":"no_results",n=this.el.getAttribute("data-collection-id");n&&(i.push(n),t[n]={item_type:w.CUSTOM_TIMELINE}),this.scribe({component:"timeline",element:"initial",action:r},{widget_in_viewport:e,item_ids:i,item_details:t})}),e.override("initialize",function(){this.params.width||(this.params.width=this.params.useLegacyDefaults?I:x),this.isStaticTimeline=this.params.staticContent||this.params.tweetLimit>0}),e.override("hydrate",function(){var e=this;return this.params.dataSource.fetch().then(function(t){e.html=t.html,e.reconfigureWithServerSideParams(t.config),v(e,t,b.INITIAL)})}),e.override("render",function(){var e,t=this;return this.el=this.sandbox.htmlToElement(this.html),this.el?(this.el.lang=this.params.lang,this.isFullyExpanded&&this.sandbox.addRootClass("var-fully-expanded"),this.isStaticTimeline&&this.sandbox.addRootClass("var-static"),e=s.timeline(this.params.lang,this.params.theme),n.all([this.sandbox.appendStyleSheet(e),this.sandbox.styleSelf({display:"inline-block",maxWidth:x,width:this.params.width,minWidth:T,marginTop:0,marginBottom:0})]).then(function(){return t.prepForInsertion(t.el),t.sandbox.injectWidgetEl(t.el)})):n.reject(new Error("unable to render"))}),e.override("show",function(){var e=this.sandbox,t=this;return this.sandbox.makeVisible().then(function(){return e.styleSelf({minHeight:t.isStaticTimeline?void 0:C,height:t.params.height})}).then(function(){return t.adjustWidgetSize()}).then(function(){return a.read(function(){var i=l(e.sandboxEl);t.scribeImpressionsForInitialTweetSet(i)})})}),e.last("resize",function(){return this.adjustWidgetSize()})}var n=i(2),s=i(89),a=i(45),o=i(37),l=i(134),d=i(25),u=i(11),c=i(84),h=i(13),f=i(101),m=i(133),p=i(90),g=i(191),v=i(192),w=i(102),b=i(193),T="180px",x="100%",C="200px",I="520px",y="600px",A=1;e.exports=c.couple(i(98),i(114),r)},191:function(e,t){function i(e){return r.test(e)}var r=/^(dark|light)$/;e.exports=i},192:function(e,t,i){function r(e,t,i){switch(e.cursors=e.cursors||{},e.pollInterval=t.pollInterval,i){case n.INITIAL:e.cursors.min=t.minCursorPosition,e.cursors.max=t.maxCursorPosition;break;case n.NEWER:e.cursors.max=t.maxCursorPosition||e.cursors.max;break;case n.OLDER:e.cursors.min=t.minCursorPosition||e.cursors.min}}var n=i(193);e.exports=r},193:function(e,t){e.exports={INITIAL:1,NEWER:2,OLDER:3}},194:function(e,t,i){function r(e){e.params({chrome:{transform:s,fallback:""}}),e.selectors({streamContainer:".timeline-Viewport",tweetStream:".timeline-TweetList"}),e.before("render",function(){this.params.chrome.transparent&&this.sandbox.addRootClass("var-chromeless"),this.params.chrome.hideBorder&&this.sandbox.addRootClass("var-borderless"),this.params.chrome.hideHeader&&this.sandbox.addRootClass("var-headerless"),this.params.chrome.hideFooter&&this.sandbox.addRootClass("var-footerless")}),e.after("render",function(){if(this.params.chrome.hideScrollBar)return this.hideScrollBar()}),e.after("resize",function(){if(this.params.chrome.hideScrollBar)return this.hideScrollBar()}),e.define("hideScrollBar",function(){var e=this.selectOne("streamContainer"),t=this.selectOne("tweetStream");return n.defer(function(){var i,r;e.style.width="",i=e.offsetWidth-t.offsetWidth,r=e.offsetWidth+i,e.style.width=r+"px"})})}var n=i(45),s=i(155);e.exports=r},195:function(e,t){function i(e){e.params({ariaLive:{fallback:""}}),e.selectors({newTweetsNotifier:".new-tweets-bar"}),e.after("render",function(){var e=this.selectOne("newTweetsNotifier");"assertive"===this.params.ariaLive&&e&&e.setAttribute("aria-live","assertive")})}e.exports=i},196:function(e,t,i){function r(e){e.selectors({fullTimestampToLocalize:".long-permalink time",relativeTimestampToLocalize:".permalink time"}),e.after("prepForInsertion",function(e){var t=o(this.el);t&&(this.select(e,"fullTimestampToLocalize").forEach(function(e){var i=e.getAttribute("datetime"),r=i&&t.localTimeStamp(i);r&&(e.innerHTML=r)}),this.select(e,"relativeTimestampToLocalize").forEach(function(e){var i=e.getAttribute("datetime"),r=i&&t.timeAgo(i);r&&(e.innerHTML=r)}))}),e.define("updateRelativeTimestamps",function(){var e=o(this.el);if(e){var t=this.select("relativeTimestampToLocalize").reduce(function(t,i){var r=i.getAttribute("datetime"),n=r&&e.timeAgo(r);return n&&t.push(function(){i.innerHTML=n}),t},[]);return n.all(t.map(s.write))}}),e.after("render",function(){var e=this;a.setInterval(function(){e.updateRelativeTimestamps()},l)})}var n=i(2),s=i(45),a=i(7),o=i(197),l=6e4;e.exports=r},197:function(e,t,i){function r(e){return new s(n.compact({months:(e.getAttribute("data-dt-months")||"").split("|"),phrases:{AM:e.getAttribute("data-dt-am"),PM:e.getAttribute("data-dt-pm"),now:e.getAttribute("data-dt-now"),s:e.getAttribute("data-dt-s"),m:e.getAttribute("data-dt-m"),h:e.getAttribute("data-dt-h"),second:e.getAttribute("data-dt-second"),seconds:e.getAttribute("data-dt-seconds"),minute:e.getAttribute("data-dt-minute"),minutes:e.getAttribute("data-dt-minutes"),hour:e.getAttribute("data-dt-hour"),hours:e.getAttribute("data-dt-hours")},formats:{full:e.getAttribute("data-dt-full"),abbr:e.getAttribute("data-dt-abbr"),shortdate:e.getAttribute("data-dt-short"),longdate:e.getAttribute("data-dt-long")}}))}var n=i(11),s=i(198);e.exports=r},198:function(e,t){function i(e){return e<10?"0"+e:e}function r(e){function t(e,t){return n&&n[e]&&(e=n[e]),e.replace(/%\{([\w_]+)\}/g,function(e,i){return void 0!==t[i]?t[i]:e})}var n=e&&e.phrases,s=e&&e.months||o,a=e&&e.formats||l;this.timeAgo=function(e){var i,n=r.parseDate(e),o=+new Date,l=o-n;return n?isNaN(l)||l<2*d?t("now"):l1?"seconds":"second")})})):l1?"minutes":"minute")})})):l1?"hours":"hour")})})):l<365*h?t(a.shortdate,{day:n.getDate(),month:t(s[n.getMonth()])}):t(a.longdate,{day:n.getDate(),month:t(s[n.getMonth()]),year:n.getFullYear().toString().slice(2)}):""},this.localTimeStamp=function(e){var n=r.parseDate(e),o=n&&n.getHours();return n?t(a.full,{day:n.getDate(),month:t(s[n.getMonth()]),year:n.getFullYear(),hours24:i(o),hours12:o<13?o?o:"12":o-12,minutes:i(n.getMinutes()),seconds:i(n.getSeconds()),amPm:t(o<12?"AM":"PM")}):""}}var n=/(\d{4})-?(\d{2})-?(\d{2})T(\d{2}):?(\d{2}):?(\d{2})(Z|[\+\-]\d{2}:?\d{2})/,s=/[a-z]{3,4} ([a-z]{3}) (\d{1,2}) (\d{1,2}):(\d{2}):(\d{2}) ([\+\-]\d{2}:?\d{2}) (\d{4})/i,a=/^\d+$/,o=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],l={abbr:"%{number}%{symbol}",shortdate:"%{day} %{month}",longdate:"%{day} %{month} %{year}",full:"%{hours12}:%{minutes} %{amPm} - %{day} %{month} %{year}"},d=1e3,u=60*d,c=60*u,h=24*c,f='%{abbr}';r.parseDate=function(e){var t,i,r=e||"",l=r.toString();return!!(t=function(){var e;return a.test(l)?parseInt(l,10):(e=l.match(s))?Date.UTC(e[7],o.indexOf(e[1]),e[2],e[3],e[4],e[5]):(e=l.match(n))?Date.UTC(e[1],e[2]-1,e[3],e[4],e[5],e[6]):void 0}())&&(i=new Date(t),!isNaN(i.getTime())&&i)},e.exports=r},199:function(e,t,i){function r(e){e.selectors({followButton:".follow-button"}),e.define("handleFollowButtonClick",function(e,t){var i=s.intentForFollowURL(t.href),r=a.asBoolean(t.getAttribute("data-age-gate"));r||n.open(i,this.sandbox.sandboxEl,e)}),e.after("render",function(){this.on("click","followButton",function(e,t){this.handleFollowButtonClick(e,t)})})}var n=i(22),s=i(23),a=i(25);e.exports=r},200:function(e,t,i){function r(e){e.selectors({mediaCard:".MediaCard",mediaCardNsfwDismissalTarget:".MediaCard-dismissNsfw"}),e.define("dismissNsfwWarning",function(e,t){var i=n.closest(this.selectors.mediaCard,t,this.el);i&&s.remove(i,"is-nsfw")}),e.after("render",function(){this.on("click","mediaCardNsfwDismissalTarget",this.dismissNsfwWarning)})}var n=i(21),s=i(20);e.exports=r},201:function(e,t,i){function r(e){function t(e){var t=e.createElement("div");return t.className="MediaCard-mediaAsset",t}function i(e){return c.url(e,m)}e.params({lang:{required:!0,transform:d.matchLanguage,fallback:"en"}}),e.selectors({mediaAsset:".MediaCard-mediaAsset",cardInterstitial:".js-cardPlayerInterstitial",wvpInterstitial:".js-playableMediaInterstitial",tweetIdInfo:".js-tweetIdInfo"}),e.define("replaceInterstitialWithMedia",function(e,t){return f.all([this.restoreLastMediaInterstitial(),u.write(function(){n=e,s=e.parentNode,e.parentNode.replaceChild(t,e)})])}),e.define("restoreLastMediaInterstitial",function(){var e;return n&&s?(e=s.firstElementChild,h.remove(e),u.write(function(){s.replaceChild(n,e)})):f.resolve()}),e.define("displayWebVideoPlayerMediaAsset",function(e,i){var r=l.closest(this.selectors.mediaAsset,i,this.el),n=l.closest(this.selectors.tweetIdInfo,i,this.el),s=n.getAttribute("data-tweet-id"),a=(this.scribeNamespace()||{}).page,o=(this.scribeData()||{}).widget_origin,d=this.params.lang,u=t(this.sandbox),c=this.sandbox.createElement("div"),m={widgetOrigin:o};return s?(e.preventDefault(),c.className="wvp-player-container",u.appendChild(c),this.replaceInterstitialWithMedia(r,u).then(function(){return h.insertForTweet(u,s,a,d,m)}).then(function(e){e&&e.on("ready",e.play)})):f.reject(new Error("No Tweet ID for player"))}),e.define("displayIframeMediaAsset",function(e,r){var n,s,d=l.closest(this.selectors.mediaAsset,r,this.el),c=l.closest(this.selectors.cardInterstitial,r,this.el),h=c.getAttribute("data-player-src"),m=c.getAttribute("data-player-width"),g=c.getAttribute("data-player-height"),v=c.getAttribute("data-player-title");return h?(e.preventDefault(),h=i(h),n=t(this.sandbox),s=o({src:h,allowfullscreen:"true",width:m,height:g,title:v||""}),s.className="FilledIframe",n.appendChild(s),this.replaceInterstitialWithMedia(d,n).then(function(){s.focus(),u.write(function(){a.add(n,p),a.add(s,p)})})):f.reject(new Error("No Player frame source"))}),e.after("render",function(){this.on("click","cardInterstitial",this.displayIframeMediaAsset),this.on("click","wvpInterstitial",this.displayWebVideoPlayerMediaAsset)})}var n,s,a=i(20),o=i(52),l=i(21),d=i(90),u=i(45),c=i(24),h=i(144),f=i(2),m={autoplay:"1"},p="js-forceRedraw";e.exports=r},202:function(e,t,i){function r(e){e.override("resizeSandboxDueToCardChange",function(){return this.isFullyExpanded?this.sandbox.matchHeightToContent():n.resolve()})}var n=i(2),s=i(84);e.exports=s.couple(i(203),r)},203:function(e,t,i){function r(e){for(var t="",i=Math.floor(e/h),r=i;r>0;r--)t+="w"+r*h+" ";return t}function n(e){e.selectors({prerenderedCard:".PrerenderedCard",periscopeVideo:".PlayerCard--video",rootCardEl:".TwitterCard .CardContent > *:first-child"}),e.define("scribeCardShown",function(e){var t=2;this.scribe({component:"card",action:"shown"},{items:[{card_name:e.getAttribute("data-card-name")}]},t)}),e.define("resizeSandboxDueToCardChange",function(){return this.sandbox.matchHeightToContent()}),e.define("markCardElAsLoaded",function(e){function t(){r&&i.resizeSandboxDueToCardChange()}var i=this,r=!1;return this.select(e,"img").forEach(function(e){e.addEventListener("load",t,!1)}),this.scribeCardShown(e),a.write(function(){s.add(e,p)}).then(function(){r=!0,i.resizeSandboxDueToCardChange()})}),e.define("updateCardWidthConstraints",function(){var e=this;return d.all(this.select("prerenderedCard").map(function(t){var i=e.selectOne(t,"rootCardEl");return a.defer(function(){var e,n=0;l.ios()?(s.remove(t,g),n=o(t.parentElement).width,t.style.maxWidth=n+"px"):n=o(t.parentElement).width,e=r(n),i.setAttribute(f,e),s.add(t,g)}).then(function(){return e.resizeSandboxDueToCardChange()})}))}),e.define("setCardTheme",function(e){var t=this.selectOne(e,"rootCardEl");this.params.theme&&t.setAttribute(m,this.params.theme)}),e.after("prepForInsertion",function(e){var t=this,i=this.select(e,"prerenderedCard").reduce(function(e,t){var i=t.getAttribute("data-css");return i&&(e[i]=e[i]||[],e[i].push(t)),e},{});u.forIn(i,function(e,i){t.sandbox.prependStyleSheet(e).then(function(){i.forEach(function(e){t.setCardTheme(e),t.markCardElAsLoaded(e)})})})}),e.after("show",function(){var e;return l.anyIE()&&(e=this.selectOne("periscopeVideo"),e&&(e.style.display="none")),this.updateCardWidthConstraints()}),e.after("resize",function(){return this.updateCardWidthConstraints()})}var s=i(20),a=i(45),o=i(69),l=i(8),d=i(2),u=i(11),c=i(84),h=50,f="data-card-breakpoints",m="data-theme",p="is-loaded",g="is-constrainedByMaxWidth";e.exports=c.couple(i(98),n)},204:function(e,t,i){function r(e,t,i){var r={};return e=e||{},i&&e.max?r.minPosition=e.max:!i&&e.min?r.maxPosition=e.min:i?r.sinceId=t:r.maxId=t,r}function n(e){e.params({dataSource:{required:!0},isPreviewTimeline:{required:!1,fallback:!1}}),e.selectors({timelineTweet:".timeline-Tweet",viewport:".timeline-Viewport",tweetList:".timeline-TweetList",tweetsInStream:".timeline-Tweet",newTweetsNotifier:".new-tweets-bar",loadMore:".timeline-LoadMore",loadMoreButton:".timeline-LoadMore-prompt"}),e.define("gcTweetsSync",function(){var e="custom"===this.el.getAttribute("data-timeline-type"),t=this.selectOne("tweetList");return e?a.resolve():void m(t,b)}),e.define("scribeImpressionsForDynamicTweetSet",function(e,t){var i=c.toRealArray(e.querySelectorAll(this.selectors.timelineTweet)),r=f(i),n=Object.keys(r),s=t?"newer":"older",a=t?v.CLIENT_SIDE_APP:v.CLIENT_SIDE_USER;this.scribe({component:"timeline",element:s,action:"results"},{item_ids:n,item_details:r,event_initiator:a})}),e.define("fetchTweets",function(e,t){function i(e){return"404"===e?s.pollInterval=null:"503"===e&&(s.pollInterval*=1.5),a.reject(e)}function n(i){var r,n,a=s.sandbox.createFragment(),o=s.sandbox.createElement("ol"),l=t?w.NEWER:w.OLDER;return p(s,i,l),o.innerHTML=i.html,r=o.firstElementChild,r&&(n=s.selectOne(r,"timelineTweet")),n&&"LI"===r.tagName?(n.getAttribute("data-tweet-id")===e&&o.removeChild(r),s.scribeImpressionsForDynamicTweetSet(o,t),s.prepForInsertion(o),c.toRealArray(o.children).forEach(function(e){a.appendChild(e)}),a):a}var s=this,o=r(this.cursors,e,t);return this.params.dataSource.poll(o,t).then(n,i)}),e.define("loadOldTweets",function(){var e=this,t=this.selectLast("tweetsInStream"),i=t&&t.getAttribute("data-tweet-id");return i?this.fetchTweets(i,!1).then(function(t){var i=e.selectOne("tweetList"),r=e.selectOne("loadMore");return l.write(function(){t.childNodes.length>0?i.appendChild(t):o.add(r,C)})}):a.reject(new Error("unable to load more"))}),e.after("loadOldTweets",function(){return g.trigger("timelineUpdated",{target:this.sandbox.sandboxEl,region:"older"}),this.resize()}),e.define("loadNewTweets",function(){var e=this,t=this.selectOne("tweetsInStream"),i=t&&t.getAttribute("data-tweet-id");return i?this.fetchTweets(i,!0).then(function(t){var i,r,n=e.selectOne("viewport"),s=e.selectOne("tweetList");if(0!==t.childNodes.length)return l.read(function(){i=n.scrollTop,r=n.scrollHeight}),l.defer(function(){var a;s.insertBefore(t,s.firstElementChild),a=i+n.scrollHeight-r,i>40||e.mouseIsOverWidget?(n.scrollTop=a,e.showNewTweetsNotifier()):(n.scrollTop=0,e.gcTweetsSync())})}):a.reject(new Error("unable to load new tweets"))}),e.after("loadNewTweets",function(){return g.trigger("timelineUpdated",{target:this.sandbox.sandboxEl,region:"newer"}),this.resize()}),e.define("showNewTweetsNotifier",function(){var e=this,t=this.selectOne("newTweetsNotifier"),i=t&&t.firstElementChild;return d.setTimeout(function(){e.hideNewTweetsNotifier()},T),l.write(function(){t.removeChild(i),t.appendChild(i),o.add(t,"is-displayed")}),l.defer(function(){o.add(t,"is-opaque")})}),e.define("hideNewTweetsNotifier",function(e){var t=new s,i=this.selectOne("newTweetsNotifier");return e=e||{},!e.force&&this.mouseIsOverNewTweetsNotifier?(t.resolve(),t.promise):(l.write(function(){o.remove(i,"is-opaque")}),d.setTimeout(function(){l.write(function(){o.remove(i,"is-displayed")}).then(t.resolve,t.reject)},x),t.promise)}),e.define("scrollToTopOfViewport",function(){var e=this.selectOne("viewport");return l.write(function(){e.scrollTop=0,e.focus()})}),e.define("schedulePolling",function(){function e(){i.isPollInProgress=!1}function t(){var n=r||i.pollInterval;n&&d.setTimeout(function(){i.isPollInProgress||(i.isPollInProgress=!0,i.loadNewTweets(i.sandbox).then(e,e)),t()},n)}var i=this,r=u.get("timeline.pollInterval");t()}),e.after("initialize",function(){this.isPollInProgress=!1,this.mouseIsOverWidget=!1,this.mouseIsOverNewTweetsNotifier=!1,this.cursors={},this.pollInterval=1e4}),e.after("render",function(){this.isStaticTimeline||this.params.isPreviewTimeline||(this.select("timelineTweet").length>0&&this.schedulePolling(),this.on("mouseover",function(){this.mouseIsOverWidget=!0}),this.on("mouseout",function(){this.mouseIsOverWidget=!1}),this.on("mouseover","newTweetsNotifier",function(){this.mouseIsOverNewTweetsNotifier=!0}),this.on("mouseout","newTweetsNotifier",function(){this.mouseIsOverNewTweetsNotifier=!1}),this.on("click","newTweetsNotifier",function(){this.scrollToTopOfViewport(),this.hideNewTweetsNotifier({force:!0})}),this.on("click","loadMoreButton",function(){this.loadOldTweets()}))})}var s=i(1),a=i(2),o=i(20),l=i(45),d=i(7),u=i(16),c=i(11),h=i(84),f=i(101),m=i(205),p=i(192),g=i(29),v=i(206),w=i(193),b=50,T=5e3,x=500,C="is-atEndOfTimeline";e.exports=h.couple(i(98),n)},205:function(e,t){function i(e,t){var i;if(e)for(;i=e.children[t];)e.removeChild(i)}e.exports=i},206:function(e,t){e.exports={CLIENT_SIDE_USER:0,CLIENT_SIDE_APP:2}},207:function(e,t,i){function r(e){e.selectors({shareMenuOpener:".js-showShareMenu",shareMenu:".timeline-ShareMenu",shareMenuTimelineHeader:".timeline-Header",shareMenuTimelineFooter:".timeline-Footer"}),e.define("getHeaderHeight",function(){var e=this.selectOne("shareMenuTimelineHeader");return e?e.getBoundingClientRect().height:0}),e.define("getFooterHeight",function(){var e=this.selectOne("shareMenuTimelineFooter");return e?e.getBoundingClientRect().height:0}),e.define("getShareMenuPositionClass",function(e){var t=e.getBoundingClientRect(),i=t.top-this.getHeaderHeight(),r=this.sandbox.height-t.bottom-this.getFooterHeight();return r=1.5:!!t.matchMedia&&t.matchMedia("only screen and (min-resolution: 144dpi)").matches}function i(t){return t=t||v,/(Trident|MSIE|Edge[\/ ]?\d)/.test(t)}function o(t){return t=t||v,/MSIE 9/.test(t)}function a(t){return t=t||v,/(iPad|iPhone|iPod)/.test(t)}function s(t){return t=t||v,/^Mozilla\/5\.0 \(Linux; (U; )?Android/.test(t)}function u(t,e){return t=t||p,e=e||v,t.postMessage&&!(i(e)&&t.opener)}function c(t,e,n){return t=t||p,e=e||h,n=n||v,"ontouchstart"in t||/Opera Mini/.test(n)||e.msMaxTouchPoints>0}function d(){var t=l.body.style;return void 0!==t.transition||void 0!==t.webkitTransition||void 0!==t.mozTransition||void 0!==t.oTransition||void 0!==t.msTransition}function f(){return!!(p.Promise&&p.Promise.resolve&&p.Promise.reject&&p.Promise.all&&p.Promise.race&&function(){var t;return new p.Promise(function(e){t=e}),m.isType("function",t)}())}var l=n(9),h=n(10),p=n(7),m=n(11),v=h.userAgent;t.exports={retina:r,anyIE:i,ie9:o,ios:a,android:s,canPostMessage:u,touch:c,cssTransitions:d,hasPromiseSupport:f}},function(t,e){t.exports=document},function(t,e){t.exports=navigator},function(t,e,n){function r(t){return f(arguments).slice(1).forEach(function(e){o(e,function(e,n){t[e]=n})}),t}function i(t){return o(t,function(e,n){u(n)&&(i(n),c(n)&&delete t[e]),void 0!==n&&null!==n&&""!==n||delete t[e]}),t}function o(t,e){for(var n in t)t.hasOwnProperty&&!t.hasOwnProperty(n)||e(n,t[n]);return t}function a(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function s(t,e){return t==a(e)}function u(t){return t===Object(t)}function c(t){if(!u(t))return!1;if(Object.keys)return!Object.keys(t).length;for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function d(t,e){h.setTimeout(function(){t.call(e||null)},0)}function f(t){return t?Array.prototype.slice.call(t):[]}function l(t,e){return!(!t||!t.indexOf)&&t.indexOf(e)>-1}var h=n(7);t.exports={aug:r,async:d,compact:i,contains:l,forIn:o,isObject:u,isEmptyObject:c,toType:a,isType:s,toRealArray:f}},function(t,e,n){function r(t,e,n){e.ready=i(t.then,t),n&&Array.isArray(e[n])&&(e[n].forEach(i(t.then,t)),delete e[n])}var i=n(13);t.exports={exposeReadyPromise:r}},function(t,e,n){var r=n(11);t.exports=function(t,e){var n=Array.prototype.slice.call(arguments,2);return function(){var i=r.toRealArray(arguments);return t.apply(e,n.concat(i))}}},function(t,e,n){var r=n(15);t.exports=new r("twttr")},function(t,e,n){function r(t){return s.isType("string",t)?t.split("."):s.isType("array",t)?t:[]}function i(t,e){var n=r(e),i=n.slice(0,-1);return i.reduce(function(t,e,n){if(t[e]=t[e]||{},!s.isObject(t[e]))throw new Error(i.slice(0,n+1).join(".")+" is already defined with a value.");return t[e]},t)}function o(t,e){e=e||a,e[t]=e[t]||{},Object.defineProperty(this,"base",{value:e[t]}),Object.defineProperty(this,"name",{value:t})}var a=n(7),s=n(11);s.aug(o.prototype,{get:function(t){var e=r(t);return e.reduce(function(t,e){if(s.isObject(t))return t[e]},this.base)},set:function(t,e,n){var o=r(t),a=i(this.base,t),s=o.slice(-1);return n&&s in a?a[s]:a[s]=e},init:function(t,e){return this.set(t,e,!0)},unset:function(t){var e=r(t),n=this.get(e.slice(0,-1));n&&delete n[e.slice(-1)]},aug:function(t){var e=this.get(t),n=s.toRealArray(arguments).slice(1);if(e="undefined"!=typeof e?e:{},n.unshift(e),!n.every(s.isObject))throw new Error("Cannot augment non-object.");return this.set(t,s.aug.apply(null,n))},call:function(t){var e=this.get(t),n=s.toRealArray(arguments).slice(1);if(!s.isType("function",e))throw new Error("Function "+t+"does not exist.");return e.apply(null,n)},fullPath:function(t){var e=r(t);return e.unshift(this.name),e.join(".")}}),t.exports=o},function(t,e,n){var r=n(15);t.exports=new r("__twttr")},function(t,e,n){function r(t){var e=a.href,n="original_referer="+e;return[t,n].join(t.indexOf("?")==-1?"?":"&")}function i(t){var e,n;t.altKey||t.metaKey||t.shiftKey||(e=u.closest(function(t){return"A"===t.tagName||"AREA"===t.tagName},t.target),e&&d.isIntentURL(e.href)&&(n=r(e.href),n=n.replace(/^http[:]/,"https:"),n=n.replace(/^\/\//,"https://"),c.open(n,e),s.preventDefault(t)))}function o(t){t.addEventListener("click",i,!1)}var a=n(18),s=n(19),u=n(21),c=n(22),d=n(23);t.exports={attachTo:o}},function(t,e){t.exports=location},function(t,e,n){function r(t){var e=t.getAttribute("data-twitter-event-id");return e?e:(t.setAttribute("data-twitter-event-id",++g),g)}function i(t,e,n){var r=0,i=t&&t.length||0;for(r=0;r!\s\/#\-\(\)\'\"]+)$/,T=/twitter\.com(?:\:\d{2,4})?\/intent\/(\w+)/,I=/^https?:\/\/(?:www\.)?twitter\.com\/\w+\/timelines\/(\d+)/i,P=/^https?:\/\/(?:www\.)?twitter\.com\/i\/moments\/(\d+)/i,S=/^https?:\/\/(?:www\.)?twitter\.com\/(\w+)\/(?:likes|favorites)/i,R=/^https?:\/\/(?:www\.)?twitter\.com\/(\w+)\/lists\/([\w-]+)/i,j=/^https?:\/\/(?:www\.)?twitter\.com\/i\/live\/(\d+)/i;t.exports={isHashTag:s,hashTag:u,isScreenName:r,screenName:i,isStatus:c,status:d,intentForProfileURL:o,intentForFollowURL:a,isTwitterURL:f,isTwimgURL:l,isIntentURL:h,regexen:{profile:_},momentId:p,collectionId:m,intentType:v,likesScreenName:g,listScreenNameAndSlug:y,eventId:w}},function(t,e,n){function r(t){return encodeURIComponent(t).replace(/\+/g,"%2B").replace(/'/g,"%27")}function i(t){return decodeURIComponent(t)}function o(t){var e=[];return d.forIn(t,function(t,n){var i=r(t);d.isType("array",n)||(n=[n]),n.forEach(function(t){c.hasValue(t)&&e.push(i+"="+r(t))})}),e.sort().join("&")}function a(t){var e,n={};return t?(e=t.split("&"),e.forEach(function(t){var e=t.split("="),r=i(e[0]),o=i(e[1]);if(2==e.length)return d.isType("array",n[r])?void n[r].push(o):r in n?(n[r]=[n[r]],void n[r].push(o)):void(n[r]=o)}),n):{}}function s(t,e){var n=o(e);return n.length>0?d.contains(t,"?")?t+"&"+o(e):t+"?"+o(e):t}function u(t){var e=t&&t.split("?");return 2==e.length?a(e[1]):{}}var c=n(25),d=n(11);t.exports={url:s,decodeURL:u,decode:a,encode:o,encodePart:r,decodePart:i}},function(t,e,n){function r(t){return void 0!==t&&null!==t&&""!==t}function i(t){return s(t)&&t%1===0}function o(t){return"string"===m.toType(t)}function a(t){return s(t)&&!i(t)}function s(t){return r(t)&&!isNaN(t)}function u(t){return r(t)&&"array"==m.toType(t)}function c(t){return m.contains(g,t)}function d(t){return m.contains(v,t)}function f(t){return!!r(t)&&(!!d(t)||!c(t)&&!!t)}function l(t){if(s(t))return t}function h(t){if(a(t))return t}function p(t){if(i(t))return parseInt(t,10)}var m=n(11),v=[!0,1,"1","on","ON","true","TRUE","yes","YES"],g=[!1,0,"0","off","OFF","false","FALSE","no","NO"];t.exports={hasValue:r,isInt:i,isFloat:a,isNumber:s,isString:o,isArray:u,isTruthValue:d,isFalseValue:c,asInt:p,asFloat:h,asNumber:l,asBoolean:f}},function(t,e,n){function r(t){var e=[];return m.forIn(t,function(t,n){e.push(t+"="+n)}),e.join(",")}function i(){return v+p.generate()}function o(t,e){function n(t){return Math.round(t/2)}return t>e?{coordinate:0,size:e}:{coordinate:n(e)-n(t),size:t}}function a(t,e,n){var i,a;e=s.parse(e),n=n||{},i=o(e.width,n.width||g),e.left=i.coordinate,e.width=i.size,a=o(e.height,n.height||y),e.top=a.coordinate,e.height=a.size,this.win=t,this.features=r(e)}var s,u=n(7),c=n(27),d=n(19),f=n(21),l=n(8),h=n(23),p=n(28),m=n(11),v="intent_",g=u.screen.width,y=u.screen.height;s=(new c).defaults({width:550,height:520,personalbar:"0",toolbar:"0",location:"1",scrollbars:"1",resizable:"1"}),a.prototype.open=function(t,e){var n=e&&"click"==e.type&&f.closest("a",e.target),r=e&&(e.altKey||e.metaKey||e.shiftKey),o=n&&(l.ios()||l.android());if(h.isTwitterURL(t))return r||o?this:(this.name=i(),this.popup=this.win.open(t,this.name,this.features),e&&d.preventDefault(e),this)},a.open=function(t,e,n){var r=new a(u,e);return r.open(t,n)},t.exports=a},function(t,e,n){function r(t){return function(e){return o.hasValue(e[t])}}function i(){this.assertions=[],this._defaults={}}var o=n(25),a=n(11);i.prototype.assert=function(t,e){return this.assertions.push({fn:t,msg:e||"assertion failed"}),this},i.prototype.defaults=function(t){return this._defaults=t||this._defaults,this},i.prototype.require=function(t){var e=this;return t=Array.isArray(t)?t:a.toRealArray(arguments),t.forEach(function(t){e.assert(r(t),"required: "+t)}),this},i.prototype.parse=function(t){var e,n;if(e=a.aug({},this._defaults,t||{}),n=this.assertions.reduce(function(t,n){return n.fn(e)||t.push(n.msg),t},[]),n.length>0)throw new Error(n.join("\n"));return e},t.exports=i},function(t,e){function n(){return i+String(+new Date)+Math.floor(1e5*Math.random())+o++}function r(){return i+String(a++)}var i="i",o=0,a=0;t.exports={generate:n,deterministic:r}},function(t,e,n){function r(){return i.get("events")||{}}var i=n(14),o=n(30),a=n(11);t.exports=a.aug(r(),o.Emitter)},function(t,e,n){var r=n(11),i=n(13),o={bind:function(t,e){return this._handlers=this._handlers||{},this._handlers[t]=this._handlers[t]||[],this._handlers[t].push(e)},unbind:function(t,e){if(this._handlers&&this._handlers[t])if(e){var n=this._handlers[t].indexOf(e);n>=0&&this._handlers[t].splice(n,1)}else this._handlers[t]=[]},trigger:function(t,e){var n=this._handlers&&this._handlers[t];e=e||{},e.type=t,n&&n.forEach(function(t){r.async(i(t,this,e))})}};t.exports={Emitter:o}},function(t,e,n){function r(t){c[t]=+new Date}function i(t){return c[t]?+new Date-c[t]:null}function o(t,e,n,r,o){var s=i(e);s&&a(t,n,r,s,o)}function a(t,e,n,r,i){var o,a=void 0===i?d:i;100*Math.random()>a||(n=u.aug(n||{},{duration_ms:r}),o={page:e,component:"performance",action:t},s.clientEvent(o,n,!0))}var s=n(32),u=n(11),c={},d=1;t.exports={start:r,end:i,track:a,endAndTrack:o}},function(t,e,n){function r(t,e,n){return i(t,e,n,2)}function i(t,e,n,r){var i=!v.isObject(t),o=!!e&&!v.isObject(e);i||o||a(m.formatClientEventNamespace(t),m.formatClientEventData(e,n,r),m.CLIENT_EVENT_ENDPOINT)}function o(t,e,n,r){var o=m.extractTermsFromDOM(t.target||t.srcElement);o.action=r||"click",i(o,e,n)}function a(t,e,n){var r,i;n&&v.isObject(t)&&v.isObject(e)&&(r=m.flattenClientEventPayload(t,e),i={l:m.stringify(r)},r.dnt&&(i.dnt=1),l(p.url(n,i)))}function s(t,e,n,r){var i,o=!v.isObject(t),a=!!e&&!v.isObject(e);if(!o&&!a)return i=m.flattenClientEventPayload(m.formatClientEventNamespace(t),m.formatClientEventData(e,n,r)),u(i)}function u(t){return y.push(t),y}function c(){var t,e;return y.length>1&&s({page:"widgets_js",component:"scribe_pixel",action:"batch_log"},{}),t=y,y=[],e=t.reduce(function(e,n,r){var i=e.length,o=i&&e[i-1],a=r+1==t.length;return a&&n.event_namespace&&"batch_log"==n.event_namespace.action&&(n.message=["entries:"+r,"requests:"+i].join("/")),d(n).forEach(function(t){var n=f(t);(!o||o.urlLength+n>g)&&(o={urlLength:b,items:[]},e.push(o)),o.urlLength+=n,o.items.push(t)}),e},[]),e.map(function(t){var e={l:t.items};return h.enabled()&&(e.dnt=1),l(p.url(m.CLIENT_EVENT_ENDPOINT,e))})}function d(t){return Array.isArray(t)||(t=[t]),t.reduce(function(t,e){var n,r=m.stringify(e),i=f(r);return b+i1&&(t=t.concat(d(n)))),t},[])}function f(t){return encodeURIComponent(t).length+3}function l(t){var e=new Image;return e.src=t}var h=n(33),p=n(24),m=n(38),v=n(11),g=2083,y=[],w=p.url(m.CLIENT_EVENT_ENDPOINT,{dnt:0,l:""}),b=encodeURIComponent(w).length;t.exports={_enqueueRawObject:u,scribe:a,clientEvent:i,clientEvent2:r,enqueueClientEvent:s,flushClientEvents:c,interaction:o}},function(t,e,n){function r(){l=!0}function i(t,e){return!!l||(!!d.asBoolean(f.val("dnt"))||(!(!s||1!=s.doNotTrack&&1!=s.msDoNotTrack)||(!!c.isUrlSensitive(e||a.host)||(!(!u.isFramed()||!c.isUrlSensitive(u.rootDocumentLocation()))||(t=h.test(t||o.referrer)&&RegExp.$1,!(!t||!c.isUrlSensitive(t)))))))}var o=n(9),a=n(18),s=n(10),u=n(34),c=n(36),d=n(25),f=n(37),l=!1,h=/https?:\/\/([^\/]+).*/i;t.exports={setOn:r,enabled:i}},function(t,e,n){function r(t){return t&&u.isType("string",t)&&(c=t),c}function i(){return d}function o(){return c!==d}var a=n(18),s=n(35),u=n(11),c=s.getCanonicalURL()||a.href,d=c;t.exports={isFramed:o,rootDocumentLocation:r,currentDocumentLocation:i}},function(t,e,n){function r(t,e){var n,r;return e=e||s,/^https?:\/\//.test(t)?t:/^\/\//.test(t)?e.protocol+t:(n=e.host+(e.port.length?":"+e.port:""),0!==t.indexOf("/")&&(r=e.pathname.split("/"),r.pop(),r.push(t),t="/"+r.join("/")),[e.protocol,"//",n,t].join(""))}function i(){for(var t,e=a.getElementsByTagName("link"),n=0;t=e[n];n++)if("canonical"==t.rel)return r(t.href)}function o(){for(var t,e,n,r=a.getElementsByTagName("a"),i=a.getElementsByTagName("link"),o=[r,i],s=0,c=0,d=/\bme\b/;t=o[s];s++)for(c=0;e=t[c];c++)if(d.test(e.rel)&&(n=u.screenName(e.href)))return n}var a=n(9),s=n(18),u=n(23);t.exports={absolutize:r,getCanonicalURL:i,getScreenNameFromPage:o}},function(t,e,n){function r(t){return t in s?s[t]:s[t]=a.test(t)}function i(){return r(o.host)}var o=n(18),a=/^[^#?]*\.(gov|mil)(:\d+)?([#?].*)?$/i,s={};t.exports={isUrlSensitive:r,isHostPageSensitive:i}},function(t,e,n){function r(t){var e,n,r,i=0;for(o={},t=t||a,e=t.getElementsByTagName("meta");n=e[i];i++)/^twitter:/.test(n.name)&&(r=n.name.replace(/^twitter:/,""),o[r]=n.content)}function i(t){return o[t]}var o,a=n(9);r(),t.exports={init:r,val:i}},function(t,e,n){function r(t,e){var n;return e=e||{},t&&t.nodeType===Node.ELEMENT_NODE?((n=t.getAttribute("data-scribe"))&&n.split(" ").forEach(function(t){var n=t.trim().split(":"),r=n[0],i=n[1];r&&i&&!e[r]&&(e[r]=i)}),r(t.parentNode,e)):e}function i(t){return p.aug({client:"tfw"},t||{})}function o(t,e,n){var r=t&&t.widget_origin||f.referrer;return t=a("tfw_client_event",t,r),t.client_version=v,t.format_version=void 0!==n?n:1,e||(t.widget_origin=r),t}function a(t,e,n){return e=e||{},p.aug({},e,{_category_:t,triggered_on:e.triggered_on||+new Date,dnt:h.enabled(n)})}function s(t,e){var n={};return e=e||{},e.association_namespace=i(t),n[b]=e,n}function u(t,e){return p.aug({},e,{event_namespace:t})}function c(t){var e,n=Array.prototype.toJSON;return delete Array.prototype.toJSON,e=l.stringify(t),n&&(Array.prototype.toJSON=n),e}function d(t){if(t.item_ids&&t.item_ids.length>1){var e=Math.floor(t.item_ids.length/2),n=t.item_ids.slice(0,e),r={},i=t.item_ids.slice(e),o={};n.forEach(function(e){r[e]=t.item_details[e]}),i.forEach(function(e){o[e]=t.item_details[e]});var a=[p.aug({},t,{item_ids:n,item_details:r}),p.aug({},t,{item_ids:i,item_details:o})];return a}return[t]}var f=n(9),l=n(39),h=n(33),p=n(11),m=n(40),v=m.version,g="https://syndication.twitter.com/i/jot",y="https://syndication.twitter.com/i/jot/syndication",w="https://platform.twitter.com/jot.html",b=1;t.exports={extractTermsFromDOM:r,flattenClientEventPayload:u,formatGenericEventData:a,formatClientEventData:o,formatClientEventNamespace:i,formatTweetAssociation:s,splitLogEntry:d,stringify:c,AUDIENCE_ENDPOINT:y,CLIENT_EVENT_ENDPOINT:g,RUFOUS_REDIRECT:w}},function(t,e,n){var r=n(7),i=r.JSON;t.exports={stringify:i.stringify||i.encode,parse:i.parse||i.decode}},function(t,e){t.exports={version:"a3a5083:1490118886978"}},function(t,e,n){function r(t){return t.reduce(function(t,e){return t.concat(g.reduce(function(t,n){return t.concat(n(e))},[]))},[])}function i(){var t=f.val("widgets:autoload")||!0;return!m.isFalseValue(t)&&(m.isTruthValue(t)?c.body:c.querySelectorAll(t))}function o(t){var e;return t=t||c.body,t=t.length?v.toRealArray(t):[t],h.pause(),e=u.allResolved(r(t).map(function(t){return d.addWidget(t)})).then(function(t){p.trigger("loaded",{widgets:t})}),u.always(e,function(){h.resume()}),e}function a(){var t=i();return t===!1?s.resolve():(l.set("widgets.loaded",!0),o(t))}var s=n(2),u=n(42),c=n(9),d=n(43),f=n(37),l=n(16),h=n(50),p=n(29),m=n(25),v=n(11),g=n(73);t.exports={load:o,loadPage:a,_getPageLoadTarget:i}},function(t,e,n){function r(t,e){return t.then(e,e)}function i(t){var e;return t=t||[],e=t.length,t=t.filter(s),e?e!==t.length?u.reject("non-Promise passed to .some"):new u(function(e,n){function r(){i+=1,i===t.length&&n()}var i=0;t.forEach(function(t){t.then(e,r)})}):u.reject("no promises passed to .some")}function o(t){var e;return void 0===t?u.reject(new Error("undefined is not an object")):Array.isArray(t)?(e=t.length,e?new u(function(n,r){function i(){a+=1,a===e&&(0===u.length?r():n(u))}function o(t){u.push(t),i()}var a=0,u=[];t.forEach(function(t){s(t)?t.then(o,i):o(t)})}):u.resolve([])):u.reject(new Error("Type error"))}function a(t){function e(){}return u.all((t||[]).map(function(t){return r(t,e)}))}function s(t){return t instanceof u}var u=n(2);t.exports={always:r,allResolved:o,some:i,isPromise:s,allSettled:a}},function(t,e,n){function r(t){return t.reduce(function(t,e){return t[e.className]=t[e.className]||[],t[e.className].push(e),t},{})}function i(t){var e=t.map(a.fromRawTask),n=r(e);f.forIn(n,function(t,e){c.allSettled(e.map(function(t){return t.initialize()})).then(function(){e.forEach(function(t){u.all([t.hydrate(),t.insertIntoDom()]).then(d(t.render,t)).then(d(t.success,t),d(t.fail,t))})})})}function o(t){return l.add(t)}var a=n(44),s=n(48),u=n(2),c=n(42),d=n(13),f=n(11),l=new s(i);t.exports={addWidget:o}},function(t,e,n){function r(t){var e=t.srcEl||t.targetEl;return e.ownerDocument.defaultView}function i(t,e){this._widget=null,this._sandbox=null,this._hydrated=!1,this._insertedIntoDom=!1,this._Sandbox=t.Sandbox,this._factory=t.factory,this._widgetParams=t.parameters,this._resolve=e,this._className=t.className,this._renderedClassName=t.className+"-rendered",this._errorClassName=t.className+"-error",this._srcEl=t.srcEl,this._targetGlobal=r(t),this._insertionStrategy=function(e){var n=t.srcEl,r=t.targetEl;n?r.insertBefore(e,n):r.appendChild(e)}}var o=n(20),a=n(45),s=n(29),u=n(47),c=n(2),d=n(42);i.fromRawTask=function(t){return new i(t.input,t.taskDoneDeferred.resolve)},i.prototype.initialize=function(){var t=this,e=new this._Sandbox(this._targetGlobal);return this._factory(this._widgetParams,e).then(function(n){return t._widget=n,t._sandbox=e,n})},i.prototype.insertIntoDom=function(){var t=this;return this._widget?this._sandbox.insert(this._widget.id,{class:[this._className,this._renderedClassName].join(" ")},null,this._insertionStrategy).then(function(){t._insertedIntoDom=!0}):c.reject(new Error("cannot insert widget into DOM before it is initialized"))},i.prototype.hydrate=function(){var t=this;return this._widget?this._widget.hydrate().then(function(){t._hydrated=!0}):c.reject(new Error("cannot hydrate widget before it is initialized"))},i.prototype.render=function(){function t(){r._sandbox.onResize(function(){return r._widget.resize().then(function(){s.trigger("resize",{target:r._sandbox.sandboxEl})})})}function e(){return u(r._srcEl).then(function(){return r._sandbox.sandboxEl})}function n(t){return u(r._sandbox.sandboxEl).then(function(){return c.reject(t)})}var r=this;return this._hydrated?this._insertedIntoDom?r._widget.render(r._sandbox).then(function(){return t(),r._widget.show()}).then(e,n):n(new Error("cannot render widget before DOM insertion")):n(new Error("cannot render widget before hydration"))},i.prototype.fail=function(){var t=this;return this._srcEl?d.always(a.write(function(){o.add(t._srcEl,t._errorClassName)}),function(){s.trigger("rendered",{target:t._srcEl}),t._resolve(t._srcEl)}):(t._resolve(),c.resolve())},i.prototype.success=function(){s.trigger("rendered",{target:this._sandbox.sandboxEl}),this._resolve(this._sandbox.sandboxEl)},t.exports=i},function(t,e,n){function r(t,e){return function(){try{e.resolve(t.call(this))}catch(t){e.reject(t)}}}function i(t,e){t.call(e)}function o(t,e){var n=new c;return u.read(r(t,n),e),n.promise}function a(t,e){var n=new c;return u.write(r(t,n),e),n.promise}function s(t,e,n){var i=new c;return d.isType("function",t)&&(n=e,e=t,t=1),u.defer(t,r(e,i),n),i.promise}var u=n(46),c=n(1),d=n(11);t.exports={sync:i,read:o,write:a,defer:s}},function(t,e,n){var r;!function(){"use strict";function i(){this.frames=[],this.lastId=0,this.raf=o,this.batch={hash:{},read:[],write:[],mode:null}}var o=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)};i.prototype.read=function(t,e){var n=this.add("read",t,e),r=n.id;this.batch.read.push(n.id);var i="reading"===this.batch.mode||this.batch.scheduled;return i?r:(this.scheduleBatch(),r)},i.prototype.write=function(t,e){var n=this.add("write",t,e),r=this.batch.mode,i=n.id;this.batch.write.push(n.id);var o="writing"===r||"reading"===r||this.batch.scheduled;return o?i:(this.scheduleBatch(),i)},i.prototype.defer=function(t,e,n){"function"==typeof t&&(n=e,e=t,t=1);var r=this,i=t-1;return this.schedule(i,function(){r.run({fn:e,ctx:n})})},i.prototype.clear=function(t){if("function"==typeof t)return this.clearFrame(t);t=Number(t);var e=this.batch.hash[t];if(e){var n=this.batch[e.type],r=n.indexOf(t);delete this.batch.hash[t],~r&&n.splice(r,1)}},i.prototype.clearFrame=function(t){var e=this.frames.indexOf(t);~e&&this.frames.splice(e,1)},i.prototype.scheduleBatch=function(){var t=this;this.schedule(0,function(){t.batch.scheduled=!1,t.runBatch()}),this.batch.scheduled=!0},i.prototype.uniqueId=function(){return++this.lastId},i.prototype.flush=function(t){for(var e;e=t.shift();)this.run(this.batch.hash[e])},i.prototype.runBatch=function(){try{ +this.batch.mode="reading",this.flush(this.batch.read),this.batch.mode="writing",this.flush(this.batch.write),this.batch.mode=null}catch(t){throw this.runBatch(),t}},i.prototype.add=function(t,e,n){var r=this.uniqueId();return this.batch.hash[r]={id:r,fn:e,ctx:n,type:t}},i.prototype.run=function(t){var e=t.ctx||this,n=t.fn;if(delete this.batch.hash[t.id],!this.onError)return n.call(e);try{n.call(e)}catch(t){this.onError(t)}},i.prototype.loop=function(){function t(){var e=n.frames.shift();n.frames.length?r(t):n.looping=!1,e&&e()}var e,n=this,r=this.raf,i=!1,o=500;this.looping||(e=setTimeout(function(){i=!0,t()},o),r(function(){i||(clearTimeout(e),t())}),this.looping=!0)},i.prototype.schedule=function(t,e){return this.frames[t]?this.schedule(t+1,e):(this.loop(),this.frames[t]=e)};var a=new i;"undefined"!=typeof t&&t.exports?t.exports=a:(r=function(){return a}.call(e,n,e,t),!(void 0!==r&&(t.exports=r)))}()},function(t,e,n){function r(t){return i.write(function(){t&&t.parentNode&&t.parentNode.removeChild(t)})}var i=n(45);t.exports=r},function(t,e,n){function r(t){this._inputsQueue=[],this._task=t,this._hasFlushBeenScheduled=!1}var i=n(1),o=n(49),a=n(13);r.prototype.add=function(t){var e=new i;return this._inputsQueue.push({input:t,taskDoneDeferred:e}),this._hasFlushBeenScheduled||(this._hasFlushBeenScheduled=!0,o(a(this._flush,this))),e.promise},r.prototype._flush=function(){try{this._task.call(null,this._inputsQueue)}catch(t){this._inputsQueue.forEach(function(e){e.taskDoneDeferred.reject(t)})}this._inputsQueue=[],this._hasFlushBeenScheduled=!1},t.exports=r},function(t,e,n){var r=n(3).Promise;t.exports=r._asap},function(t,e,n){function r(t){t.forEach(function(t){var e=t.input.namespace,n=t.input.data,r=t.input.offsite,i=t.input.version;d.clientEvent(e,n,r,i),t.taskDoneDeferred.resolve()})}function i(t){function e(){t.forEach(function(t){t.taskDoneDeferred.resolve()})}function n(){t.forEach(function(t){t.taskDoneDeferred.reject()})}c.init(),t.forEach(function(t){var e=t.input.namespace,n=t.input.data,r=t.input.offsite,i=t.input.version;c.clientEvent(e,n,r,i)}),c.flush().then(e,n)}function o(t){(1===t.length?r:i)(t)}function a(t,e,n,r){return l.add({namespace:t,data:e,offsite:n,version:r})}function s(){l.pause()}function u(){l.resume()}var c=n(51),d=n(32),f=n(72),l=new f(o);t.exports={scribe:a,pause:s,resume:u}},function(t,e,n){function r(){function t(t){h.body.appendChild(t)}return T?I.promise:(l=new _(p),l.insert("rufous-sandbox",null,{display:"none"},t).then(function(){l.setTitle("Twitter analytics iframe"),d=u(),f=c(),I.resolve([d,f])}),T=!0,I.promise)}function i(t,e){var n,r,i;b.isObject(t)&&b.isObject(e)&&(i=w.flattenClientEventPayload(t,e),n=d.firstChild,n.value=+(+n.value||i.dnt||0),r=l.createElement("input"),r.type="hidden",r.name="l",r.value=w.stringify(i),d.appendChild(r))}function o(t,e,n){var r=!b.isObject(t),o=!!e&&!b.isObject(e);r||o||I.promise.then(function(){i(w.formatClientEventNamespace(t),w.formatClientEventData(e,n))})}function a(){return I.promise.then(function(){if(d.children.length<=2)return y.reject();var t=y.all([l.doc.body.appendChild(d),l.doc.body.appendChild(f)]).then(function(t){var e=t[0],n=t[1];return n.addEventListener("load",function(){s(e,n)()}),e.submit(),t});return d=u(),f=c(),t})}function s(t,e){return function(){var n=t.parentNode;n&&(n.removeChild(t),n.removeChild(e))}}function u(){var t=l.createElement("form"),e=l.createElement("input"),n=l.createElement("input");return C++,t.action=w.CLIENT_EVENT_ENDPOINT,t.method="POST",t.target=x+C,t.id=A+C,e.type="hidden",e.name="dnt",e.value=v.enabled(),n.type="hidden",n.name="tfw_redirect",n.value=w.RUFOUS_REDIRECT,t.appendChild(e),t.appendChild(n),t}function c(){var t=x+C;return m({id:t,name:t,width:0,height:0,border:0},{display:"none"},l.doc)}var d,f,l,h=n(9),p=n(7),m=n(52),v=n(33),g=n(1),y=n(2),w=n(38),b=n(11),_=n(53),E=Math.floor(1e3*Math.random())+"_",x="rufous-frame-"+E+"-",A="rufous-form-"+E+"-",C=0,T=!1,I=new g;t.exports={clientEvent:o,flush:a,init:r}},function(t,e,n){var r=n(9),i=n(11);t.exports=function(t,e,n){var o;if(n=n||r,t=t||{},e=e||{},t.name){try{o=n.createElement('')}catch(e){o=n.createElement("iframe"),o.name=t.name}delete t.name}else o=n.createElement("iframe");return t.id&&(o.id=t.id,delete t.id),o.allowtransparency="true",o.scrolling="no",o.setAttribute("frameBorder",0),o.setAttribute("allowTransparency",!0),i.forIn(t,function(t,e){o.setAttribute(t,e)}),i.forIn(e,function(t,e){o.style[t]=e}),o}},function(t,e,n){var r=n(54),i=n(63);t.exports=r.build([i])},function(t,e,n){var r=n(55),i=n(58),o=n(13);r=Object.create(r),r.build=o(r.build,null,i),t.exports=r},function(t,e,n){function r(){return s.toRealArray(arguments)}function i(t,e,n){var r=new t;return e=a(o(e||[])),e.forEach(function(t){t.call(null,r)}),r.build(n)}var o=n(56),a=n(57),s=n(11);t.exports={couple:r,build:i}},function(t,e,n){function r(t){var e=[];return t.forEach(function(t){var n=i.isType("array",t)?r(t):[t];e=e.concat(n)}),e}var i=n(11);t.exports=r},function(t,e){function n(t){return t.filter(function(e,n){return t.indexOf(e)===n})}t.exports=n},function(t,e,n){function r(){i.apply(this,arguments)}var i=n(59),o=n(11),a=n(62);r.prototype=Object.create(i.prototype),o.aug(r.prototype,{factory:a}),t.exports=r},function(t,e,n){function r(t,e,n){var r=this[e];if(!r)throw new Error(e+" does not exist");this[e]=t(r,n)}function i(){this.Component=this.factory(),this._adviceArgs=[],this._lastArgs=[]}var o=n(60),a=n(11),s=n(61);a.aug(i.prototype,{factory:s,build:function(t){var e=this;this.Component;return a.aug(this.Component.prototype.boundParams,t),this._adviceArgs.concat(this._lastArgs).forEach(function(t){r.apply(e.Component.prototype,t)}),delete this._lastArgs,delete this._adviceArgs,this.Component},params:function(t){var e=this.Component.prototype.paramConfigs;t=t||{},this.Component.prototype.paramConfigs=a.aug({},t,e)},define:function(t,e){if(t in this.Component.prototype)throw new Error(t+" has previously been defined");this.override(t,e)},defineStatic:function(t,e){this.Component[t]=e},override:function(t,e){this.Component.prototype[t]=e},defineProperty:function(t,e){if(t in this.Component.prototype)throw new Error(t+" has previously been defined");this.overrideProperty(t,e)},overrideProperty:function(t,e){var n=a.aug({configurable:!0},e);Object.defineProperty(this.Component.prototype,t,n)},before:function(t,e){this._adviceArgs.push([o.before,t,e])},after:function(t,e){this._adviceArgs.push([o.after,t,e])},around:function(t,e){this._adviceArgs.push([o.around,t,e])},last:function(t,e){this._lastArgs.push([o.after,t,e])}}),t.exports=i},function(t,e,n){function r(t,e){return function(){var n,r=this,i=arguments;return n=e.apply(this,arguments),a.isPromise(n)?n.then(function(){return t.apply(r,i)}):t.apply(this,arguments)}}function i(t,e){return function(){function n(t,e){return a.isPromise(e)?e.then(function(){return t}):t}var r,i=this,o=arguments;return r=t.apply(this,arguments),a.isPromise(r)?r.then(function(t){return n(t,e.apply(i,o))}):n(r,e.apply(this,arguments))}}function o(t,e){return function(){var n=s.toRealArray(arguments);return n.unshift(u(t,this)),e.apply(this,n)}}var a=n(42),s=n(11),u=n(13);t.exports={before:r,after:i,around:o}},function(t,e,n){function r(){return!0}function i(t){return t}function o(t,e,n){var r=null;return t.some(function(t){if(t=s.isType("function",t)?t():t,e(t))return r=n(t),!0}),r}function a(){function t(t){var e=this;t=t||{},this.params=Object.keys(this.paramConfigs).reduce(function(n,a){var s=[],u=e.boundParams,c=e.paramConfigs[a],d=c.validate||r,f=c.transform||i;if(a in u&&s.push(u[a]),a in t&&s.push(t[a]),s="fallback"in c?s.concat(c.fallback):s,n[a]=o(s,d,f),c.required&&null==n[a])throw new Error(a+" is a required parameter");return n},{}),this.initialize()}return s.aug(t.prototype,{paramConfigs:{},boundParams:{},initialize:function(){}}),t}var s=n(11);t.exports=a},function(t,e,n){function r(){function t(t){e.apply(this,arguments),Object.defineProperty(this,"targetGlobal",{value:t})}var e=a();return t.prototype=Object.create(e.prototype),u.aug(t.prototype,{id:null,initialized:!1,width:0,height:0,sandboxEl:null,insert:function(){return s.reject()},onResize:function(){},addClass:function(t){var e=this.sandboxEl;return t=Array.isArray(t)?t:[t],o.write(function(){t.forEach(function(t){i.add(e,t)})})},removeClass:function(t){var e=this.sandboxEl;return t=Array.isArray(t)?t:[t],o.write(function(){t.forEach(function(t){i.remove(e,t)})})},styleSelf:function(t){var e=this;return o.write(function(){u.forIn(t,function(t,n){e.sandboxEl.style[t]=n})})}}),t}var i=n(20),o=n(45),a=n(61),s=n(2),u=n(11);t.exports=r},function(t,e,n){function r(t,e,n,r){return e=w.aug({id:t},x,e),n=w.aug({},A,n),m(e,n,r)}function i(t){try{t.contentWindow.document}catch(t){return y.reject(t)}return y.resolve(t)}function o(t,e,n,i,o){var a=new g,u=_.generate(),d=r(t,e,n,o);return b.set(["sandbox",u],function(){var t=d.contentWindow.document,e="";c.write(function(){t.write(e)}).then(function(){t.close(),a.resolve(d)})}),d.src=["javascript:",'document.write("");',"try { window.parent.document; }",'catch (e) { document.domain="'+s.domain+'"; }',"window.parent."+b.fullPath(["sandbox",u])+"();"].join(""),d.addEventListener("error",a.reject,!1),c.write(function(){i.parentNode.replaceChild(d,i)}),a.promise}function a(t){t.overrideProperty("id",{get:function(){return this.sandboxEl&&this.sandboxEl.id}}),t.overrideProperty("initialized",{get:function(){return!!this.win}}),t.overrideProperty("width",{get:function(){return this._width}}),t.overrideProperty("height",{get:function(){return this._height}}),t.overrideProperty("sandboxEl",{get:function(){return this.iframeEl}}),t.defineProperty("iframeEl",{get:function(){return this._iframe}}),t.defineProperty("rootEl",{get:function(){return this.doc&&this.doc.documentElement}}),t.defineProperty("widgetEl",{get:function(){return this.doc&&this.doc.body.firstElementChild}}),t.defineProperty("win",{get:function(){return this.iframeEl&&this.iframeEl.contentWindow}}),t.defineProperty("doc",{get:function(){return this.win&&this.win.document}}),t.define("_updateCachedDimensions",function(){var t=this;return c.read(function(){var e,n=v(t.sandboxEl);"visible"==t.sandboxEl.style.visibility?t._width=n.width:(e=v(t.sandboxEl.parentElement).width,t._width=Math.min(n.width,e)),t._height=n.height})}),t.define("_setTargetToBlank",function(){var t=this.createElement("base");t.target="_blank",this.doc.head.appendChild(t)}),t.define("_didResize",function(){var t=this,e=this._resizeHandlers.slice(0);return this._updateCachedDimensions().then(function(){e.forEach(function(e){e(t)})})}),t.define("setTitle",function(t){this.iframeEl.title=t}),t.override("createElement",function(t){return this.doc.createElement(t)}),t.override("createFragment",function(){return this.doc.createDocumentFragment()}),t.override("htmlToElement",function(t){var e;return e=this.createElement("div"),e.innerHTML=t,e.firstElementChild}),t.override("hasSelectedText",function(){return!!d.getSelectedText(this.win)}),t.override("addRootClass",function(t){var e=this.rootEl;return t=Array.isArray(t)?t:[t],this.initialized?c.write(function(){t.forEach(function(t){u.add(e,t)})}):y.reject(new Error("sandbox not initialized"))}),t.override("removeRootClass",function(t){var e=this.rootEl;return t=Array.isArray(t)?t:[t],this.initialized?c.write(function(){t.forEach(function(t){u.remove(e,t)})}):y.reject(new Error("sandbox not initialized"))}),t.override("hasRootClass",function(t){return u.present(this.rootEl,t)}),t.define("addStyleSheet",function(t,e){var n,r=new g;return this.initialized?(n=this.createElement("link"),n.type="text/css",n.rel="stylesheet",n.href=t,n.addEventListener("load",r.resolve,!1),n.addEventListener("error",r.reject,!1),c.write(E(e,null,n)).then(function(){return l(t).then(r.resolve,r.reject),r.promise})):y.reject(new Error("sandbox not initialized"))}),t.override("prependStyleSheet",function(t){var e=this.doc;return this.addStyleSheet(t,function(t){var n=e.head.firstElementChild;return n?e.head.insertBefore(t,n):e.head.appendChild(t)})}),t.override("appendStyleSheet",function(t){var e=this.doc;return this.addStyleSheet(t,function(t){return e.head.appendChild(t)})}),t.define("addCss",function(t,e){var n;return h.inlineStyle()?(n=this.createElement("style"),n.type="text/css",n.appendChild(this.doc.createTextNode(t)),c.write(E(e,null,n))):y.resolve()}),t.override("prependCss",function(t){var e=this.doc;return this.addCss(t,function(t){var n=e.head.firstElementChild;return n?e.head.insertBefore(t,n):e.head.appendChild(t)})}),t.override("appendCss",function(t){var e=this.doc;return this.addCss(t,function(t){return e.head.appendChild(t)})}),t.override("makeVisible",function(){var t=this;return this.styleSelf(C).then(function(){t._updateCachedDimensions()})}),t.override("injectWidgetEl",function(t){var e=this;return this.initialized?this.widgetEl?y.reject(new Error("widget already injected")):c.write(function(){e.doc.body.appendChild(t)}):y.reject(new Error("sandbox not initialized"))}),t.override("matchHeightToContent",function(){var t,e=this;return c.read(function(){t=e.widgetEl?v(e.widgetEl).height:0}),c.write(function(){e.sandboxEl.style.height=t+"px"}).then(function(){return e._updateCachedDimensions()})}),t.override("matchWidthToContent",function(){var t,e=this;return c.read(function(){t=e.widgetEl?v(e.widgetEl).width:0}),c.write(function(){e.sandboxEl.style.width=t+"px"}).then(function(){return e._updateCachedDimensions()})}),t.after("initialize",function(){this._iframe=null,this._width=this._height=0,this._resizeHandlers=[]}),t.override("insert",function(t,e,n,a){var s=this,u=new g,d=this.targetGlobal.document,f=r(t,e,n,d);return c.write(E(a,null,f)),f.addEventListener("load",function(){i(f).then(null,E(o,null,t,e,n,f,d)).then(u.resolve,u.reject)},!1),f.addEventListener("error",u.reject,!1),u.promise.then(function(t){var e=p(s._didResize,P,s);return s._iframe=t,s.win.addEventListener("resize",e,!1),y.all([s._setTargetToBlank(),s.addRootClass(T),s.prependCss(I)])})}),t.override("onResize",function(t){this._resizeHandlers.push(t)}),t.after("styleSelf",function(){return this._updateCachedDimensions()})}var s=n(9),u=n(20),c=n(45),d=n(64),f=n(54),l=n(65),h=n(66),p=n(67),m=n(52),v=(n(68),n(69)),g=n(1),y=n(2),w=n(11),b=n(16),_=n(28),E=n(13),x={allowfullscreen:"true"},A={position:"absolute",visibility:"hidden",display:"block",width:"0px",height:"0px",padding:"0",border:"none"},C={position:"static",visibility:"visible"},T="SandboxRoot",I=".SandboxRoot { display: none; }",P=50;t.exports=f.couple(n(70),a)},function(t,e,n){function r(t){return t=t||o,t.getSelection&&t.getSelection()}function i(t){var e=r(t);return e?e.toString():""}var o=n(7);t.exports={getSelection:r,getSelectedText:i}},function(t,e,n){function r(t){var e=new a,n=i.createElement("img");return n.onload=n.onerror=function(){o.setTimeout(e.resolve,50)},n.src=t,o.setTimeout(e.reject,s),e.promise}var i=n(9),o=n(7),a=n(1),s=2e4;t.exports=r},function(t,e,n){function r(){return h+l.generate()}function i(){var t=r(),e=s.createElement("div"),n=s.createElement("style"),i="."+t+" { visibility: hidden; }";return!!s.body&&(f.asBoolean(c.val("widgets:csp"))&&(o=!1),void 0!==o?o:(e.style.display="none",a.add(e,t),n.type="text/css",n.appendChild(s.createTextNode(i)),s.body.appendChild(n),s.body.appendChild(e),o="hidden"===u.getComputedStyle(e).visibility,d(e),d(n),o))}var o,a=n(20),s=n(9),u=n(7),c=n(37),d=n(47),f=n(25),l=n(28),h="csptest";t.exports={inlineStyle:i}},function(t,e,n){function r(t,e,n){function r(){var s=n||this,u=arguments,c=+new Date;return i.clearTimeout(o),c-a>e?(a=c,void t.apply(s,u)):void(o=i.setTimeout(function(){r.apply(s,u)},e))}var o,a=0;return n=n||null,r}var i=n(7);t.exports=r},function(t,e,n){function r(){c("info",l.toRealArray(arguments))}function i(){c("warn",l.toRealArray(arguments))}function o(){c("error",l.toRealArray(arguments))}function a(t){m&&(p[t]=u())}function s(t){var e;m&&(p[t]?(e=u(),r("_twitter",t,e-p[t])):o("timeEnd() called before time() for id: ",t))}function u(){return f.performance&&+f.performance.now()||+new Date}function c(t,e){if(f[h]&&f[h][t])switch(e.length){case 1:f[h][t](e[0]);break;case 2:f[h][t](e[0],e[1]);break;case 3:f[h][t](e[0],e[1],e[2]);break;case 4:f[h][t](e[0],e[1],e[2],e[3]);break;case 5:f[h][t](e[0],e[1],e[2],e[3],e[4]);break;default:0!==e.length&&f[h].warn&&f[h].warn("too many params passed to logger."+t)}}var d=n(18),f=n(7),l=n(11),h=["con","sole"].join(""),p={},m=l.contains(d.href,"tw_debug=true");t.exports={info:r,warn:i,error:o,time:a,timeEnd:s}},function(t,e){function n(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height}}t.exports=n},function(t,e,n){function r(t){t.define("createElement",i),t.define("createFragment",i),t.define("htmlToElement",i),t.define("hasSelectedText",i),t.define("addRootClass",i),t.define("removeRootClass",i),t.define("hasRootClass",i),t.define("prependStyleSheet",i),t.define("appendStyleSheet",i),t.define("prependCss",i),t.define("appendCss",i),t.define("makeVisible",i),t.define("injectWidgetEl",i),t.define("matchHeightToContent",i),t.define("matchWidthToContent",i)}var i=n(71);t.exports=r},function(t,e){function n(){throw new Error("unimplemented method")}t.exports=n},function(t,e,n){function r(t,e){this._inputsQueue=[],this._task=t,this._isPaused=!1,this._flushDelay=e&&e.flushDelay||a,this._pauseLength=e&&e.pauseLength||s,this._flushTimeout=void 0}var i=n(1),o=n(13),a=100,s=3e3;r.prototype.add=function(t){var e=new i;return this._inputsQueue.push({input:t,taskDoneDeferred:e}),this._scheduleFlush(),e.promise},r.prototype._scheduleFlush=function(){this._isPaused||(clearTimeout(this._flushTimeout),this._flushTimeout=setTimeout(o(this._flush,this),this._flushDelay))},r.prototype._flush=function(){try{this._task.call(null,this._inputsQueue)}catch(t){this._inputsQueue.forEach(function(e){e.taskDoneDeferred.reject(t)})}this._inputsQueue=[],this._flushTimeout=void 0},r.prototype.pause=function(t){clearTimeout(this._flushTimeout),this._isPaused=!0,!t&&this._pauseLength&&setTimeout(o(this.resume,this),this._pauseLength)},r.prototype.resume=function(){this._isPaused=!1,this._scheduleFlush()},t.exports=r},function(t,e,n){t.exports=[n(74),n(107),n(123),n(156),n(162),n(168),n(213),n(225),n(230)]},function(t,e,n){function r(t){var e=t.getAttribute("data-show-screen-name"),n=u(t),r=t.getAttribute("href"),i=t.getAttribute("data-screen-name"),c=e?a.asBoolean(e):null,d=t.getAttribute("data-size"),f=o.decodeURL(r),l=f.recipient_id,h=t.getAttribute("data-text")||f.text,p=t.getAttribute("data-welcome-message-id")||f.welcomeMessageId;return s.aug(n,{screenName:i,showScreenName:c,size:d,text:h,userId:l,welcomeMessageId:p})}function i(t){var e=c(t,f);return e.map(function(t){return d(r(t),t.parentNode,t)})}var o=n(24),a=n(25),s=n(11),u=n(75),c=n(77)(),d=n(80),f="a.twitter-dm-button";t.exports=i},function(t,e,n){function r(t){var e=t.href&&t.href.split("?")[1],n=e?a.decode(e):{},r={lang:u(t),width:t.getAttribute("data-width")||t.getAttribute("width"),height:t.getAttribute("data-height")||t.getAttribute("height"),related:t.getAttribute("data-related"),partner:t.getAttribute("data-partner")};return o.asBoolean(t.getAttribute("data-dnt"))&&i.setOn(),s.forIn(r,function(t,e){var r=n[t];n[t]=o.hasValue(r)?r:e}),n}var i=n(33),o=n(25),a=n(24),s=n(11),u=n(76);t.exports=r},function(t,e,n){function r(t){var e;if(t)return e=t.lang||t.getAttribute("data-lang"),i.isType("string",e)?e:r(t.parentElement)}var i=n(11);t.exports=r},function(t,e,n){var r=n(78),i=n(28);t.exports=function(){var t="data-twitter-extracted-"+i.generate();return function(e,n){function i(e){return!e.hasAttribute(t)}function o(e){return e.setAttribute(t,"true"),e}return r(e,n).filter(i).map(o)}}},function(t,e,n){function r(t,e){return o(t,e)?[t]:i.toRealArray(t.querySelectorAll(e))}var i=n(11),o=n(79);t.exports=r},function(t,e,n){function r(t,e){if(a)return a.call(t,e)}var i=n(7),o=i.HTMLElement,a=o.prototype.matches||o.prototype.matchesSelector||o.prototype.webkitMatchesSelector||o.prototype.mozMatchesSelector||o.prototype.msMatchesSelector||o.prototype.oMatchesSelector;t.exports=r},function(t,e,n){function r(t,e,n){return new i(o,a,"twitter-dm-button",t,e,n)}var i=n(81),o=n(82),a=n(103);t.exports=r},function(t,e){function n(t,e,n,r,i,o){this.factory=t,this.Sandbox=e,this.srcEl=o,this.targetEl=i,this.parameters=r,this.className=n}n.prototype.destroy=function(){this.srcEl=this.targetEl=null},t.exports=n},function(t,e,n){function r(t,e){var r=new i;return n.e(1,function(i,o){var a;if(i)return r.reject(i);try{a=n(83),r.resolve(new a(t,e))}catch(t){r.reject(t)}}),r.promise}var i=n(1);t.exports=r},,function(t,e,n){var r=n(55),i=n(85),o=n(13);r=Object.create(r),r.build=o(r.build,null,i),t.exports=r},function(t,e,n){function r(){i.apply(this,arguments),this.Widget=this.Component}var i=n(59),o=n(11),a=n(86);r.prototype=Object.create(i.prototype),o.aug(r.prototype,{factory:a,build:function(){var t=i.prototype.build.apply(this,arguments);return t},selectors:function(t){var e=this.Widget.prototype.selectors;t=t||{},this.Widget.prototype.selectors=o.aug({},t,e)}}),t.exports=r},function(t,e,n){function r(){function t(t,n){e.apply(this,arguments),this.id=d+c(),this.sandbox=n}var e=a();return t.prototype=Object.create(e.prototype),s.aug(t.prototype,{selectors:{},hydrate:function(){return i.resolve()},prepForInsertion:function(){},render:function(){return i.resolve()},show:function(){return i.resolve()},resize:function(){return i.resolve()},select:function(t,e){return 1===arguments.length&&(e=t,t=this.el),t?(e=this.selectors[e]||e,s.toRealArray(t.querySelectorAll(e))):[]},selectOne:function(){return this.select.apply(this,arguments)[0]},selectLast:function(){return this.select.apply(this,arguments).pop()},on:function(t,e,n){function r(t){s.addEventListener(t,n,!1)}function i(t){o.delegate(s,t,a,n)}var a,s=this.el;this.el&&(t=(t||"").split(/\s+/),2===arguments.length?n=e:a=e,a=this.selectors[a]||a,n=u(n,this),t.forEach(a?i:r))}}),t}var i=n(2),o=n(19),a=n(61),s=n(11),u=n(13),c=n(87),d="twitter-widget-";t.exports=r},function(t,e){function n(){return String(r++)}var r=0;t.exports=n},,function(t,e,n){function r(t){return"dark"===t?"dark":"light"}function i(t,e,n){var i,o;return n=r(n),i=s.isRtlLang(e)?"rtl":"ltr",o=[t,c.css,n,i,"css"].join("."),u.base()+"/css/"+o}function o(){return u.base()+"/css/"+["periscope_on_air",c.css,"css"].join(".")}function a(){return u.base()+"/css/"+["dm_button",c.css,"css"].join(".")}var s=n(90),u=n(93),c=n(94),d=n(13);t.exports={dmButton:a,tweet:d(i,null,"tweet"),timeline:d(i,null,"timeline"),video:d(i,null,"video"),moment:d(i,null,"moment"),grid:d(i,null,"grid"),periscopeOnAir:o}},function(t,e,n){function r(t){return t=String(t).toLowerCase(),o.contains(s,t)}function i(t){return t=(t||"").toLowerCase(),t=t.replace("_","-"),a(t)?t:(t=t.replace(/\-.*/,""),a(t)?t:"en")}var o=n(11),a=n(91),s=["ar","fa","he","ur"];t.exports={isRtlLang:r,matchLanguage:i}},function(t,e,n){function r(t){return"en"===t||i.contains(o,t)}var i=n(11),o=n(92);t.exports=r},function(t,e){t.exports=["hi","zh-cn","fr","zh-tw","msa","fil","fi","sv","pl","ja","ko","de","it","pt","es","ru","id","tr","da","no","nl","hu","fa","ar","ur","he","th","cs","uk","vi","ro","bn","el","en-gb","gu","kn","mr","ta","bg","ca","hr","sr","sk"]},function(t,e,n){function r(t){var e=o.get("host");return a(t)+"://"+e}var i=n(18),o=n(16),a=function(){return/^http\:$/.test(i.protocol)?function(t){return t?"https":"http"}:function(){return"https"}}();t.exports={base:r}},function(t,e){t.exports={css:"3a5bba37d8a97ff1a6185653efe28c38"}},,function(t,e,n){function r(t){t.define("injectRefUrlParams",function(t){t.getAttribute(a)||(t.setAttribute(a,!0),t.href=i(t.href))}),t.after("render",function(){this.on("click","A",function(t,e){o.isTwitterURL(e.href)&&this.injectRefUrlParams(e)})})}var i=n(97),o=n(23),a="data-url-ref-attrs-injected";t.exports=r},function(t,e,n){function r(t){return i.url(t,{ref_src:a,ref_url:o.rootDocumentLocation()})}var i=n(24),o=n(34),a="twsrc^tfw";t.exports=r},function(t,e,n){function r(t){t.define("scribeNamespace",function(){return{client:"tfw"}}),t.define("scribeData",function(){return{widget_origin:a.rootDocumentLocation(),widget_frame:a.isFramed()&&a.currentDocumentLocation()}}),t.define("scribe",function(t,e,n){t=s.aug(this.scribeNamespace(),t||{}),e=s.aug(this.scribeData(),e||{}),i.scribe(t,e,!1,n)}),t.define("scribeInteraction",function(t,e,n){var r=o.extractTermsFromDOM(t.target);r.action=t.type,this.scribe(r,e,n)})}var i=n(50),o=n(38),a=n(34),s=n(11);t.exports=r},,function(t,e,n){function r(t){var e;if(t)return e=s([t]),{item_ids:Object.keys(e),item_details:e}}function i(t){t.selectors({tweetIdInfo:".js-tweetIdInfo"}),t.define("scribeClickInteraction",function(t,e){var n=o.closest(this.selectors.tweetIdInfo,e,this.el);this.scribeInteraction(t,r(n))}),t.after("render",function(){this.on("click","A",this.scribeClickInteraction),this.on("click","BUTTON",this.scribeClickInteraction)})}var o=n(21),a=n(84),s=n(101);t.exports=a.couple(n(98),i)},function(t,e,n){function r(t){return t?(t=Array.isArray(t)?t:[t],t.reduce(function(t,e){var n=e.getAttribute("data-tweet-id"),r=e.getAttribute("data-rendered-tweet-id")||n;return n===r?t[r]={item_type:i.TWEET}:n&&(t[r]={item_type:i.RETWEET,target_type:i.TWEET,target_id:n}),t},{})):{}}var i=n(102);t.exports=r},function(t,e){t.exports={TWEET:0,RETWEET:10,CUSTOM_TIMELINE:17,LIVE_VIDEO_EVENT:28}},function(t,e,n){var r=n(104),i=n(53);t.exports=r.isSupported()?r:i},function(t,e,n){var r=n(54),i=n(105);t.exports=r.build([i])},function(t,e,n){function r(t){t.defineStatic("isSupported",function(){return!!o.HTMLElement.prototype.createShadowRoot&&l.inlineStyle()&&!h.android()}),t.overrideProperty("id",{get:function(){return this.sandboxEl&&this.sandboxEl.id}}),t.overrideProperty("initialized",{get:function(){return!!this._shadowHost}}),t.overrideProperty("width",{get:function(){return this._width}}),t.overrideProperty("height",{get:function(){return this._height}}),t.overrideProperty("sandboxEl",{get:function(){return this._shadowHost}}),t.define("_updateCachedDimensions",function(){var t=this;return u.read(function(){var e,n=p(t.sandboxEl);"visible"==t.sandboxEl.style.visibility?t._width=n.width:(e=p(t.sandboxEl.parentElement).width,t._width=Math.min(n.width,e)),t._height=n.height})}),t.define("_didResize",function(){var t=this,e=this._resizeHandlers.slice(0);return this._updateCachedDimensions().then(function(){e.forEach(function(e){e(t)})})}),t.override("createElement",function(t){return this.targetGlobal.document.createElement(t)}),t.override("createFragment",function(){return this.targetGlobal.document.createDocumentFragment()}),t.override("htmlToElement",function(t){var e;return e=this.createElement("div"),e.innerHTML=t,e.firstElementChild}),t.override("hasSelectedText",function(){return!!c.getSelectedText(this.targetGlobal)}),t.override("addRootClass",function(t){var e=this._shadowRootBody;return t=Array.isArray(t)?t:[t],this.initialized?u.write(function(){t.forEach(function(t){a.add(e,t)})}):g.reject(new Error("sandbox not initialized"))}),t.override("removeRootClass",function(t){var e=this._shadowRootBody;return t=Array.isArray(t)?t:[t],this.initialized?u.write(function(){t.forEach(function(t){a.remove(e,t)})}):g.reject(new Error("sandbox not initialized"))}),t.override("hasRootClass",function(t){return a.present(this._shadowRootBody,t)}),t.override("addStyleSheet",function(t,e){return this.addCss('@import url("'+t+'");',e).then(function(){return f(t)})}),t.override("prependStyleSheet",function(t){var e=this._shadowRoot;return this.addStyleSheet(t,function(t){var n=e.firstElementChild;return n?e.insertBefore(t,n):e.appendChild(t)})}),t.override("appendStyleSheet",function(t){var e=this._shadowRoot;return this.addStyleSheet(t,function(t){return e.appendChild(t)})}),t.override("addCss",function(t,e){var n;return this.initialized?l.inlineStyle()?(n=this.createElement("style"),n.type="text/css",n.appendChild(this.targetGlobal.document.createTextNode(t)),u.write(m(e,null,n))):g.resolve():g.reject(new Error("sandbox not initialized"))}),t.override("prependCss",function(t){var e=this._shadowRoot;return this.addCss(t,function(t){var n=e.firstElementChild;return n?e.insertBefore(t,n):e.appendChild(t)})}),t.override("appendCss",function(t){var e=this._shadowRoot;return this.addCss(t,function(t){return e.appendChild(t)})}),t.override("makeVisible",function(){return this.styleSelf(_)}),t.override("injectWidgetEl",function(t){function e(){var t=v(n._didResize,w,n);new i(n._shadowRootBody,t)}var n=this;return this.initialized?this._shadowRootBody.firstElementChild?g.reject(new Error("widget already injected")):u.write(function(){n._shadowRootBody.appendChild(t)}).then(function(){return n._updateCachedDimensions()}).then(e):g.reject(new Error("sandbox not initialized"))}),t.override("matchHeightToContent",function(){return g.resolve()}),t.override("matchWidthToContent",function(){return g.resolve()}),t.override("insert",function(t,e,n,r){var i=this.targetGlobal.document,o=this._shadowHost=i.createElement(E),a=this._shadowRoot=o.createShadowRoot(),c=this._shadowRootBody=i.createElement("div");return y.forIn(e||{},function(t,e){o.setAttribute(t,e)}),o.id=t,a.appendChild(c),s.delegate(c,"click","A",function(t,e){e.hasAttribute("target")||e.setAttribute("target","_blank")}),g.all([this.styleSelf(b),this.addRootClass(x),this.prependCss(A),u.write(r.bind(null,o))])}),t.override("onResize",function(t){this._resizeHandlers.push(t)}),t.after("initialize",function(){this._shadowHost=this._shadowRoot=this._shadowRootBody=null,this._width=this._height=0,this._resizeHandlers=[]}),t.after("styleSelf",function(){return this._updateCachedDimensions()})}var i=n(106),o=n(7),a=n(20),s=n(19),u=n(45),c=n(64),d=n(54),f=n(65),l=n(66),h=n(8),p=n(69),m=n(13),v=n(67),g=n(2),y=n(11),w=50,b={position:"absolute",visibility:"hidden",display:"block",transform:"rotate(0deg)"},_={position:"static",visibility:"visible"},E="twitterwidget",x="SandboxRoot",A=".SandboxRoot { display: none; }";t.exports=d.couple(n(70),r)},function(t,e){!function(){var e=function(t,n){function r(){this.q=[],this.add=function(t){this.q.push(t)};var t,e;this.call=function(){for(t=0,e=this.q.length;t
',t.appendChild(t.resizeSensor),{fixed:1,absolute:1}[i(t,"position")]||(t.style.position="relative");var a,s,u=t.resizeSensor.childNodes[0],c=u.childNodes[0],d=t.resizeSensor.childNodes[1],f=(d.childNodes[0],function(){c.style.width=u.offsetWidth+10+"px",c.style.height=u.offsetHeight+10+"px",u.scrollLeft=u.scrollWidth,u.scrollTop=u.scrollHeight,d.scrollLeft=d.scrollWidth,d.scrollTop=d.scrollHeight,a=t.offsetWidth,s=t.offsetHeight});f();var l=function(){t.resizedAttached&&t.resizedAttached.call()},h=function(t,e,n){t.attachEvent?t.attachEvent("on"+e,n):t.addEventListener(e,n)},p=function(){t.offsetWidth==a&&t.offsetHeight==s||l(),f()};h(u,"scroll",p),h(d,"scroll",p)}var a=Object.prototype.toString.call(t),s="[object Array]"===a||"[object NodeList]"===a||"[object HTMLCollection]"===a||"undefined"!=typeof jQuery&&t instanceof jQuery||"undefined"!=typeof Elements&&t instanceof Elements; +if(s)for(var u=0,c=t.length;u0;return this.updateCachedDimensions().then(function(){e&&t._resizeHandlers.forEach(function(e){e(t)})})}),t.define("loadDocument",function(t){var e=new u;return this.initialized?this.iframeEl.src?c.reject(new Error("widget already loaded")):(this.iframeEl.addEventListener("load",e.resolve,!1),this.iframeEl.addEventListener("error",e.reject,!1),this.iframeEl.src=t,e.promise):c.reject(new Error("sandbox not initialized"))}),t.after("initialize",function(){this._iframe=null,this._width=this._height=0,this._resizeHandlers=[]}),t.override("insert",function(t,e,n,r){var o=this;return e=f.aug({id:t},e),n=f.aug({},l,n),this._iframe=s(e,n),p[t]=this,this.onResize(a(function(){o.makeVisible()})),i.write(d(r,null,this._iframe))}),t.override("onResize",function(t){this._resizeHandlers.push(t)}),t.after("styleSelf",function(){return this.updateCachedDimensions()})}var i=n(45),o=n(117),a=n(122),s=n(52),u=n(1),c=n(2),d=n(13),f=n(11),l={position:"absolute",visibility:"hidden",width:"0px",height:"0px"},h={position:"static",visibility:"visible"},p={};o(function(t,e,n){var r=p[t];if(r)return r.styleSelf({width:e+"px",height:n+"px"}).then(function(){r.didResize()})}),t.exports=r},function(t,e,n){function r(t){(new o).attachReceiver(new a.Receiver(i,"twttr.button")).bind("twttr.private.trigger",function(t,e){var n=c(this);s.trigger(t,{target:n,region:e,type:t,data:{}})}).bind("twttr.private.resizeButton",function(e){var n=c(this),r=n&&n.id,i=u.asInt(e.width),o=u.asInt(e.height);r&&i&&o&&t(r,i,o)})}var i=n(7),o=n(118),a=n(120),s=n(29),u=n(25),c=n(121);t.exports=r},function(t,e,n){function r(t){this.registry=t||{}}function i(t){return h.isType("string",t)?f.parse(t):t}function o(t){var e,n,r;return!!h.isObject(t)&&(e=t.jsonrpc===v,n=h.isType("string",t.method),r=!("id"in t)||a(t.id),e&&n&&r)}function a(t){var e,n,r;return e=h.isType("string",t),n=h.isType("number",t),r=null===t,e||n||r}function s(t){return h.isObject(t)&&!h.isType("function",t)}function u(t,e){return{jsonrpc:v,id:t,result:e}}function c(t,e){return{jsonrpc:v,id:a(t)?t:null,error:e}}function d(t){return p.all(t).then(function(t){return t=t.filter(function(t){return void 0!==t}),t.length?t:void 0})}var f=n(39),l=n(119),h=n(11),p=n(2),m=n(42),v="2.0";r.prototype._invoke=function(t,e){var n,r,i;n=this.registry[t.method],r=t.params||[],r=h.isType("array",r)?r:[r];try{i=n.apply(e.source||null,r)}catch(t){i=p.reject(t.message)}return m.isPromise(i)?i:p.resolve(i)},r.prototype._processRequest=function(t,e){function n(e){return u(t.id,e)}function r(){return c(t.id,l.INTERNAL_ERROR)}var i;return o(t)?(i="params"in t&&!s(t.params)?p.resolve(c(t.id,l.INVALID_PARAMS)):this.registry[t.method]?this._invoke(t,{source:e}).then(n,r):p.resolve(c(t.id,l.METHOD_NOT_FOUND)),null!=t.id?i:p.resolve()):p.resolve(c(t.id,l.INVALID_REQUEST))},r.prototype.attachReceiver=function(t){return t.attachTo(this),this},r.prototype.bind=function(t,e){return this.registry[t]=e,this},r.prototype.receive=function(t,e){var n,r,o,a=this;try{t=i(t)}catch(t){return p.resolve(c(null,l.PARSE_ERROR))}return e=e||null,n=h.isType("array",t),r=n?t:[t],o=r.map(function(t){return a._processRequest(t,e)}),n?d(o):o[0]},t.exports=r},function(t,e){t.exports={PARSE_ERROR:{code:-32700,message:"Parse error"},INVALID_REQUEST:{code:-32600,message:"Invalid Request"},INVALID_PARAMS:{code:-32602,message:"Invalid params"},METHOD_NOT_FOUND:{code:-32601,message:"Method not found"},INTERNAL_ERROR:{code:-32603,message:"Internal error"}}},function(t,e,n){function r(t,e,n){var r;t&&t.postMessage&&(g?r=(n||"")+f.stringify(e):n?(r={},r[n]=e):r=e,t.postMessage(r,"*"))}function i(t){return p.isType("string",t)?t:"JSONRPC"}function o(t,e){return e?p.isType("string",t)&&0===t.indexOf(e)?t.substring(e.length):t[e]?t[e]:void 0:t}function a(t,e){var n=t.document;this.filter=i(e),this.server=null,this.isTwitterFrame=m.isTwitterURL(n.location.href),t.addEventListener("message",v(this._onMessage,this),!1)}function s(t,e){this.pending={},this.target=t,this.isTwitterHost=m.isTwitterURL(c.href),this.filter=i(e),d.addEventListener("message",v(this._onMessage,this),!1)}function u(t){return arguments.length>0&&(g=!!t),g}var c=n(18),d=n(7),f=n(39),l=n(1),h=n(8),p=n(11),m=n(23),v=n(13),g=h.ie9();p.aug(a.prototype,{_onMessage:function(t){var e,n=this;this.server&&(this.isTwitterFrame&&!m.isTwitterURL(t.origin)||(e=o(t.data,this.filter),e&&this.server.receive(e,t.source).then(function(e){e&&r(t.source,e,n.filter)})))},attachTo:function(t){this.server=t},detach:function(){this.server=null}}),p.aug(s.prototype,{_processResponse:function(t){var e=this.pending[t.id];e&&(e.resolve(t),delete this.pending[t.id])},_onMessage:function(t){var e;if((!this.isTwitterHost||m.isTwitterURL(t.origin))&&(e=o(t.data,this.filter))){if(p.isType("string",e))try{e=f.parse(e)}catch(t){return}e=p.isType("array",e)?e:[e],e.forEach(v(this._processResponse,this))}},send:function(t){var e=new l;return t.id?this.pending[t.id]=e:e.resolve(),r(this.target,t,this.filter),e.promise}}),t.exports={Receiver:a,Dispatcher:s,_stringifyPayload:u}},function(t,e,n){function r(t){for(var e,n=i.getElementsByTagName("iframe"),r=0;e=n[r];r++)if(e.contentWindow===t)return e}var i=n(9);t.exports=r},function(t,e){function n(t){var e,n=!1;return function(){return n?e:(n=!0,e=t.apply(this,arguments))}}t.exports=n},function(t,e,n){function r(t){var e=u(t),n={collectionId:s.collectionId(t.href),chrome:t.getAttribute("data-chrome"),limit:t.getAttribute("data-limit")};return a.forIn(n,function(t,n){var r=e[t];e[t]=o.hasValue(r)?r:n}),e}function i(t){var e=c(t,f);return e.map(function(t){return d(r(t),t.parentNode,t)})}var o=n(25),a=n(11),s=n(23),u=n(75),c=n(77)(),d=n(124),f="a.twitter-grid";t.exports=i},function(t,e,n){function r(t,e,n){return new i(o,a,"twitter-grid",t,e,n)}var i=n(81),o=n(125),a=n(53);t.exports=r},function(t,e,n){function r(t,e){var r=new i;return n.e(3,function(i,o){var a;if(i)return r.reject(i);try{a=n(126),r.resolve(new a(t,e))}catch(t){r.reject(t)}}),r.promise}var i=n(1);t.exports=r},,,,function(t,e,n){function r(t){if(t)return t.replace(/[^\w\$]/g,"_")}function i(){return f+l++}function o(t,e,n,o){var f,l,h;return o=r(o||i()),f=s.fullPath(["callbacks",o]),l=a.createElement("script"),h=new u,e=c.aug({},e,{callback:f,suppress_response_codes:!0}),s.set(["callbacks",o],function(t){var e,r;e=n(t||!1),t=e.resp,r=e.success,r?h.resolve(t):h.reject(t),l.onload=l.onreadystatechange=null,l.parentNode&&l.parentNode.removeChild(l),s.unset(["callbacks",o])}),l.onerror=function(){h.reject(new Error("failed to fetch "+l.src))},l.src=d.url(t,e),l.async="async",a.body.appendChild(l),h.promise}var a=n(9),s=n(16),u=n(1),c=n(11),d=n(24),f="cb",l=0;t.exports={fetch:o}},function(t,e,n){function r(t){var e,n;return e=t.headers&&t.headers.status,n=t&&!t.error&&200===e,!n&&t.headers&&t.headers.message&&i.warn(t.headers.message),{success:n,resp:t}}var i=n(68);t.exports=r},function(t,e){function n(){var t=9e5;return Math.floor(+new Date/t)}t.exports=n},function(t,e,n){function r(t){var e=t||[];return e.unshift("cookie/consent"),f(w,e)}function i(t){var e=t||[];return e.unshift("video/event"),f(w,e)}function o(t){var e=t||[];return e.unshift("grid/collection"),f(y,e)}function a(t){var e=t||[];return e.unshift("moments"),f(y,e)}function s(t){var e=t||[];return e.unshift("timeline"),f(y,e)}function u(t){var e=t||[];return e.unshift("widgets/timelines"),f(y,e)}function c(t){var e=t||[];return e.unshift("tweets.json"),f(y,e)}function d(t){var e=t||[];return e.unshift("widgets/video"),f(y,e)}function f(t,e){var n=[t];return e.forEach(function(t){n.push(l(t))}),n.join("/")}function l(t){var e=(t||"").toString(),n=h(e)?1:0,r=p(e)?-1:void 0;return e.slice(n,r)}function h(t){return"/"===t.slice(0,1)}function p(t){return"/"===t.slice(-1)}var m=n(16),v="https://cdn.syndication.twimg.com",g="https://syndication.twitter.com",y=m.get("backendHost")||v,w=m.get("backendHost")||g;t.exports={cookieConsent:r,eventVideo:i,grid:o,moment:a,timeline:s,timelinePreconfigured:u,tweetBatch:c,video:d}},function(t,e,n){var r=n(9),i=n(25),o=r.createElement("div");t.exports=function(t){return i.isNumber(t)&&(t+="px"),o.style.width="",o.style.width=t,o.style.width||null}},function(t,e,n){function r(t){var e=t.getBoundingClientRect(),n=i.innerWidth,r=i.innerHeight,o=e.top>r,a=e.bottom<0,s=e.left>n,u=e.right<0;return!(o||a||s||u)}var i=n(7);t.exports=r},function(t,e,n){function r(t){t.after("prepForInsertion",function(t){o.sizeIframes(t,this.sandbox.width,a,i.sync)}),t.after("resize",function(){o.sizeIframes(this.el,this.sandbox.width,a,i.write)})}var i=n(45),o=n(136),a=375;t.exports=r},function(t,e,n){function r(t){var e=t.split(" ");this.url=decodeURIComponent(e[0].trim()),this.width=+e[1].replace(/w$/,"").trim()}function i(t,e,n){var i,o,a,s;if(t=h.devicePixelRatio?t*h.devicePixelRatio:t,o=e.split(",").map(function(t){return new r(t.trim())}),n)for(s=0;s=t?n:e},o[0]),i&&i.width>a.width?i:a}function o(t,e){var n,r=t.getAttribute("data-srcset"),o=t.src;r&&(n=i(e,r,o),t.src=n.url)}function a(t,e){e=void 0!==e?!!e:v.retina(),p.toRealArray(t.getElementsByTagName("IMG")).forEach(function(t){var n=t.getAttribute("data-src-1x")||t.getAttribute("src"),r=t.getAttribute("data-src-2x");e&&r?t.src=r:n&&(t.src=n)})}function s(t,e,n){t&&(p.toRealArray(t.querySelectorAll(".NaturalImage-image")).forEach(function(t){n(function(){o(t,e)})}),p.toRealArray(t.querySelectorAll(".CroppedImage-image")).forEach(function(t){n(function(){o(t,e/2)})}),p.toRealArray(t.querySelectorAll("img.autosized-media")).forEach(function(t){n(function(){o(t,e),t.removeAttribute("width"),t.removeAttribute("height")})}))}function u(t,e,n,r){t&&p.toRealArray(t.querySelectorAll("iframe.autosized-media, .wvp-player-container")).forEach(function(t){var i=d(t.getAttribute("data-width"),t.getAttribute("data-height"),g.effectiveWidth(t.parentElement)||e,n);r(function(){t.setAttribute("width",i.width),t.setAttribute("height",i.height),y.present(t,"wvp-player-container")?(t.style.width=i.width,t.style.height=i.height):(t.width=i.width,t.height=i.height)})})}function c(t,e,n,r){s(t,e,r),u(t,e,n,r)}function d(t,e,n,r,i,o){return n=n||t,r=r||e,i=i||0,o=o||0,t>n&&(e*=n/t,t=n),e>r&&(t*=r/e,e=r),t=0;n--)if(r=this.params.breakpoints[n],t>r.size){e=r.className;break}return e}),t.after("initialize",function(){this.allBreakpoints=this.params.breakpoints.map(function(t){return t.className})}),t.define("recalculateBreakpoints",function(){var t=this.getClassForWidth(this.sandbox.width);return t&&this.sandbox.hasRootClass(t)?a.resolve():a.all([this.sandbox.removeRootClass(this.allBreakpoints),this.sandbox.addRootClass(t)])}),t.after("render",function(){return this.recalculateBreakpoints()}),t.after("resize",function(){return this.recalculateBreakpoints()})}var a=n(2),s=n(25),u="env-bp-",c=u+"min";t.exports=o},,function(t,e,n){function r(t,e,n,r,i){var o=new u,a=s(t,n,r,i);if(a){var c=d.createPlayerForTweet(a.element,e,a.options);return c?(o.resolve(c),o.promise):o.reject(new Error("unable to create tweet video player"))}}function i(t,e,n,r,i){var o=new u,a=s(t,n,r,i);if(!a)return o.reject(new Error("unable to initialize event video player"));var c=d.createPlayerForLiveVideo(a.element,e,a.options);return c.on("ready",function(){c.playPreview(),o.resolve(c)}),o.promise}function o(t){var e=t.querySelector(".wvp-player-container"),n=e&&d.findPlayerForElement(e);if(n)return n.teardown()}function a(t){return d.findPlayerForElement(t)}function s(t,e,n,r){var i;r=r||{};var o={scribeContext:{client:"tfw",page:e},languageCode:n,hideControls:r.hideControls||!1,addTwitterBranding:r.addBranding||!1,widgetOrigin:r.widgetOrigin};if(i=c(t,".wvp-player-container"),i.length>0)return f&&d.setBaseUrl(f),{element:i[0],options:o}}var u=n(1),c=n(78),d=n(145),f=null;t.exports={insertForTweet:r,insertForEvent:i,remove:o,find:a}},function(t,e,n){var r;!function(i,o){r=function(){return i.TwitterVideoPlayer=o()}.call(e,n,e,t),!(void 0!==r&&(t.exports=r))}(this,function(){function t(t){if(t&&t.data&&t.data.params&&t.data.params[0]){var e=t.data.params[0],n=t.data.id;if(e&&e.context&&"TwitterVideoPlayer"===e.context){var r=e.playerId;delete e.playerId,delete e.context;var i=s[r];i&&i.processMessage(t.data.method,e,n)}}}function e(t,e,n){var r=Object.keys(n).filter(function(t){return null!=n[t]}).map(function(t){var e=n[t];return encodeURIComponent(t)+"="+encodeURIComponent(e)}).join("&");return r&&(r="?"+r),t+e+r}function n(n,i,o,u,c){var d=n.ownerDocument,f=d.defaultView;f.addEventListener("message",t),this.playerId=a++;var l={embed_source:"clientlib",player_id:this.playerId,rpc_init:1};if(this.scribeParams={},this.scribeParams.suppressScribing=u&&u.suppressScribing,!this.scribeParams.suppressScribing){if(!u.scribeContext)throw"video_player: Missing scribe context";if(!u.scribeContext.client)throw"video_player: Scribe context missing client property";this.scribeParams.client=u.scribeContext.client,this.scribeParams.page=u.scribeContext.page,this.scribeParams.section=u.scribeContext.section,this.scribeParams.component=u.scribeContext.component}this.scribeParams.debugScribe=u&&u.scribeContext&&u.scribeContext.debugScribing,this.scribeParams.scribeUrl=u&&u.scribeContext&&u.scribeContext.scribeUrl,this.promotedLogParams=u.promotedContext,this.adRequestCallback=u.adRequestCallback,u.languageCode&&(l.language_code=u.languageCode);var h=e(r,i,l);return this.videoIframe=document.createElement("iframe"),this.videoIframe.setAttribute("src",h),this.videoIframe.setAttribute("allowfullscreen",""),this.videoIframe.setAttribute("id",o),this.videoIframe.setAttribute("style","width: 100%; height: 100%; position: absolute; top: 0; left: 0;"),this.domElement=n,this.domElement.appendChild(this.videoIframe),s[this.playerId]=this,this.eventCallbacks={},this.emitEvent=function(t,e){var n=this.eventCallbacks[t];"undefined"!=typeof n&&n.forEach(function(t){t.apply(this.playerInterface,[e])}.bind(this))},this.jsonRpc=function(t){var e=this.videoIframe.contentWindow;t.jsonrpc="2.0",e&&e.postMessage&&e.postMessage(JSON.stringify(t),"*")},this.jsonRpcCall=function(t,e){this.jsonRpc({method:t,params:e})},this.jsonRpcResult=function(t,e){this.jsonRpc({result:t,id:e})},this.processMessage=function(t,e,n){switch(t){case"requestPlayerConfig":this.jsonRpcResult({scribeParams:this.scribeParams,promotedLogParams:this.promotedLogParams,squareCorners:u.squareCorners,borderRadius:u.borderRadius,hideControls:u.hideControls,embedded:u.addTwitterBranding,widgetOrigin:u.widgetOrigin},n);break;case"videoPlayerAdStart":this.emitEvent("adStart",e);break;case"videoPlayerAdEnd":this.emitEvent("adEnd",e);break;case"videoPlayerPlay":this.emitEvent("play",e);break;case"videoPlayerPause":this.emitEvent("pause",e);break;case"videoPlayerMute":this.emitEvent("mute",e);break;case"videoPlayerUnmute":this.emitEvent("unmute",e);break;case"videoPlayerPlaybackComplete":this.emitEvent("playbackComplete",e);break;case"videoPlayerReady":this.emitEvent("ready",e);break;case"videoView":this.emitEvent("view",e);break;case"debugLoggingEvent":this.emitEvent("logged",e);break;case"requestDynamicAd":"function"==typeof this.adRequestCallback?this.jsonRpcResult(this.adRequestCallback(),n):this.jsonRpcResult({},n)}},this.playerInterface={on:function(t,e){return"undefined"==typeof this.eventCallbacks[t]&&(this.eventCallbacks[t]=[]),this.eventCallbacks[t].push(e),this.playerInterface}.bind(this),off:function(t,e){if("undefined"==typeof e)delete this.eventCallbacks[t];else{var n=this.eventCallbacks[t];if("undefined"!=typeof n){var r=n.indexOf(e);r>-1&&n.splice(r,1)}}return this.playerInterface}.bind(this),play:function(){return this.jsonRpcCall("play"),this.playerInterface}.bind(this),pause:function(){return this.jsonRpcCall("pause"),this.playerInterface}.bind(this),mute:function(){return this.jsonRpcCall("mute"),this.playerInterface}.bind(this),unmute:function(){return this.jsonRpcCall("unmute"),this.playerInterface}.bind(this),playPreview:function(){return this.jsonRpcCall("autoPlayPreview"),this.playerInterface}.bind(this),pausePreview:function(){return this.jsonRpcCall("autoPlayPreviewStop"),this.playerInterface}.bind(this),updatePosition:function(t){return this.jsonRpcCall("updatePosition",[t]),this.playerInterface}.bind(this),updateLayoutBreakpoint:function(t){return this.jsonRpcCall("updateLayoutBreakpoint",[t]),this.playerInterface}.bind(this),enterFullScreen:function(){return this.jsonRpcCall("enterFullScreen"),this.playerInterface}.bind(this),exitFullScreen:function(){return this.jsonRpcCall("exitFullScreen"),this.playerInterface}.bind(this),teardown:function(){this.eventCallbacks={},n.removeChild(this.videoIframe),this.videoIframe=void 0,delete s[this.playerId]}.bind(this)},this.playerInterface}var r="https://twitter.com",i=/^https?:\/\/([a-zA-Z0-9]+\.)*twitter.com(:\d+)?$/,o={suppressScribing:!1,squareCorners:!1,hideControls:!1,addTwitterBranding:!1},a=0,s={};return{setBaseUrl:function(t){i.test(t)?r=t:window.console.error("newBaseUrl "+t+" not allowed")},createPlayerForTweet:function(t,e,r){var i="/i/videos/tweet/"+e,a="player_tweet_"+e;return new n(t,i,a,r||o)},createPlayerForDm:function(t,e,r){var i="/i/videos/dm/"+e,a="player_dm_"+e;return new n(t,i,a,r||o)},createPlayerForLiveVideo:function(t,e,r){var i="/i/videos/live_video/"+e,a="player_live_video_"+e;return new n(t,i,a,r||o)},findPlayerForElement:function(t){for(var e in s)if(s.hasOwnProperty(e)){var n=s[e];if(n&&n.domElement===t)return n.playerInterface}return null}}})},function(t,e,n){function r(t){t.selectors({clickToOpen:".js-clickToOpenTarget"}),t.define("shouldOpenTarget",function(t){var e=i.closest("A",t.target,this.el),n=this.sandbox.hasSelectedText();return!e&&!n}),t.define("openTarget",function(t,e){var n=e&&e.getAttribute(u);n&&(o(n),this.scribeOpenClick(t))}),t.define("attemptToOpenTarget",function(t,e){this.shouldOpenTarget(t)&&this.openTarget(t,e)}),t.define("scribeOpenClick",function(t){var e=s.extractTermsFromDOM(t.target),n={associations:s.formatTweetAssociation(e)};this.scribe({section:"chrome",action:"click"},n)}),t.after("render",function(){this.on("click","clickToOpen",this.attemptToOpenTarget)})}var i=n(21),o=n(147),a=n(84),s=n(38),u="data-click-to-open-target";t.exports=a.couple(n(98),r)},function(t,e,n){function r(t){a.isTwitterURL(t)&&(t=o(t)),i.open(t)}var i=n(7),o=n(97),a=n(23);t.exports=r},function(t,e,n){function r(t){t.params({productName:{required:!0},dataSource:{required:!1},related:{required:!1},partner:{fallback:d(o.val,o,"partner")}}),t.selectors({timeline:".timeline",tweetIdInfo:".js-tweetIdInfo"}),t.define("injectWebIntentParams",function(t){var e=i.closest(this.selectors.timeline,t,this.el),n=i.closest(this.selectors.tweetIdInfo,t,this.el);t.getAttribute(f)||(t.setAttribute(f,!0),t.href=u.url(t.href,{tw_w:this.params.dataSource&&this.params.dataSource.id,tw_i:n&&n.getAttribute("data-tweet-id"),tw_p:this.params.productName,related:this.params.related,partner:this.params.partner,query:e&&e.getAttribute("data-search-query"),profile_id:e&&e.getAttribute("data-profile-id"),original_referer:s.rootDocumentLocation()}))}),t.after("render",function(){this.on("click","A",function(t,e){c.isIntentURL(e.href)&&(this.injectWebIntentParams(e),a.open(e.href,this.sandbox.sandboxEl,t))})})}var i=n(21),o=n(37),a=n(22),s=n(34),u=n(24),c=n(23),d=n(13),f="data-url-params-injected";t.exports=r},function(t,e,n){function r(t){t.before("render",function(){i.ios()&&this.sandbox.addRootClass("env-ios"),i.ie9()&&this.sandbox.addRootClass("ie9"),i.touch()&&this.sandbox.addRootClass("is-touch")})}var i=n(8);t.exports=r},function(t,e,n){function r(t){t.params({pageForAudienceImpression:{required:!0}}),t.before("hydrate",function(){i.scribeAudienceImpression(this.params.pageForAudienceImpression)})}var i=n(151);t.exports=r},function(t,e,n){function r(){return d.formatGenericEventData("syndicated_impression",{})}function i(){u("tweet")}function o(){u("timeline")}function a(){u("video")}function s(){u("partnertweet")}function u(t){f.isHostPageSensitive()||l[t]||(l[t]=!0,c.scribe(d.formatClientEventNamespace({page:t,action:"impression"}),r(),d.AUDIENCE_ENDPOINT))}var c=n(32),d=n(38),f=n(36),l={};t.exports={scribeAudienceImpression:u,scribePartnerTweetAudienceImpression:s,scribeTweetAudienceImpression:i,scribeTimelineAudienceImpression:o,scribeVideoAudienceImpression:a}},function(t,e,n){function r(t){var e={action:"dimensions"},n=new o(a);t.after("show",function(){if(n.nextBoolean()){var t=this.sandbox.width,r=this.sandbox.height,i={context:t+","+r};this.scribe(e,i)}})}var i=n(84),o=n(153),a=1;t.exports=i.couple(n(98),r)},function(t,e){function n(t){this.percentage=t}n.prototype.nextBoolean=function(){return 100*Math.random() Date: Thu, 23 Mar 2017 09:55:58 -0700 Subject: [PATCH 22/49] Add all pages --- docs/beginner.html | 327 ++++++++++++++ docs/extentions.html | 215 +++++++++ docs/index.html | 12 +- docs/working_with_data.html | 850 ++++++++++++++++++++++++++++++++++++ docs/writing_queries.html | 610 ++++++++++++++++++++++++++ 5 files changed, 2008 insertions(+), 6 deletions(-) create mode 100644 docs/beginner.html create mode 100644 docs/extentions.html create mode 100644 docs/working_with_data.html create mode 100644 docs/writing_queries.html diff --git a/docs/beginner.html b/docs/beginner.html new file mode 100644 index 0000000..fa86d54 --- /dev/null +++ b/docs/beginner.html @@ -0,0 +1,327 @@ + + + + + + TaffyDB - Beginner's Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + +

Beginner's Guide

+ +

TaffyDB is very easy to get started with. This brief turtoial will introduce you to a few of the core concepts and should be enough to get started even if you aren't already a web developer.

+ +

Step 1: Creating a quick sandbox

+

It is recmmended that you download and use your own copy of TaffyDB, but for the purposes of playing around you can use the latest version right off of GitHub. If you have never created a web page before you can simply create a text document, include the code below, and save it to your desktop as test.html.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+

The script tag imports TaffyDB right onto the page.

+ +

Step 2: Your First DB

+

Let's create a DB to store some city information. You'll need another script tag and you'll be writing JavaScript.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY();
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+

Step 3: Adding records

+

You can add records on creation and via the .insert() method. Below we are doing both.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY([{name:"New York",state:"WA"},{name:"Las Vegas",state:"NV"},{name:"Boston",state:"MA"}]);
+	
+		cities.insert({name:"Portland",state:"OR"});
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+

Step 4: Your first query

+

Our city db is itself a function that accepts a filter object (an object that will be matched to records). Let's query for Boston. We will alert the .count() method to see our results.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY([{name:"New York",state:"WA"},{name:"Las Vegas",state:"NV"},{name:"Boston",state:"MA"}]);
+	
+		cities.insert({name:"Portland",state:"OR"});
+
+		alert(cities({name:"Boston"}).count());
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+ +

Step 5: Chaining methods

+

You can chain together. Below we will get the first two records from the DB and use the .each() method to alert their names.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY([{name:"New York",state:"WA"},{name:"Las Vegas",state:"NV"},{name:"Boston",state:"MA"}]);
+	
+		cities.insert({name:"Portland",state:"OR"});
+
+		cities().limit(2).each(function (r) {alert(r.name)});
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+ +

Step 6: Updating data

+

You may have noticed that New York is in the wrong state. Let's fix that and alert the new state.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY([{name:"New York",state:"WA"},{name:"Las Vegas",state:"NV"},{name:"Boston",state:"MA"}]);
+	
+		cities.insert({name:"Portland",state:"OR"});
+
+		cities({name:"New York"}).update({state:"NY"});
+
+		alert(cities({name:"New York"}).first().state);
+
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+ +

Step 7: Sorting

+

Sorting is a big part of TaffyDB using the .order() method.

+
<html>
+	<head>
+		<script src="https://github.com/typicaljoe/taffydb/raw/master/taffy.js"></script>
+		<script>
+
+		var cities = TAFFY([{name:"New York",state:"WA"},{name:"Las Vegas",state:"NV"},{name:"Boston",state:"MA"}]);
+	
+		cities.insert({name:"Portland",state:"OR"});
+
+		alert(cities().order("name").first().name);
+
+		</script>
+	</head>
+	<body>
+	</body>
+				
+</html>
+

What's next

+

There are a lot of other methods you can use against your data. Some highlights include .remove() to delete records, .get() to get an array of records, and .supplant to merge records with a string template. Continue to browse the docs for more ways to use TaffyDB.

+ + + + +
+
+ + + +
+ + +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/extentions.html b/docs/extentions.html new file mode 100644 index 0000000..5556e9d --- /dev/null +++ b/docs/extentions.html @@ -0,0 +1,215 @@ + + + + + + TaffyDB - Extensions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + +

Extending TaffyDB

+ +

TaffyDB is easy to extend. Simply use the extend method to add a new method to all TaffyDB collections on your page.

+

Here is an example that creates an "avg" method that takes a column and returns the avg value.

+
// Create a new empty database
+TAFFY.extend("avg",function (c) {
+	// This runs the query or returns the results if it has already run
+	this.context({
+           results: this.getDBI().query(this.context())
+    });
+    // setup the sum
+    var total = 0;
+    // loop over every record in the results and sum up the column.
+    TAFFY.each(this.context().results,function (r) {
+		total = total + r[c];
+    })
+    
+    // divide the total by the number of records and return
+    return total/this.context().results.length;
+});
+
+

What can you build?

+ + +
+
+ + + +
+ + +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 4fa091c..ac721ce 100644 --- a/docs/index.html +++ b/docs/index.html @@ -91,7 +91,7 @@ - TaffyDB + TaffyDB diff --git a/docs/working_with_data.html b/docs/working_with_data.html new file mode 100644 index 0000000..610040d --- /dev/null +++ b/docs/working_with_data.html @@ -0,0 +1,850 @@ + + + + + + TaffyDB - Working with data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + +

Working with data

+ +

Creating your database

+

You use the global TAFFY function to create a new database.

+
// Create a new empty database
+var db = TAFFY();
+
+// Create a new database a single object (first record)
+var db = TAFFY({record:1,text:"example"})
+
+// Create a new database using an array
+var db = TAFFY([{record:1,text:"example"}])
+
+// Create a new database using a JSON string
+var db = TAFFY('[{"record":1,"text":"example"}]')
+
+

DB Queries

+

Once you have a database you'll be able to call your variable as function. This will setup a query and return a collection of methods to work with the results of that query.

+ + + + + + + + + + +
+ db() + + Takes:
One or more Strings, Records, A Filter Objects, Arrays, or Functions. +
+ Returns:
A Query Object +
+ Used to query the database and return a method collection to start working with the data. +
+
db(); // returns all rows
+
+
+

DB Methods

+

In addition to the query function you have a couple of top level methods to use.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ db.insert() + + Takes:
An object or array of objects/json strings to insert. +
+
+ Optional: Call Event override +
true runs onInsert event (default) +
false does not onInsert event +
+ Returns:
A query pointing to the inserted records +
+ Inserts records into the database. +
+ db.merge() + + Takes:
An object or array of objects/json strings to insert. +
+
+ Optional: Key +
identity column to be used to match records against the existing db. Default "id". +
true runs onInsert for new records and onUpdate for changed records +
+
+ Optional: Call Event override +
false does not run insert or update event (default) +
true runs onInsert for new records and onUpdate for changed records +
+ Returns:
A query pointing to the changed or inserted records +
+ Inserts or replaces records in an existing db. +
+
db.insert({column:"value"}); // inserts one record
+						
+db.insert({column:"value"},false); // insert but do not call onInsert event
+
+ db.order() + + Takes:
A string listing columns to order by separated by commas.
+ Optional: Use asec, desc, logical, and logicaldesc to influencence sort direction. +
+ Returns:
true +
+ Sorts the db by column. Note that logical sorting is default.
+ Note: db.sort() is different than db().order() in that sort() changes the order of the records in the database while order() only impacts the order of results returned from a query. +
+
db.order("columnname"); // orders collection by columnname
+
+ db.store() + + Takes:
A string with the storage name for the DB
+
+ Returns:
true if data was returned from localStorage, false if no data returned +
+ Sets up a localStorage collection for a given name. If data exists already the data will be loaded into the collection. Changes are auto synced to localStorage.

+ Pass in false to terminate storing the collection (data in localstorage will be unchanged). +

+ Note: localStorage is not avaliable in all browsers. If localStorage is not found then .store() will be ignored. + +
+
db.store("name"); // starts storing records in local storage
+
+ db.settings() + + Takes:
An object. +
+ Returns:
The settings object +
+ Used to modify the following settings on each DB: +
    +
  • template: this is a template object {} that is merged with each new record as it is added
  • +
  • forcePropertyCase: (defaults null) Can be "lower" or "higher" and forces properties to a case on insert, update.
  • +
  • onInsert: function to run on record insert. The this keyword will be the new record.
  • +
  • onUpdate: function to run on record update. The this keyword will be the new record. Arg 1 will be old record. Arg 2 will be the changes.
  • +
  • onRemove: function to run on record remove. The this keyword will be the removed record.
  • +
  • onDBChange: function to run on change to the DB. The this keyword will be the entire DB.
  • +
  • cacheSize: size of cached query collection. Default to 100. Set to 0 to turn off caching.
  • +
  • name: string name for the db table to be used at a later date.
  • + +
+
+
db.settings({template:{show:true}}); // sets the template to have a show value set to true by default on all records
+
+db.settings({onUpdate:function () {alert(this)}}); // sets the onUpdate event
+
+					
+
+ +

Query Object Methods

+ +

Any call to data collections root function will return a new query object. The methods below can be used + to interact with the data.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ db().update() + + Takes:
Any: +
An object to be merged with the matching objects. +
A function that will return the modified record for update. +
Two arguments: a string column name and a value to set the column to +
+
+ Optional Call Event override +
true runs onUpdate event (default) +
false does not onUpdate event +
+ Returns:
Query Object +
+ Updates the records in the query set. +
+
db().update({column:"value"}); // sets column to "value" for all matching records
+
+db().update("column","value"); // sets column to "value" for all matching records
+
+db().update(function () {this.column = "value";return this;}); // sets column to "value" for all matching records
+
+
+db().update({column:"value"},false); // update but do not call onUpdate event
+
+ db().remove() + + Takes:
+
+ Optional Call Event override +
true runs onUpdate event (default) +
false does not onUpdate event +
+ Returns:
Count of removed records. +
+ Removes records from the database +
+
db().remove(); // removes all matching records from the database
+						
+db().remove(true); // removes but do not call onRemove event
+
+ db().filter() + + Takes:
One or more Strings, Records, A Filter Objects, Arrays, or Functions. + +
+ Returns:
Query Object +
+ See Filtering
+ Applies a sub filter and returns a new Query Object to let you access the results of the filter. +
+
db().filter({column:value});
+						
+db().filter({column:value}).count();
+
+collection({column:{gte:value}}).filter({column:{lte:value}}).count();
+					
+
+ db().order() + + Takes:
A string listing columns to order by separated by commas.
+ Optional: Use asec, desc, logical, and logicaldesc to influence sort direction. +
+ Returns:
Query Object +
+ Sorts the query results by column based. Note that logical sorting is default. + Note: db.sort() is different than db().order() in that sort() changes the order of the records in the database while order() only impacts the order of results returned from a query. + +
+
db().order("col1"); // sorts by col1 using a logical sort
+
+db().order("col1 asec, col2 asec"); // sorts by col1 then col2
+
+db().order("col1 desc"); // sorts by col1 descending
+
+db().order("col1 logicaldesc"); // sorts by col1 using a logical sort descending
+					
+
+ db().limit() + + Takes:
A number. +
+ Returns:
Query Object +
+ Limits the number of results in a query set. +
+
db().limit(15); // Limits returned results to first 15
+
+ db().start() + + Takes:
A number. +
+ Returns:
Query Object +
+ Sets the starting record number. Used for offset and paging. +
+
db().start(15); // Starts returning results at record 15
+
+ db().each() + + Takes:
A function. +
+ Returns:
Query Object +
+ Runs one or more functions once for every record in the query. +
+
db().each(function (record,recordnumber) {
+	alert(record["balance"]);
+}); // alerts the value of the balance column for each record
+
+ db().map() + + Takes:
A function. +
+ Returns:
An array of results from your function being run against the records in the query. +
+ Runs your function against each record in the query and returns the results as an array. +
+
db().map(function (record,recordnumber) {
+	return record.balance*0.2;
+}); // returns an array of numbers that are each 20% of the actual balance for each record
+
+ db().callback() + + Takes:
A function and an (optional) delay. +
+ + +Used for lazy query execution and to prevent blocking. Provided function will be called with current Quote Object after query has run in a setTimeout block. +
+
db().callback(function () {
+    alert(this.count()); // alert count of matching records					
+});
+
+ db().get() + + + + Returns:
An array of all matching records. +
+ Prefered method for extracting data. Returns an array of matching records. Also used for exporting records form the database. +
+
db().get(); // returns an array of all matching records
+
+ db().stringify() + + + + Returns:
A JSON representation of an array of all matching records. +
+ Used for exporting data as JSON text. Returns a JSON array filled with JSON objects for each record. +
+
db().stringify(); // returns a JSON array of all matching records
+
+ db().first() + + + + Returns:
A single record. +
+ Returns the first record in a record set. +
+
db().first(); // returns the first record out of all matching records.
+
+ db().last() + + + + Returns:
A single record. +
+ Returns the last record in a record set. +
+
db().last(); // returns the last record out of all matching records.
+
+ db().sum() + + Takes:
One or more column names. +
+ Returns:
A number. +
+ Returns the sum total of the column or columns passed into it. +
+
db().last("balance"); // returns the sum of the "balance" column.
+
+ db().min() + + Takes:
Column name. +
+ Returns:
A number or value. +
+ Returns the min value for the column passed in. +
+
db().min("balance"); // returns the lowest value of the "balance" column.
+
+ db().max() + + Takes:
Column name. +
+ Returns:
A number or value. +
+ Returns the max value for the column passed in. +
+
db().max("balance"); 
+// returns the highest value of the "balance" column.
+
+ db().select() + + Takes:
One or more column names. +
+ Returns:
For one column: An array of values.
+ For two or more columns: An array of arrays of values. +
+ Used to select columns out the database. Pass in column names to get back an array of values. +
+
db().select("charges","credits","balance"); 
+// returns an array of arrays in this format [[-24,20,-4]]
+
+db().select("balance"); 
+// returns an array of values in this format [-4,6,7,10]
+					
+ +
+ db().distinct() + + Takes:
One or more column names. +
+ Returns:
For one column: An array of values.
+ For two or more columns: An array of arrays of values. +
+ Used to select distinct values from the database for one or more columns. Pass in column names to get back an array of distinct values. +
+
db().distinct("title","gender"); 
+// returns an array of arrays in this format [["Mr.","Male"],["Ms.","Female"]]
+
+db().distinct("title"); 
+// returns an array of values in this format ["Mr.","Ms.","Mrs."]
+ +
+ db().supplant() + + Takes:
A string template.
+ Optional return array flag. +
+ Returns:
Defaults to a string. If return array flag is true then an array of strings with an entry for each record. +
+ Used to merge records with a template formated with {key} values to be replaced with real values from the records. +
+
db().supplant("<tr><td>{balance}</td></tr>"); 
+// returns a string in this format "<tr><td>-4</td></tr><tr><td>6</td></tr>"
+
+db().supplant("<tr><td>{balance}</td></tr>",true); 
+// returns an array of strings format ["<tr><td>-4</td></tr>","<tr><td>6</td></tr>"]
+
+ +
+ db().join() + + Takes:
1. A second db or reference to a db query.
+ 2. One or more functions to be used as join conditions or
+ An an array of one or more join conditions
+ +
+ Returns:
A db query object containing the joined rows. +
+ Used to join two dbs and/or queries together and produce a hybrid query containing the joined data.

+ [EXPERIMENTAL FEATURE] +
+ +
// City DB
+city_db = TAFFY([
+  {name:'New York',state:'NY'},
+  {name:'Las Vegas',state:'NV'},
+  {name:'Boston',state:'MA'}
+]);
+
+// State DB
+state_db = TAFFY([
+  {name: 'New York', abbreviation: 'NY'},
+  {name: 'Nevada', abbreviation: 'NV'},
+  {name: 'Massachusetts', abbreviation: 'MA'}
+]);
+
+// Conditional Join
+city_db()
+  .join( state_db, [ 'state', 'abbreviation' ]);
+
+// Conditional Join with optional ===
+city_db()
+  .join( state_db, [ 'state', '===', 'abbreviation' ]);
+  
+// Conditional Join using function
+city_db()
+  .join( state_db, function (l, r) {
+      return (l.state === r.abbreviation);
+    });
+
+ +
+ + +
+
+ + + +
+ + +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/writing_queries.html b/docs/writing_queries.html new file mode 100644 index 0000000..7f71a9a --- /dev/null +++ b/docs/writing_queries.html @@ -0,0 +1,610 @@ + + + + + + TaffyDB - Writing queries + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ + +

Writing queries

+ +

The heart of TaffyDB and any database is running queries against your data. This is done after creation of your database by calling the root function and building Filter Objects.

+
// Create a new empty database
+var db = TAFFY();
+
+// Run a query against the DB to return all rows
+db();
+
+// Real world example - remove all records
+db().remove();
+
+ +

Looking up individual records

+

Every object within a TaffyDB collection has a ___id value set by TaffyDB. This value is not intended for you to know, but is useful when building dynamic applications. This can be used to lookup a record by passing it into the root function as a string.

+
// Looks up a record based on its id
+db("T000008R000002");
+
+// Real world example - update records "status" column
+db("T000008R000002").update({status:"Active"});
+
+

This also works if you have a copy of the whole record.

+
// get the first record
+var firstRecord = db().first();
+
+// look up this record again
+db(firstRecord);
+
+// Real world example - update records "status" column
+db(firstRecord).update({status:"Active"});
+
+

Using functions

+

To give you full control over the results of your query you can always pass in a function. Just have it return true if you want the record in your final results.

+
// functional example, returns all records
+db(function () {
+	return true;
+});
+
+
+// Real world example - function returns records with a status of active
+db(function () {
+	return (this.status == "Active") ? true : false;
+});
+
+ + +

Basic queries

+

TaffyDB uses a very JavaScript centric Filter Object for looking up queries. There is no string concatenation and you can quickly compose these by hand or dynamically from within your app. The filter object is compared against each record using some business rules and if it passes the record remains in the results set.

+ +

The most common Filter Object is used simply to check if a column is equal to value.

+
// does a match for column and value
+db({column:"value"});
+
+
+// Real world example - records with a status of active
+db({status:"Active"});
+
+

This is the short form of this

+
// does a match for column and value
+db({column:{is:"value"}});
+
+
+// Real world example - records with a status of active
+db({status:{is:"Active"}});
+
+

The "is" part of this expressions can be swapped out for a variety of other comparisons as listed below.

+

Using !(bang)

+

For any comparison operator you can quote it and add a ! sign to reverse the meaning.

+
// does a match for column that is not a value
+db({column:{"!is":"value"}});
+
+// Real world example - records with a status other than of active
+db({status:{"!is":"Active"}});
+
+

Adding additional filters

+

Using the almighty comma you can add additional lookups to you Filter Object.

+
// does a match for column that is a value and column2 is a value
+db({column:"value",column2:"value"});
+
+// Real world example - records with a status of active and a role of admin
+db({status:"Active",role:"Admin"});
+
+

You can also pass in additional Filter Objects into the function

+
// does a match for column that is a value and column2 is a value
+db({column:"value"},{column2:"value"});
+
+// Real world example - records with a status of active and a role of admin
+db({status:"Active"},{role:"Admin"});
+
+

Using arrays for IN and OR

+

In a database you can use "in" to pass in a collection of values to compare against. This is possible in TaffyDB via the array.

+
// does a match for column that is one of two values
+db({column:["value","value2"]);
+
+// Real world example - records with a status of active or pending
+db({status:["Active","Pending"]});
+
+

You can also pass in an array of Filter Objects with each one being treated as a logical OR.

+
// does a match for column that is one of two values
+db([{column:"value"},{column:"value2"}]);
+
+// Real world example - records with a status of active or pending
+db([{status:"Active"},{status:"Pending"}]);
+
+

Bringing it all together

+

A real world example of a complex query.

+
// return records where the role is Admin and the status is Active. 
+// Also return records where the role is Admin, the status is Pending, and the manager_review is true
+
+db({role:"Admin"},[{status:"Active"},{status:"Pending",manager_review:true}]);
+
+

Comparison Operators

+

In addition to the default "is" operator there are a lot of other operators you can use to lookup records.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ is + + Example:
{column:{is:value}} +
+ Used to see if a column is of same type and value of supplied value. +
+ == + + Example:
{column:{'==':value}} +
+ Used to see if a column matches a supplied value using JavaScript's liberal coercion rules. +
+ === + + Example:
{column:{'===':value}} +
+ Used to see if a column is of same type and value of supplied value. +
+ isnocase + + Example:
{column:{isnocase:value}} +
+ Used to see if a column value is equal to a supplied value. Ignores case of column and value. +
+ left + + Example:
{column:{left:value}} +
+ Used to see if the start of a column is the same as a supplied value. +
+ leftnocase + + Example:
{column:{leftnocase:value}} +
+ Used to see if the start of a column is the same as a supplied value. Ignores case of column and value. +
+ right + + Example:
{column:{right:value}} +
+ Used to see if the end of a column is the same as a supplied value. +
+ rightnocase + + Example:
{column:{rightnocase:value}} +
+ Used to see if the end of a column is the same as a supplied value. Ignores case of column and value +
+ like + + Example:
{column:{like:value}} +
+ Used to see if column contains a supplied value. +
+ likenocase + + Example:
{column:{likenocase:value}} +
+ Used to see if column contains a supplied value. Ignores case of column and value +
+ regex + + Example:
{column:{regex:value}} +
+ Used to see if column matches a supplied regular expression. +
+ lt + + Example:
{column:{lt:value}} or {column:{'<':value}} +
+ Used to see if column is less than a supplied value. +
+ lte + + Example:
{column:{lte:value}} or {column:{'<=':value}} +
+ Used to see if column is less than or equal to a supplied value. +
+ gt + + Example:
{column:{gt:value}} or {column:{'>':value}} +
+ Used to see if column is greater than a supplied value. +
+ gte + + Example:
{column:{gte:value}} or {column:{'>=':value}} +
+ Used to see if column is greater than or equal to a supplied value. +
+ has + + Example:
{column:{has:value}} +
+ Used to see if column that is an object has a value or object appearing in its tree. +
+ hasAll + + Example:
{column:{hasAll:value}} +
+ Used to see if column that is an object has a value or object appearing in its tree. +
+ isSameArray + + Example:
{column:{isSameArray:value}} +
+ Used to see if column is an array and is the same as a supplied array. +
+ isSameObject + + Example:
{column:{isSameObject:value}} +
+ Used to see if column is an object and is the same as a supplied object. +
+ isString + + Example:
{column:{isString:true}} +
+ Used to see if column a string. +
+ isNumber + + Example:
{column:{isNumber:true}} +
+ Used to see if column a number. +
+ isArray + + Example:
{column:{isArray:true}} +
+ Used to see if column an array. +
+ isObject + + Example:
{column:{isObject:true}} +
+ Used to see if column an object. +
+ isFunction + + Example:
{column:{isFunction:true}} +
+ Used to see if column a function. +
+ isBoolean + + Example:
{column:{isBoolean:true}} +
+ Used to see if column a boolean (true/false). +
+ isNull + + Example:
{column:{isNull:true}} +
+ Used to see if column null. +
+ isUndefined + + Example:
{column:{isUndefined:true}} +
+ Used to see if column undefined. +
+ + + + + + +
+
+ + + +
+ + +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From e82b5ba1f286e2cb0df160e4523713b7fb024188 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 09:57:51 -0700 Subject: [PATCH 23/49] Create CNAME --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..1fb05d6 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +taffydb.com \ No newline at end of file From 455e04e296c9182644b4690921492f2ac075151b Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:13:31 -0700 Subject: [PATCH 24/49] Removed discussion list link --- docs/index.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/index.html b/docs/index.html index ac721ce..f643af8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -128,7 +128,6 @@
  • Open Issues
  • -
  • Discussion List
  • Donate
  • @@ -299,4 +298,4 @@

    Fork It!

    - \ No newline at end of file + From c5861c7348aeefde64be3e08ab5957bf7e2fc177 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:15:29 -0700 Subject: [PATCH 25/49] Fixed Nav --- docs/extentions.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/extentions.html b/docs/extentions.html index 5556e9d..5cc29bc 100644 --- a/docs/extentions.html +++ b/docs/extentions.html @@ -104,7 +104,7 @@
  • Beginner's Guide
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • @@ -212,4 +212,4 @@

    Extending TaffyDB

    - \ No newline at end of file + From 71f1abd78024a507f2350f624344355da4f51b22 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:15:54 -0700 Subject: [PATCH 26/49] Fixed Nav --- docs/beginner.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/beginner.html b/docs/beginner.html index fa86d54..c2dda42 100644 --- a/docs/beginner.html +++ b/docs/beginner.html @@ -104,7 +104,7 @@
  • Beginner's Guide
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • @@ -324,4 +324,4 @@

    What's next

    - \ No newline at end of file + From 60091ca0b9789572c4b613072f48615644b9f1c0 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:16:25 -0700 Subject: [PATCH 27/49] fixed nav --- docs/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.html b/docs/index.html index f643af8..d1eaeb4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -104,7 +104,7 @@
  • Beginner's Guide
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • From 46ac66e743767e612364aa447574a0c04168aedf Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:16:46 -0700 Subject: [PATCH 28/49] fixed nav --- docs/working_with_data.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/working_with_data.html b/docs/working_with_data.html index 610040d..73cdf44 100644 --- a/docs/working_with_data.html +++ b/docs/working_with_data.html @@ -104,7 +104,7 @@
  • Beginner's Guide
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • @@ -847,4 +847,4 @@

    Query Object Methods

    - \ No newline at end of file + From c7743c6d20f07c519154f598ebf204110a814743 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 23 Mar 2017 13:17:07 -0700 Subject: [PATCH 29/49] Fix nav --- docs/writing_queries.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/writing_queries.html b/docs/writing_queries.html index 7f71a9a..590efaa 100644 --- a/docs/writing_queries.html +++ b/docs/writing_queries.html @@ -104,7 +104,7 @@
  • Beginner's Guide
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • @@ -607,4 +607,4 @@

    Comparison Operators

    - \ No newline at end of file + From 34b32aa722e777e7bfdbb03b0dd0d7d9dd0af4ee Mon Sep 17 00:00:00 2001 From: Leo Dastur Date: Wed, 10 May 2017 19:22:47 -0700 Subject: [PATCH 30/49] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e064d8..9665eac 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ var row = products({item:2}) ``` ## Use it in Node.JS -Node is easy to use in Node.JS. Simply install using `npm` and `require` the +TaffyDB is easy to use in Node.JS. Simply install using `npm` and `require` the package: ```js From 45644f10d903d233b64e667ef6d2e386ad993c80 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Tue, 30 May 2017 14:02:05 -0700 Subject: [PATCH 31/49] Fixed bottom nav --- docs/index.html | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/docs/index.html b/docs/index.html index d1eaeb4..ef0dfb2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -228,19 +228,19 @@

    Modify data on the fly

    Beginner's Guide

    A quick intro to getting your first DB up in running from scratch.

    -

    View details »

    +

    View details »

    Writing queries

    The heart of TaffyDB and any database is running queries against your data. This is done after creation of your database by calling the root function and building Filter Objects.

    -

    View details »

    +

    View details »

    Using and modifying data

    The basics for ordering, inserting, updating, deleting, and using your data in an application.

    -

    View details »

    +

    View details »

    @@ -248,13 +248,7 @@

    Using and modifying data

    Extensions

    TaffyDB is easy to extend. Write your own plugins or model whole applications with TaffyDB as the backbone.

    -

    View details »

    -
    -
    -

    Discussion List

    -

    A great place to get help, suggest ideas, and contribute to the TaffyDB community.

    -

    View details »

    - +

    View details »

    Fork It!

    From 9d9e257ad0a438abafdd8c345653763bdace4904 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:06:54 -0700 Subject: [PATCH 32/49] fixed donate button and nav --- docs/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.html b/docs/index.html index ef0dfb2..9498153 100644 --- a/docs/index.html +++ b/docs/index.html @@ -99,12 +99,12 @@
    @@ -129,7 +129,7 @@
  • Open Issues
  • -
  • Donate +
  • Donate
  • From 917d632cd19c39589ba02ddff01cb5e90ab3b82a Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:10:39 -0700 Subject: [PATCH 33/49] Update index.html --- docs/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/index.html b/docs/index.html index 9498153..349f190 100644 --- a/docs/index.html +++ b/docs/index.html @@ -122,14 +122,14 @@
  • Download
  • Source Code
  • -
    + - +
  • Open Issues
  • -
  • Donate +
  • Donate
  • From 4c5e9bb342643e6ce56a59a8030d1884f442e244 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:15:16 -0700 Subject: [PATCH 34/49] fixed donate and nav --- docs/beginner.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/beginner.html b/docs/beginner.html index c2dda42..a4df540 100644 --- a/docs/beginner.html +++ b/docs/beginner.html @@ -101,10 +101,10 @@ @@ -122,14 +122,14 @@
  • Download
  • Source Code
  • -
    + - +
  • Open Issues
  • -
  • Donate +
  • Donate
  • From 2e0bab794163b52cdfdad8aa56faf24a9fa45ea6 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:16:12 -0700 Subject: [PATCH 35/49] Fixed donate button --- docs/extentions.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/extentions.html b/docs/extentions.html index 5cc29bc..2873c4d 100644 --- a/docs/extentions.html +++ b/docs/extentions.html @@ -122,14 +122,14 @@
  • Download
  • Source Code
  • -
    + - +
  • Open Issues
  • -
  • Donate +
  • Donate
  • From 1925f4f61f062e74969073f9b9d11f6cdc810db1 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:18:12 -0700 Subject: [PATCH 36/49] fixed nav and donate button --- docs/working_with_data.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/working_with_data.html b/docs/working_with_data.html index 73cdf44..6d1b0cb 100644 --- a/docs/working_with_data.html +++ b/docs/working_with_data.html @@ -103,8 +103,8 @@
  • Download
  • Beginner's Guide
  • Writing Queries
  • -
  • Working With Data
  • -
  • Extensions
  • +
  • Working With Data
  • +
  • Extensions
  • @@ -122,14 +122,14 @@
  • Download
  • Source Code
  • -
    + - +
  • Open Issues
  • -
  • Donate +
  • Donate
  • From c3e126e09b75352d981b1ee841f5ffde71c536e4 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Mon, 21 Aug 2017 13:19:22 -0700 Subject: [PATCH 37/49] Fixed nav and donate button --- docs/writing_queries.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/writing_queries.html b/docs/writing_queries.html index 590efaa..2fd51c0 100644 --- a/docs/writing_queries.html +++ b/docs/writing_queries.html @@ -102,9 +102,9 @@
  • Home
  • Download
  • Beginner's Guide
  • -
  • Writing Queries
  • +
  • Writing Queries
  • Working With Data
  • -
  • Extensions
  • +
  • Extensions
  • @@ -122,14 +122,14 @@
  • Download
  • Source Code
  • -
    + - +
  • Open Issues
  • -
  • Donate +
  • Donate
  • From 6a2804c655c23e61e2f5e09491cdedf97ac0ea24 Mon Sep 17 00:00:00 2001 From: Jose Miguel Colella Date: Fri, 6 Apr 2018 22:34:52 -0400 Subject: [PATCH 38/49] Include License file You mention in the README that this is an open-source database. This includes a license that makes your software truly open source. This repository is probably not being updated, but for the many developers that are using taffydb as a dependency in an enterprise environment, this makes taffydb appear as a license risk. --- License | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 License diff --git a/License b/License new file mode 100644 index 0000000..23ee1b9 --- /dev/null +++ b/License @@ -0,0 +1,7 @@ +Copyright 2018 joe@taffydb.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 8d2b6697221843f044afdf4282ebd5e7b8ae9cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Beumier?= Date: Thu, 12 Sep 2019 12:32:51 +0200 Subject: [PATCH 39/49] small typo fixed --- docs/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.html b/docs/index.html index 349f190..0f9c0c4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -153,7 +153,7 @@

    The JavaScript Database

    An opensouce library that brings database features into your JavaScript applications.

    Introduction

    -

    How you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have something that looks a lot like a database table? TaffyDB is a libary to bring powerful database funtionality to that concept and rapidly improve the way you work with data inside of JavaScript.

    +

    How you ever noticed how JavaScript object literals look a lot like records? And that if you wrap a group of them up in an array you have something that looks a lot like a database table? TaffyDB is a library to bring powerful database funtionality to that concept and rapidly improve the way you work with data inside of JavaScript.

    What makes it sticky

    From 07c07a467deaddc2a8a7578b6908660ca5907785 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 14 Jan 2021 10:01:44 -0800 Subject: [PATCH 40/49] Update CNAME --- docs/CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CNAME b/docs/CNAME index 1fb05d6..91867a1 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -taffydb.com \ No newline at end of file +d.com \ No newline at end of file From e44d6e2f65aa5765c3771ee29e7a64386a831876 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 14 Jan 2021 10:01:56 -0800 Subject: [PATCH 41/49] Update CNAME --- docs/CNAME | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CNAME b/docs/CNAME index 91867a1..1fb05d6 100644 --- a/docs/CNAME +++ b/docs/CNAME @@ -1 +1 @@ -d.com \ No newline at end of file +taffydb.com \ No newline at end of file From d63eaf1810250097858fe3284661a825c04853ea Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 14 Jan 2021 13:23:51 -0800 Subject: [PATCH 42/49] Delete CNAME --- docs/CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 1fb05d6..0000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -taffydb.com \ No newline at end of file From d4870cee370abffe510ba598b02e4e7ad6af5d2a Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 14 Jan 2021 13:26:16 -0800 Subject: [PATCH 43/49] Create CNAME --- docs/CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/CNAME diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..1fb05d6 --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +taffydb.com \ No newline at end of file From 19b49c07ed6af7320cc068e442e17fc2fe8f2184 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 14:57:12 -0700 Subject: [PATCH 44/49] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 9665eac..c2e5f21 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,6 @@ happy to include it in the suite, time permitting. View more docs and examples, get support, and get notified of updates: Web: http://taffydb.com -Twitter: http://twitter.com/biastoact ## Software License Agreement (BSD License) Copyright (c) From 3f3063cc553893d43ad919e09346660d37f3c8fe Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 14:58:30 -0700 Subject: [PATCH 45/49] Update index.html --- docs/index.html | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/index.html b/docs/index.html index 0f9c0c4..153dace 100644 --- a/docs/index.html +++ b/docs/index.html @@ -129,15 +129,7 @@
  • Open Issues
  • -
  • Donate -
  • - - - - - - - + From f95427739d3535b254a6a93a086167a06808bc36 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 14:58:55 -0700 Subject: [PATCH 46/49] Update extentions.html --- docs/extentions.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/extentions.html b/docs/extentions.html index 2873c4d..3998209 100644 --- a/docs/extentions.html +++ b/docs/extentions.html @@ -129,14 +129,6 @@
  • Open Issues
  • -
  • Donate -
  • - - - - - - From 4dafd7c6126faefb12c873d050b0150d4ba4e155 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 14:59:28 -0700 Subject: [PATCH 47/49] Update beginner.html --- docs/beginner.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/beginner.html b/docs/beginner.html index a4df540..19a6b33 100644 --- a/docs/beginner.html +++ b/docs/beginner.html @@ -129,14 +129,6 @@
  • Open Issues
  • -
  • Donate -
  • - - - - - - From 0b687c2d77868cf9c63db53831d171ac189f0628 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 14:59:56 -0700 Subject: [PATCH 48/49] Update working_with_data.html --- docs/working_with_data.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/working_with_data.html b/docs/working_with_data.html index 6d1b0cb..863b869 100644 --- a/docs/working_with_data.html +++ b/docs/working_with_data.html @@ -129,13 +129,6 @@
  • Open Issues
  • -
  • Donate -
  • - - - - - From 5e208249202e314d8706c49f7895169544b985f1 Mon Sep 17 00:00:00 2001 From: typicaljoe Date: Thu, 15 Jun 2023 15:00:17 -0700 Subject: [PATCH 49/49] Update writing_queries.html --- docs/writing_queries.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/writing_queries.html b/docs/writing_queries.html index 2fd51c0..ce6ae1e 100644 --- a/docs/writing_queries.html +++ b/docs/writing_queries.html @@ -129,14 +129,6 @@
  • Open Issues
  • -
  • Donate -
  • - - - - - -