aboutsummaryrefslogtreecommitdiff
path: root/public/javascripts
diff options
context:
space:
mode:
authorBrandon Mathis <brandon@imathis.com>2011-05-15 18:33:00 -0400
committerBrandon Mathis <brandon@imathis.com>2011-05-15 18:33:00 -0400
commitc7d5365f81552cae16bbb91696ca3e67b4a0a2e9 (patch)
tree76c57e41828a3492535cde7fe82bef98ccea0eb4 /public/javascripts
parente4c2d5790bac6a74037638fde049c374fc44cc7b (diff)
downloadmy_new_personal_website-c7d5365f81552cae16bbb91696ca3e67b4a0a2e9.tar.xz
my_new_personal_website-c7d5365f81552cae16bbb91696ca3e67b4a0a2e9.zip
major refactoring, improved file watching, changed site to public to support rack via pow (http://pow.cx) also implemented the basics of a 320 and up design refresh on the classic theme. This should make it great for mobile reading
Diffstat (limited to 'public/javascripts')
-rw-r--r--public/javascripts/libs/DOMAssistantCompressed-2.8.js4
-rw-r--r--public/javascripts/libs/ios-viewport-scaling-bug-fix.js20
-rw-r--r--public/javascripts/libs/modernizr-1.7.min.js2
-rw-r--r--public/javascripts/libs/respond.js8
-rw-r--r--public/javascripts/libs/selectivizr-min.js5
-rw-r--r--public/javascripts/mootools-1.2.4.2-more.js100
-rw-r--r--public/javascripts/mootools-more-1.3.1.1.js1322
-rw-r--r--public/javascripts/mootools-yui-compressed.js5492
-rw-r--r--public/javascripts/octopress.js76
-rw-r--r--public/javascripts/pinboard.js2
-rw-r--r--public/javascripts/twitter.js108
11 files changed, 103 insertions, 7036 deletions
diff --git a/public/javascripts/libs/DOMAssistantCompressed-2.8.js b/public/javascripts/libs/DOMAssistantCompressed-2.8.js
new file mode 100644
index 00000000..ff9ef9e0
--- /dev/null
+++ b/public/javascripts/libs/DOMAssistantCompressed-2.8.js
@@ -0,0 +1,4 @@
+// Developed by Robert Nyman/DOMAssistant team, code/licensing: http://domassistant.googlecode.com/, documentation: http://www.domassistant.com/documentation, version 2.8
+var DOMAssistant=function(){var j=function(){},o=window,g=o.$,k=o.$$,d=/*@cc_on!@*/false,i=d&&parseFloat(navigator.appVersion)<6,h,c={},q={},a=true,n=Array.prototype.slice,p={accesskey:"accessKey","class":"className",colspan:"colSpan","for":"htmlFor",maxlength:"maxLength",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",valign:"vAlign",cellspacing:"cellSpacing",cellpadding:"cellPadding"},m={rules:/\s*,\s*/g,selector:/^(\w+|\*)?(#[\w\u00C0-\uFFFF\-=$]+)?((\.[\w\u00C0-\uFFFF\-]+)*)?((\[\w+\s*([~^$*|])?(=\s*([-\w\u00C0-\uFFFF\s.]+|"[^"]*"|'[^']*'))?\]+)*)?((:\w[-\w]*(\((odd|even|\-?\d*n?([-+]\d+)?|[:#]?[-\w\u00C0-\uFFFF.]+|"[^"]*"|'[^']*'|((\w*\.[-\w\u00C0-\uFFFF]+)*)?|(\[#?\w+([~^$*|])?=?[-\w\u00C0-\uFFFF\s.'"]+\]+)|(:\w[-\w]*\(.+\)))\))?)*)?([+>~])?/,selectorSplit:/(?:\[.*\]|\(.*\)|[^\s+>~[(])+|[+>~]/g,id:/^#([-\w\u00C0-\uFFFF=$]+)$/,tag:/^\w+/,relation:/^[+>~]$/,pseudo:/^:(\w[-\w]*)(\((.+)\))?$/,pseudos:/:(\w[-\w]*)(\((([^(]+)|([^(]+\([^(]+)\))\))?/g,attribs:/\[(\w+)\s*([~^$*|])?(=)?\s*([^\[\]]*|"[^"]*"|'[^']*')?\](?=$|\[|:|\s)/g,classes:/\.([-\w\u00C0-\uFFFF]+)/g,quoted:/^["'](.*)["']$/,nth:/^((odd|even)|([1-9]\d*)|((([1-9]\d*)?)n([-+]\d+)?)|(-(([1-9]\d*)?)n\+(\d+)))$/,special:/(:check|:enabl|\bselect)ed\b/},f=function(t,u,r){var s=t.tagName;while((t=t[u+"Sibling"])&&(t.nodeType!==1||(r?t.tagName!==s:t.tagName==="!"))){}return t},b=function(r){return typeof r!=="undefined"},l=function(r){return(l=r[0].compareDocumentPosition?function(s){return s.sort(function(u,t){return 3-(u.compareDocumentPosition(t)&6)})}:d?function(s){return s.sort(function(u,t){return u.sourceIndex-t.sourceIndex})}:function(s){return s.sort(function(w,u){var v=document.createRange(),t=document.createRange();v.setStart(w,0);v.setEnd(w,0);t.setStart(u,0);t.setEnd(u,0);return v.compareBoundaryPoints(Range.START_TO_END,t)})})(r)};var e=function(s,r){s.push.apply(s,n.apply(r));return s};if(d){e=function(t,s){if(s.slice){return t.concat(s)}var r=0,u;while((u=s[r++])){t[t.length]=u}return t}}return{isIE:d,camel:p,def:b,allMethods:[],publicMethods:["prev","next","hasChild","cssSelect","elmsByClass","elmsByAttribute","elmsByTag"],harmonize:function(){o.$=g;o.$$=k;return this},initCore:function(){this.applyMethod.call(o,"$",this.$);this.applyMethod.call(o,"$$",this.$$);o.DOMAssistant=this;if(d){j=Array}j.prototype=[];(function(r){r.each=function(v,u){for(var t=0,s=this.length;t<s;t++){if(v.call(u||this[t],this[t],t,this)===false){break}}return this};r.first=function(){return b(this[0])?DOMAssistant.addMethodsToElm(this[0]):null};r.end=function(){return this.previousSet};r.indexOf=r.indexOf||function(u){for(var t=0,s=this.length;t<s;t++){if(t in this&&this[t]===u){return t}}return -1};r.map=function(w,v){var u=[];for(var t=0,s=this.length;t<s;t++){if(t in this){u[t]=w.call(v||this[t],this[t],t,this)}}return u};r.filter=function(w,v){var u=new j();u.previousSet=this;for(var t=0,s=this.length;t<s;t++){if(t in this&&w.call(v||this[t],this[t],t,this)){u.push(this[t])}}return u};r.every=function(v,u){for(var t=0,s=this.length;t<s;t++){if(t in this&&!v.call(u||this[t],this[t],t,this)){return false}}return true};r.some=function(v,u){for(var t=0,s=this.length;t<s;t++){if(t in this&&v.call(u||this[t],this[t],t,this)){return true}}return false}})(j.prototype);this.attach(this)},addMethods:function(r,s){if(!b(this.allMethods[r])){this.allMethods[r]=s;this.addHTMLArrayPrototype(r,s)}},addMethodsToElm:function(s){for(var r in this.allMethods){if(b(this.allMethods[r])){this.applyMethod.call(s,r,this.allMethods[r])}}return s},applyMethod:function(s,r){if(typeof this[s]!=="function"){this[s]=r}},attach:function(t){var r=t.publicMethods;if(!b(r)){for(var v in t){if(v!=="init"&&b(t[v])){this.addMethods(v,t[v])}}}else{if(r.constructor===Array){for(var s=0,u;(u=r[s]);s++){this.addMethods(u,t[u])}}}if(typeof t.init==="function"){t.init()}},addHTMLArrayPrototype:function(r,s){j.prototype[r]=function(){var v=new j();v.previousSet=this;for(var u=0,t=this.length;u<t;u++){v.push(s.apply(DOMAssistant.$$(this[u]),arguments))}return v}},cleanUp:function(u){var s=u.all||u.getElementsByTagName("*");for(var r=0,t;(t=s[r++]);){if(t.hasData&&t.hasData()){if(t.removeEvent){t.removeEvent()}t.unstore()}}u.innerHTML=""},setCache:function(r){a=r},$:function(){var u=arguments[0];if(arguments.length===1&&(typeof u==="object"||(typeof u==="function"&&!!u.nodeName))){return DOMAssistant.$$(u)}var w=!!u?new j():null;for(var s=0,r,v;(r=arguments[s]);s++){if(typeof r==="string"){r=r.replace(/^[^#\(]*(#)/,"$1");if(m.id.test(r)){if((v=DOMAssistant.$$(r.substr(1),false))){w.push(v)}}else{var t=(document.all||document.getElementsByTagName("*")).length;w=(!document.querySelectorAll&&a&&q.rule&&q.rule===r&&q.doc===t)?q.elms:e(w,DOMAssistant.cssSelection.call(document,r));q={rule:r,elms:w,doc:t}}}}return w},$$:function(x,u){var w=(typeof x==="object"||typeof x==="function"&&!!x.nodeName)?x:document.getElementById(x),v=b(u)?u:true,t=function(z){var y=z.id;return typeof y!=="object"?y:z.attributes.id.nodeValue};if(typeof x==="string"&&w&&t(w)!==x){w=null;for(var r=0,s;(s=document.all[r]);r++){if(t(s)===x){w=s;break}}}if(w&&v&&!w.next){DOMAssistant.addMethodsToElm(w)}return w},prev:function(){return DOMAssistant.$$(f(this,"previous"))},next:function(){return DOMAssistant.$$(f(this,"next"))},hasChild:function(r){return this===document||this!==r&&(this.contains?this.contains(r):!!(this.compareDocumentPosition(r)&16))},getSequence:function(v){var w,u=2,s=-1,r=-1,t=m.nth.exec(v.replace(/^0n\+/,"").replace(/^2n$/,"even").replace(/^2n+1$/,"odd"));if(!t){return null}if(t[2]){w=(t[2]==="odd")?1:2;r=(w===1)?1:0}else{if(t[3]){w=s=parseInt(t[3],10);u=0}else{if(t[4]){u=t[6]?parseInt(t[6],10):1;w=t[7]?parseInt(t[7],10):0;while(w<1){w+=u}r=(w>=u)?(w-u)%u:w}else{if(t[8]){u=t[10]?parseInt(t[10],10):1;w=s=parseInt(t[11],10);while(w>u){w-=u}r=(s>=u)?(s-u)%u:s}}}}return{start:w,add:u,max:s,modVal:r}},cssByDOM:function(v){var aU,I,D,N,av,x,ah,A,K,w,aq,aN,y,aI,at,aB=new j(),aR=aB.indexOf,ap=[],aG=[],aK=v.replace(m.rules,",").split(","),aF={};function aQ(s){s=s||ap;for(var r=s.length;r--;){s[r].added=null;s[r].removeAttribute("added")}}function C(){for(var r=aU.length;r--;){aU[r].childElms=null}}function am(t,r){for(var u=0,aX;(aX=t[u]);u++){var aW=false;for(var s=0,aV;(aV=r[s]);s++){if(aV===aX){aW=true;r.splice(s,1);break}}if(aW){t.splice(u--,1)}}return t}function E(s,r){return(d||m.special.test(r))?s[p[r.toLowerCase()]||r]:s.getAttribute(r,2)}function P(r,s){r=r?r.replace(m.quoted,"$1").replace(/(\.|\[|\])/g,"\\$1"):null;return{"^":"^"+r,"$":r+"$","*":r,"|":"^"+r+"(\\-\\w+)*$","~":"\\b"+r+"\\b"}[s]||(r!==null?"^"+r+"$":r)}function W(r){return(r||this).tagName!=="!"}function S(r,s){return i?(r==="*"?s.all:s.all.tags(r)):s.getElementsByTagName(r)}function aL(r,s){r=r||"*";s=s||document;return(s===document||s.lastModified)?c[r]||(c[r]=S(r,document)):S(r,s)}function ar(aX,bf,u){aU=[];var aV=bf.split("-"),a0=[],a5=0,be=/\-of\-type$/.test(bf),a4,aZ={first:function(bg){return !f(bg,"previous",be)},last:function(bg){return !f(bg,"next",be)},empty:function(bg){return !bg.firstChild},enabled:function(bg){return !bg.disabled&&bg.type!=="hidden"},disabled:function(bg){return bg.disabled},checked:function(bg){return bg.checked},contains:function(bg){return(bg.innerText||bg.textContent||"").indexOf(u.replace(m.quoted,"$1"))>-1},other:function(bg){return E(bg,bf)===u}};function t(bg){while((A=aX[a5++])){if(W(A)&&aZ[bg](A)){a0[a0.length]=A}}return a0}var bb=aV[0]||null;if(bb&&aZ[bb]){return t(bb)}switch(bb){case"only":var a1,aW;while((A=aX[a5++])){K=A.parentNode;var a6=A.nodeName;if(K!==a1||a6!==aW){if(aZ.first(A)&&aZ.last(A)){a0[a0.length]=A}a1=K;aW=a6}}break;case"nth":if(u==="n"){a0=aX}else{var bd=(aV[1]==="last")?["lastChild","previousSibling"]:["firstChild","nextSibling"];aI=DOMAssistant.getSequence(u);if(aI){while((A=aX[a5++])){K=A.parentNode;K.childElms=K.childElms||{};var a7=A.nodeName;if(!K.childElms[a7]){var ba=0;aN=aI.start;y=K[bd[0]];while(y&&(aI.max<0||aN<=aI.max)){var bc=y.nodeName;if((be&&bc===a7)||(!be&&y.nodeType===1&&bc!=="!")){if(++ba===aN){if(bc===a7){a0[a0.length]=y}aN+=aI.add}}y=y[bd[1]]}if(at){h++}K.childElms[a7]=true;aU[aU.length]=K}}C()}}break;case"target":var s=document.location.hash.slice(1);if(s){while((A=aX[a5++])){if(E(A,"name")===s||E(A,"id")===s){a0[a0.length]=A;break}}}break;case"not":if((a4=m.pseudo.exec(u))){a0=am(aX,ar(aX,a4[1]?a4[1].toLowerCase():null,a4[3]||null))}else{for(var a8 in m){if(m[a8].lastIndex){m[a8].lastIndex=0}}u=u.replace(m.id,"[id=$1]");var a3=m.tag.exec(u);var aY=m.classes.exec(u);var a2=m.attribs.exec(u);var r=new RegExp(a2?P(a2[4],a2[2]):"(^|\\s)"+(a3?a3[0]:aY?aY[1]:"")+"(\\s|$)","i");while((w=aX[a5++])){aq=null;if(a3&&!r.test(w.nodeName)||aY&&!r.test(w.className)){aq=w}else{if(a2){var a9=E(w,a2[1]);if(!b(a9)||a9===false||typeof a9==="string"&&!r.test(a9)){aq=w}}}if(aq&&!aq.added){aq.added=true;a0[a0.length]=aq}}}break;default:return t("other")}return a0}function Z(aV,t){var r=0,u=aV,aW;while((aW=t[r++])){if(!u.length||u.indexOf(aW)<0){aV.push(aW)}}return aV}h=-1;for(var ak=0,aJ=[];(I=aK[ak]);ak++){if(!(D=I.match(m.selectorSplit))||ak&&aR.call(aK.slice(0,ak),I)>-1){continue}ap=[this];for(var ai=0,G;(G=D[ai]);ai++){aG=[];if((N=m.relation.exec(G))){var an=null,aS=D[ai+1];if((av=m.tag.exec(aS))){av=av[0];x=new RegExp("(^|\\s)"+av+"(\\s|$)","i")}else{if(m.id.test(aS)){an=DOMAssistant.$(aS)||null}}for(var ag=0,M;(M=ap[ag]);ag++){switch(N[0]){case">":var aD=an||aL(av,M);for(var ae=0,ay;(ay=aD[ae]);ae++){if(ay.parentNode===M){aG[aG.length]=ay}}break;case"+":if((M=f(M,"next"))){if((an&&an[0]===M)||(!an&&(!av||x.test(M.nodeName)))){aG[aG.length]=M}}break;case"~":while((M=M.nextSibling)&&!M.added){if((an&&an[0]===M)||(!an&&(!av||x.test(M.nodeName)))){M.added=true;aG[aG.length]=M}}break}}ap=aG;aQ();G=D[++ai];if(/^\w+$/.test(G)||m.id.test(G)){continue}ap.skipTag=true}var au=m.selector.exec(G);aF={tag:au[1]?au[1]:"*",id:au[2],allClasses:au[3],allAttr:au[5],allPseudos:au[10]};at=(aF.tag==="*");if(aF.id){var O=0,al=document.getElementById(aF.id.slice(1));if(al){while(ap[O]&&!DOMAssistant.hasChild.call(ap[O],al)){O++}aG=(O<ap.length&&(at||aF.tag===al.tagName.toLowerCase()))?[al]:[]}ap=aG}else{if(aF.tag&&!ap.skipTag){if(ai===0&&!aG.length&&ap.length===1){ap=aG=e([],aL(aF.tag,ap[0]))}else{for(var ad=0,aO=ap.length,az,aw;ad<aO;ad++){az=aL(aF.tag,ap[ad]);for(var aa=0;(aw=az[aa]);aa++){if(!aw.added){aw.added=true;aG[aG.length]=aw}}}ap=aG;aQ()}}}if(!aG.length){break}ap.skipTag=false;if(aF.allClasses){var Y=0,ab=[],J=aF.allClasses.split(".").slice(1);while((ah=ap[Y++])){var af=true,ax=ah.className;if(ax&&ax.length){ax=ax.split(" ");for(var X=J.length;X--;){if(ax.indexOf(J[X])<0){af=false;break}}if(af){ab[ab.length]=ah}}}ap=aG=ab}if(aF.allAttr){var B,T=0,aC=[],ac=[],aH=aF.allAttr.match(m.attribs);for(var H=/^\[(selected|readonly)(\s*=.+)?\]$/,V=0,z=aH.length,U,aP;V<z;V++){m.attribs.lastIndex=0;U=m.attribs.exec(aH[V].replace(H,"[$1]"));aP=P(U[4],U[2]||null);aC[V]=[(aP?new RegExp(aP):null),U[1]]}while((ah=aG[T++])){for(var R=0,aE=aC.length;R<aE;R++){var aA=aC[R][0],aj=E(ah,aC[R][1]);B=true;if(!aA&&aj===true){continue}if((!aA&&(!aj||typeof aj!=="string"||!aj.length))||(!!aA&&!aA.test(aj))){B=false;break}}if(B){ac[ac.length]=ah}}ap=aG=ac}if(aF.allPseudos){var F=aF.allPseudos.match(m.pseudos);for(var Q=0,ao=F.length;Q<ao;Q++){m.pseudos.lastIndex=0;var aT=m.pseudos.exec(F[Q]);var L=aT[1]?aT[1].toLowerCase():null;var aM=aT[3]||null;aG=ar(aG,L,aM);aQ(aG)}ap=aG}}aB=((aJ.length&&(at||aR.call(aJ,aF.tag)>=0||aR.call(aJ,"*")>=0))?Z:e)(aB,ap);aJ.push(aF.tag);if(d&&at){aB=aB.filter(W)}}return((aB.length>1&&aK.length>1)||h>0)?l(aB):aB},cssByXpath:function(s){var t={xhtml:"http://www.w3.org/1999/xhtml"},u=(document.documentElement.namespaceURI===t.xhtml)?"xhtml:":"",r=function v(w){return t[w]||null};DOMAssistant.cssByXpath=function(N){var R,T,J,z,A,E,B=new j(),C=N.replace(m.rules,",").split(",");function M(W){var X=W?"[":"",V=W?"]":"";return function(Y,ac,ab,aa,Z){Z=(Z||"").replace(m.quoted,"$1");if(ac===Z&&ac==="readonly"){aa=null}return X+({"^":"starts-with(@"+ac+', "'+Z+'")',"$":"substring(@"+ac+", (string-length(@"+ac+") - "+(Z.length-1)+"), "+Z.length+') = "'+Z+'"',"*":'contains(concat(" ", @'+ac+', " "), "'+Z+'")',"|":"@"+ac+'="'+Z+'" or starts-with(@'+ac+', "'+Z+'-")',"~":'contains(concat(" ", @'+ac+', " "), " '+Z+' ")'}[ab]||("@"+ac+(aa?'="'+Z+'"':"")))+V}}function P(W,Y,X){W=/\-child$/.test(Y)?"*":W;var aa=Y.split("-"),V=((aa[1]==="last")?"(count(following-sibling::":"(count(preceding-sibling::")+W+") + 1)",Z,ab;switch(aa[0]){case"nth":return(X!=="n"&&(E=DOMAssistant.getSequence(X)))?((E.start===E.max)?V+" = "+E.start:V+" mod "+E.add+" = "+E.modVal+((E.start>1)?" and "+V+" >= "+E.start:"")+((E.max>0)?" and "+V+" <= "+E.max:"")):"";case"not":return"not("+((Z=m.pseudo.exec(X))?P(W,Z[1]?Z[1].toLowerCase():null,Z[3]||null):X.replace(m.id,"[id=$1]").replace(m.tag,"self::$0").replace(m.classes,'contains(concat(" ", @class, " "), " $1 ")').replace(m.attribs,M()))+")";case"first":return"not(preceding-sibling::"+W+")";case"last":return"not(following-sibling::"+W+")";case"only":return"not(preceding-sibling::"+W+" or following-sibling::"+W+")";case"empty":return"not(child::*) and not(text())";case"contains":return'contains(., "'+X.replace(m.quoted,"$1")+'")';case"enabled":return'not(@disabled) and not(@type="hidden")';case"disabled":return"@disabled";case"target":return'@name="'+(ab=document.location.hash.slice(1))+'" or @id="'+ab+'"';default:return"@"+Y+'="'+X+'"'}}for(var O=0;(R=C[O]);O++){if(!(T=R.match(m.selectorSplit))||O&&B.indexOf.call(C.slice(0,O),R)>-1){continue}J=J?J+" | .":".";for(var L=0,Q=T.length;L<Q;L++){z=m.selector.exec(T[L]);A={tag:u+(z[1]?z[1]:"*"),id:z[2],allClasses:z[3],allAttr:z[5],allPseudos:z[10],tagRelation:z[20]};J+=(A.tagRelation?({">":"/","+":"/following-sibling::*[1]/self::","~":"/following-sibling::"}[A.tagRelation]||""):((L>0&&m.relation.test(T[L-1]))?A.tag:("//"+A.tag)))+(A.id||"").replace(m.id,'[@id = "$1"]')+(A.allClasses||"").replace(m.classes,'[contains(concat(" ", @class, " "), " $1 ")]')+(A.allAttr||"").replace(m.attribs,M(true));if(A.allPseudos){var D=A.allPseudos.match(m.pseudos);for(var K=0,x=D.length;K<x;K++){m.pseudos.lastIndex=0;var y=m.pseudos.exec(D[K]),U=y[1]?y[1].toLowerCase():null,w=y[3]||null,G=P(A.tag,U,w);if(G.length){J+="["+G+"]"}}}}}try{var I=document.evaluate(J,this,r,7,null),H,F=0;while((H=I.snapshotItem(F++))){B.push(H)}}catch(S){}return B};return DOMAssistant.cssByXpath.call(this,s)},cssSelection:function(s){if(!s){return null}var r=m.special.test(s);try{if(document.querySelectorAll&&!r){return e(new j(),this.querySelectorAll(s))}}catch(t){}return((document.evaluate&&!r&&!/-of-type/.test(s))?DOMAssistant.cssByXpath:DOMAssistant.cssByDOM).call(this,s)},cssSelect:function(r){return DOMAssistant.cssSelection.call(this,r)},elmsByClass:function(t,r){var s=(r||"")+"."+t;return DOMAssistant.cssSelection.call(this,s)},elmsByAttribute:function(s,t,r,v){var u=(r||"")+"["+s+((t&&t!=="*")?((v||"")+"="+t+"]"):"]");return DOMAssistant.cssSelection.call(this,u)},elmsByTag:function(r){return DOMAssistant.cssSelection.call(this,r)}}}();DOMAssistant.initCore();DOMAssistant.Storage=function(){var c=1,a=[],b="_da"+ +new Date();return{hasData:function(){var d=this[b];return !!d&&!!a[d]},retrieve:function(d){if(!DOMAssistant.def(d)){return this[b]||(this[b]=c++)}if(!this[b]||!a[this[b]]){return}return a[this[b]][d]},store:function(f,g){var e=this[b]||(this[b]=c++);a[e]=a[e]||{};if(typeof f==="object"){for(var d in f){if(typeof d==="string"){a[e][d]=f[d]}}}else{a[e][f]=g}return this},unstore:function(e){var d=this[b]||(this[b]=c++);if(a[d]){if(DOMAssistant.def(e)){delete a[d][e]}else{a[d]=null}}return this}}}();DOMAssistant.attach(DOMAssistant.Storage);DOMAssistant.AJAX=function(){var globalXMLHttp=null,readyState=0,status=-1,statusText="",requestPool=[],createAjaxObj=function(url,method,callback,addToContent){var params=null;if(/POST/i.test(method)){url=url.split("?");params=url[1];url=url[0]}return{url:url,method:method,callback:callback,params:params,headers:{},responseType:"text",addToContent:addToContent||false}};return{publicMethods:["ajax","get","post","load"],initRequest:function(){var XMLHttp=null;if(!!window.XMLHttpRequest&&!DOMAssistant.isIE){XMLHttp=new XMLHttpRequest();DOMAssistant.AJAX.initRequest=function(){return requestPool.length?requestPool.pop():new XMLHttpRequest()}}else{if(!!window.ActiveXObject){var XMLHttpMS=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];for(var i=0;i<XMLHttpMS.length;i++){try{XMLHttp=new window.ActiveXObject(XMLHttpMS[i]);DOMAssistant.AJAX.initRequest=function(){return requestPool.length?requestPool.pop():new window.ActiveXObject(XMLHttpMS[i])};break}catch(e){XMLHttp=null}}}}return XMLHttp},ajax:function(ajaxObj){if(!ajaxObj.noParse&&ajaxObj.url&&/\?/.test(ajaxObj.url)&&ajaxObj.method&&/POST/i.test(ajaxObj.method)){var url=ajaxObj.url.split("?");ajaxObj.url=url[0];ajaxObj.params=url[1]+((url[1].length>0&&ajaxObj.params)?("&"+ajaxObj.params):"")}return DOMAssistant.AJAX.makeCall.call(this,ajaxObj)},get:function(url,callback,addToContent){return DOMAssistant.AJAX.makeCall.call(this,createAjaxObj(url,"GET",callback,addToContent))},post:function(url,callback){return DOMAssistant.AJAX.makeCall.call(this,createAjaxObj(url,"POST",callback))},load:function(url,addToContent){this.get(url,DOMAssistant.AJAX.replaceWithAJAXContent,addToContent)},makeCall:function(ajaxObj){var XMLHttp=DOMAssistant.AJAX.initRequest();if(XMLHttp){globalXMLHttp=XMLHttp;(function(elm){var url=ajaxObj.url,method=ajaxObj.method||"GET",callback=ajaxObj.callback,params=ajaxObj.params,headers=ajaxObj.headers,responseType=ajaxObj.responseType||"text",addToContent=ajaxObj.addToContent,timeout=ajaxObj.timeout||null,ex=ajaxObj.exception,timeoutId=null,done=false;XMLHttp.open(method,url,true);XMLHttp.setRequestHeader("AJAX","true");XMLHttp.setRequestHeader("X-Requested-With","XMLHttpRequest");if(method==="POST"){XMLHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");XMLHttp.setRequestHeader("Content-length",params?params.length:0);if(XMLHttp.overrideMimeType){XMLHttp.setRequestHeader("Connection","close")}}if(responseType==="json"){XMLHttp.setRequestHeader("Accept","application/json, text/javascript, */*")}for(var i in headers){if(typeof i==="string"){XMLHttp.setRequestHeader(i,headers[i])}}if(typeof callback==="function"){XMLHttp.onreadystatechange=function(){try{if(XMLHttp.readyState===4&&!done){window.clearTimeout(timeoutId);done=true;status=XMLHttp.status;statusText=XMLHttp.statusText;readyState=4;if((status||location.protocol!=="file:")&&(status<200||status>=300)){throw new Error(statusText)}var response=/xml/i.test(responseType)?XMLHttp.responseXML:XMLHttp.responseText;if(/json/i.test(responseType)&&!!response){response=(typeof JSON==="object"&&typeof JSON.parse==="function")?JSON.parse(response):eval("("+response+")")}globalXMLHttp=null;XMLHttp.onreadystatechange=function(){};requestPool.push(XMLHttp);callback.call(elm,response,addToContent)}}catch(e){globalXMLHttp=XMLHttp=null;if(typeof ex==="function"){ex.call(elm,e);ex=null}}}}XMLHttp.send(params);if(timeout){timeoutId=window.setTimeout(function(){if(!done){XMLHttp.abort();done=true;if(typeof ex==="function"){readyState=0;status=408;statusText="Request timeout";globalXMLHttp=XMLHttp=null;ex.call(elm,new Error(statusText));ex=null}}},timeout)}})(this)}return this},replaceWithAJAXContent:function(content,add){if(add){this.innerHTML+=content}else{DOMAssistant.cleanUp(this);this.innerHTML=content}},getReadyState:function(){return(globalXMLHttp&&DOMAssistant.def(globalXMLHttp.readyState))?globalXMLHttp.readyState:readyState},getStatus:function(){return status},getStatusText:function(){return statusText}}}();DOMAssistant.attach(DOMAssistant.AJAX);DOMAssistant.CSS=function(){var a=DOMAssistant.def,b={display:true};return{addClass:function(d){if(!this.hasClass(d)){var c=this.className;this.className=c+(c.length?" ":"")+d}return this},removeClass:function(c){return this.replaceClass(c)},replaceClass:function(d,e){var c=new RegExp(("(^|\\s)"+d+"(\\s|$)"),"i");this.className=this.className.replace(c,function(f,h,g){return e?(h+e+g):" "}).replace(/^\s+|\s+$/g,"");return this},hasClass:function(c){return(" "+this.className+" ").indexOf(" "+c+" ")>-1},setStyle:function(f,g){var e=this.style;if("filters" in this&&(typeof f==="string"?/opacity/i.test(f):a(f.opacity))){e.zoom=1;e.filter=(e.filter||"").replace(/alpha\([^)]*\)/,"")+"alpha(opacity="+(a(f.opacity)?f.opacity:g)*100+")"}if(a(e.cssText)){var c=e.cssText;if(typeof f==="object"){for(var d in f){if(typeof d==="string"){if(b[d]){e[d]=f[d]}c+=";"+d+":"+f[d]}}}else{if(b[f]){e[f]=g}c+=";"+f+":"+g}e.cssText=c}return this},getStyle:function(c){var e="",d;c=c.toLowerCase();if(document.defaultView&&document.defaultView.getComputedStyle){e=document.defaultView.getComputedStyle(this,"").getPropertyValue(c)}else{if(this.currentStyle){if("filters" in this&&c==="opacity"){e=(d=this.style.filter||this.currentStyle.filter)&&d.indexOf("opacity=")>=0?parseFloat(d.match(/opacity=([^)]*)/)[1])/100:1}else{c=c.replace(/^float$/,"styleFloat").replace(/\-(\w)/g,function(f,g){return g.toUpperCase()});e=this.currentStyle[c]}if(e==="auto"&&/^(width|height)$/.test(c)&&this.currentStyle.display!=="none"){e=this["offset"+c.charAt(0).toUpperCase()+c.substr(1)]+"px"}}}return e}}}();DOMAssistant.attach(DOMAssistant.CSS);DOMAssistant.Content=function(){var a=DOMAssistant.$$;return{init:function(){DOMAssistant.setCache(false)},create:function(d,c,b,e){var f=a(document.createElement(d));if(c){f=f.setAttributes(c)}if(DOMAssistant.def(e)){f.addContent(e)}if(b){this.appendChild(f)}return f},setAttributes:function(b){if(DOMAssistant.isIE){var c=function(g,e,f){var d=e.toLowerCase();switch(d){case"name":case"type":case"multiple":return a(document.createElement(g.outerHTML.replace(new RegExp(d+"(=[a-zA-Z]+)?")," ").replace(">"," "+d+"="+f+">")));case"style":g.style.cssText=f;return g;default:g[DOMAssistant.camel[d]||e]=f;return g}};DOMAssistant.Content.setAttributes=function(d){var h=this;var g=this.parentNode;for(var f in d){if(typeof d[f]==="string"||typeof d[f]==="number"){var e=c(h,f,d[f]);if(g&&/(name|type)/i.test(f)){if(h.innerHTML){e.innerHTML=h.innerHTML}g.replaceChild(e,h)}h=e}}return h}}else{DOMAssistant.Content.setAttributes=function(d){for(var e in d){if(/class/i.test(e)){this.className=d[e]}else{this.setAttribute(e,d[e])}}return this}}return DOMAssistant.Content.setAttributes.call(this,b)},addContent:function(f){var d=typeof f;if(d==="string"||d==="number"){if(!this.firstChild){this.innerHTML=f}else{var c=document.createElement("div");c.innerHTML=f;for(var b=c.childNodes.length-1,e=null;b>=0;b--){e=this.insertBefore(c.childNodes[b],e)}}}else{if(d==="object"||(d==="function"&&!!f.nodeName)){this.appendChild(f)}}return this},replaceContent:function(b){DOMAssistant.cleanUp(this);return this.addContent(b)},replace:function(g,b){var f=typeof g;if(f==="string"||f==="number"){var e=this.parentNode;var d=DOMAssistant.Content.create.call(e,"div",null,false,g);for(var c=d.childNodes.length;c--;){e.insertBefore(d.childNodes[c],this.nextSibling)}g=this.nextSibling;e.removeChild(this)}else{if(f==="object"||(f==="function"&&!!g.nodeName)){this.parentNode.replaceChild(g,this)}}return b?g:this},remove:function(){DOMAssistant.cleanUp(this);if(this.hasData()){if(this.removeEvent){this.removeEvent()}this.unstore()}this.parentNode.removeChild(this);return null}}}();DOMAssistant.attach(DOMAssistant.Content);DOMAssistant.Events=function(){var i,g="_events",c=!!document.addEventListener,a={focus:true,blur:true},b=DOMAssistant.isIE?{focus:"activate",blur:"deactivate",mouseenter:"mouseover",mouseleave:"mouseout"}:{mouseenter:"mouseover",mouseleave:"mouseout"},f={special:/^submit|reset|change|select$/i,mouseenterleave:/^mouse(enter|leave)$/i,dom:/^DOM/,on:/^on/i},e=function(j){return DOMAssistant.isIE&&f.special.test(j)},d=function(j){return b[j]||j},h=function(n,k,m){n=n||window.event||{};if(n.event){return n}var l={event:n,type:k||n.type,bubbles:n.bubbles||true,cancelable:n.cancelable||false,target:m||n.target||n.srcElement,clientX:n.clientX||0,clientY:n.clientY||0,altKey:n.altKey||false,ctrlKey:n.ctrlKey||false,shiftKey:n.shiftKey||false,button:n.button||null,timeStamp:+new Date(),preventDefault:function(){if(n.preventDefault){n.preventDefault()}this.returnValue=n.returnValue=false},stopPropagation:function(){if(n.stopPropagation){n.stopPropagation()}this.cancelBubble=n.cancelBubble=true}};if(l.target&&3===l.target.nodeType){l.target=l.target.parentNode}l.currentTarget=l.target;l.relatedTarget=n.relatedTarget||(n.fromElement===l.target?n.toElement:n.fromElement)||null;var o=document.documentElement,j=document.body;l.pageX=DOMAssistant.def(n.pageX)?n.pageX:(l.clientX+(o.scrollLeft||j.scrollLeft)-(o.clientLeft||0));l.pageY=DOMAssistant.def(n.pageY)?n.pageY:(l.clientY+(o.scrollTop||j.scrollTop)-(o.clientTop||0));if("number"===typeof n.which){l.keyCode=n.keyCode;l.charCode=l.which=n.which}else{if(n.keyCode){l.keyCode=l.charCode=n.keyCode}}return l};return{publicMethods:["triggerEvent","addEvent","removeEvent","relayEvent","unrelayEvent","preventDefault","cancelBubble"],init:function(){DOMAssistant.preventDefault=this.preventDefault;DOMAssistant.cancelBubble=this.cancelBubble;i=this.handleEvent},triggerEvent:function(r,o,q){var m=d(r),s=this.retrieve(g),j=q||h(q,m,o||this);j.currentTarget=this;if(s&&s[m]){for(var n=0,l=s[m].length;n<l;n++){if(s[m][n].call(this,j)===false){j.stopPropagation()}}}else{if(typeof this["on"+m]==="function"){this["on"+m].call(this,j)}}var k=DOMAssistant.$$(this.parentNode);if(!j.cancelBubble&&k&&k.nodeType===1){k.triggerEvent(m,o,j)}return this},addEvent:function(r,l,k,q,n){var j,m=d(r),p=m+this.retrieve(),o="on"+m;if(!(l.attachedElements&&l.attachedElements[p])){var s=this.retrieve(g)||{};if(!s[m]){s[m]=[];j=this[o];this[o]=null}if(typeof this.window==="object"){this.window[o]=i}else{if(!s[m].length){if(c){this.addEventListener(m,i,a[m])}else{this[o]=i}}}if(j){s[m].push(j)}if(m!==r){l.evt=r}l.relay=k;l.proxy=q;l.selector=n;l.attachedElements=l.attachedElements||{};l.attachedElements[p]=true;s[m].push(l);this.store(g,s)}return this},handleEvent:function(r){var q=(r&&f.dom.test(r.type)&&c)?r:h(r),o=d(q.type),p=q.target,l=q.relatedTarget,n=this.retrieve(g)[o].slice(0),t,j,s;if((t=n.length)){for(var m=0;m<t;m++){if(typeof n[m]==="function"){if((s=n[m].evt)&&s!==o){q.type=s;if(l&&f.mouseenterleave.test(s)){if(n[m].relay){var k=n[m].elms||(n[m].elms=this.cssSelect(n[m].selector));if(k.indexOf(p)<0||!DOMAssistant.hasChild.call(l,p)){continue}}else{if(this===l||this.hasChild(l)){continue}}}}j=n[m].call(this,q)}}if(j===false){q.stopPropagation()}return j}},removeEvent:function(w,l,k,s){var q=(w=d(w))+this.retrieve(),x=this.retrieve(g),p="on"+w;if(x&&!w){for(var v in x){if(x[v].length){this.removeEvent(v)}}var r=this.attributes;for(var t,m=r.length;m--;){t=r[m].nodeName.toLowerCase();if(f.on.test(t)&&typeof this[t]==="function"){this[t]=null}}}else{if(x&&x[w]){var o=x[w];for(var u,n=o.length;n--;){u=l||o[n];if(o[n]===u&&k===u.relay&&s===u.proxy){o.splice(n,1);if(!!s&&u.selector){this.cssSelect(u.selector).removeEvent(s)}if(u.attachedElements){u.attachedElements[q]=null}}}if(!x[w].length){if(c){this.removeEventListener(w,i,a[w])}else{this[p]=null}}}else{if(this[p]&&!l&&!k){this[p]=null}}}return this},relayEvent:function(k,j,m,l){if(e(k)){this.relayEvent("focus",j,function(){DOMAssistant.$$(this).removeEvent(k).addEvent(k,function(n){return m.call(this,h(n))})},k).relayEvent("blur",j,function(){DOMAssistant.$$(this).removeEvent(k)},k);return this}return this.addEvent(k,function(s){s=h(s);var r=s.target,n=arguments,o=0,t,p=this.cssSelect(j);while((t=p[o++])){if((t===r||DOMAssistant.hasChild.call(t,r))&&!t.disabled){s.currentTarget=t;var q=m.apply(t,n);if(!q){s.preventDefault()}return q}}},true,l,j)},unrelayEvent:function(j){if(e(j)){return this.removeEvent("focus",null,true,j).removeEvent("blur",null,true,j)}return this.removeEvent(j,null,true)},preventDefault:function(j){if(j.preventDefault){j.preventDefault()}j.returnValue=false},cancelBubble:function(j){if(j.stopPropagation){j.stopPropagation()}j.cancelBubble=true}}}();DOMAssistant.attach(DOMAssistant.Events);DOMAssistant.DOMLoad=function(){var g=false,a=null,f=[],b={},c=null,d=function(){for(var j=0,h=f.length;j<h;j++){try{f[j]()}catch(k){if(c&&typeof c==="function"){c(k)}}}f=[]},e=function(){if(g){return}g=true;d()};
+/*@cc_on @if(@_win32||@_win64)document.write("<script id=\"ieScriptLoad\" defer src=\"//:\"><\/script>");document.getElementById("ieScriptLoad").onreadystatechange=function(){if(this.readyState==="complete"){e()}}@end@*/
+if(document.addEventListener){document.addEventListener("DOMContentLoaded",e,false)}if(/KHTML|WebKit|iCab/i.test(navigator.userAgent)){a=setInterval(function(){if(/loaded|complete/i.test(document.readyState)){e();clearInterval(a)}},10)}window.onload=e;return{DOMReady:function(){for(var j=0,h=arguments.length,k;j<h;j++){k=arguments[j];if(!k.DOMReady&&!b[k]){if(typeof k==="string"){b[k]=true;k=new Function(k)}k.DOMReady=true;f.push(k)}}if(g){d()}},setErrorHandling:function(h){c=h}}}();DOMAssistant.DOMReady=DOMAssistant.DOMLoad.DOMReady; \ No newline at end of file
diff --git a/public/javascripts/libs/ios-viewport-scaling-bug-fix.js b/public/javascripts/libs/ios-viewport-scaling-bug-fix.js
new file mode 100644
index 00000000..49f0d443
--- /dev/null
+++ b/public/javascripts/libs/ios-viewport-scaling-bug-fix.js
@@ -0,0 +1,20 @@
+// https://gist.github.com/901295
+// By @mathias, @cheeaun and @jdalton
+
+(function(doc) {
+ var addEvent = 'addEventListener',
+ type = 'gesturestart',
+ qsa = 'querySelectorAll',
+ scales = [1, 1],
+ meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : [];
+ function fix() {
+ meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1];
+ doc.removeEventListener(type, fix, true);
+ }
+ if ((meta = meta[meta.length - 1]) && addEvent in doc) {
+ fix();
+ scales = [.25, 1.6];
+ doc[addEvent](type, fix, true);
+ }
+}(document));
+
diff --git a/public/javascripts/libs/modernizr-1.7.min.js b/public/javascripts/libs/modernizr-1.7.min.js
new file mode 100644
index 00000000..6f54850c
--- /dev/null
+++ b/public/javascripts/libs/modernizr-1.7.min.js
@@ -0,0 +1,2 @@
+// Modernizr v1.7 www.modernizr.com
+window.Modernizr=function(a,b,c){function G(){e.input=function(a){for(var b=0,c=a.length;b<c;b++)t[a[b]]=!!(a[b]in l);return t}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)l.setAttribute("type",f=a[d]),e=l.type!=="text",e&&(l.value=m,l.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&l.style.WebkitAppearance!==c?(g.appendChild(l),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(l,null).WebkitAppearance!=="textfield"&&l.offsetHeight!==0,g.removeChild(l)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=l.checkValidity&&l.checkValidity()===!1:/^color$/.test(f)?(g.appendChild(l),g.offsetWidth,e=l.value!=m,g.removeChild(l)):e=l.value!=m)),s[a[d]]=!!e;return s}("search tel url email datetime date month week time datetime-local number range color".split(" "))}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return!!E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c&&(!b||b(a[d],j)))return!0}function D(a,b){return(""+a).indexOf(b)!==-1}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="1.7",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v,w=function(a){var c=b.createElement("style"),d=b.createElement("div"),e;c.textContent=a+"{#modernizr{height:3px}}",h.appendChild(c),d.id="modernizr",g.appendChild(d),e=d.offsetHeight===3,c.parentNode.removeChild(c),d.parentNode.removeChild(d);return!!e},x=function(){function d(d,e){e=e||b.createElement(a[d]||"div");var f=(d="on"+d)in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),y=({}).hasOwnProperty,z;C(y,c)||C(y.call,c)?z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)}:z=function(a,b){return y.call(a,b)},r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return a.getContext&&a.getContext("2d")},r.canvastext=function(){return e.canvas&&C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return"ontouchstart"in a||w("@media ("+o.join("touch-enabled),(")+"modernizr)")},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b<c;){var d=p[b].toLowerCase();if(a[d+"_indexedDB"]||a[d+"IndexedDB"])return!0}return!1},r.hashchange=function(){return x("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return !!(a.history&&history.pushState)},r.draganddrop=function(){return x("dragstart")&&x("drop")},r.websockets=function(){return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(//:),url(//:),red url(//:)");return(new RegExp("(url\\s*\\(.*?){3}")).test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius","",function(a){return D(a,"orderRadius")})},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=w("@media ("+o.join("transform-3d),(")+"modernizr)"));return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){var a,c,d=h||g,e=b.createElement("style"),f=b.implementation||{hasFeature:function(){return!1}};e.type="text/css",d.insertBefore(e,d.firstChild),a=e.sheet||e.styleSheet;var i=f.hasFeature("CSS2","")?function(b){if(!a||!b)return!1;var c=!1;try{a.insertRule(b,0),c=/src/i.test(a.cssRules[0].cssText),a.deleteRule(a.cssRules.length-1)}catch(d){}return c}:function(b){if(!a||!b)return!1;a.cssText=b;return a.cssText.length!==0&&/src/i.test(a.cssText)&&a.cssText.replace(/\r+|\n+/g,"").indexOf(b.split(" ")[0])===0};c=i('@font-face { font-family: "font"; src: url(data:,); }'),d.removeChild(e);return c},r.video=function(){var a=b.createElement("video"),c=!!a.canPlayType;if(c){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}return c},r.audio=function(){var a=b.createElement("audio"),c=!!a.canPlayType;c&&(c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;"));return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webWorkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="<svg/>";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var H in r)z(r,H)&&(v=H.toLowerCase(),e[v]=r[H](),u.push((e[v]?"":"no-")+v));e.input||G(),e.crosswindowmessaging=e.postmessage,e.historymanagement=e.history,e.addTest=function(a,b){a=a.toLowerCase();if(!e[a]){b=!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b;return e}},A(""),j=l=null,f&&a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function p(a,b){var c=-1,d=a.length,e,f=[];while(++c<d)e=a[c],(b=e.media||b)!="screen"&&f.push(p(e.imports,b),e.cssText);return f.join("")}function o(a){var b=-1;while(++b<e)a.createElement(d[b])}var c="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",d=c.split("|"),e=d.length,f=new RegExp("(^|\\s)("+c+")","gi"),g=new RegExp("<(/*)("+c+")","gi"),h=new RegExp("(^|[^\\n]*?\\s)("+c+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),i=b.createDocumentFragment(),j=b.documentElement,k=j.firstChild,l=b.createElement("body"),m=b.createElement("style"),n;o(b),o(i),k.insertBefore(m,k.firstChild),m.media="print",a.attachEvent("onbeforeprint",function(){var a=-1,c=p(b.styleSheets,"all"),k=[],o;n=n||b.body;while((o=h.exec(c))!=null)k.push((o[1]+o[2]+o[3]).replace(f,"$1.iepp_$2")+o[4]);m.styleSheet.cssText=k.join("\n");while(++a<e){var q=b.getElementsByTagName(d[a]),r=q.length,s=-1;while(++s<r)q[s].className.indexOf("iepp_")<0&&(q[s].className+=" iepp_"+d[a])}i.appendChild(n),j.appendChild(l),l.className=n.className,l.innerHTML=n.innerHTML.replace(g,"<$1font")}),a.attachEvent("onafterprint",function(){l.innerHTML="",j.removeChild(l),j.appendChild(n),m.styleSheet.cssText=""})}(a,b),e._enableHTML5=f,e._version=d,g.className=g.className.replace(/\bno-js\b/,"")+" js "+u.join(" ");return e}(this,this.document) \ No newline at end of file
diff --git a/public/javascripts/libs/respond.js b/public/javascripts/libs/respond.js
new file mode 100644
index 00000000..99b19825
--- /dev/null
+++ b/public/javascripts/libs/respond.js
@@ -0,0 +1,8 @@
+/*
+ * respond.js - A small and fast polyfill for min/max-width CSS3 Media Queries
+ * Copyright 2011, Scott Jehl, scottjehl.com
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Usage: Check out the readme file or github.com/scottjehl/respond
+*/
+(function(e,h){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=h;if(h){return}var u=e.document,r=u.documentElement,i=[],k=[],p=[],o={},g=30,f=u.getElementsByTagName("head")[0]||r,b=f.getElementsByTagName("link"),d=[],a=function(){var B=b,w=B.length;for(var z=0;z<w;z++){var y=B[z],x=y.href,A=y.media,v=y.rel&&y.rel.toLowerCase()==="stylesheet";if(!!x&&v&&!o[x]){if(!/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test(x)||x.replace(RegExp.$1,"").split("/")[0]===e.location.host){d.push({href:x,media:A})}else{o[x]=true}}}t()},t=function(){if(d.length){var v=d.shift();n(v.href,function(w){m(w,v.href,v.media);o[v.href]=true;t()})}},m=function(G,v,x){var E=G.match(/@media ([^\{]+)\{((?!@media)[\s\S])*(?=\}[\s]*\/\*\/mediaquery\*\/)/gmi),H=E&&E.length||0,v=v.substring(0,v.lastIndexOf("/")),w=function(I){return I.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+v+"$2$3")},y=!H&&x;if(v.length){v+="/"}if(y){H=1}for(var B=0;B<H;B++){var C;if(y){C=x;k.push(w(G))}else{C=E[B].match(/@media ([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1;k.push(RegExp.$2&&w(RegExp.$2))}var z=C.split(","),F=z.length;for(var A=0;A<F;A++){var D=z[A];i.push({media:D.match(/(only\s+)?([a-zA-Z]+)(\sand)?/)&&RegExp.$2,rules:k.length-1,minw:D.match(/\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1),maxw:D.match(/\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1)})}}j()},l,q,j=function(E){var v="clientWidth",x=r[v],D=u.compatMode==="CSS1Compat"&&x||u.body[v]||x,z={},C=u.createDocumentFragment(),B=b[b.length-1],w=(new Date()).getTime();if(E&&l&&w-l<g){clearTimeout(q);q=setTimeout(j,g);return}else{l=w}for(var y in i){var F=i[y];if(!F.minw&&!F.maxw||(!F.minw||F.minw&&D>=F.minw)&&(!F.maxw||F.maxw&&D<=F.maxw)){if(!z[F.media]){z[F.media]=[]}z[F.media].push(k[F.rules])}}for(var y in p){if(p[y]&&p[y].parentNode===f){f.removeChild(p[y])}}for(var y in z){var G=u.createElement("style"),A=z[y].join("\n");G.type="text/css";G.media=y;if(G.styleSheet){G.styleSheet.cssText=A}else{G.appendChild(u.createTextNode(A))}C.appendChild(G);p.push(G)}f.insertBefore(C,B.nextSibling)},n=function(v,x){var w=c();if(!w){return}w.open("GET",v,true);w.onreadystatechange=function(){if(w.readyState!=4||w.status!=200&&w.status!=304){return}x(w.responseText)};if(w.readyState==4){return}w.send()},c=(function(){var v=false,w=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new XMLHttpRequest()}],y=w.length;while(y--){try{v=w[y]()}catch(x){continue}break}return function(){return v}})();a();respond.update=a;function s(){j(true)}if(e.addEventListener){e.addEventListener("resize",s,false)}else{if(e.attachEvent){e.attachEvent("onresize",s)}}})(this,(function(f){if(f.matchMedia){return true}var e,i=document,c=i.documentElement,g=c.firstElementChild||c.firstChild,h=!i.body,d=i.body||i.createElement("body"),b=i.createElement("div"),a="only all";b.id="mq-test-1";b.style.cssText="position:absolute;top:-99em";d.appendChild(b);b.innerHTML='_<style media="'+a+'"> #mq-test-1 { width: 9px; }</style>';if(h){c.insertBefore(d,g)}b.removeChild(b.firstChild);e=b.offsetWidth==9;if(h){c.removeChild(d)}else{d.removeChild(b)}return e})(this));
+
diff --git a/public/javascripts/libs/selectivizr-min.js b/public/javascripts/libs/selectivizr-min.js
new file mode 100644
index 00000000..5adda2fa
--- /dev/null
+++ b/public/javascripts/libs/selectivizr-min.js
@@ -0,0 +1,5 @@
+/*!
+ * selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license.
+ * selectivizr.com
+ */
+(function(j){function A(a){return a.replace(B,h).replace(C,function(a,d,b){for(var a=b.split(","),b=0,e=a.length;b<e;b++){var s=D(a[b].replace(E,h).replace(F,h))+o,l=[];a[b]=s.replace(G,function(a,b,c,d,e){if(b){if(l.length>0){var a=l,f,e=s.substring(0,e).replace(H,i);if(e==i||e.charAt(e.length-1)==o)e+="*";try{f=t(e)}catch(k){}if(f){e=0;for(c=f.length;e<c;e++){for(var d=f[e],h=d.className,j=0,m=a.length;j<m;j++){var g=a[j];if(!RegExp("(^|\\s)"+g.className+"(\\s|$)").test(d.className)&&g.b&&(g.b===!0||g.b(d)===!0))h=u(h,g.className,!0)}d.className=h}}l=[]}return b}else{if(b=c?I(c):!v||v.test(d)?{className:w(d),b:!0}:null)return l.push(b),"."+b.className;return a}})}return d+a.join(",")})}function I(a){var c=!0,d=w(a.slice(1)),b=a.substring(0,5)==":not(",e,f;b&&(a=a.slice(5,-1));var l=a.indexOf("(");l>-1&&(a=a.substring(0,l));if(a.charAt(0)==":")switch(a.slice(1)){case "root":c=function(a){return b?a!=p:a==p};break;case "target":if(m==8){c=function(a){function c(){var d=location.hash,e=d.slice(1);return b?d==i||a.id!=e:d!=i&&a.id==e}k(j,"hashchange",function(){g(a,d,c())});return c()};break}return!1;case "checked":c=function(a){J.test(a.type)&&k(a,"propertychange",function(){event.propertyName=="checked"&&g(a,d,a.checked!==b)});return a.checked!==b};break;case "disabled":b=!b;case "enabled":c=function(c){if(K.test(c.tagName))return k(c,"propertychange",function(){event.propertyName=="$disabled"&&g(c,d,c.a===b)}),q.push(c),c.a=c.disabled,c.disabled===b;return a==":enabled"?b:!b};break;case "focus":e="focus",f="blur";case "hover":e||(e="mouseenter",f="mouseleave");c=function(a){k(a,b?f:e,function(){g(a,d,!0)});k(a,b?e:f,function(){g(a,d,!1)});return b};break;default:if(!L.test(a))return!1}return{className:d,b:c}}function w(a){return M+"-"+(m==6&&N?O++:a.replace(P,function(a){return a.charCodeAt(0)}))}function D(a){return a.replace(x,h).replace(Q,o)}function g(a,c,d){var b=a.className,c=u(b,c,d);if(c!=b)a.className=c,a.parentNode.className+=i}function u(a,c,d){var b=RegExp("(^|\\s)"+c+"(\\s|$)"),e=b.test(a);return d?e?a:a+o+c:e?a.replace(b,h).replace(x,h):a}function k(a,c,d){a.attachEvent("on"+c,d)}function r(a,c){if(/^https?:\/\//i.test(a))return c.substring(0,c.indexOf("/",8))==a.substring(0,a.indexOf("/",8))?a:null;if(a.charAt(0)=="/")return c.substring(0,c.indexOf("/",8))+a;var d=c.split(/[?#]/)[0];a.charAt(0)!="?"&&d.charAt(d.length-1)!="/"&&(d=d.substring(0,d.lastIndexOf("/")+1));return d+a}function y(a){if(a)return n.open("GET",a,!1),n.send(),(n.status==200?n.responseText:i).replace(R,i).replace(S,function(c,d,b,e,f){return y(r(b||f,a))}).replace(T,function(c,d,b){d=d||i;return" url("+d+r(b,a)+d+") "});return i}function U(){var a,c;a=f.getElementsByTagName("BASE");for(var d=a.length>0?a[0].href:f.location.href,b=0;b<f.styleSheets.length;b++)if(c=f.styleSheets[b],c.href!=i&&(a=r(c.href,d)))c.cssText=A(y(a));q.length>0&&setInterval(function(){for(var a=0,c=q.length;a<c;a++){var b=q[a];if(b.disabled!==b.a)b.disabled?(b.disabled=!1,b.a=!0,b.disabled=!0):b.a=b.disabled}},250)}if(!/*@cc_on!@*/true){var f=document,p=f.documentElement,n=function(){if(j.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(a){return null}}(),m=/MSIE (\d+)/.exec(navigator.userAgent)[1];if(!(f.compatMode!="CSS1Compat"||m<6||m>8||!n)){var z={NW:"*.Dom.select",MooTools:"$$",DOMAssistant:"*.$",Prototype:"$$",YAHOO:"*.util.Selector.query",Sizzle:"*",jQuery:"*",dojo:"*.query"},t,q=[],O=0,N=!0,M="slvzr",R=/(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g,S=/@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g,T=/\burl\(\s*(["']?)(?!data:)([^"')]+)\1\s*\)/g,L=/^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,B=/:(:first-(?:line|letter))/g,C=/(^|})\s*([^\{]*?[\[:][^{]+)/g,G=/([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g,H=/(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g,P=/[^\w-]/g,K=/^(INPUT|SELECT|TEXTAREA|BUTTON)$/,J=/^(checkbox|radio)$/,v=m>6?/[\$\^*]=(['"])\1/:null,E=/([(\[+~])\s+/g,F=/\s+([)\]+~])/g,Q=/\s+/g,x=/^\s*((?:[\S\s]*\S)?)\s*$/,i="",o=" ",h="$1";(function(a,c){function d(){try{p.doScroll("left")}catch(a){setTimeout(d,50);return}b("poll")}function b(d){if(!(d.type=="readystatechange"&&f.readyState!="complete")&&((d.type=="load"?a:f).detachEvent("on"+d.type,b,!1),!e&&(e=!0)))c.call(a,d.type||d)}var e=!1,g=!0;if(f.readyState=="complete")c.call(a,i);else{if(f.createEventObject&&p.doScroll){try{g=!a.frameElement}catch(h){}g&&d()}k(f,"readystatechange",b);k(a,"load",b)}})(j,function(){for(var a in z){var c,d,b=j;if(j[a]){for(c=z[a].replace("*",a).split(".");(d=c.shift())&&(b=b[d]););if(typeof b=="function"){t=b;U();break}}}})}}})(this); \ No newline at end of file
diff --git a/public/javascripts/mootools-1.2.4.2-more.js b/public/javascripts/mootools-1.2.4.2-more.js
deleted file mode 100644
index 2c12092c..00000000
--- a/public/javascripts/mootools-1.2.4.2-more.js
+++ /dev/null
@@ -1,100 +0,0 @@
-//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.
-
-MooTools.More={version:"1.2.4.2",build:"bd5a93c0913cce25917c48cbdacde568e15e02ef"};(function(){var a={language:"en-US",languages:{"en-US":{}},cascades:["en-US"]};
-var b;MooTools.lang=new Events();$extend(MooTools.lang,{setLanguage:function(c){if(!a.languages[c]){return this;}a.language=c;this.load();this.fireEvent("langChange",c);
-return this;},load:function(){var c=this.cascade(this.getCurrentLanguage());b={};$each(c,function(e,d){b[d]=this.lambda(e);},this);},getCurrentLanguage:function(){return a.language;
-},addLanguage:function(c){a.languages[c]=a.languages[c]||{};return this;},cascade:function(e){var c=(a.languages[e]||{}).cascades||[];c.combine(a.cascades);
-c.erase(e).push(e);var d=c.map(function(f){return a.languages[f];},this);return $merge.apply(this,d);},lambda:function(c){(c||{}).get=function(e,d){return $lambda(c[e]).apply(this,$splat(d));
-};return c;},get:function(e,d,c){if(b&&b[e]){return(d?b[e].get(d,c):b[e]);}},set:function(d,e,c){this.addLanguage(d);langData=a.languages[d];if(!langData[e]){langData[e]={};
-}$extend(langData[e],c);if(d==this.getCurrentLanguage()){this.load();this.fireEvent("langChange",d);}return this;},list:function(){return Hash.getKeys(a.languages);
-}});})();(function(){var i=this.Date;if(!i.now){i.now=$time;}i.Methods={ms:"Milliseconds",year:"FullYear",min:"Minutes",mo:"Month",sec:"Seconds",hr:"Hours"};
-["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds","Time","TimezoneOffset","Week","Timezone","GMTOffset","DayOfYear","LastMonth","LastDayOfMonth","UTCDate","UTCDay","UTCFullYear","AMPM","Ordinal","UTCHours","UTCMilliseconds","UTCMinutes","UTCMonth","UTCSeconds"].each(function(p){i.Methods[p.toLowerCase()]=p;
-});var d=function(q,p){return new Array(p-String(q).length+1).join("0")+q;};i.implement({set:function(t,r){switch($type(t)){case"object":for(var s in t){this.set(s,t[s]);
-}break;case"string":t=t.toLowerCase();var q=i.Methods;if(q[t]){this["set"+q[t]](r);}}return this;},get:function(q){q=q.toLowerCase();var p=i.Methods;if(p[q]){return this["get"+p[q]]();
-}return null;},clone:function(){return new i(this.get("time"));},increment:function(p,r){p=p||"day";r=$pick(r,1);switch(p){case"year":return this.increment("month",r*12);
-case"month":var q=this.get("date");this.set("date",1).set("mo",this.get("mo")+r);return this.set("date",q.min(this.get("lastdayofmonth")));case"week":return this.increment("day",r*7);
-case"day":return this.set("date",this.get("date")+r);}if(!i.units[p]){throw new Error(p+" is not a supported interval");}return this.set("time",this.get("time")+r*i.units[p]());
-},decrement:function(p,q){return this.increment(p,-1*$pick(q,1));},isLeapYear:function(){return i.isLeapYear(this.get("year"));},clearTime:function(){return this.set({hr:0,min:0,sec:0,ms:0});
-},diff:function(q,p){if($type(q)=="string"){q=i.parse(q);}return((q-this)/i.units[p||"day"](3,3)).toInt();},getLastDayOfMonth:function(){return i.daysInMonth(this.get("mo"),this.get("year"));
-},getDayOfYear:function(){return(i.UTC(this.get("year"),this.get("mo"),this.get("date")+1)-i.UTC(this.get("year"),0,1))/i.units.day();},getWeek:function(){return(this.get("dayofyear")/7).ceil();
-},getOrdinal:function(p){return i.getMsg("ordinal",p||this.get("date"));},getTimezone:function(){return this.toString().replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");
-},getGMTOffset:function(){var p=this.get("timezoneOffset");return((p>0)?"-":"+")+d((p.abs()/60).floor(),2)+d(p%60,2);},setAMPM:function(p){p=p.toUpperCase();
-var q=this.get("hr");if(q>11&&p=="AM"){return this.decrement("hour",12);}else{if(q<12&&p=="PM"){return this.increment("hour",12);}}return this;},getAMPM:function(){return(this.get("hr")<12)?"AM":"PM";
-},parse:function(p){this.set("time",i.parse(p));return this;},isValid:function(p){return !!(p||this).valueOf();},format:function(p){if(!this.isValid()){return"invalid date";
-}p=p||"%x %X";p=k[p.toLowerCase()]||p;var q=this;return p.replace(/%([a-z%])/gi,function(s,r){switch(r){case"a":return i.getMsg("days")[q.get("day")].substr(0,3);
-case"A":return i.getMsg("days")[q.get("day")];case"b":return i.getMsg("months")[q.get("month")].substr(0,3);case"B":return i.getMsg("months")[q.get("month")];
-case"c":return q.toString();case"d":return d(q.get("date"),2);case"H":return d(q.get("hr"),2);case"I":return((q.get("hr")%12)||12);case"j":return d(q.get("dayofyear"),3);
-case"m":return d((q.get("mo")+1),2);case"M":return d(q.get("min"),2);case"o":return q.get("ordinal");case"p":return i.getMsg(q.get("ampm"));case"S":return d(q.get("seconds"),2);
-case"U":return d(q.get("week"),2);case"w":return q.get("day");case"x":return q.format(i.getMsg("shortDate"));case"X":return q.format(i.getMsg("shortTime"));
-case"y":return q.get("year").toString().substr(2);case"Y":return q.get("year");case"T":return q.get("GMTOffset");case"Z":return q.get("Timezone");}return r;
-});},toISOString:function(){return this.format("iso8601");}});i.alias("toISOString","toJSON");i.alias("diff","compare");i.alias("format","strftime");var k={db:"%Y-%m-%d %H:%M:%S",compact:"%Y%m%dT%H%M%S",iso8601:"%Y-%m-%dT%H:%M:%S%T",rfc822:"%a, %d %b %Y %H:%M:%S %Z","short":"%d %b %H:%M","long":"%B %d, %Y %H:%M"};
-var g=[];var e=i.parse;var n=function(s,u,r){var q=-1;var t=i.getMsg(s+"s");switch($type(u)){case"object":q=t[u.get(s)];break;case"number":q=t[month-1];
-if(!q){throw new Error("Invalid "+s+" index: "+index);}break;case"string":var p=t.filter(function(v){return this.test(v);},new RegExp("^"+u,"i"));if(!p.length){throw new Error("Invalid "+s+" string");
-}if(p.length>1){throw new Error("Ambiguous "+s);}q=p[0];}return(r)?t.indexOf(q):q;};i.extend({getMsg:function(q,p){return MooTools.lang.get("Date",q,p);
-},units:{ms:$lambda(1),second:$lambda(1000),minute:$lambda(60000),hour:$lambda(3600000),day:$lambda(86400000),week:$lambda(608400000),month:function(q,p){var r=new i;
-return i.daysInMonth($pick(q,r.get("mo")),$pick(p,r.get("year")))*86400000;},year:function(p){p=p||new i().get("year");return i.isLeapYear(p)?31622400000:31536000000;
-}},daysInMonth:function(q,p){return[31,i.isLeapYear(p)?29:28,31,30,31,30,31,31,30,31,30,31][q];},isLeapYear:function(p){return((p%4===0)&&(p%100!==0))||(p%400===0);
-},parse:function(r){var q=$type(r);if(q=="number"){return new i(r);}if(q!="string"){return r;}r=r.clean();if(!r.length){return null;}var p;g.some(function(t){var s=t.re.exec(r);
-return(s)?(p=t.handler(s)):false;});return p||new i(e(r));},parseDay:function(p,q){return n("day",p,q);},parseMonth:function(q,p){return n("month",q,p);
-},parseUTC:function(q){var p=new i(q);var r=i.UTC(p.get("year"),p.get("mo"),p.get("date"),p.get("hr"),p.get("min"),p.get("sec"));return new i(r);},orderIndex:function(p){return i.getMsg("dateOrder").indexOf(p)+1;
-},defineFormat:function(p,q){k[p]=q;},defineFormats:function(p){for(var q in p){i.defineFormat(q,p[q]);}},parsePatterns:g,defineParser:function(p){g.push((p.re&&p.handler)?p:l(p));
-},defineParsers:function(){Array.flatten(arguments).each(i.defineParser);},define2DigitYearStart:function(p){h=p%100;m=p-h;}});var m=1900;var h=70;var j=function(p){return new RegExp("(?:"+i.getMsg(p).map(function(q){return q.substr(0,3);
-}).join("|")+")[a-z]*");};var a=function(p){switch(p){case"x":return((i.orderIndex("month")==1)?"%m[.-/]%d":"%d[.-/]%m")+"([.-/]%y)?";case"X":return"%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%T?";
-}return null;};var o={d:/[0-2]?[0-9]|3[01]/,H:/[01]?[0-9]|2[0-3]/,I:/0?[1-9]|1[0-2]/,M:/[0-5]?\d/,s:/\d+/,o:/[a-z]*/,p:/[ap]\.?m\.?/,y:/\d{2}|\d{4}/,Y:/\d{4}/,T:/Z|[+-]\d{2}(?::?\d{2})?/};
-o.m=o.I;o.S=o.M;var c;var b=function(p){c=p;o.a=o.A=j("days");o.b=o.B=j("months");g.each(function(r,q){if(r.format){g[q]=l(r.format);}});};var l=function(r){if(!c){return{format:r};
-}var p=[];var q=(r.source||r).replace(/%([a-z])/gi,function(t,s){return a(s)||t;}).replace(/\((?!\?)/g,"(?:").replace(/ (?!\?|\*)/g,",? ").replace(/%([a-z%])/gi,function(t,s){var u=o[s];
-if(!u){return s;}p.push(s);return"("+u.source+")";}).replace(/\[a-z\]/gi,"[a-z\\u00c0-\\uffff]");return{format:r,re:new RegExp("^"+q+"$","i"),handler:function(u){u=u.slice(1).associate(p);
-var s=new i().clearTime();if("d" in u){f.call(s,"d",1);}if("m" in u){f.call(s,"m",1);}for(var t in u){f.call(s,t,u[t]);}return s;}};};var f=function(p,q){if(!q){return this;
-}switch(p){case"a":case"A":return this.set("day",i.parseDay(q,true));case"b":case"B":return this.set("mo",i.parseMonth(q,true));case"d":return this.set("date",q);
-case"H":case"I":return this.set("hr",q);case"m":return this.set("mo",q-1);case"M":return this.set("min",q);case"p":return this.set("ampm",q.replace(/\./g,""));
-case"S":return this.set("sec",q);case"s":return this.set("ms",("0."+q)*1000);case"w":return this.set("day",q);case"Y":return this.set("year",q);case"y":q=+q;
-if(q<100){q+=m+(q<h?100:0);}return this.set("year",q);case"T":if(q=="Z"){q="+00";}var r=q.match(/([+-])(\d{2}):?(\d{2})?/);r=(r[1]+"1")*(r[2]*60+(+r[3]||0))+this.getTimezoneOffset();
-return this.set("time",this-r*60000);}return this;};i.defineParsers("%Y([-./]%m([-./]%d((T| )%X)?)?)?","%Y%m%d(T%H(%M%S?)?)?","%x( %X)?","%d%o( %b( %Y)?)?( %X)?","%b( %d%o)?( %Y)?( %X)?","%Y %b( %d%o( %X)?)?","%o %b %d %X %T %Y");
-MooTools.lang.addEvent("langChange",function(p){if(MooTools.lang.get("Date")){b(p);}}).fireEvent("langChange",MooTools.lang.getCurrentLanguage());})();
-Date.implement({timeDiffInWords:function(a){return Date.distanceOfTimeInWords(this,a||new Date);},timeDiff:function(g,b){if(g==null){g=new Date;}var f=((g-this)/1000).toInt();
-if(!f){return"0s";}var a={s:60,m:60,h:24,d:365,y:0};var e,d=[];for(var c in a){if(!f){break;}if((e=a[c])){d.unshift((f%e)+c);f=(f/e).toInt();}else{d.unshift(f+c);
-}}return d.join(b||":");}});Date.alias("timeDiffInWords","timeAgoInWords");Date.extend({distanceOfTimeInWords:function(b,a){return Date.getTimePhrase(((a-b)/1000).toInt());
-},getTimePhrase:function(f){var d=(f<0)?"Until":"Ago";if(f<0){f*=-1;}var b={minute:60,hour:60,day:24,week:7,month:52/12,year:12,eon:Infinity};var e="lessThanMinute";
-for(var c in b){var a=b[c];if(f<1.5*a){if(f>0.75*a){e=c;}break;}f/=a;e=c+"s";}return Date.getMsg(e+d).substitute({delta:f.round()});}});Date.defineParsers({re:/^(?:tod|tom|yes)/i,handler:function(a){var b=new Date().clearTime();
-switch(a[0]){case"tom":return b.increment();case"yes":return b.decrement();default:return b;}}},{re:/^(next|last) ([a-z]+)$/i,handler:function(e){var f=new Date().clearTime();
-var b=f.getDay();var c=Date.parseDay(e[2],true);var a=c-b;if(c<=b){a+=7;}if(e[1]=="last"){a-=7;}return f.set("date",f.getDate()+a);}});Element.implement({measure:function(e){var g=function(h){return !!(!h||h.offsetHeight||h.offsetWidth);
-};if(g(this)){return e.apply(this);}var d=this.getParent(),f=[],b=[];while(!g(d)&&d!=document.body){b.push(d.expose());d=d.getParent();}var c=this.expose();
-var a=e.apply(this);c();b.each(function(h){h();});return a;},expose:function(){if(this.getStyle("display")!="none"){return $empty;}var a=this.style.cssText;
-this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=a;}.bind(this);},getDimensions:function(a){a=$merge({computeSize:false},a);
-var f={};var d=function(g,e){return(e.computeSize)?g.getComputedSize(e):g.getSize();};var b=this.getParent("body");if(b&&this.getStyle("display")=="none"){f=this.measure(function(){return d(this,a);
-});}else{if(b){try{f=d(this,a);}catch(c){}}else{f={x:0,y:0};}}return $chk(f.x)?$extend(f,{width:f.x,height:f.y}):$extend(f,{x:f.width,y:f.height});},getComputedSize:function(a){a=$merge({styles:["padding","border"],plains:{height:["top","bottom"],width:["left","right"]},mode:"both"},a);
-var c={width:0,height:0};switch(a.mode){case"vertical":delete c.width;delete a.plains.width;break;case"horizontal":delete c.height;delete a.plains.height;
-break;}var b=[];$each(a.plains,function(g,f){g.each(function(h){a.styles.each(function(i){b.push((i=="border")?i+"-"+h+"-width":i+"-"+h);});});});var e={};
-b.each(function(f){e[f]=this.getComputedStyle(f);},this);var d=[];$each(a.plains,function(g,f){var h=f.capitalize();c["total"+h]=c["computed"+h]=0;g.each(function(i){c["computed"+i.capitalize()]=0;
-b.each(function(k,j){if(k.test(i)){e[k]=e[k].toInt()||0;c["total"+h]=c["total"+h]+e[k];c["computed"+i.capitalize()]=c["computed"+i.capitalize()]+e[k];}if(k.test(i)&&f!=k&&(k.test("border")||k.test("padding"))&&!d.contains(k)){d.push(k);
-c["computed"+h]=c["computed"+h]-e[k];}});});});["Width","Height"].each(function(g){var f=g.toLowerCase();if(!$chk(c[f])){return;}c[f]=c[f]+this["offset"+g]+c["computed"+g];
-c["total"+g]=c[f]+c["total"+g];delete c["computed"+g];},this);return $extend(e,c);}});Element.implement({isDisplayed:function(){return this.getStyle("display")!="none";
-},isVisible:function(){var a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.isDisplayed();},toggle:function(){return this[this.isDisplayed()?"hide":"show"]();
-},hide:function(){var b;try{if((b=this.getStyle("display"))=="none"){b=null;}}catch(a){}return this.store("originalDisplay",b||"block").setStyle("display","none");
-},show:function(a){return this.setStyle("display",a||this.retrieve("originalDisplay")||"block");},swapClass:function(a,b){return this.removeClass(a).addClass(b);
-}});Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.Engine.trident4,mode:"vertical",display:"block",hideInputs:Browser.Engine.trident?"select, input, textarea, object, embed":false},dissolve:function(){try{if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true;
-this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
-this.element.setStyle("display","block");if(this.options.transitionOpacity){d.opacity=1;}var b={};$each(d,function(f,e){b[e]=[f,0];},this);this.element.setStyle("overflow","hidden");
-var a=this.options.hideInputs?this.element.getElements(this.options.hideInputs):null;this.$chain.unshift(function(){if(this.hidden){this.hiding=false;$each(d,function(f,e){d[e]=f;
-},this);this.element.style.cssText=this.cssText;this.element.setStyle("display","none");if(a){a.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);
-this.callChain();}.bind(this));if(a){a.setStyle("visibility","hidden");}this.start(b);}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);
-this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this));}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();
-this.dissolve();}}}}catch(c){this.hiding=false;this.element.setStyle("display","none");this.callChain.delay(10,this);this.fireEvent("complete",this.element);
-this.fireEvent("hide",this.element);}return this;},reveal:function(){try{if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"||this.element.getStyle("visiblity")=="hidden"||this.element.getStyle("opacity")==0){this.showing=true;
-this.hiding=this.hidden=false;var d;this.cssText=this.element.style.cssText;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});
-}.bind(this));$each(d,function(f,e){d[e]=f;});if($chk(this.options.heightOverride)){d.height=this.options.heightOverride.toInt();}if($chk(this.options.widthOverride)){d.width=this.options.widthOverride.toInt();
-}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=1;}var b={height:0,display:this.options.display};$each(d,function(f,e){b[e]=0;
-});this.element.setStyles($merge(b,{overflow:"hidden"}));var a=this.options.hideInputs?this.element.getElements(this.options.hideInputs):null;if(a){a.setStyle("visibility","hidden");
-}this.start(d);this.$chain.unshift(function(){this.element.style.cssText=this.cssText;this.element.setStyle("display",this.options.display);if(!this.hidden){this.showing=false;
-}if(a){a.setStyle("visibility","visible");}this.callChain();this.fireEvent("show",this.element);}.bind(this));}else{this.callChain();this.fireEvent("complete",this.element);
-this.fireEvent("show",this.element);}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();
-this.reveal();}}}}catch(c){this.element.setStyles({display:this.options.display,visiblity:"visible",opacity:1});this.showing=false;this.callChain.delay(10,this);
-this.fireEvent("complete",this.element);this.fireEvent("show",this.element);}return this;},toggle:function(){if(this.element.getStyle("display")=="none"||this.element.getStyle("visiblity")=="hidden"||this.element.getStyle("opacity")==0){this.reveal();
-}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments);this.element.style.cssText=this.cssText;this.hidding=false;this.showing=false;
-}});Element.Properties.reveal={set:function(a){var b=this.retrieve("reveal");if(b){b.cancel();}return this.eliminate("reveal").store("reveal:options",a);
-},get:function(a){if(a||!this.retrieve("reveal")){if(a||!this.retrieve("reveal:options")){this.set("reveal",a);}this.store("reveal",new Fx.Reveal(this,this.retrieve("reveal:options")));
-}return this.retrieve("reveal");}};Element.Properties.dissolve=Element.Properties.reveal;Element.implement({reveal:function(a){this.get("reveal",a).reveal();
-return this;},dissolve:function(a){this.get("reveal",a).dissolve();return this;},nix:function(){var a=Array.link(arguments,{destroy:Boolean.type,options:Object.type});
-this.get("reveal",a.options).dissolve().chain(function(){this[a.destroy?"destroy":"dispose"]();}.bind(this));return this;},wink:function(){var b=Array.link(arguments,{duration:Number.type,options:Object.type});
-var a=this.get("reveal",b.options);a.reveal().chain(function(){(function(){a.dissolve();}).delay(b.duration||2000);});}});MooTools.lang.set("en-US","Date",{months:["January","February","March","April","May","June","July","August","September","October","November","December"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dateOrder:["month","date","year"],shortDate:"%m/%d/%Y",shortTime:"%I:%M%p",AM:"AM",PM:"PM",ordinal:function(a){return(a>3&&a<21)?"th":["th","st","nd","rd","th"][Math.min(a%10,4)];
-},lessThanMinuteAgo:"less than a minute ago",minuteAgo:"about a minute ago",minutesAgo:"{delta} minutes ago",hourAgo:"about an hour ago",hoursAgo:"about {delta} hours ago",dayAgo:"1 day ago",daysAgo:"{delta} days ago",weekAgo:"1 week ago",weeksAgo:"{delta} weeks ago",monthAgo:"1 month ago",monthsAgo:"{delta} months ago",yearAgo:"1 year ago",yearsAgo:"{delta} years ago",lessThanMinuteUntil:"less than a minute from now",minuteUntil:"about a minute from now",minutesUntil:"{delta} minutes from now",hourUntil:"about an hour from now",hoursUntil:"about {delta} hours from now",dayUntil:"1 day from now",daysUntil:"{delta} days from now",weekUntil:"1 week from now",weeksUntil:"{delta} weeks from now",monthUntil:"1 month from now",monthsUntil:"{delta} months from now",yearUntil:"1 year from now",yearsUntil:"{delta} years from now"});
diff --git a/public/javascripts/mootools-more-1.3.1.1.js b/public/javascripts/mootools-more-1.3.1.1.js
deleted file mode 100644
index 582e4660..00000000
--- a/public/javascripts/mootools-more-1.3.1.1.js
+++ /dev/null
@@ -1,1322 +0,0 @@
-// MooTools: the javascript framework.
-// Load this file's selection again by visiting: http://mootools.net/more/0a2b8625655481363709ef8d9ab1d0f4
-// Or build this file again with packager using: packager build More/Date More/Date.Extras More/Hash More/Request.JSONP
-/*
----
-
-script: More.js
-
-name: More
-
-description: MooTools More
-
-license: MIT-style license
-
-authors:
- - Guillermo Rauch
- - Thomas Aylott
- - Scott Kyle
- - Arian Stolwijk
- - Tim Wienk
- - Christoph Pojer
- - Aaron Newton
-
-requires:
- - Core/MooTools
-
-provides: [MooTools.More]
-
-...
-*/
-
-MooTools.More = {
- 'version': '1.3.1.1',
- 'build': '0292a3af1eea242b817fecf9daa127417d10d4ce'
-};
-
-
-/*
----
-
-script: Object.Extras.js
-
-name: Object.Extras
-
-description: Extra Object generics, like getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
-
-requires:
- - Core/Object
- - /MooTools.More
-
-provides: [Object.Extras]
-
-...
-*/
-
-(function(){
-
-var defined = function(value){
- return value != null;
-};
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
- getFromPath: function(source, parts){
- if (typeof parts == 'string') parts = parts.split('.');
- for (var i = 0, l = parts.length; i < l; i++){
- if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
- else return null;
- }
- return source;
- },
-
- cleanValues: function(object, method){
- method = method || defined;
- for (var key in object) if (!method(object[key])){
- delete object[key];
- }
- return object;
- },
-
- erase: function(object, key){
- if (hasOwnProperty.call(object, key)) delete object[key];
- return object;
- },
-
- run: function(object){
- var args = Array.slice(arguments, 1);
- for (var key in object) if (object[key].apply){
- object[key].apply(object, args);
- }
- return object;
- }
-
-});
-
-}).call(this);
-
-
-/*
----
-
-script: Locale.js
-
-name: Locale
-
-description: Provides methods for localization.
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
- - Arian Stolwijk
-
-requires:
- - Core/Events
- - /Object.Extras
- - /MooTools.More
-
-provides: [Locale, Lang]
-
-...
-*/
-
-(function(){
-
-var current = null,
- locales = {},
- inherits = {};
-
-var getSet = function(set){
- if (instanceOf(set, Locale.Set)) return set;
- else return locales[set];
-};
-
-var Locale = this.Locale = {
-
- define: function(locale, set, key, value){
- var name;
- if (instanceOf(locale, Locale.Set)){
- name = locale.name;
- if (name) locales[name] = locale;
- } else {
- name = locale;
- if (!locales[name]) locales[name] = new Locale.Set(name);
- locale = locales[name];
- }
-
- if (set) locale.define(set, key, value);
-
-
-
- if (!current) current = locale;
-
- return locale;
- },
-
- use: function(locale){
- locale = getSet(locale);
-
- if (locale){
- current = locale;
-
- this.fireEvent('change', locale);
-
-
- }
-
- return this;
- },
-
- getCurrent: function(){
- return current;
- },
-
- get: function(key, args){
- return (current) ? current.get(key, args) : '';
- },
-
- inherit: function(locale, inherits, set){
- locale = getSet(locale);
-
- if (locale) locale.inherit(inherits, set);
- return this;
- },
-
- list: function(){
- return Object.keys(locales);
- }
-
-};
-
-Object.append(Locale, new Events);
-
-Locale.Set = new Class({
-
- sets: {},
-
- inherits: {
- locales: [],
- sets: {}
- },
-
- initialize: function(name){
- this.name = name || '';
- },
-
- define: function(set, key, value){
- var defineData = this.sets[set];
- if (!defineData) defineData = {};
-
- if (key){
- if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
- else defineData[key] = value;
- }
- this.sets[set] = defineData;
-
- return this;
- },
-
- get: function(key, args, _base){
- var value = Object.getFromPath(this.sets, key);
- if (value != null){
- var type = typeOf(value);
- if (type == 'function') value = value.apply(null, Array.from(args));
- else if (type == 'object') value = Object.clone(value);
- return value;
- }
-
- // get value of inherited locales
- var index = key.indexOf('.'),
- set = index < 0 ? key : key.substr(0, index),
- names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
- if (!_base) _base = [];
-
- for (var i = 0, l = names.length; i < l; i++){
- if (_base.contains(names[i])) continue;
- _base.include(names[i]);
-
- var locale = locales[names[i]];
- if (!locale) continue;
-
- value = locale.get(key, args, _base);
- if (value != null) return value;
- }
-
- return '';
- },
-
- inherit: function(names, set){
- names = Array.from(names);
-
- if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
-
- var l = names.length;
- while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
-
- return this;
- }
-
-});
-
-
-
-}).call(this);
-
-
-/*
----
-
-name: Locale.en-US.Date
-
-description: Date messages for US English.
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
-
-requires:
- - /Locale
-
-provides: [Locale.en-US.Date]
-
-...
-*/
-
-Locale.define('en-US', 'Date', {
-
- months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
- months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
- days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
- // Culture's date order: MM/DD/YYYY
- dateOrder: ['month', 'date', 'year'],
- shortDate: '%m/%d/%Y',
- shortTime: '%I:%M%p',
- AM: 'AM',
- PM: 'PM',
- firstDayOfWeek: 0,
-
- // Date.Extras
- ordinal: function(dayOfMonth){
- // 1st, 2nd, 3rd, etc.
- return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
- },
-
- lessThanMinuteAgo: 'less than a minute ago',
- minuteAgo: 'about a minute ago',
- minutesAgo: '{delta} minutes ago',
- hourAgo: 'about an hour ago',
- hoursAgo: 'about {delta} hours ago',
- dayAgo: '1 day ago',
- daysAgo: '{delta} days ago',
- weekAgo: '1 week ago',
- weeksAgo: '{delta} weeks ago',
- monthAgo: '1 month ago',
- monthsAgo: '{delta} months ago',
- yearAgo: '1 year ago',
- yearsAgo: '{delta} years ago',
-
- lessThanMinuteUntil: 'less than a minute from now',
- minuteUntil: 'about a minute from now',
- minutesUntil: '{delta} minutes from now',
- hourUntil: 'about an hour from now',
- hoursUntil: 'about {delta} hours from now',
- dayUntil: '1 day from now',
- daysUntil: '{delta} days from now',
- weekUntil: '1 week from now',
- weeksUntil: '{delta} weeks from now',
- monthUntil: '1 month from now',
- monthsUntil: '{delta} months from now',
- yearUntil: '1 year from now',
- yearsUntil: '{delta} years from now'
-
-});
-
-
-/*
----
-
-script: Date.js
-
-name: Date
-
-description: Extends the Date native object to include methods useful in managing dates.
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
- - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
- - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
- - Scott Kyle - scott [at] appden.com; http://appden.com
-
-requires:
- - Core/Array
- - Core/String
- - Core/Number
- - MooTools.More
- - Locale
- - Locale.en-US.Date
-
-provides: [Date]
-
-...
-*/
-
-(function(){
-
-var Date = this.Date;
-
-var DateMethods = Date.Methods = {
- ms: 'Milliseconds',
- year: 'FullYear',
- min: 'Minutes',
- mo: 'Month',
- sec: 'Seconds',
- hr: 'Hours'
-};
-
-['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
- 'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
- 'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
- Date.Methods[method.toLowerCase()] = method;
-});
-
-var pad = function(n, digits, string){
- if (digits == 1) return n;
- return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
-};
-
-Date.implement({
-
- set: function(prop, value){
- prop = prop.toLowerCase();
- var method = DateMethods[prop] && 'set' + DateMethods[prop];
- if (method && this[method]) this[method](value);
- return this;
- }.overloadSetter(),
-
- get: function(prop){
- prop = prop.toLowerCase();
- var method = DateMethods[prop] && 'get' + DateMethods[prop];
- if (method && this[method]) return this[method]();
- return null;
- }.overloadGetter(),
-
- clone: function(){
- return new Date(this.get('time'));
- },
-
- increment: function(interval, times){
- interval = interval || 'day';
- times = times != null ? times : 1;
-
- switch (interval){
- case 'year':
- return this.increment('month', times * 12);
- case 'month':
- var d = this.get('date');
- this.set('date', 1).set('mo', this.get('mo') + times);
- return this.set('date', d.min(this.get('lastdayofmonth')));
- case 'week':
- return this.increment('day', times * 7);
- case 'day':
- return this.set('date', this.get('date') + times);
- }
-
- if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
-
- return this.set('time', this.get('time') + times * Date.units[interval]());
- },
-
- decrement: function(interval, times){
- return this.increment(interval, -1 * (times != null ? times : 1));
- },
-
- isLeapYear: function(){
- return Date.isLeapYear(this.get('year'));
- },
-
- clearTime: function(){
- return this.set({hr: 0, min: 0, sec: 0, ms: 0});
- },
-
- diff: function(date, resolution){
- if (typeOf(date) == 'string') date = Date.parse(date);
-
- return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
- },
-
- getLastDayOfMonth: function(){
- return Date.daysInMonth(this.get('mo'), this.get('year'));
- },
-
- getDayOfYear: function(){
- return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
- - Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
- },
-
- setDay: function(day, firstDayOfWeek){
- if (firstDayOfWeek == null){
- firstDayOfWeek = Date.getMsg('firstDayOfWeek');
- if (firstDayOfWeek === '') firstDayOfWeek = 1;
- }
-
- day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
- var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
-
- return this.increment('day', day - currentDay);
- },
-
- getWeek: function(firstDayOfWeek){
- if (firstDayOfWeek == null){
- firstDayOfWeek = Date.getMsg('firstDayOfWeek');
- if (firstDayOfWeek === '') firstDayOfWeek = 1;
- }
-
- var date = this,
- dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
- dividend = 0,
- firstDayOfYear;
-
- if (firstDayOfWeek == 1){
- // ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
- var month = date.get('month'),
- startOfWeek = date.get('date') - dayOfWeek;
-
- if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
-
- if (month == 0 && startOfWeek < -2){
- // Use a date from last year to determine the week
- date = new Date(date).decrement('day', dayOfWeek);
- dayOfWeek = 0;
- }
-
- firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
- if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
- } else {
- // In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
- // Days in the same week can have a different weeknumber if the week spreads across two years.
- firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
- }
-
- dividend += date.get('dayofyear');
- dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
- dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
-
- return (dividend / 7);
- },
-
- getOrdinal: function(day){
- return Date.getMsg('ordinal', day || this.get('date'));
- },
-
- getTimezone: function(){
- return this.toString()
- .replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
- .replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
- },
-
- getGMTOffset: function(){
- var off = this.get('timezoneOffset');
- return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
- },
-
- setAMPM: function(ampm){
- ampm = ampm.toUpperCase();
- var hr = this.get('hr');
- if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
- else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
- return this;
- },
-
- getAMPM: function(){
- return (this.get('hr') < 12) ? 'AM' : 'PM';
- },
-
- parse: function(str){
- this.set('time', Date.parse(str));
- return this;
- },
-
- isValid: function(date){
- return !isNaN((date || this).valueOf());
- },
-
- format: function(f){
- if (!this.isValid()) return 'invalid date';
- if (!f) f = '%x %X';
-
- var formatLower = f.toLowerCase();
- if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter!
- f = formats[formatLower] || f; // replace short-hand with actual format
-
- var d = this;
- return f.replace(/%([a-z%])/gi,
- function($0, $1){
- switch ($1){
- case 'a': return Date.getMsg('days_abbr')[d.get('day')];
- case 'A': return Date.getMsg('days')[d.get('day')];
- case 'b': return Date.getMsg('months_abbr')[d.get('month')];
- case 'B': return Date.getMsg('months')[d.get('month')];
- case 'c': return d.format('%a %b %d %H:%M:%S %Y');
- case 'd': return pad(d.get('date'), 2);
- case 'e': return pad(d.get('date'), 2, ' ');
- case 'H': return pad(d.get('hr'), 2);
- case 'I': return pad((d.get('hr') % 12) || 12, 2);
- case 'j': return pad(d.get('dayofyear'), 3);
- case 'k': return pad(d.get('hr'), 2, ' ');
- case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
- case 'L': return pad(d.get('ms'), 3);
- case 'm': return pad((d.get('mo') + 1), 2);
- case 'M': return pad(d.get('min'), 2);
- case 'o': return d.get('ordinal');
- case 'p': return Date.getMsg(d.get('ampm'));
- case 's': return Math.round(d / 1000);
- case 'S': return pad(d.get('seconds'), 2);
- case 'T': return d.format('%H:%M:%S');
- case 'U': return pad(d.get('week'), 2);
- case 'w': return d.get('day');
- case 'x': return d.format(Date.getMsg('shortDate'));
- case 'X': return d.format(Date.getMsg('shortTime'));
- case 'y': return d.get('year').toString().substr(2);
- case 'Y': return d.get('year');
- case 'z': return d.get('GMTOffset');
- case 'Z': return d.get('Timezone');
- }
- return $1;
- }
- );
- },
-
- toISOString: function(){
- return this.format('iso8601');
- }
-
-}).alias({
- toJSON: 'toISOString',
- compare: 'diff',
- strftime: 'format'
-});
-
-var formats = {
- db: '%Y-%m-%d %H:%M:%S',
- compact: '%Y%m%dT%H%M%S',
- 'short': '%d %b %H:%M',
- 'long': '%B %d, %Y %H:%M'
-};
-
-// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
-var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
- rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-
-var formatters = {
- rfc822: function(date){
- return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
- },
- rfc2822: function(date){
- return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
- },
- iso8601: function(date){
- return (
- date.getUTCFullYear() + '-' +
- pad(date.getUTCMonth() + 1, 2) + '-' +
- pad(date.getUTCDate(), 2) + 'T' +
- pad(date.getUTCHours(), 2) + ':' +
- pad(date.getUTCMinutes(), 2) + ':' +
- pad(date.getUTCSeconds(), 2) + '.' +
- pad(date.getUTCMilliseconds(), 3) + 'Z'
- );
- }
-};
-
-
-var parsePatterns = [],
- nativeParse = Date.parse;
-
-var parseWord = function(type, word, num){
- var ret = -1,
- translated = Date.getMsg(type + 's');
- switch (typeOf(word)){
- case 'object':
- ret = translated[word.get(type)];
- break;
- case 'number':
- ret = translated[word];
- if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
- break;
- case 'string':
- var match = translated.filter(function(name){
- return this.test(name);
- }, new RegExp('^' + word, 'i'));
- if (!match.length) throw new Error('Invalid ' + type + ' string');
- if (match.length > 1) throw new Error('Ambiguous ' + type);
- ret = match[0];
- }
-
- return (num) ? translated.indexOf(ret) : ret;
-};
-
-var startCentury = 1900,
- startYear = 70;
-
-Date.extend({
-
- getMsg: function(key, args){
- return Locale.get('Date.' + key, args);
- },
-
- units: {
- ms: Function.from(1),
- second: Function.from(1000),
- minute: Function.from(60000),
- hour: Function.from(3600000),
- day: Function.from(86400000),
- week: Function.from(608400000),
- month: function(month, year){
- var d = new Date;
- return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
- },
- year: function(year){
- year = year || new Date().get('year');
- return Date.isLeapYear(year) ? 31622400000 : 31536000000;
- }
- },
-
- daysInMonth: function(month, year){
- return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
- },
-
- isLeapYear: function(year){
- return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
- },
-
- parse: function(from){
- var t = typeOf(from);
- if (t == 'number') return new Date(from);
- if (t != 'string') return from;
- from = from.clean();
- if (!from.length) return null;
-
- var parsed;
- parsePatterns.some(function(pattern){
- var bits = pattern.re.exec(from);
- return (bits) ? (parsed = pattern.handler(bits)) : false;
- });
-
- if (!(parsed && parsed.isValid())){
- parsed = new Date(nativeParse(from));
- if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
- }
- return parsed;
- },
-
- parseDay: function(day, num){
- return parseWord('day', day, num);
- },
-
- parseMonth: function(month, num){
- return parseWord('month', month, num);
- },
-
- parseUTC: function(value){
- var localDate = new Date(value);
- var utcSeconds = Date.UTC(
- localDate.get('year'),
- localDate.get('mo'),
- localDate.get('date'),
- localDate.get('hr'),
- localDate.get('min'),
- localDate.get('sec'),
- localDate.get('ms')
- );
- return new Date(utcSeconds);
- },
-
- orderIndex: function(unit){
- return Date.getMsg('dateOrder').indexOf(unit) + 1;
- },
-
- defineFormat: function(name, format){
- formats[name] = format;
- return this;
- },
-
- defineFormats: function(formats){
- for (var name in formats) Date.defineFormat(name, formats[name]);
- return this;
- },
-
-
-
- defineParser: function(pattern){
- parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
- return this;
- },
-
- defineParsers: function(){
- Array.flatten(arguments).each(Date.defineParser);
- return this;
- },
-
- define2DigitYearStart: function(year){
- startYear = year % 100;
- startCentury = year - startYear;
- return this;
- }
-
-});
-
-var regexOf = function(type){
- return new RegExp('(?:' + Date.getMsg(type).map(function(name){
- return name.substr(0, 3);
- }).join('|') + ')[a-z]*');
-};
-
-var replacers = function(key){
- switch (key){
- case 'T':
- return '%H:%M:%S';
- case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
- return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
- case 'X':
- return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
- }
- return null;
-};
-
-var keys = {
- d: /[0-2]?[0-9]|3[01]/,
- H: /[01]?[0-9]|2[0-3]/,
- I: /0?[1-9]|1[0-2]/,
- M: /[0-5]?\d/,
- s: /\d+/,
- o: /[a-z]*/,
- p: /[ap]\.?m\.?/,
- y: /\d{2}|\d{4}/,
- Y: /\d{4}/,
- z: /Z|[+-]\d{2}(?::?\d{2})?/
-};
-
-keys.m = keys.I;
-keys.S = keys.M;
-
-var currentLanguage;
-
-var recompile = function(language){
- currentLanguage = language;
-
- keys.a = keys.A = regexOf('days');
- keys.b = keys.B = regexOf('months');
-
- parsePatterns.each(function(pattern, i){
- if (pattern.format) parsePatterns[i] = build(pattern.format);
- });
-};
-
-var build = function(format){
- if (!currentLanguage) return {format: format};
-
- var parsed = [];
- var re = (format.source || format) // allow format to be regex
- .replace(/%([a-z])/gi,
- function($0, $1){
- return replacers($1) || $0;
- }
- ).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
- .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
- .replace(/%([a-z%])/gi,
- function($0, $1){
- var p = keys[$1];
- if (!p) return $1;
- parsed.push($1);
- return '(' + p.source + ')';
- }
- ).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
-
- return {
- format: format,
- re: new RegExp('^' + re + '$', 'i'),
- handler: function(bits){
- bits = bits.slice(1).associate(parsed);
- var date = new Date().clearTime(),
- year = bits.y || bits.Y;
-
- if (year != null) handle.call(date, 'y', year); // need to start in the right year
- if ('d' in bits) handle.call(date, 'd', 1);
- if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
-
- for (var key in bits) handle.call(date, key, bits[key]);
- return date;
- }
- };
-};
-
-var handle = function(key, value){
- if (!value) return this;
-
- switch (key){
- case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
- case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
- case 'd': return this.set('date', value);
- case 'H': case 'I': return this.set('hr', value);
- case 'm': return this.set('mo', value - 1);
- case 'M': return this.set('min', value);
- case 'p': return this.set('ampm', value.replace(/\./g, ''));
- case 'S': return this.set('sec', value);
- case 's': return this.set('ms', ('0.' + value) * 1000);
- case 'w': return this.set('day', value);
- case 'Y': return this.set('year', value);
- case 'y':
- value = +value;
- if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
- return this.set('year', value);
- case 'z':
- if (value == 'Z') value = '+00';
- var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
- offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
- return this.set('time', this - offset * 60000);
- }
-
- return this;
-};
-
-Date.defineParsers(
- '%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
- '%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
- '%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
- '%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
- '%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
- '%Y %b( %d%o( %X)?)?', // Same as above with year coming first
- '%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
- '%T', // %H:%M:%S
- '%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
-);
-
-Locale.addEvent('change', function(language){
- if (Locale.get('Date')) recompile(language);
-}).fireEvent('change', Locale.getCurrent());
-
-}).call(this);
-
-
-/*
----
-
-script: Date.Extras.js
-
-name: Date.Extras
-
-description: Extends the Date native object to include extra methods (on top of those in Date.js).
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
- - Scott Kyle
-
-requires:
- - /Date
-
-provides: [Date.Extras]
-
-...
-*/
-
-Date.implement({
-
- timeDiffInWords: function(to){
- return Date.distanceOfTimeInWords(this, to || new Date);
- },
-
- timeDiff: function(to, separator){
- if (to == null) to = new Date;
- var delta = ((to - this) / 1000).floor();
-
- var vals = [],
- durations = [60, 60, 24, 365, 0],
- names = ['s', 'm', 'h', 'd', 'y'],
- value, duration;
-
- for (var item = 0; item < durations.length; item++){
- if (item && !delta) break;
- value = delta;
- if ((duration = durations[item])){
- value = (delta % duration);
- delta = (delta / duration).floor();
- }
- vals.unshift(value + (names[item] || ''));
- }
-
- return vals.join(separator || ':');
- }
-
-}).extend({
-
- distanceOfTimeInWords: function(from, to){
- return Date.getTimePhrase(((to - from) / 1000).toInt());
- },
-
- getTimePhrase: function(delta){
- var suffix = (delta < 0) ? 'Until' : 'Ago';
- if (delta < 0) delta *= -1;
-
- var units = {
- minute: 60,
- hour: 60,
- day: 24,
- week: 7,
- month: 52 / 12,
- year: 12,
- eon: Infinity
- };
-
- var msg = 'lessThanMinute';
-
- for (var unit in units){
- var interval = units[unit];
- if (delta < 1.5 * interval){
- if (delta > 0.75 * interval) msg = unit;
- break;
- }
- delta /= interval;
- msg = unit + 's';
- }
-
- delta = delta.round();
- return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
- }
-
-}).defineParsers(
-
- {
- // "today", "tomorrow", "yesterday"
- re: /^(?:tod|tom|yes)/i,
- handler: function(bits){
- var d = new Date().clearTime();
- switch (bits[0]){
- case 'tom': return d.increment();
- case 'yes': return d.decrement();
- default: return d;
- }
- }
- },
-
- {
- // "next Wednesday", "last Thursday"
- re: /^(next|last) ([a-z]+)$/i,
- handler: function(bits){
- var d = new Date().clearTime();
- var day = d.getDay();
- var newDay = Date.parseDay(bits[2], true);
- var addDays = newDay - day;
- if (newDay <= day) addDays += 7;
- if (bits[1] == 'last') addDays -= 7;
- return d.set('date', d.getDate() + addDays);
- }
- }
-
-).alias('timeAgoInWords', 'timeDiffInWords');
-
-
-/*
----
-
-name: Hash
-
-description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
-
-license: MIT-style license.
-
-requires:
- - Core/Object
- - /MooTools.More
-
-provides: [Hash]
-
-...
-*/
-
-(function(){
-
-if (this.Hash) return;
-
-var Hash = this.Hash = new Type('Hash', function(object){
- if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
- for (var key in object) this[key] = object[key];
- return this;
-});
-
-this.$H = function(object){
- return new Hash(object);
-};
-
-Hash.implement({
-
- forEach: function(fn, bind){
- Object.forEach(this, fn, bind);
- },
-
- getClean: function(){
- var clean = {};
- for (var key in this){
- if (this.hasOwnProperty(key)) clean[key] = this[key];
- }
- return clean;
- },
-
- getLength: function(){
- var length = 0;
- for (var key in this){
- if (this.hasOwnProperty(key)) length++;
- }
- return length;
- }
-
-});
-
-Hash.alias('each', 'forEach');
-
-Hash.implement({
-
- has: Object.prototype.hasOwnProperty,
-
- keyOf: function(value){
- return Object.keyOf(this, value);
- },
-
- hasValue: function(value){
- return Object.contains(this, value);
- },
-
- extend: function(properties){
- Hash.each(properties || {}, function(value, key){
- Hash.set(this, key, value);
- }, this);
- return this;
- },
-
- combine: function(properties){
- Hash.each(properties || {}, function(value, key){
- Hash.include(this, key, value);
- }, this);
- return this;
- },
-
- erase: function(key){
- if (this.hasOwnProperty(key)) delete this[key];
- return this;
- },
-
- get: function(key){
- return (this.hasOwnProperty(key)) ? this[key] : null;
- },
-
- set: function(key, value){
- if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
- return this;
- },
-
- empty: function(){
- Hash.each(this, function(value, key){
- delete this[key];
- }, this);
- return this;
- },
-
- include: function(key, value){
- if (this[key] == undefined) this[key] = value;
- return this;
- },
-
- map: function(fn, bind){
- return new Hash(Object.map(this, fn, bind));
- },
-
- filter: function(fn, bind){
- return new Hash(Object.filter(this, fn, bind));
- },
-
- every: function(fn, bind){
- return Object.every(this, fn, bind);
- },
-
- some: function(fn, bind){
- return Object.some(this, fn, bind);
- },
-
- getKeys: function(){
- return Object.keys(this);
- },
-
- getValues: function(){
- return Object.values(this);
- },
-
- toQueryString: function(base){
- return Object.toQueryString(this, base);
- }
-
-});
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-
-}).call(this);
-
-
-
-/*
----
-
-script: Request.JSONP.js
-
-name: Request.JSONP
-
-description: Defines Request.JSONP, a class for cross domain javascript via script injection.
-
-license: MIT-style license
-
-authors:
- - Aaron Newton
- - Guillermo Rauch
- - Arian Stolwijk
-
-requires:
- - Core/Element
- - Core/Request
- - MooTools.More
-
-provides: [Request.JSONP]
-
-...
-*/
-
-Request.JSONP = new Class({
-
- Implements: [Chain, Events, Options],
-
- options: {
- /*
- onRequest: function(src, scriptElement){},
- onComplete: function(data){},
- onSuccess: function(data){},
- onCancel: function(){},
- onTimeout: function(){},
- onError: function(){}, */
- onRequest: function(src){
- if (this.options.log && window.console && console.log){
- console.log('JSONP retrieving script with url:' + src);
- }
- },
- onError: function(src){
- if (this.options.log && window.console && console.warn){
- console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
- }
- },
- url: '',
- callbackKey: 'callback',
- injectScript: document.head,
- data: '',
- link: 'ignore',
- timeout: 0,
- log: false
- },
-
- initialize: function(options){
- this.setOptions(options);
- },
-
- send: function(options){
- if (!Request.prototype.check.call(this, options)) return this;
- this.running = true;
-
- var type = typeOf(options);
- if (type == 'string' || type == 'element') options = {data: options};
- options = Object.merge(this.options, options || {});
-
- var data = options.data;
- switch (typeOf(data)){
- case 'element': data = document.id(data).toQueryString(); break;
- case 'object': case 'hash': data = Object.toQueryString(data);
- }
-
- var index = this.index = Request.JSONP.counter++;
-
- var src = options.url +
- (options.url.test('\\?') ? '&' :'?') +
- (options.callbackKey) +
- '=Request.JSONP.request_map.request_'+ index +
- (data ? '&' + data : '');
-
- if (src.length > 2083) this.fireEvent('error', src);
-
- Request.JSONP.request_map['request_' + index] = function(){
- this.success(arguments, index);
- }.bind(this);
-
- var script = this.getScript(src).inject(options.injectScript);
- this.fireEvent('request', [src, script]);
-
- if (options.timeout) this.timeout.delay(options.timeout, this);
-
- return this;
- },
-
- getScript: function(src){
- if (!this.script) this.script = new Element('script[type=text/javascript]', {
- async: true,
- src: src
- });
- return this.script;
- },
-
- success: function(args, index){
- if (!this.running) return false;
- this.clear()
- .fireEvent('complete', args).fireEvent('success', args)
- .callChain();
- },
-
- cancel: function(){
- if (this.running) this.clear().fireEvent('cancel');
- return this;
- },
-
- isRunning: function(){
- return !!this.running;
- },
-
- clear: function(){
- this.running = false;
- if (this.script){
- this.script.destroy();
- this.script = null;
- }
- return this;
- },
-
- timeout: function(){
- if (this.running){
- this.running = false;
- this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
- }
- return this;
- }
-
-});
-
-Request.JSONP.counter = 0;
-Request.JSONP.request_map = {};
-
-
diff --git a/public/javascripts/mootools-yui-compressed.js b/public/javascripts/mootools-yui-compressed.js
deleted file mode 100644
index a20f066b..00000000
--- a/public/javascripts/mootools-yui-compressed.js
+++ /dev/null
@@ -1,5492 +0,0 @@
-/*
----
-MooTools: the javascript framework
-
-web build:
- - http://mootools.net/core/7c56cfef9dddcf170a5d68e3fb61cfd7
-
-packager build:
- - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
-
-/*
----
-
-name: Core
-
-description: The heart of MooTools.
-
-license: MIT-style license.
-
-copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/).
-
-authors: The MooTools production team (http://mootools.net/developers/)
-
-inspiration:
- - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
- - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
-
-provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
-
-...
-*/
-
-(function(){
-
-this.MooTools = {
- version: '1.3.1',
- build: 'af48c8d589f43f32212f9bb8ff68a127e6a3ba6c'
-};
-
-// typeOf, instanceOf
-
-var typeOf = this.typeOf = function(item){
- if (item == null) return 'null';
- if (item.$family) return item.$family();
-
- if (item.nodeName){
- if (item.nodeType == 1) return 'element';
- if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
- } else if (typeof item.length == 'number'){
- if (item.callee) return 'arguments';
- if ('item' in item) return 'collection';
- }
-
- return typeof item;
-};
-
-var instanceOf = this.instanceOf = function(item, object){
- if (item == null) return false;
- var constructor = item.$constructor || item.constructor;
- while (constructor){
- if (constructor === object) return true;
- constructor = constructor.parent;
- }
- return item instanceof object;
-};
-
-// Function overloading
-
-var Function = this.Function;
-
-var enumerables = true;
-for (var i in {toString: 1}) enumerables = null;
-if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
-
-Function.prototype.overloadSetter = function(usePlural){
- var self = this;
- return function(a, b){
- if (a == null) return this;
- if (usePlural || typeof a != 'string'){
- for (var k in a) self.call(this, k, a[k]);
- if (enumerables) for (var i = enumerables.length; i--;){
- k = enumerables[i];
- if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
- }
- } else {
- self.call(this, a, b);
- }
- return this;
- };
-};
-
-Function.prototype.overloadGetter = function(usePlural){
- var self = this;
- return function(a){
- var args, result;
- if (usePlural || typeof a != 'string') args = a;
- else if (arguments.length > 1) args = arguments;
- if (args){
- result = {};
- for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
- } else {
- result = self.call(this, a);
- }
- return result;
- };
-};
-
-Function.prototype.extend = function(key, value){
- this[key] = value;
-}.overloadSetter();
-
-Function.prototype.implement = function(key, value){
- this.prototype[key] = value;
-}.overloadSetter();
-
-// From
-
-var slice = Array.prototype.slice;
-
-Function.from = function(item){
- return (typeOf(item) == 'function') ? item : function(){
- return item;
- };
-};
-
-Array.from = function(item){
- if (item == null) return [];
- return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
-};
-
-Number.from = function(item){
- var number = parseFloat(item);
- return isFinite(number) ? number : null;
-};
-
-String.from = function(item){
- return item + '';
-};
-
-// hide, protect
-
-Function.implement({
-
- hide: function(){
- this.$hidden = true;
- return this;
- },
-
- protect: function(){
- this.$protected = true;
- return this;
- }
-
-});
-
-// Type
-
-var Type = this.Type = function(name, object){
- if (name){
- var lower = name.toLowerCase();
- var typeCheck = function(item){
- return (typeOf(item) == lower);
- };
-
- Type['is' + name] = typeCheck;
- if (object != null){
- object.prototype.$family = (function(){
- return lower;
- }).hide();
-
- }
- }
-
- if (object == null) return null;
-
- object.extend(this);
- object.$constructor = Type;
- object.prototype.$constructor = object;
-
- return object;
-};
-
-var toString = Object.prototype.toString;
-
-Type.isEnumerable = function(item){
- return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
-};
-
-var hooks = {};
-
-var hooksOf = function(object){
- var type = typeOf(object.prototype);
- return hooks[type] || (hooks[type] = []);
-};
-
-var implement = function(name, method){
- if (method && method.$hidden) return;
-
- var hooks = hooksOf(this);
-
- for (var i = 0; i < hooks.length; i++){
- var hook = hooks[i];
- if (typeOf(hook) == 'type') implement.call(hook, name, method);
- else hook.call(this, name, method);
- }
-
- var previous = this.prototype[name];
- if (previous == null || !previous.$protected) this.prototype[name] = method;
-
- if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
- return method.apply(item, slice.call(arguments, 1));
- });
-};
-
-var extend = function(name, method){
- if (method && method.$hidden) return;
- var previous = this[name];
- if (previous == null || !previous.$protected) this[name] = method;
-};
-
-Type.implement({
-
- implement: implement.overloadSetter(),
-
- extend: extend.overloadSetter(),
-
- alias: function(name, existing){
- implement.call(this, name, this.prototype[existing]);
- }.overloadSetter(),
-
- mirror: function(hook){
- hooksOf(this).push(hook);
- return this;
- }
-
-});
-
-new Type('Type', Type);
-
-// Default Types
-
-var force = function(name, object, methods){
- var isType = (object != Object),
- prototype = object.prototype;
-
- if (isType) object = new Type(name, object);
-
- for (var i = 0, l = methods.length; i < l; i++){
- var key = methods[i],
- generic = object[key],
- proto = prototype[key];
-
- if (generic) generic.protect();
-
- if (isType && proto){
- delete prototype[key];
- prototype[key] = proto.protect();
- }
- }
-
- if (isType) object.implement(prototype);
-
- return force;
-};
-
-force('String', String, [
- 'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
- 'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase'
-])('Array', Array, [
- 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
- 'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
-])('Number', Number, [
- 'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
-])('Function', Function, [
- 'apply', 'call', 'bind'
-])('RegExp', RegExp, [
- 'exec', 'test'
-])('Object', Object, [
- 'create', 'defineProperty', 'defineProperties', 'keys',
- 'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
- 'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
-])('Date', Date, ['now']);
-
-Object.extend = extend.overloadSetter();
-
-Date.extend('now', function(){
- return +(new Date);
-});
-
-new Type('Boolean', Boolean);
-
-// fixes NaN returning as Number
-
-Number.prototype.$family = function(){
- return isFinite(this) ? 'number' : 'null';
-}.hide();
-
-// Number.random
-
-Number.extend('random', function(min, max){
- return Math.floor(Math.random() * (max - min + 1) + min);
-});
-
-// forEach, each
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-Object.extend('forEach', function(object, fn, bind){
- for (var key in object){
- if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
- }
-});
-
-Object.each = Object.forEach;
-
-Array.implement({
-
- forEach: function(fn, bind){
- for (var i = 0, l = this.length; i < l; i++){
- if (i in this) fn.call(bind, this[i], i, this);
- }
- },
-
- each: function(fn, bind){
- Array.forEach(this, fn, bind);
- return this;
- }
-
-});
-
-// Array & Object cloning, Object merging and appending
-
-var cloneOf = function(item){
- switch (typeOf(item)){
- case 'array': return item.clone();
- case 'object': return Object.clone(item);
- default: return item;
- }
-};
-
-Array.implement('clone', function(){
- var i = this.length, clone = new Array(i);
- while (i--) clone[i] = cloneOf(this[i]);
- return clone;
-});
-
-var mergeOne = function(source, key, current){
- switch (typeOf(current)){
- case 'object':
- if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
- else source[key] = Object.clone(current);
- break;
- case 'array': source[key] = current.clone(); break;
- default: source[key] = current;
- }
- return source;
-};
-
-Object.extend({
-
- merge: function(source, k, v){
- if (typeOf(k) == 'string') return mergeOne(source, k, v);
- for (var i = 1, l = arguments.length; i < l; i++){
- var object = arguments[i];
- for (var key in object) mergeOne(source, key, object[key]);
- }
- return source;
- },
-
- clone: function(object){
- var clone = {};
- for (var key in object) clone[key] = cloneOf(object[key]);
- return clone;
- },
-
- append: function(original){
- for (var i = 1, l = arguments.length; i < l; i++){
- var extended = arguments[i] || {};
- for (var key in extended) original[key] = extended[key];
- }
- return original;
- }
-
-});
-
-// Object-less types
-
-['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
- new Type(name);
-});
-
-// Unique ID
-
-var UID = Date.now();
-
-String.extend('uniqueID', function(){
- return (UID++).toString(36);
-});
-
-
-
-}).call(this);
-
-
-/*
----
-
-name: Array
-
-description: Contains Array Prototypes like each, contains, and erase.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Array
-
-...
-*/
-
-Array.implement({
-
- invoke: function(methodName){
- var args = Array.slice(arguments, 1);
- return this.map(function(item){
- return item[methodName].apply(item, args);
- });
- },
-
- every: function(fn, bind){
- for (var i = 0, l = this.length; i < l; i++){
- if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
- }
- return true;
- },
-
- filter: function(fn, bind){
- var results = [];
- for (var i = 0, l = this.length; i < l; i++){
- if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]);
- }
- return results;
- },
-
- clean: function(){
- return this.filter(function(item){
- return item != null;
- });
- },
-
- indexOf: function(item, from){
- var len = this.length;
- for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
- if (this[i] === item) return i;
- }
- return -1;
- },
-
- map: function(fn, bind){
- var results = [];
- for (var i = 0, l = this.length; i < l; i++){
- if (i in this) results[i] = fn.call(bind, this[i], i, this);
- }
- return results;
- },
-
- some: function(fn, bind){
- for (var i = 0, l = this.length; i < l; i++){
- if ((i in this) && fn.call(bind, this[i], i, this)) return true;
- }
- return false;
- },
-
- associate: function(keys){
- var obj = {}, length = Math.min(this.length, keys.length);
- for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
- return obj;
- },
-
- link: function(object){
- var result = {};
- for (var i = 0, l = this.length; i < l; i++){
- for (var key in object){
- if (object[key](this[i])){
- result[key] = this[i];
- delete object[key];
- break;
- }
- }
- }
- return result;
- },
-
- contains: function(item, from){
- return this.indexOf(item, from) != -1;
- },
-
- append: function(array){
- this.push.apply(this, array);
- return this;
- },
-
- getLast: function(){
- return (this.length) ? this[this.length - 1] : null;
- },
-
- getRandom: function(){
- return (this.length) ? this[Number.random(0, this.length - 1)] : null;
- },
-
- include: function(item){
- if (!this.contains(item)) this.push(item);
- return this;
- },
-
- combine: function(array){
- for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
- return this;
- },
-
- erase: function(item){
- for (var i = this.length; i--;){
- if (this[i] === item) this.splice(i, 1);
- }
- return this;
- },
-
- empty: function(){
- this.length = 0;
- return this;
- },
-
- flatten: function(){
- var array = [];
- for (var i = 0, l = this.length; i < l; i++){
- var type = typeOf(this[i]);
- if (type == 'null') continue;
- array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
- }
- return array;
- },
-
- pick: function(){
- for (var i = 0, l = this.length; i < l; i++){
- if (this[i] != null) return this[i];
- }
- return null;
- },
-
- hexToRgb: function(array){
- if (this.length != 3) return null;
- var rgb = this.map(function(value){
- if (value.length == 1) value += value;
- return value.toInt(16);
- });
- return (array) ? rgb : 'rgb(' + rgb + ')';
- },
-
- rgbToHex: function(array){
- if (this.length < 3) return null;
- if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
- var hex = [];
- for (var i = 0; i < 3; i++){
- var bit = (this[i] - 0).toString(16);
- hex.push((bit.length == 1) ? '0' + bit : bit);
- }
- return (array) ? hex : '#' + hex.join('');
- }
-
-});
-
-
-
-
-/*
----
-
-name: String
-
-description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: String
-
-...
-*/
-
-String.implement({
-
- test: function(regex, params){
- return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
- },
-
- contains: function(string, separator){
- return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
- },
-
- trim: function(){
- return this.replace(/^\s+|\s+$/g, '');
- },
-
- clean: function(){
- return this.replace(/\s+/g, ' ').trim();
- },
-
- camelCase: function(){
- return this.replace(/-\D/g, function(match){
- return match.charAt(1).toUpperCase();
- });
- },
-
- hyphenate: function(){
- return this.replace(/[A-Z]/g, function(match){
- return ('-' + match.charAt(0).toLowerCase());
- });
- },
-
- capitalize: function(){
- return this.replace(/\b[a-z]/g, function(match){
- return match.toUpperCase();
- });
- },
-
- escapeRegExp: function(){
- return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
- },
-
- toInt: function(base){
- return parseInt(this, base || 10);
- },
-
- toFloat: function(){
- return parseFloat(this);
- },
-
- hexToRgb: function(array){
- var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
- return (hex) ? hex.slice(1).hexToRgb(array) : null;
- },
-
- rgbToHex: function(array){
- var rgb = this.match(/\d{1,3}/g);
- return (rgb) ? rgb.rgbToHex(array) : null;
- },
-
- substitute: function(object, regexp){
- return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
- if (match.charAt(0) == '\\') return match.slice(1);
- return (object[name] != null) ? object[name] : '';
- });
- }
-
-});
-
-
-/*
----
-
-name: Number
-
-description: Contains Number Prototypes like limit, round, times, and ceil.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Number
-
-...
-*/
-
-Number.implement({
-
- limit: function(min, max){
- return Math.min(max, Math.max(min, this));
- },
-
- round: function(precision){
- precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
- return Math.round(this * precision) / precision;
- },
-
- times: function(fn, bind){
- for (var i = 0; i < this; i++) fn.call(bind, i, this);
- },
-
- toFloat: function(){
- return parseFloat(this);
- },
-
- toInt: function(base){
- return parseInt(this, base || 10);
- }
-
-});
-
-Number.alias('each', 'times');
-
-(function(math){
- var methods = {};
- math.each(function(name){
- if (!Number[name]) methods[name] = function(){
- return Math[name].apply(null, [this].concat(Array.from(arguments)));
- };
- });
- Number.implement(methods);
-})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
-
-
-/*
----
-
-name: Function
-
-description: Contains Function Prototypes like create, bind, pass, and delay.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Function
-
-...
-*/
-
-Function.extend({
-
- attempt: function(){
- for (var i = 0, l = arguments.length; i < l; i++){
- try {
- return arguments[i]();
- } catch (e){}
- }
- return null;
- }
-
-});
-
-Function.implement({
-
- attempt: function(args, bind){
- try {
- return this.apply(bind, Array.from(args));
- } catch (e){}
-
- return null;
- },
-
- bind: function(bind){
- var self = this,
- args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
-
- return function(){
- if (!args && !arguments.length) return self.call(bind);
- if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments)));
- return self.apply(bind, args || arguments);
- };
- },
-
- pass: function(args, bind){
- var self = this;
- if (args != null) args = Array.from(args);
- return function(){
- return self.apply(bind, args || arguments);
- };
- },
-
- delay: function(delay, bind, args){
- return setTimeout(this.pass((args == null ? [] : args), bind), delay);
- },
-
- periodical: function(periodical, bind, args){
- return setInterval(this.pass((args == null ? [] : args), bind), periodical);
- }
-
-});
-
-
-
-
-/*
----
-
-name: Object
-
-description: Object generic methods
-
-license: MIT-style license.
-
-requires: Type
-
-provides: [Object, Hash]
-
-...
-*/
-
-(function(){
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
- subset: function(object, keys){
- var results = {};
- for (var i = 0, l = keys.length; i < l; i++){
- var k = keys[i];
- results[k] = object[k];
- }
- return results;
- },
-
- map: function(object, fn, bind){
- var results = {};
- for (var key in object){
- if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
- }
- return results;
- },
-
- filter: function(object, fn, bind){
- var results = {};
- Object.each(object, function(value, key){
- if (fn.call(bind, value, key, object)) results[key] = value;
- });
- return results;
- },
-
- every: function(object, fn, bind){
- for (var key in object){
- if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
- }
- return true;
- },
-
- some: function(object, fn, bind){
- for (var key in object){
- if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
- }
- return false;
- },
-
- keys: function(object){
- var keys = [];
- for (var key in object){
- if (hasOwnProperty.call(object, key)) keys.push(key);
- }
- return keys;
- },
-
- values: function(object){
- var values = [];
- for (var key in object){
- if (hasOwnProperty.call(object, key)) values.push(object[key]);
- }
- return values;
- },
-
- getLength: function(object){
- return Object.keys(object).length;
- },
-
- keyOf: function(object, value){
- for (var key in object){
- if (hasOwnProperty.call(object, key) && object[key] === value) return key;
- }
- return null;
- },
-
- contains: function(object, value){
- return Object.keyOf(object, value) != null;
- },
-
- toQueryString: function(object, base){
- var queryString = [];
-
- Object.each(object, function(value, key){
- if (base) key = base + '[' + key + ']';
- var result;
- switch (typeOf(value)){
- case 'object': result = Object.toQueryString(value, key); break;
- case 'array':
- var qs = {};
- value.each(function(val, i){
- qs[i] = val;
- });
- result = Object.toQueryString(qs, key);
- break;
- default: result = key + '=' + encodeURIComponent(value);
- }
- if (value != null) queryString.push(result);
- });
-
- return queryString.join('&');
- }
-
-});
-
-})();
-
-
-
-
-/*
----
-
-name: Browser
-
-description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
-
-license: MIT-style license.
-
-requires: [Array, Function, Number, String]
-
-provides: [Browser, Window, Document]
-
-...
-*/
-
-(function(){
-
-var document = this.document;
-var window = document.window = this;
-
-var UID = 1;
-
-this.$uid = (window.ActiveXObject) ? function(item){
- return (item.uid || (item.uid = [UID++]))[0];
-} : function(item){
- return item.uid || (item.uid = UID++);
-};
-
-$uid(window);
-$uid(document);
-
-var ua = navigator.userAgent.toLowerCase(),
- platform = navigator.platform.toLowerCase(),
- UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
- mode = UA[1] == 'ie' && document.documentMode;
-
-var Browser = this.Browser = {
-
- extend: Function.prototype.extend,
-
- name: (UA[1] == 'version') ? UA[3] : UA[1],
-
- version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
-
- Platform: {
- name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
- },
-
- Features: {
- xpath: !!(document.evaluate),
- air: !!(window.runtime),
- query: !!(document.querySelector),
- json: !!(window.JSON)
- },
-
- Plugins: {}
-
-};
-
-Browser[Browser.name] = true;
-Browser[Browser.name + parseInt(Browser.version, 10)] = true;
-Browser.Platform[Browser.Platform.name] = true;
-
-// Request
-
-Browser.Request = (function(){
-
- var XMLHTTP = function(){
- return new XMLHttpRequest();
- };
-
- var MSXML2 = function(){
- return new ActiveXObject('MSXML2.XMLHTTP');
- };
-
- var MSXML = function(){
- return new ActiveXObject('Microsoft.XMLHTTP');
- };
-
- return Function.attempt(function(){
- XMLHTTP();
- return XMLHTTP;
- }, function(){
- MSXML2();
- return MSXML2;
- }, function(){
- MSXML();
- return MSXML;
- });
-
-})();
-
-Browser.Features.xhr = !!(Browser.Request);
-
-// Flash detection
-
-var version = (Function.attempt(function(){
- return navigator.plugins['Shockwave Flash'].description;
-}, function(){
- return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
-}) || '0 r0').match(/\d+/g);
-
-Browser.Plugins.Flash = {
- version: Number(version[0] || '0.' + version[1]) || 0,
- build: Number(version[2]) || 0
-};
-
-// String scripts
-
-Browser.exec = function(text){
- if (!text) return text;
- if (window.execScript){
- window.execScript(text);
- } else {
- var script = document.createElement('script');
- script.setAttribute('type', 'text/javascript');
- script.text = text;
- document.head.appendChild(script);
- document.head.removeChild(script);
- }
- return text;
-};
-
-String.implement('stripScripts', function(exec){
- var scripts = '';
- var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
- scripts += code + '\n';
- return '';
- });
- if (exec === true) Browser.exec(scripts);
- else if (typeOf(exec) == 'function') exec(scripts, text);
- return text;
-});
-
-// Window, Document
-
-Browser.extend({
- Document: this.Document,
- Window: this.Window,
- Element: this.Element,
- Event: this.Event
-});
-
-this.Window = this.$constructor = new Type('Window', function(){});
-
-this.$family = Function.from('window').hide();
-
-Window.mirror(function(name, method){
- window[name] = method;
-});
-
-this.Document = document.$constructor = new Type('Document', function(){});
-
-document.$family = Function.from('document').hide();
-
-Document.mirror(function(name, method){
- document[name] = method;
-});
-
-document.html = document.documentElement;
-document.head = document.getElementsByTagName('head')[0];
-
-if (document.execCommand) try {
- document.execCommand("BackgroundImageCache", false, true);
-} catch (e){}
-
-if (this.attachEvent && !this.addEventListener){
- var unloadEvent = function(){
- this.detachEvent('onunload', unloadEvent);
- document.head = document.html = document.window = null;
- };
- this.attachEvent('onunload', unloadEvent);
-}
-
-// IE fails on collections and <select>.options (refers to <select>)
-var arrayFrom = Array.from;
-try {
- arrayFrom(document.html.childNodes);
-} catch(e){
- Array.from = function(item){
- if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
- var i = item.length, array = new Array(i);
- while (i--) array[i] = item[i];
- return array;
- }
- return arrayFrom(item);
- };
-
- var prototype = Array.prototype,
- slice = prototype.slice;
- ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
- var method = prototype[name];
- Array[name] = function(item){
- return method.apply(Array.from(item), slice.call(arguments, 1));
- };
- });
-}
-
-
-
-}).call(this);
-
-
-/*
----
-
-name: Event
-
-description: Contains the Event Class, to make the event object cross-browser.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, Function, String, Object]
-
-provides: Event
-
-...
-*/
-
-var Event = new Type('Event', function(event, win){
- if (!win) win = window;
- var doc = win.document;
- event = event || win.event;
- if (event.$extended) return event;
- this.$extended = true;
- var type = event.type,
- target = event.target || event.srcElement,
- page = {},
- client = {},
- related = null,
- rightClick, wheel, code, key;
- while (target && target.nodeType == 3) target = target.parentNode;
-
- if (type.indexOf('key') != -1){
- code = event.which || event.keyCode;
- key = Object.keyOf(Event.Keys, code);
- if (type == 'keydown'){
- var fKey = code - 111;
- if (fKey > 0 && fKey < 13) key = 'f' + fKey;
- }
- if (!key) key = String.fromCharCode(code).toLowerCase();
- } else if ((/click|mouse|menu/i).test(type)){
- doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
- page = {
- x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
- y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
- };
- client = {
- x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
- y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
- };
- if ((/DOMMouseScroll|mousewheel/).test(type)){
- wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
- }
- rightClick = (event.which == 3) || (event.button == 2);
- if ((/over|out/).test(type)){
- related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
- var testRelated = function(){
- while (related && related.nodeType == 3) related = related.parentNode;
- return true;
- };
- var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated();
- related = (hasRelated) ? related : null;
- }
- } else if ((/gesture|touch/i).test(type)){
- this.rotation = event.rotation;
- this.scale = event.scale;
- this.targetTouches = event.targetTouches;
- this.changedTouches = event.changedTouches;
- var touches = this.touches = event.touches;
- if (touches && touches[0]){
- var touch = touches[0];
- page = {x: touch.pageX, y: touch.pageY};
- client = {x: touch.clientX, y: touch.clientY};
- }
- }
-
- return Object.append(this, {
- event: event,
- type: type,
-
- page: page,
- client: client,
- rightClick: rightClick,
-
- wheel: wheel,
-
- relatedTarget: document.id(related),
- target: document.id(target),
-
- code: code,
- key: key,
-
- shift: event.shiftKey,
- control: event.ctrlKey,
- alt: event.altKey,
- meta: event.metaKey
- });
-});
-
-Event.Keys = {
- 'enter': 13,
- 'up': 38,
- 'down': 40,
- 'left': 37,
- 'right': 39,
- 'esc': 27,
- 'space': 32,
- 'backspace': 8,
- 'tab': 9,
- 'delete': 46
-};
-
-
-
-Event.implement({
-
- stop: function(){
- return this.stopPropagation().preventDefault();
- },
-
- stopPropagation: function(){
- if (this.event.stopPropagation) this.event.stopPropagation();
- else this.event.cancelBubble = true;
- return this;
- },
-
- preventDefault: function(){
- if (this.event.preventDefault) this.event.preventDefault();
- else this.event.returnValue = false;
- return this;
- }
-
-});
-
-
-/*
----
-
-name: Class
-
-description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
-
-license: MIT-style license.
-
-requires: [Array, String, Function, Number]
-
-provides: Class
-
-...
-*/
-
-(function(){
-
-var Class = this.Class = new Type('Class', function(params){
- if (instanceOf(params, Function)) params = {initialize: params};
-
- var newClass = function(){
- reset(this);
- if (newClass.$prototyping) return this;
- this.$caller = null;
- var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
- this.$caller = this.caller = null;
- return value;
- }.extend(this).implement(params);
-
- newClass.$constructor = Class;
- newClass.prototype.$constructor = newClass;
- newClass.prototype.parent = parent;
-
- return newClass;
-});
-
-var parent = function(){
- if (!this.$caller) throw new Error('The method "parent" cannot be called.');
- var name = this.$caller.$name,
- parent = this.$caller.$owner.parent,
- previous = (parent) ? parent.prototype[name] : null;
- if (!previous) throw new Error('The method "' + name + '" has no parent.');
- return previous.apply(this, arguments);
-};
-
-var reset = function(object){
- for (var key in object){
- var value = object[key];
- switch (typeOf(value)){
- case 'object':
- var F = function(){};
- F.prototype = value;
- object[key] = reset(new F);
- break;
- case 'array': object[key] = value.clone(); break;
- }
- }
- return object;
-};
-
-var wrap = function(self, key, method){
- if (method.$origin) method = method.$origin;
- var wrapper = function(){
- if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
- var caller = this.caller, current = this.$caller;
- this.caller = current; this.$caller = wrapper;
- var result = method.apply(this, arguments);
- this.$caller = current; this.caller = caller;
- return result;
- }.extend({$owner: self, $origin: method, $name: key});
- return wrapper;
-};
-
-var implement = function(key, value, retain){
- if (Class.Mutators.hasOwnProperty(key)){
- value = Class.Mutators[key].call(this, value);
- if (value == null) return this;
- }
-
- if (typeOf(value) == 'function'){
- if (value.$hidden) return this;
- this.prototype[key] = (retain) ? value : wrap(this, key, value);
- } else {
- Object.merge(this.prototype, key, value);
- }
-
- return this;
-};
-
-var getInstance = function(klass){
- klass.$prototyping = true;
- var proto = new klass;
- delete klass.$prototyping;
- return proto;
-};
-
-Class.implement('implement', implement.overloadSetter());
-
-Class.Mutators = {
-
- Extends: function(parent){
- this.parent = parent;
- this.prototype = getInstance(parent);
- },
-
- Implements: function(items){
- Array.from(items).each(function(item){
- var instance = new item;
- for (var key in instance) implement.call(this, key, instance[key], true);
- }, this);
- }
-};
-
-}).call(this);
-
-
-/*
----
-
-name: Class.Extras
-
-description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
-
-license: MIT-style license.
-
-requires: Class
-
-provides: [Class.Extras, Chain, Events, Options]
-
-...
-*/
-
-(function(){
-
-this.Chain = new Class({
-
- $chain: [],
-
- chain: function(){
- this.$chain.append(Array.flatten(arguments));
- return this;
- },
-
- callChain: function(){
- return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
- },
-
- clearChain: function(){
- this.$chain.empty();
- return this;
- }
-
-});
-
-var removeOn = function(string){
- return string.replace(/^on([A-Z])/, function(full, first){
- return first.toLowerCase();
- });
-};
-
-this.Events = new Class({
-
- $events: {},
-
- addEvent: function(type, fn, internal){
- type = removeOn(type);
-
-
-
- this.$events[type] = (this.$events[type] || []).include(fn);
- if (internal) fn.internal = true;
- return this;
- },
-
- addEvents: function(events){
- for (var type in events) this.addEvent(type, events[type]);
- return this;
- },
-
- fireEvent: function(type, args, delay){
- type = removeOn(type);
- var events = this.$events[type];
- if (!events) return this;
- args = Array.from(args);
- events.each(function(fn){
- if (delay) fn.delay(delay, this, args);
- else fn.apply(this, args);
- }, this);
- return this;
- },
-
- removeEvent: function(type, fn){
- type = removeOn(type);
- var events = this.$events[type];
- if (events && !fn.internal){
- var index = events.indexOf(fn);
- if (index != -1) delete events[index];
- }
- return this;
- },
-
- removeEvents: function(events){
- var type;
- if (typeOf(events) == 'object'){
- for (type in events) this.removeEvent(type, events[type]);
- return this;
- }
- if (events) events = removeOn(events);
- for (type in this.$events){
- if (events && events != type) continue;
- var fns = this.$events[type];
- for (var i = fns.length; i--;) if (i in fns){
- this.removeEvent(type, fns[i]);
- }
- }
- return this;
- }
-
-});
-
-this.Options = new Class({
-
- setOptions: function(){
- var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
- if (this.addEvent) for (var option in options){
- if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
- this.addEvent(option, options[option]);
- delete options[option];
- }
- return this;
- }
-
-});
-
-}).call(this);
-
-
-/*
----
-name: Slick.Parser
-description: Standalone CSS3 Selector parser
-provides: Slick.Parser
-...
-*/
-
-;(function(){
-
-var parsed,
- separatorIndex,
- combinatorIndex,
- reversed,
- cache = {},
- reverseCache = {},
- reUnescape = /\\/g;
-
-var parse = function(expression, isReversed){
- if (expression == null) return null;
- if (expression.Slick === true) return expression;
- expression = ('' + expression).replace(/^\s+|\s+$/g, '');
- reversed = !!isReversed;
- var currentCache = (reversed) ? reverseCache : cache;
- if (currentCache[expression]) return currentCache[expression];
- parsed = {
- Slick: true,
- expressions: [],
- raw: expression,
- reverse: function(){
- return parse(this.raw, true);
- }
- };
- separatorIndex = -1;
- while (expression != (expression = expression.replace(regexp, parser)));
- parsed.length = parsed.expressions.length;
- return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
-};
-
-var reverseCombinator = function(combinator){
- if (combinator === '!') return ' ';
- else if (combinator === ' ') return '!';
- else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
- else return '!' + combinator;
-};
-
-var reverse = function(expression){
- var expressions = expression.expressions;
- for (var i = 0; i < expressions.length; i++){
- var exp = expressions[i];
- var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
-
- for (var j = 0; j < exp.length; j++){
- var cexp = exp[j];
- if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
- cexp.combinator = cexp.reverseCombinator;
- delete cexp.reverseCombinator;
- }
-
- exp.reverse().push(last);
- }
- return expression;
-};
-
-var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
- return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
- return '\\' + match;
- });
-};
-
-var regexp = new RegExp(
-/*
-#!/usr/bin/env ruby
-puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
-__END__
- "(?x)^(?:\
- \\s* ( , ) \\s* # Separator \n\
- | \\s* ( <combinator>+ ) \\s* # Combinator \n\
- | ( \\s+ ) # CombinatorChildren \n\
- | ( <unicode>+ | \\* ) # Tag \n\
- | \\# ( <unicode>+ ) # ID \n\
- | \\. ( <unicode>+ ) # ClassName \n\
- | # Attribute \n\
- \\[ \
- \\s* (<unicode1>+) (?: \
- \\s* ([*^$!~|]?=) (?: \
- \\s* (?:\
- ([\"']?)(.*?)\\9 \
- )\
- ) \
- )? \\s* \
- \\](?!\\]) \n\
- | :+ ( <unicode>+ )(?:\
- \\( (?:\
- (?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
- ) \\)\
- )?\
- )"
-*/
- "^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
- .replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
- .replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
- .replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-);
-
-function parser(
- rawMatch,
-
- separator,
- combinator,
- combinatorChildren,
-
- tagName,
- id,
- className,
-
- attributeKey,
- attributeOperator,
- attributeQuote,
- attributeValue,
-
- pseudoMarker,
- pseudoClass,
- pseudoQuote,
- pseudoClassQuotedValue,
- pseudoClassValue
-){
- if (separator || separatorIndex === -1){
- parsed.expressions[++separatorIndex] = [];
- combinatorIndex = -1;
- if (separator) return '';
- }
-
- if (combinator || combinatorChildren || combinatorIndex === -1){
- combinator = combinator || ' ';
- var currentSeparator = parsed.expressions[separatorIndex];
- if (reversed && currentSeparator[combinatorIndex])
- currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
- currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
- }
-
- var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
-
- if (tagName){
- currentParsed.tag = tagName.replace(reUnescape, '');
-
- } else if (id){
- currentParsed.id = id.replace(reUnescape, '');
-
- } else if (className){
- className = className.replace(reUnescape, '');
-
- if (!currentParsed.classList) currentParsed.classList = [];
- if (!currentParsed.classes) currentParsed.classes = [];
- currentParsed.classList.push(className);
- currentParsed.classes.push({
- value: className,
- regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
- });
-
- } else if (pseudoClass){
- pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
- pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
-
- if (!currentParsed.pseudos) currentParsed.pseudos = [];
- currentParsed.pseudos.push({
- key: pseudoClass.replace(reUnescape, ''),
- value: pseudoClassValue,
- type: pseudoMarker.length == 1 ? 'class' : 'element'
- });
-
- } else if (attributeKey){
- attributeKey = attributeKey.replace(reUnescape, '');
- attributeValue = (attributeValue || '').replace(reUnescape, '');
-
- var test, regexp;
-
- switch (attributeOperator){
- case '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break;
- case '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break;
- case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
- case '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break;
- case '=' : test = function(value){
- return attributeValue == value;
- }; break;
- case '*=' : test = function(value){
- return value && value.indexOf(attributeValue) > -1;
- }; break;
- case '!=' : test = function(value){
- return attributeValue != value;
- }; break;
- default : test = function(value){
- return !!value;
- };
- }
-
- if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
- return false;
- };
-
- if (!test) test = function(value){
- return value && regexp.test(value);
- };
-
- if (!currentParsed.attributes) currentParsed.attributes = [];
- currentParsed.attributes.push({
- key: attributeKey,
- operator: attributeOperator,
- value: attributeValue,
- test: test
- });
-
- }
-
- return '';
-};
-
-// Slick NS
-
-var Slick = (this.Slick || {});
-
-Slick.parse = function(expression){
- return parse(expression);
-};
-
-Slick.escapeRegExp = escapeRegExp;
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-/*
----
-name: Slick.Finder
-description: The new, superfast css selector engine.
-provides: Slick.Finder
-requires: Slick.Parser
-...
-*/
-
-;(function(){
-
-var local = {},
- featuresCache = {},
- toString = Object.prototype.toString;
-
-// Feature / Bug detection
-
-local.isNativeCode = function(fn){
- return (/\{\s*\[native code\]\s*\}/).test('' + fn);
-};
-
-local.isXML = function(document){
- return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
- (document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
-};
-
-local.setDocument = function(document){
-
- // convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
- var nodeType = document.nodeType;
- if (nodeType == 9); // document
- else if (nodeType) document = document.ownerDocument; // node
- else if (document.navigator) document = document.document; // window
- else return;
-
- // check if it's the old document
-
- if (this.document === document) return;
- this.document = document;
-
- // check if we have done feature detection on this document before
-
- var root = document.documentElement,
- rootUid = this.getUIDXML(root),
- features = featuresCache[rootUid],
- feature;
-
- if (features){
- for (feature in features){
- this[feature] = features[feature];
- }
- return;
- }
-
- features = featuresCache[rootUid] = {};
-
- features.root = root;
- features.isXMLDocument = this.isXML(document);
-
- features.brokenStarGEBTN
- = features.starSelectsClosedQSA
- = features.idGetsName
- = features.brokenMixedCaseQSA
- = features.brokenGEBCN
- = features.brokenCheckedQSA
- = features.brokenEmptyAttributeQSA
- = features.isHTMLDocument
- = features.nativeMatchesSelector
- = false;
-
- var starSelectsClosed, starSelectsComments,
- brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
- brokenFormAttributeGetter;
-
- var selected, id = 'slick_uniqueid';
- var testNode = document.createElement('div');
-
- var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
- testRoot.appendChild(testNode);
-
- // on non-HTML documents innerHTML and getElementsById doesnt work properly
- try {
- testNode.innerHTML = '<a id="'+id+'"></a>';
- features.isHTMLDocument = !!document.getElementById(id);
- } catch(e){};
-
- if (features.isHTMLDocument){
-
- testNode.style.display = 'none';
-
- // IE returns comment nodes for getElementsByTagName('*') for some documents
- testNode.appendChild(document.createComment(''));
- starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
-
- // IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
- try {
- testNode.innerHTML = 'foo</foo>';
- selected = testNode.getElementsByTagName('*');
- starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
- } catch(e){};
-
- features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
-
- // IE returns elements with the name instead of just id for getElementsById for some documents
- try {
- testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
- features.idGetsName = document.getElementById(id) === testNode.firstChild;
- } catch(e){};
-
- if (testNode.getElementsByClassName){
-
- // Safari 3.2 getElementsByClassName caches results
- try {
- testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
- testNode.getElementsByClassName('b').length;
- testNode.firstChild.className = 'b';
- cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
- } catch(e){};
-
- // Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
- try {
- testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
- brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
- } catch(e){};
-
- features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
- }
-
- if (testNode.querySelectorAll){
- // IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
- try {
- testNode.innerHTML = 'foo</foo>';
- selected = testNode.querySelectorAll('*');
- features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
- } catch(e){};
-
- // Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
- try {
- testNode.innerHTML = '<a class="MiX"></a>';
- features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
- } catch(e){};
-
- // Webkit and Opera dont return selected options on querySelectorAll
- try {
- testNode.innerHTML = '<select><option selected="selected">a</option></select>';
- features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
- } catch(e){};
-
- // IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
- try {
- testNode.innerHTML = '<a class=""></a>';
- features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
- } catch(e){};
-
- }
-
- // IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
- try {
- testNode.innerHTML = '<form action="s"><input id="action"/></form>';
- brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
- } catch(e){};
-
- // native matchesSelector function
-
- features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
- if (features.nativeMatchesSelector) try {
- // if matchesSelector trows errors on incorrect sintaxes we can use it
- features.nativeMatchesSelector.call(root, ':slick');
- features.nativeMatchesSelector = null;
- } catch(e){};
-
- }
-
- try {
- root.slick_expando = 1;
- delete root.slick_expando;
- features.getUID = this.getUIDHTML;
- } catch(e) {
- features.getUID = this.getUIDXML;
- }
-
- testRoot.removeChild(testNode);
- testNode = selected = testRoot = null;
-
- // getAttribute
-
- features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
- var method = this.attributeGetters[name];
- if (method) return method.call(node);
- var attributeNode = node.getAttributeNode(name);
- return (attributeNode) ? attributeNode.nodeValue : null;
- } : function(node, name){
- var method = this.attributeGetters[name];
- return (method) ? method.call(node) : node.getAttribute(name);
- };
-
- // hasAttribute
-
- features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
- return node.hasAttribute(attribute);
- } : function(node, attribute) {
- node = node.getAttributeNode(attribute);
- return !!(node && (node.specified || node.nodeValue));
- };
-
- // contains
- // FIXME: Add specs: local.contains should be different for xml and html documents?
- features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){
- return context.contains(node);
- } : (root && root.compareDocumentPosition) ? function(context, node){
- return context === node || !!(context.compareDocumentPosition(node) & 16);
- } : function(context, node){
- if (node) do {
- if (node === context) return true;
- } while ((node = node.parentNode));
- return false;
- };
-
- // document order sorting
- // credits to Sizzle (http://sizzlejs.com/)
-
- features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
- if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
- return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
- } : ('sourceIndex' in root) ? function(a, b){
- if (!a.sourceIndex || !b.sourceIndex) return 0;
- return a.sourceIndex - b.sourceIndex;
- } : (document.createRange) ? function(a, b){
- if (!a.ownerDocument || !b.ownerDocument) return 0;
- var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
- aRange.setStart(a, 0);
- aRange.setEnd(a, 0);
- bRange.setStart(b, 0);
- bRange.setEnd(b, 0);
- return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
- } : null ;
-
- root = null;
-
- for (feature in features){
- this[feature] = features[feature];
- }
-};
-
-// Main Method
-
-var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
- reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
- qsaFailExpCache = {};
-
-local.search = function(context, expression, append, first){
-
- var found = this.found = (first) ? null : (append || []);
-
- if (!context) return found;
- else if (context.navigator) context = context.document; // Convert the node from a window to a document
- else if (!context.nodeType) return found;
-
- // setup
-
- var parsed, i,
- uniques = this.uniques = {},
- hasOthers = !!(append && append.length),
- contextIsDocument = (context.nodeType == 9);
-
- if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
-
- // avoid duplicating items already in the append array
- if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
-
- // expression checks
-
- if (typeof expression == 'string'){ // expression is a string
-
- /*<simple-selectors-override>*/
- var simpleSelector = expression.match(reSimpleSelector);
- simpleSelectors: if (simpleSelector) {
-
- var symbol = simpleSelector[1],
- name = simpleSelector[2],
- node, nodes;
-
- if (!symbol){
-
- if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
- nodes = context.getElementsByTagName(name);
- if (first) return nodes[0] || null;
- for (i = 0; node = nodes[i++];){
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- }
-
- } else if (symbol == '#'){
-
- if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
- node = context.getElementById(name);
- if (!node) return found;
- if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
- if (first) return node || null;
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-
- } else if (symbol == '.'){
-
- if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
- if (context.getElementsByClassName && !this.brokenGEBCN){
- nodes = context.getElementsByClassName(name);
- if (first) return nodes[0] || null;
- for (i = 0; node = nodes[i++];){
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- }
- } else {
- var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
- nodes = context.getElementsByTagName('*');
- for (i = 0; node = nodes[i++];){
- className = node.className;
- if (!(className && matchClass.test(className))) continue;
- if (first) return node;
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- }
- }
-
- }
-
- if (hasOthers) this.sort(found);
- return (first) ? null : found;
-
- }
- /*</simple-selectors-override>*/
-
- /*<query-selector-override>*/
- querySelector: if (context.querySelectorAll) {
-
- if (!this.isHTMLDocument || this.brokenMixedCaseQSA || qsaFailExpCache[expression] ||
- (this.brokenCheckedQSA && expression.indexOf(':checked') > -1) ||
- (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression)) || Slick.disableQSA) break querySelector;
-
- var _expression = expression;
- if (!contextIsDocument){
- // non-document rooted QSA
- // credits to Andrew Dupont
- var currentId = context.getAttribute('id'), slickid = 'slickid__';
- context.setAttribute('id', slickid);
- _expression = '#' + slickid + ' ' + _expression;
- }
-
- try {
- if (first) return context.querySelector(_expression) || null;
- else nodes = context.querySelectorAll(_expression);
- } catch(e) {
- qsaFailExpCache[expression] = 1;
- break querySelector;
- } finally {
- if (!contextIsDocument){
- if (currentId) context.setAttribute('id', currentId);
- else context.removeAttribute('id');
- }
- }
-
- if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
- if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
- } else for (i = 0; node = nodes[i++];){
- if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
- }
-
- if (hasOthers) this.sort(found);
- return found;
-
- }
- /*</query-selector-override>*/
-
- parsed = this.Slick.parse(expression);
- if (!parsed.length) return found;
- } else if (expression == null){ // there is no expression
- return found;
- } else if (expression.Slick){ // expression is a parsed Slick object
- parsed = expression;
- } else if (this.contains(context.documentElement || context, expression)){ // expression is a node
- (found) ? found.push(expression) : found = expression;
- return found;
- } else { // other junk
- return found;
- }
-
- /*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
- // cache elements for the nth selectors
-
- this.posNTH = {};
- this.posNTHLast = {};
- this.posNTHType = {};
- this.posNTHTypeLast = {};
-
- /*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
- // if append is null and there is only a single selector with one expression use pushArray, else use pushUID
- this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
-
- if (found == null) found = [];
-
- // default engine
-
- var j, m, n;
- var combinator, tag, id, classList, classes, attributes, pseudos;
- var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
-
- search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
-
- combinator = 'combinator:' + currentBit.combinator;
- if (!this[combinator]) continue search;
-
- tag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
- id = currentBit.id;
- classList = currentBit.classList;
- classes = currentBit.classes;
- attributes = currentBit.attributes;
- pseudos = currentBit.pseudos;
- lastBit = (j === (currentExpression.length - 1));
-
- this.bitUniques = {};
-
- if (lastBit){
- this.uniques = uniques;
- this.found = found;
- } else {
- this.uniques = {};
- this.found = [];
- }
-
- if (j === 0){
- this[combinator](context, tag, id, classes, attributes, pseudos, classList);
- if (first && lastBit && found.length) break search;
- } else {
- if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
- this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
- if (found.length) break search;
- } else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
- }
-
- currentItems = this.found;
- }
-
- // should sort if there are nodes in append and if you pass multiple expressions.
- if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
-
- return (first) ? (found[0] || null) : found;
-};
-
-// Utils
-
-local.uidx = 1;
-local.uidk = 'slick-uniqueid';
-
-local.getUIDXML = function(node){
- var uid = node.getAttribute(this.uidk);
- if (!uid){
- uid = this.uidx++;
- node.setAttribute(this.uidk, uid);
- }
- return uid;
-};
-
-local.getUIDHTML = function(node){
- return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
-};
-
-// sort based on the setDocument documentSorter method.
-
-local.sort = function(results){
- if (!this.documentSorter) return results;
- results.sort(this.documentSorter);
- return results;
-};
-
-/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-local.cacheNTH = {};
-
-local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
-
-local.parseNTHArgument = function(argument){
- var parsed = argument.match(this.matchNTH);
- if (!parsed) return false;
- var special = parsed[2] || false;
- var a = parsed[1] || 1;
- if (a == '-') a = -1;
- var b = +parsed[3] || 0;
- parsed =
- (special == 'n') ? {a: a, b: b} :
- (special == 'odd') ? {a: 2, b: 1} :
- (special == 'even') ? {a: 2, b: 0} : {a: 0, b: a};
-
- return (this.cacheNTH[argument] = parsed);
-};
-
-local.createNTHPseudo = function(child, sibling, positions, ofType){
- return function(node, argument){
- var uid = this.getUID(node);
- if (!this[positions][uid]){
- var parent = node.parentNode;
- if (!parent) return false;
- var el = parent[child], count = 1;
- if (ofType){
- var nodeName = node.nodeName;
- do {
- if (el.nodeName != nodeName) continue;
- this[positions][this.getUID(el)] = count++;
- } while ((el = el[sibling]));
- } else {
- do {
- if (el.nodeType != 1) continue;
- this[positions][this.getUID(el)] = count++;
- } while ((el = el[sibling]));
- }
- }
- argument = argument || 'n';
- var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
- if (!parsed) return false;
- var a = parsed.a, b = parsed.b, pos = this[positions][uid];
- if (a == 0) return b == pos;
- if (a > 0){
- if (pos < b) return false;
- } else {
- if (b < pos) return false;
- }
- return ((pos - b) % a) == 0;
- };
-};
-
-/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-local.pushArray = function(node, tag, id, classes, attributes, pseudos){
- if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
-};
-
-local.pushUID = function(node, tag, id, classes, attributes, pseudos){
- var uid = this.getUID(node);
- if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
- this.uniques[uid] = true;
- this.found.push(node);
- }
-};
-
-local.matchNode = function(node, selector){
- if (this.isHTMLDocument && this.nativeMatchesSelector){
- try {
- return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
- } catch(matchError) {}
- }
-
- var parsed = this.Slick.parse(selector);
- if (!parsed) return true;
-
- // simple (single) selectors
- var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i;
- for (i = 0; (currentExpression = expressions[i]); i++){
- if (currentExpression.length == 1){
- var exp = currentExpression[0];
- if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
- simpleExpCounter++;
- }
- }
-
- if (simpleExpCounter == parsed.length) return false;
-
- var nodes = this.search(this.document, parsed), item;
- for (i = 0; item = nodes[i++];){
- if (item === node) return true;
- }
- return false;
-};
-
-local.matchPseudo = function(node, name, argument){
- var pseudoName = 'pseudo:' + name;
- if (this[pseudoName]) return this[pseudoName](node, argument);
- var attribute = this.getAttribute(node, name);
- return (argument) ? argument == attribute : !!attribute;
-};
-
-local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
- if (tag){
- var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
- if (tag == '*'){
- if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
- } else {
- if (nodeName != tag) return false;
- }
- }
-
- if (id && node.getAttribute('id') != id) return false;
-
- var i, part, cls;
- if (classes) for (i = classes.length; i--;){
- cls = node.getAttribute('class') || node.className;
- if (!(cls && classes[i].regexp.test(cls))) return false;
- }
- if (attributes) for (i = attributes.length; i--;){
- part = attributes[i];
- if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
- }
- if (pseudos) for (i = pseudos.length; i--;){
- part = pseudos[i];
- if (!this.matchPseudo(node, part.key, part.value)) return false;
- }
- return true;
-};
-
-var combinators = {
-
- ' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
-
- var i, item, children;
-
- if (this.isHTMLDocument){
- getById: if (id){
- item = this.document.getElementById(id);
- if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
- // all[id] returns all the elements with that name or id inside node
- // if theres just one it will return the element, else it will be a collection
- children = node.all[id];
- if (!children) return;
- if (!children[0]) children = [children];
- for (i = 0; item = children[i++];){
- var idNode = item.getAttributeNode('id');
- if (idNode && idNode.nodeValue == id){
- this.push(item, tag, null, classes, attributes, pseudos);
- break;
- }
- }
- return;
- }
- if (!item){
- // if the context is in the dom we return, else we will try GEBTN, breaking the getById label
- if (this.contains(this.root, node)) return;
- else break getById;
- } else if (this.document !== node && !this.contains(node, item)) return;
- this.push(item, tag, null, classes, attributes, pseudos);
- return;
- }
- getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
- children = node.getElementsByClassName(classList.join(' '));
- if (!(children && children.length)) break getByClass;
- for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
- return;
- }
- }
- getByTag: {
- children = node.getElementsByTagName(tag);
- if (!(children && children.length)) break getByTag;
- if (!this.brokenStarGEBTN) tag = null;
- for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
- }
- },
-
- '>': function(node, tag, id, classes, attributes, pseudos){ // direct children
- if ((node = node.firstChild)) do {
- if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
- } while ((node = node.nextSibling));
- },
-
- '+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
- while ((node = node.nextSibling)) if (node.nodeType == 1){
- this.push(node, tag, id, classes, attributes, pseudos);
- break;
- }
- },
-
- '^': function(node, tag, id, classes, attributes, pseudos){ // first child
- node = node.firstChild;
- if (node){
- if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
- else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
- }
- },
-
- '~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
- while ((node = node.nextSibling)){
- if (node.nodeType != 1) continue;
- var uid = this.getUID(node);
- if (this.bitUniques[uid]) break;
- this.bitUniques[uid] = true;
- this.push(node, tag, id, classes, attributes, pseudos);
- }
- },
-
- '++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
- this['combinator:+'](node, tag, id, classes, attributes, pseudos);
- this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
- },
-
- '~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
- this['combinator:~'](node, tag, id, classes, attributes, pseudos);
- this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
- },
-
- '!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
- while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
- },
-
- '!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
- node = node.parentNode;
- if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
- },
-
- '!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
- while ((node = node.previousSibling)) if (node.nodeType == 1){
- this.push(node, tag, id, classes, attributes, pseudos);
- break;
- }
- },
-
- '!^': function(node, tag, id, classes, attributes, pseudos){ // last child
- node = node.lastChild;
- if (node){
- if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
- else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
- }
- },
-
- '!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
- while ((node = node.previousSibling)){
- if (node.nodeType != 1) continue;
- var uid = this.getUID(node);
- if (this.bitUniques[uid]) break;
- this.bitUniques[uid] = true;
- this.push(node, tag, id, classes, attributes, pseudos);
- }
- }
-
-};
-
-for (var c in combinators) local['combinator:' + c] = combinators[c];
-
-var pseudos = {
-
- /*<pseudo-selectors>*/
-
- 'empty': function(node){
- var child = node.firstChild;
- return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
- },
-
- 'not': function(node, expression){
- return !this.matchNode(node, expression);
- },
-
- 'contains': function(node, text){
- return (node.innerText || node.textContent || '').indexOf(text) > -1;
- },
-
- 'first-child': function(node){
- while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
- return true;
- },
-
- 'last-child': function(node){
- while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
- return true;
- },
-
- 'only-child': function(node){
- var prev = node;
- while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
- var next = node;
- while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
- return true;
- },
-
- /*<nth-pseudo-selectors>*/
-
- 'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
-
- 'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
-
- 'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
-
- 'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
-
- 'index': function(node, index){
- return this['pseudo:nth-child'](node, '' + index + 1);
- },
-
- 'even': function(node){
- return this['pseudo:nth-child'](node, '2n');
- },
-
- 'odd': function(node){
- return this['pseudo:nth-child'](node, '2n+1');
- },
-
- /*</nth-pseudo-selectors>*/
-
- /*<of-type-pseudo-selectors>*/
-
- 'first-of-type': function(node){
- var nodeName = node.nodeName;
- while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
- return true;
- },
-
- 'last-of-type': function(node){
- var nodeName = node.nodeName;
- while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
- return true;
- },
-
- 'only-of-type': function(node){
- var prev = node, nodeName = node.nodeName;
- while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
- var next = node;
- while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
- return true;
- },
-
- /*</of-type-pseudo-selectors>*/
-
- // custom pseudos
-
- 'enabled': function(node){
- return !node.disabled;
- },
-
- 'disabled': function(node){
- return node.disabled;
- },
-
- 'checked': function(node){
- return node.checked || node.selected;
- },
-
- 'focus': function(node){
- return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
- },
-
- 'root': function(node){
- return (node === this.root);
- },
-
- 'selected': function(node){
- return node.selected;
- }
-
- /*</pseudo-selectors>*/
-};
-
-for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
-
-// attributes methods
-
-local.attributeGetters = {
-
- 'class': function(){
- return this.getAttribute('class') || this.className;
- },
-
- 'for': function(){
- return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
- },
-
- 'href': function(){
- return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
- },
-
- 'style': function(){
- return (this.style) ? this.style.cssText : this.getAttribute('style');
- },
-
- 'tabindex': function(){
- var attributeNode = this.getAttributeNode('tabindex');
- return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
- },
-
- 'type': function(){
- return this.getAttribute('type');
- }
-
-};
-
-// Slick
-
-var Slick = local.Slick = (this.Slick || {});
-
-Slick.version = '1.1.5';
-
-// Slick finder
-
-Slick.search = function(context, expression, append){
- return local.search(context, expression, append);
-};
-
-Slick.find = function(context, expression){
- return local.search(context, expression, null, true);
-};
-
-// Slick containment checker
-
-Slick.contains = function(container, node){
- local.setDocument(container);
- return local.contains(container, node);
-};
-
-// Slick attribute getter
-
-Slick.getAttribute = function(node, name){
- return local.getAttribute(node, name);
-};
-
-// Slick matcher
-
-Slick.match = function(node, selector){
- if (!(node && selector)) return false;
- if (!selector || selector === node) return true;
- local.setDocument(node);
- return local.matchNode(node, selector);
-};
-
-// Slick attribute accessor
-
-Slick.defineAttributeGetter = function(name, fn){
- local.attributeGetters[name] = fn;
- return this;
-};
-
-Slick.lookupAttributeGetter = function(name){
- return local.attributeGetters[name];
-};
-
-// Slick pseudo accessor
-
-Slick.definePseudo = function(name, fn){
- local['pseudo:' + name] = function(node, argument){
- return fn.call(node, argument);
- };
- return this;
-};
-
-Slick.lookupPseudo = function(name){
- var pseudo = local['pseudo:' + name];
- if (pseudo) return function(argument){
- return pseudo.call(this, argument);
- };
- return null;
-};
-
-// Slick overrides accessor
-
-Slick.override = function(regexp, fn){
- local.override(regexp, fn);
- return this;
-};
-
-Slick.isXML = local.isXML;
-
-Slick.uidOf = function(node){
- return local.getUIDHTML(node);
-};
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-/*
----
-
-name: Element
-
-description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder]
-
-provides: [Element, Elements, $, $$, Iframe, Selectors]
-
-...
-*/
-
-var Element = function(tag, props){
- var konstructor = Element.Constructors[tag];
- if (konstructor) return konstructor(props);
- if (typeof tag != 'string') return document.id(tag).set(props);
-
- if (!props) props = {};
-
- if (!(/^[\w-]+$/).test(tag)){
- var parsed = Slick.parse(tag).expressions[0][0];
- tag = (parsed.tag == '*') ? 'div' : parsed.tag;
- if (parsed.id && props.id == null) props.id = parsed.id;
-
- var attributes = parsed.attributes;
- if (attributes) for (var i = 0, l = attributes.length; i < l; i++){
- var attr = attributes[i];
- if (attr.value != null && attr.operator == '=' && props[attr.key] == null)
- props[attr.key] = attr.value;
- }
-
- if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
- }
-
- return document.newElement(tag, props);
-};
-
-if (Browser.Element) Element.prototype = Browser.Element.prototype;
-
-new Type('Element', Element).mirror(function(name){
- if (Array.prototype[name]) return;
-
- var obj = {};
- obj[name] = function(){
- var results = [], args = arguments, elements = true;
- for (var i = 0, l = this.length; i < l; i++){
- var element = this[i], result = results[i] = element[name].apply(element, args);
- elements = (elements && typeOf(result) == 'element');
- }
- return (elements) ? new Elements(results) : results;
- };
-
- Elements.implement(obj);
-});
-
-if (!Browser.Element){
- Element.parent = Object;
-
- Element.Prototype = {'$family': Function.from('element').hide()};
-
- Element.mirror(function(name, method){
- Element.Prototype[name] = method;
- });
-}
-
-Element.Constructors = {};
-
-
-
-var IFrame = new Type('IFrame', function(){
- var params = Array.link(arguments, {
- properties: Type.isObject,
- iframe: function(obj){
- return (obj != null);
- }
- });
-
- var props = params.properties || {}, iframe;
- if (params.iframe) iframe = document.id(params.iframe);
- var onload = props.onload || function(){};
- delete props.onload;
- props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
- iframe = new Element(iframe || 'iframe', props);
-
- var onLoad = function(){
- onload.call(iframe.contentWindow);
- };
-
- if (window.frames[props.id]) onLoad();
- else iframe.addListener('load', onLoad);
- return iframe;
-});
-
-var Elements = this.Elements = function(nodes){
- if (nodes && nodes.length){
- var uniques = {}, node;
- for (var i = 0; node = nodes[i++];){
- var uid = Slick.uidOf(node);
- if (!uniques[uid]){
- uniques[uid] = true;
- this.push(node);
- }
- }
- }
-};
-
-Elements.prototype = {length: 0};
-Elements.parent = Array;
-
-new Type('Elements', Elements).implement({
-
- filter: function(filter, bind){
- if (!filter) return this;
- return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
- return item.match(filter);
- } : filter, bind));
- }.protect(),
-
- push: function(){
- var length = this.length;
- for (var i = 0, l = arguments.length; i < l; i++){
- var item = document.id(arguments[i]);
- if (item) this[length++] = item;
- }
- return (this.length = length);
- }.protect(),
-
- unshift: function(){
- var items = [];
- for (var i = 0, l = arguments.length; i < l; i++){
- var item = document.id(arguments[i]);
- if (item) items.push(item);
- }
- return Array.prototype.unshift.apply(this, items);
- }.protect(),
-
- concat: function(){
- var newElements = new Elements(this);
- for (var i = 0, l = arguments.length; i < l; i++){
- var item = arguments[i];
- if (Type.isEnumerable(item)) newElements.append(item);
- else newElements.push(item);
- }
- return newElements;
- }.protect(),
-
- append: function(collection){
- for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
- return this;
- }.protect(),
-
- empty: function(){
- while (this.length) delete this[--this.length];
- return this;
- }.protect()
-
-});
-
-
-
-(function(){
-
-// FF, IE
-var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
-
-splice.call(object, 1, 1);
-if (object[1] == 1) Elements.implement('splice', function(){
- var length = this.length;
- splice.apply(this, arguments);
- while (length >= this.length) delete this[length--];
- return this;
-}.protect());
-
-Elements.implement(Array.prototype);
-
-Array.mirror(Elements);
-
-/*<ltIE8>*/
-var createElementAcceptsHTML;
-try {
- var x = document.createElement('<input name=x>');
- createElementAcceptsHTML = (x.name == 'x');
-} catch(e){}
-
-var escapeQuotes = function(html){
- return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-};
-/*</ltIE8>*/
-
-Document.implement({
-
- newElement: function(tag, props){
- if (props && props.checked != null) props.defaultChecked = props.checked;
- /*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
- if (createElementAcceptsHTML && props){
- tag = '<' + tag;
- if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
- if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
- tag += '>';
- delete props.name;
- delete props.type;
- }
- /*</ltIE8>*/
- return this.id(this.createElement(tag)).set(props);
- }
-
-});
-
-})();
-
-Document.implement({
-
- newTextNode: function(text){
- return this.createTextNode(text);
- },
-
- getDocument: function(){
- return this;
- },
-
- getWindow: function(){
- return this.window;
- },
-
- id: (function(){
-
- var types = {
-
- string: function(id, nocash, doc){
- id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
- return (id) ? types.element(id, nocash) : null;
- },
-
- element: function(el, nocash){
- $uid(el);
- if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
- Object.append(el, Element.Prototype);
- }
- return el;
- },
-
- object: function(obj, nocash, doc){
- if (obj.toElement) return types.element(obj.toElement(doc), nocash);
- return null;
- }
-
- };
-
- types.textnode = types.whitespace = types.window = types.document = function(zero){
- return zero;
- };
-
- return function(el, nocash, doc){
- if (el && el.$family && el.uid) return el;
- var type = typeOf(el);
- return (types[type]) ? types[type](el, nocash, doc || document) : null;
- };
-
- })()
-
-});
-
-if (window.$ == null) Window.implement('$', function(el, nc){
- return document.id(el, nc, this.document);
-});
-
-Window.implement({
-
- getDocument: function(){
- return this.document;
- },
-
- getWindow: function(){
- return this;
- }
-
-});
-
-[Document, Element].invoke('implement', {
-
- getElements: function(expression){
- return Slick.search(this, expression, new Elements);
- },
-
- getElement: function(expression){
- return document.id(Slick.find(this, expression));
- }
-
-});
-
-
-
-if (window.$$ == null) Window.implement('$$', function(selector){
- if (arguments.length == 1){
- if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
- else if (Type.isEnumerable(selector)) return new Elements(selector);
- }
- return new Elements(arguments);
-});
-
-(function(){
-
-var collected = {}, storage = {};
-var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
-
-var get = function(uid){
- return (storage[uid] || (storage[uid] = {}));
-};
-
-var clean = function(item){
- var uid = item.uid;
- if (item.removeEvents) item.removeEvents();
- if (item.clearAttributes) item.clearAttributes();
- if (uid != null){
- delete collected[uid];
- delete storage[uid];
- }
- return item;
-};
-
-var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly',
- 'rowSpan', 'tabIndex', 'useMap'
-];
-var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected',
- 'noresize', 'defer', 'defaultChecked'
-];
- var attributes = {
- 'html': 'innerHTML',
- 'class': 'className',
- 'for': 'htmlFor',
- 'text': (function(){
- var temp = document.createElement('div');
- return (temp.textContent == null) ? 'innerText' : 'textContent';
- })()
-};
-var readOnly = ['type'];
-var expandos = ['value', 'defaultValue'];
-var uriAttrs = /^(?:href|src|usemap)$/i;
-
-bools = bools.associate(bools);
-camels = camels.associate(camels.map(String.toLowerCase));
-readOnly = readOnly.associate(readOnly);
-
-Object.append(attributes, expandos.associate(expandos));
-
-var inserters = {
-
- before: function(context, element){
- var parent = element.parentNode;
- if (parent) parent.insertBefore(context, element);
- },
-
- after: function(context, element){
- var parent = element.parentNode;
- if (parent) parent.insertBefore(context, element.nextSibling);
- },
-
- bottom: function(context, element){
- element.appendChild(context);
- },
-
- top: function(context, element){
- element.insertBefore(context, element.firstChild);
- }
-
-};
-
-inserters.inside = inserters.bottom;
-
-
-
-var injectCombinator = function(expression, combinator){
- if (!expression) return combinator;
-
- expression = Object.clone(Slick.parse(expression));
-
- var expressions = expression.expressions;
- for (var i = expressions.length; i--;)
- expressions[i][0].combinator = combinator;
-
- return expression;
-};
-
-Element.implement({
-
- set: function(prop, value){
- var property = Element.Properties[prop];
- (property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
- }.overloadSetter(),
-
- get: function(prop){
- var property = Element.Properties[prop];
- return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
- }.overloadGetter(),
-
- erase: function(prop){
- var property = Element.Properties[prop];
- (property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
- return this;
- },
-
- setProperty: function(attribute, value){
- attribute = camels[attribute] || attribute;
- if (value == null) return this.removeProperty(attribute);
- var key = attributes[attribute];
- (key) ? this[key] = value :
- (bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value);
- return this;
- },
-
- setProperties: function(attributes){
- for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
- return this;
- },
-
- getProperty: function(attribute){
- attribute = camels[attribute] || attribute;
- var key = attributes[attribute] || readOnly[attribute];
- return (key) ? this[key] :
- (bools[attribute]) ? !!this[attribute] :
- (uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) :
- (key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null;
- },
-
- getProperties: function(){
- var args = Array.from(arguments);
- return args.map(this.getProperty, this).associate(args);
- },
-
- removeProperty: function(attribute){
- attribute = camels[attribute] || attribute;
- var key = attributes[attribute];
- (key) ? this[key] = '' :
- (bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute);
- return this;
- },
-
- removeProperties: function(){
- Array.each(arguments, this.removeProperty, this);
- return this;
- },
-
- hasClass: function(className){
- return this.className.clean().contains(className, ' ');
- },
-
- addClass: function(className){
- if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
- return this;
- },
-
- removeClass: function(className){
- this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
- return this;
- },
-
- toggleClass: function(className, force){
- if (force == null) force = !this.hasClass(className);
- return (force) ? this.addClass(className) : this.removeClass(className);
- },
-
- adopt: function(){
- var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
- if (length > 1) parent = fragment = document.createDocumentFragment();
-
- for (var i = 0; i < length; i++){
- var element = document.id(elements[i], true);
- if (element) parent.appendChild(element);
- }
-
- if (fragment) this.appendChild(fragment);
-
- return this;
- },
-
- appendText: function(text, where){
- return this.grab(this.getDocument().newTextNode(text), where);
- },
-
- grab: function(el, where){
- inserters[where || 'bottom'](document.id(el, true), this);
- return this;
- },
-
- inject: function(el, where){
- inserters[where || 'bottom'](this, document.id(el, true));
- return this;
- },
-
- replaces: function(el){
- el = document.id(el, true);
- el.parentNode.replaceChild(this, el);
- return this;
- },
-
- wraps: function(el, where){
- el = document.id(el, true);
- return this.replaces(el).grab(el, where);
- },
-
- getPrevious: function(expression){
- return document.id(Slick.find(this, injectCombinator(expression, '!~')));
- },
-
- getAllPrevious: function(expression){
- return Slick.search(this, injectCombinator(expression, '!~'), new Elements);
- },
-
- getNext: function(expression){
- return document.id(Slick.find(this, injectCombinator(expression, '~')));
- },
-
- getAllNext: function(expression){
- return Slick.search(this, injectCombinator(expression, '~'), new Elements);
- },
-
- getFirst: function(expression){
- return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
- },
-
- getLast: function(expression){
- return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
- },
-
- getParent: function(expression){
- return document.id(Slick.find(this, injectCombinator(expression, '!')));
- },
-
- getParents: function(expression){
- return Slick.search(this, injectCombinator(expression, '!'), new Elements);
- },
-
- getSiblings: function(expression){
- return Slick.search(this, injectCombinator(expression, '~~'), new Elements);
- },
-
- getChildren: function(expression){
- return Slick.search(this, injectCombinator(expression, '>'), new Elements);
- },
-
- getWindow: function(){
- return this.ownerDocument.window;
- },
-
- getDocument: function(){
- return this.ownerDocument;
- },
-
- getElementById: function(id){
- return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
- },
-
- getSelected: function(){
- this.selectedIndex; // Safari 3.2.1
- return new Elements(Array.from(this.options).filter(function(option){
- return option.selected;
- }));
- },
-
- toQueryString: function(){
- var queryString = [];
- this.getElements('input, select, textarea').each(function(el){
- var type = el.type;
- if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
-
- var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
- // IE
- return document.id(opt).get('value');
- }) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
-
- Array.from(value).each(function(val){
- if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
- });
- });
- return queryString.join('&');
- },
-
- destroy: function(){
- var children = clean(this).getElementsByTagName('*');
- Array.each(children, clean);
- Element.dispose(this);
- return null;
- },
-
- empty: function(){
- Array.from(this.childNodes).each(Element.dispose);
- return this;
- },
-
- dispose: function(){
- return (this.parentNode) ? this.parentNode.removeChild(this) : this;
- },
-
- match: function(expression){
- return !expression || Slick.match(this, expression);
- }
-
-});
-
-var cleanClone = function(node, element, keepid){
- if (!keepid) node.setAttributeNode(document.createAttribute('id'));
- if (node.clearAttributes){
- node.clearAttributes();
- node.mergeAttributes(element);
- node.removeAttribute('uid');
- if (node.options){
- var no = node.options, eo = element.options;
- for (var i = no.length; i--;) no[i].selected = eo[i].selected;
- }
- }
-
- var prop = formProps[element.tagName.toLowerCase()];
- if (prop && element[prop]) node[prop] = element[prop];
-};
-
-Element.implement('clone', function(contents, keepid){
- contents = contents !== false;
- var clone = this.cloneNode(contents), i;
-
- if (contents){
- var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
- for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid);
- }
-
- cleanClone(clone, this, keepid);
-
- if (Browser.ie){
- var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
- for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
- }
- return document.id(clone);
-});
-
-var contains = {contains: function(element){
- return Slick.contains(this, element);
-}};
-
-if (!document.contains) Document.implement(contains);
-if (!document.createElement('div').contains) Element.implement(contains);
-
-
-
-[Element, Window, Document].invoke('implement', {
-
- addListener: function(type, fn){
- if (type == 'unload'){
- var old = fn, self = this;
- fn = function(){
- self.removeListener('unload', fn);
- old();
- };
- } else {
- collected[$uid(this)] = this;
- }
- if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
- else this.attachEvent('on' + type, fn);
- return this;
- },
-
- removeListener: function(type, fn){
- if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
- else this.detachEvent('on' + type, fn);
- return this;
- },
-
- retrieve: function(property, dflt){
- var storage = get($uid(this)), prop = storage[property];
- if (dflt != null && prop == null) prop = storage[property] = dflt;
- return prop != null ? prop : null;
- },
-
- store: function(property, value){
- var storage = get($uid(this));
- storage[property] = value;
- return this;
- },
-
- eliminate: function(property){
- var storage = get($uid(this));
- delete storage[property];
- return this;
- }
-
-});
-
-// IE purge
-if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
- Object.each(collected, clean);
- if (window.CollectGarbage) CollectGarbage();
-});
-
-})();
-
-Element.Properties = {};
-
-
-
-Element.Properties.style = {
-
- set: function(style){
- this.style.cssText = style;
- },
-
- get: function(){
- return this.style.cssText;
- },
-
- erase: function(){
- this.style.cssText = '';
- }
-
-};
-
-Element.Properties.tag = {
-
- get: function(){
- return this.tagName.toLowerCase();
- }
-
-};
-
-(function(maxLength){
- if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = {
- get: function(){
- var maxlength = this.getAttribute('maxLength');
- return maxlength == maxLength ? null : maxlength;
- }
- };
-})(document.createElement('input').getAttribute('maxLength'));
-
-Element.Properties.html = (function(){
-
- var tableTest = Function.attempt(function(){
- var table = document.createElement('table');
- table.innerHTML = '<tr><td></td></tr>';
- });
-
- var wrapper = document.createElement('div');
-
- var translations = {
- table: [1, '<table>', '</table>'],
- select: [1, '<select>', '</select>'],
- tbody: [2, '<table><tbody>', '</tbody></table>'],
- tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
- };
- translations.thead = translations.tfoot = translations.tbody;
-
- var html = {
- set: function(){
- var html = Array.flatten(arguments).join('');
- var wrap = (!tableTest && translations[this.get('tag')]);
- if (wrap){
- var first = wrapper;
- first.innerHTML = wrap[1] + html + wrap[2];
- for (var i = wrap[0]; i--;) first = first.firstChild;
- this.empty().adopt(first.childNodes);
- } else {
- this.innerHTML = html;
- }
- }
- };
-
- html.erase = html.set;
-
- return html;
-})();
-
-
-/*
----
-
-name: Element.Style
-
-description: Contains methods for interacting with the styles of Elements in a fashionable way.
-
-license: MIT-style license.
-
-requires: Element
-
-provides: Element.Style
-
-...
-*/
-
-(function(){
-
-var html = document.html;
-
-Element.Properties.styles = {set: function(styles){
- this.setStyles(styles);
-}};
-
-var hasOpacity = (html.style.opacity != null);
-var reAlpha = /alpha\(opacity=([\d.]+)\)/i;
-
-var setOpacity = function(element, opacity){
- if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
- if (hasOpacity){
- element.style.opacity = opacity;
- } else {
- opacity = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
- var filter = element.style.filter || element.getComputedStyle('filter') || '';
- element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
- }
-};
-
-Element.Properties.opacity = {
-
- set: function(opacity){
- var visibility = this.style.visibility;
- if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden';
- else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible';
-
- setOpacity(this, opacity);
- },
-
- get: (hasOpacity) ? function(){
- var opacity = this.style.opacity || this.getComputedStyle('opacity');
- return (opacity == '') ? 1 : opacity;
- } : function(){
- var opacity, filter = (this.style.filter || this.getComputedStyle('filter'));
- if (filter) opacity = filter.match(reAlpha);
- return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
- }
-
-};
-
-var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
-
-Element.implement({
-
- getComputedStyle: function(property){
- if (this.currentStyle) return this.currentStyle[property.camelCase()];
- var defaultView = Element.getDocument(this).defaultView,
- computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
- return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
- },
-
- setOpacity: function(value){
- setOpacity(this, value);
- return this;
- },
-
- getOpacity: function(){
- return this.get('opacity');
- },
-
- setStyle: function(property, value){
- switch (property){
- case 'opacity': return this.set('opacity', parseFloat(value));
- case 'float': property = floatName;
- }
- property = property.camelCase();
- if (typeOf(value) != 'string'){
- var map = (Element.Styles[property] || '@').split(' ');
- value = Array.from(value).map(function(val, i){
- if (!map[i]) return '';
- return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
- }).join(' ');
- } else if (value == String(Number(value))){
- value = Math.round(value);
- }
- this.style[property] = value;
- return this;
- },
-
- getStyle: function(property){
- switch (property){
- case 'opacity': return this.get('opacity');
- case 'float': property = floatName;
- }
- property = property.camelCase();
- var result = this.style[property];
- if (!result || property == 'zIndex'){
- result = [];
- for (var style in Element.ShortStyles){
- if (property != style) continue;
- for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
- return result.join(' ');
- }
- result = this.getComputedStyle(property);
- }
- if (result){
- result = String(result);
- var color = result.match(/rgba?\([\d\s,]+\)/);
- if (color) result = result.replace(color[0], color[0].rgbToHex());
- }
- if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){
- if ((/^(height|width)$/).test(property)){
- var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
- values.each(function(value){
- size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
- }, this);
- return this['offset' + property.capitalize()] - size + 'px';
- }
- if (Browser.opera && String(result).indexOf('px') != -1) return result;
- if ((/^border(.+)Width|margin|padding/).test(property)) return '0px';
- }
- return result;
- },
-
- setStyles: function(styles){
- for (var style in styles) this.setStyle(style, styles[style]);
- return this;
- },
-
- getStyles: function(){
- var result = {};
- Array.flatten(arguments).each(function(key){
- result[key] = this.getStyle(key);
- }, this);
- return result;
- }
-
-});
-
-Element.Styles = {
- left: '@px', top: '@px', bottom: '@px', right: '@px',
- width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
- backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
- fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
- margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
- borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
- zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
-};
-
-
-
-Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
-
-['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
- var Short = Element.ShortStyles;
- var All = Element.Styles;
- ['margin', 'padding'].each(function(style){
- var sd = style + direction;
- Short[style][sd] = All[sd] = '@px';
- });
- var bd = 'border' + direction;
- Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
- var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
- Short[bd] = {};
- Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
- Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
- Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
-});
-
-}).call(this);
-
-
-/*
----
-
-name: Element.Event
-
-description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events.
-
-license: MIT-style license.
-
-requires: [Element, Event]
-
-provides: Element.Event
-
-...
-*/
-
-(function(){
-
-Element.Properties.events = {set: function(events){
- this.addEvents(events);
-}};
-
-[Element, Window, Document].invoke('implement', {
-
- addEvent: function(type, fn){
- var events = this.retrieve('events', {});
- if (!events[type]) events[type] = {keys: [], values: []};
- if (events[type].keys.contains(fn)) return this;
- events[type].keys.push(fn);
- var realType = type,
- custom = Element.Events[type],
- condition = fn,
- self = this;
- if (custom){
- if (custom.onAdd) custom.onAdd.call(this, fn);
- if (custom.condition){
- condition = function(event){
- if (custom.condition.call(this, event)) return fn.call(this, event);
- return true;
- };
- }
- realType = custom.base || realType;
- }
- var defn = function(){
- return fn.call(self);
- };
- var nativeEvent = Element.NativeEvents[realType];
- if (nativeEvent){
- if (nativeEvent == 2){
- defn = function(event){
- event = new Event(event, self.getWindow());
- if (condition.call(self, event) === false) event.stop();
- };
- }
- this.addListener(realType, defn, arguments[2]);
- }
- events[type].values.push(defn);
- return this;
- },
-
- removeEvent: function(type, fn){
- var events = this.retrieve('events');
- if (!events || !events[type]) return this;
- var list = events[type];
- var index = list.keys.indexOf(fn);
- if (index == -1) return this;
- var value = list.values[index];
- delete list.keys[index];
- delete list.values[index];
- var custom = Element.Events[type];
- if (custom){
- if (custom.onRemove) custom.onRemove.call(this, fn);
- type = custom.base || type;
- }
- return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
- },
-
- addEvents: function(events){
- for (var event in events) this.addEvent(event, events[event]);
- return this;
- },
-
- removeEvents: function(events){
- var type;
- if (typeOf(events) == 'object'){
- for (type in events) this.removeEvent(type, events[type]);
- return this;
- }
- var attached = this.retrieve('events');
- if (!attached) return this;
- if (!events){
- for (type in attached) this.removeEvents(type);
- this.eliminate('events');
- } else if (attached[events]){
- attached[events].keys.each(function(fn){
- this.removeEvent(events, fn);
- }, this);
- delete attached[events];
- }
- return this;
- },
-
- fireEvent: function(type, args, delay){
- var events = this.retrieve('events');
- if (!events || !events[type]) return this;
- args = Array.from(args);
-
- events[type].keys.each(function(fn){
- if (delay) fn.delay(delay, this, args);
- else fn.apply(this, args);
- }, this);
- return this;
- },
-
- cloneEvents: function(from, type){
- from = document.id(from);
- var events = from.retrieve('events');
- if (!events) return this;
- if (!type){
- for (var eventType in events) this.cloneEvents(from, eventType);
- } else if (events[type]){
- events[type].keys.each(function(fn){
- this.addEvent(type, fn);
- }, this);
- }
- return this;
- }
-
-});
-
-Element.NativeEvents = {
- click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
- mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
- mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
- keydown: 2, keypress: 2, keyup: 2, //keyboard
- orientationchange: 2, // mobile
- touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
- gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
- focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
- load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
- error: 1, abort: 1, scroll: 1 //misc
-};
-
-var check = function(event){
- var related = event.relatedTarget;
- if (related == null) return true;
- if (!related) return false;
- return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
-};
-
-Element.Events = {
-
- mouseenter: {
- base: 'mouseover',
- condition: check
- },
-
- mouseleave: {
- base: 'mouseout',
- condition: check
- },
-
- mousewheel: {
- base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
- }
-
-};
-
-
-
-}).call(this);
-
-
-/*
----
-
-name: Element.Dimensions
-
-description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
-
-license: MIT-style license.
-
-credits:
- - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
- - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
-
-requires: [Element, Element.Style]
-
-provides: [Element.Dimensions]
-
-...
-*/
-
-(function(){
-
-var element = document.createElement('div'),
- child = document.createElement('div');
-element.style.height = '0';
-element.appendChild(child);
-var brokenOffsetParent = (child.offsetParent === element);
-element = child = null;
-
-var isOffset = function(el){
- return styleString(el, 'position') != 'static' || isBody(el);
-};
-
-var isOffsetStatic = function(el){
- return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
-};
-
-Element.implement({
-
- scrollTo: function(x, y){
- if (isBody(this)){
- this.getWindow().scrollTo(x, y);
- } else {
- this.scrollLeft = x;
- this.scrollTop = y;
- }
- return this;
- },
-
- getSize: function(){
- if (isBody(this)) return this.getWindow().getSize();
- return {x: this.offsetWidth, y: this.offsetHeight};
- },
-
- getScrollSize: function(){
- if (isBody(this)) return this.getWindow().getScrollSize();
- return {x: this.scrollWidth, y: this.scrollHeight};
- },
-
- getScroll: function(){
- if (isBody(this)) return this.getWindow().getScroll();
- return {x: this.scrollLeft, y: this.scrollTop};
- },
-
- getScrolls: function(){
- var element = this.parentNode, position = {x: 0, y: 0};
- while (element && !isBody(element)){
- position.x += element.scrollLeft;
- position.y += element.scrollTop;
- element = element.parentNode;
- }
- return position;
- },
-
- getOffsetParent: brokenOffsetParent ? function(){
- var element = this;
- if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
- var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
- while ((element = element.parentNode)){
- if (isOffsetCheck(element)) return element;
- }
- return null;
- } : function(){
- var element = this;
- if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
- try {
- return element.offsetParent;
- } catch(e) {}
- return null;
- },
-
- getOffsets: function(){
- if (this.getBoundingClientRect && !Browser.Platform.ios){
- var bound = this.getBoundingClientRect(),
- html = document.id(this.getDocument().documentElement),
- htmlScroll = html.getScroll(),
- elemScrolls = this.getScrolls(),
- isFixed = (styleString(this, 'position') == 'fixed');
-
- return {
- x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
- y: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
- };
- }
-
- var element = this, position = {x: 0, y: 0};
- if (isBody(this)) return position;
-
- while (element && !isBody(element)){
- position.x += element.offsetLeft;
- position.y += element.offsetTop;
-
- if (Browser.firefox){
- if (!borderBox(element)){
- position.x += leftBorder(element);
- position.y += topBorder(element);
- }
- var parent = element.parentNode;
- if (parent && styleString(parent, 'overflow') != 'visible'){
- position.x += leftBorder(parent);
- position.y += topBorder(parent);
- }
- } else if (element != this && Browser.safari){
- position.x += leftBorder(element);
- position.y += topBorder(element);
- }
-
- element = element.offsetParent;
- }
- if (Browser.firefox && !borderBox(this)){
- position.x -= leftBorder(this);
- position.y -= topBorder(this);
- }
- return position;
- },
-
- getPosition: function(relative){
- if (isBody(this)) return {x: 0, y: 0};
- var offset = this.getOffsets(),
- scroll = this.getScrolls();
- var position = {
- x: offset.x - scroll.x,
- y: offset.y - scroll.y
- };
-
- if (relative && (relative = document.id(relative))){
- var relativePosition = relative.getPosition();
- return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
- }
- return position;
- },
-
- getCoordinates: function(element){
- if (isBody(this)) return this.getWindow().getCoordinates();
- var position = this.getPosition(element),
- size = this.getSize();
- var obj = {
- left: position.x,
- top: position.y,
- width: size.x,
- height: size.y
- };
- obj.right = obj.left + obj.width;
- obj.bottom = obj.top + obj.height;
- return obj;
- },
-
- computePosition: function(obj){
- return {
- left: obj.x - styleNumber(this, 'margin-left'),
- top: obj.y - styleNumber(this, 'margin-top')
- };
- },
-
- setPosition: function(obj){
- return this.setStyles(this.computePosition(obj));
- }
-
-});
-
-
-[Document, Window].invoke('implement', {
-
- getSize: function(){
- var doc = getCompatElement(this);
- return {x: doc.clientWidth, y: doc.clientHeight};
- },
-
- getScroll: function(){
- var win = this.getWindow(), doc = getCompatElement(this);
- return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
- },
-
- getScrollSize: function(){
- var doc = getCompatElement(this),
- min = this.getSize(),
- body = this.getDocument().body;
-
- return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
- },
-
- getPosition: function(){
- return {x: 0, y: 0};
- },
-
- getCoordinates: function(){
- var size = this.getSize();
- return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
- }
-
-});
-
-// private methods
-
-var styleString = Element.getComputedStyle;
-
-function styleNumber(element, style){
- return styleString(element, style).toInt() || 0;
-}
-
-function borderBox(element){
- return styleString(element, '-moz-box-sizing') == 'border-box';
-}
-
-function topBorder(element){
- return styleNumber(element, 'border-top-width');
-}
-
-function leftBorder(element){
- return styleNumber(element, 'border-left-width');
-}
-
-function isBody(element){
- return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-function getCompatElement(element){
- var doc = element.getDocument();
- return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-}
-
-}).call(this);
-
-//aliases
-Element.alias({position: 'setPosition'}); //compatability
-
-[Window, Document, Element].invoke('implement', {
-
- getHeight: function(){
- return this.getSize().y;
- },
-
- getWidth: function(){
- return this.getSize().x;
- },
-
- getScrollTop: function(){
- return this.getScroll().y;
- },
-
- getScrollLeft: function(){
- return this.getScroll().x;
- },
-
- getScrollHeight: function(){
- return this.getScrollSize().y;
- },
-
- getScrollWidth: function(){
- return this.getScrollSize().x;
- },
-
- getTop: function(){
- return this.getPosition().y;
- },
-
- getLeft: function(){
- return this.getPosition().x;
- }
-
-});
-
-
-/*
----
-
-name: Fx
-
-description: Contains the basic animation logic to be extended by all other Fx Classes.
-
-license: MIT-style license.
-
-requires: [Chain, Events, Options]
-
-provides: Fx
-
-...
-*/
-
-(function(){
-
-var Fx = this.Fx = new Class({
-
- Implements: [Chain, Events, Options],
-
- options: {
- /*
- onStart: nil,
- onCancel: nil,
- onComplete: nil,
- */
- fps: 60,
- unit: false,
- duration: 500,
- frames: null,
- frameSkip: true,
- link: 'ignore'
- },
-
- initialize: function(options){
- this.subject = this.subject || this;
- this.setOptions(options);
- },
-
- getTransition: function(){
- return function(p){
- return -(Math.cos(Math.PI * p) - 1) / 2;
- };
- },
-
- step: function(now){
- if (this.options.frameSkip){
- var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
- this.time = now;
- this.frame += frames;
- } else {
- this.frame++;
- }
-
- if (this.frame < this.frames){
- var delta = this.transition(this.frame / this.frames);
- this.set(this.compute(this.from, this.to, delta));
- } else {
- this.frame = this.frames;
- this.set(this.compute(this.from, this.to, 1));
- this.stop();
- }
- },
-
- set: function(now){
- return now;
- },
-
- compute: function(from, to, delta){
- return Fx.compute(from, to, delta);
- },
-
- check: function(){
- if (!this.isRunning()) return true;
- switch (this.options.link){
- case 'cancel': this.cancel(); return true;
- case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
- }
- return false;
- },
-
- start: function(from, to){
- if (!this.check(from, to)) return this;
- this.from = from;
- this.to = to;
- this.frame = (this.options.frameSkip) ? 0 : -1;
- this.time = null;
- this.transition = this.getTransition();
- var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
- this.duration = Fx.Durations[duration] || duration.toInt();
- this.frameInterval = 1000 / fps;
- this.frames = frames || Math.round(this.duration / this.frameInterval);
- this.fireEvent('start', this.subject);
- pushInstance.call(this, fps);
- return this;
- },
-
- stop: function(){
- if (this.isRunning()){
- this.time = null;
- pullInstance.call(this, this.options.fps);
- if (this.frames == this.frame){
- this.fireEvent('complete', this.subject);
- if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
- } else {
- this.fireEvent('stop', this.subject);
- }
- }
- return this;
- },
-
- cancel: function(){
- if (this.isRunning()){
- this.time = null;
- pullInstance.call(this, this.options.fps);
- this.frame = this.frames;
- this.fireEvent('cancel', this.subject).clearChain();
- }
- return this;
- },
-
- pause: function(){
- if (this.isRunning()){
- this.time = null;
- pullInstance.call(this, this.options.fps);
- }
- return this;
- },
-
- resume: function(){
- if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
- return this;
- },
-
- isRunning: function(){
- var list = instances[this.options.fps];
- return list && list.contains(this);
- }
-
-});
-
-Fx.compute = function(from, to, delta){
- return (to - from) * delta + from;
-};
-
-Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
-
-// global timers
-
-var instances = {}, timers = {};
-
-var loop = function(){
- var now = Date.now();
- for (var i = this.length; i--;){
- var instance = this[i];
- if (instance) instance.step(now);
- }
-};
-
-var pushInstance = function(fps){
- var list = instances[fps] || (instances[fps] = []);
- list.push(this);
- if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
-};
-
-var pullInstance = function(fps){
- var list = instances[fps];
- if (list){
- list.erase(this);
- if (!list.length && timers[fps]){
- delete instances[fps];
- timers[fps] = clearInterval(timers[fps]);
- }
- }
-};
-
-}).call(this);
-
-
-/*
----
-
-name: Fx.CSS
-
-description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
-
-license: MIT-style license.
-
-requires: [Fx, Element.Style]
-
-provides: Fx.CSS
-
-...
-*/
-
-Fx.CSS = new Class({
-
- Extends: Fx,
-
- //prepares the base from/to object
-
- prepare: function(element, property, values){
- values = Array.from(values);
- if (values[1] == null){
- values[1] = values[0];
- values[0] = element.getStyle(property);
- }
- var parsed = values.map(this.parse);
- return {from: parsed[0], to: parsed[1]};
- },
-
- //parses a value into an array
-
- parse: function(value){
- value = Function.from(value)();
- value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
- return value.map(function(val){
- val = String(val);
- var found = false;
- Object.each(Fx.CSS.Parsers, function(parser, key){
- if (found) return;
- var parsed = parser.parse(val);
- if (parsed || parsed === 0) found = {value: parsed, parser: parser};
- });
- found = found || {value: val, parser: Fx.CSS.Parsers.String};
- return found;
- });
- },
-
- //computes by a from and to prepared objects, using their parsers.
-
- compute: function(from, to, delta){
- var computed = [];
- (Math.min(from.length, to.length)).times(function(i){
- computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
- });
- computed.$family = Function.from('fx:css:value');
- return computed;
- },
-
- //serves the value as settable
-
- serve: function(value, unit){
- if (typeOf(value) != 'fx:css:value') value = this.parse(value);
- var returned = [];
- value.each(function(bit){
- returned = returned.concat(bit.parser.serve(bit.value, unit));
- });
- return returned;
- },
-
- //renders the change to an element
-
- render: function(element, property, value, unit){
- element.setStyle(property, this.serve(value, unit));
- },
-
- //searches inside the page css to find the values for a selector
-
- search: function(selector){
- if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
- var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
- Array.each(document.styleSheets, function(sheet, j){
- var href = sheet.href;
- if (href && href.contains('://') && !href.contains(document.domain)) return;
- var rules = sheet.rules || sheet.cssRules;
- Array.each(rules, function(rule, i){
- if (!rule.style) return;
- var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
- return m.toLowerCase();
- }) : null;
- if (!selectorText || !selectorTest.test(selectorText)) return;
- Object.each(Element.Styles, function(value, style){
- if (!rule.style[style] || Element.ShortStyles[style]) return;
- value = String(rule.style[style]);
- to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
- });
- });
- });
- return Fx.CSS.Cache[selector] = to;
- }
-
-});
-
-Fx.CSS.Cache = {};
-
-Fx.CSS.Parsers = {
-
- Color: {
- parse: function(value){
- if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
- return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
- },
- compute: function(from, to, delta){
- return from.map(function(value, i){
- return Math.round(Fx.compute(from[i], to[i], delta));
- });
- },
- serve: function(value){
- return value.map(Number);
- }
- },
-
- Number: {
- parse: parseFloat,
- compute: Fx.compute,
- serve: function(value, unit){
- return (unit) ? value + unit : value;
- }
- },
-
- String: {
- parse: Function.from(false),
- compute: function(zero, one){
- return one;
- },
- serve: function(zero){
- return zero;
- }
- }
-
-};
-
-
-
-
-/*
----
-
-name: Fx.Tween
-
-description: Formerly Fx.Style, effect to transition any CSS property for an element.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: [Fx.Tween, Element.fade, Element.highlight]
-
-...
-*/
-
-Fx.Tween = new Class({
-
- Extends: Fx.CSS,
-
- initialize: function(element, options){
- this.element = this.subject = document.id(element);
- this.parent(options);
- },
-
- set: function(property, now){
- if (arguments.length == 1){
- now = property;
- property = this.property || this.options.property;
- }
- this.render(this.element, property, now, this.options.unit);
- return this;
- },
-
- start: function(property, from, to){
- if (!this.check(property, from, to)) return this;
- var args = Array.flatten(arguments);
- this.property = this.options.property || args.shift();
- var parsed = this.prepare(this.element, this.property, args);
- return this.parent(parsed.from, parsed.to);
- }
-
-});
-
-Element.Properties.tween = {
-
- set: function(options){
- this.get('tween').cancel().setOptions(options);
- return this;
- },
-
- get: function(){
- var tween = this.retrieve('tween');
- if (!tween){
- tween = new Fx.Tween(this, {link: 'cancel'});
- this.store('tween', tween);
- }
- return tween;
- }
-
-};
-
-Element.implement({
-
- tween: function(property, from, to){
- this.get('tween').start(arguments);
- return this;
- },
-
- fade: function(how){
- var fade = this.get('tween'), o = 'opacity', toggle;
- how = [how, 'toggle'].pick();
- switch (how){
- case 'in': fade.start(o, 1); break;
- case 'out': fade.start(o, 0); break;
- case 'show': fade.set(o, 1); break;
- case 'hide': fade.set(o, 0); break;
- case 'toggle':
- var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
- fade.start(o, (flag) ? 0 : 1);
- this.store('fade:flag', !flag);
- toggle = true;
- break;
- default: fade.start(o, arguments);
- }
- if (!toggle) this.eliminate('fade:flag');
- return this;
- },
-
- highlight: function(start, end){
- if (!end){
- end = this.retrieve('highlight:original', this.getStyle('background-color'));
- end = (end == 'transparent') ? '#fff' : end;
- }
- var tween = this.get('tween');
- tween.start('background-color', start || '#ffff88', end).chain(function(){
- this.setStyle('background-color', this.retrieve('highlight:original'));
- tween.callChain();
- }.bind(this));
- return this;
- }
-
-});
-
-
-/*
----
-
-name: Fx.Morph
-
-description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: Fx.Morph
-
-...
-*/
-
-Fx.Morph = new Class({
-
- Extends: Fx.CSS,
-
- initialize: function(element, options){
- this.element = this.subject = document.id(element);
- this.parent(options);
- },
-
- set: function(now){
- if (typeof now == 'string') now = this.search(now);
- for (var p in now) this.render(this.element, p, now[p], this.options.unit);
- return this;
- },
-
- compute: function(from, to, delta){
- var now = {};
- for (var p in from) now[p] = this.parent(from[p], to[p], delta);
- return now;
- },
-
- start: function(properties){
- if (!this.check(properties)) return this;
- if (typeof properties == 'string') properties = this.search(properties);
- var from = {}, to = {};
- for (var p in properties){
- var parsed = this.prepare(this.element, p, properties[p]);
- from[p] = parsed.from;
- to[p] = parsed.to;
- }
- return this.parent(from, to);
- }
-
-});
-
-Element.Properties.morph = {
-
- set: function(options){
- this.get('morph').cancel().setOptions(options);
- return this;
- },
-
- get: function(){
- var morph = this.retrieve('morph');
- if (!morph){
- morph = new Fx.Morph(this, {link: 'cancel'});
- this.store('morph', morph);
- }
- return morph;
- }
-
-};
-
-Element.implement({
-
- morph: function(props){
- this.get('morph').start(props);
- return this;
- }
-
-});
-
-
-/*
----
-
-name: Fx.Transitions
-
-description: Contains a set of advanced transitions to be used with any of the Fx Classes.
-
-license: MIT-style license.
-
-credits:
- - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
-
-requires: Fx
-
-provides: Fx.Transitions
-
-...
-*/
-
-Fx.implement({
-
- getTransition: function(){
- var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
- if (typeof trans == 'string'){
- var data = trans.split(':');
- trans = Fx.Transitions;
- trans = trans[data[0]] || trans[data[0].capitalize()];
- if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
- }
- return trans;
- }
-
-});
-
-Fx.Transition = function(transition, params){
- params = Array.from(params);
- var easeIn = function(pos){
- return transition(pos, params);
- };
- return Object.append(easeIn, {
- easeIn: easeIn,
- easeOut: function(pos){
- return 1 - transition(1 - pos, params);
- },
- easeInOut: function(pos){
- return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
- }
- });
-};
-
-Fx.Transitions = {
-
- linear: function(zero){
- return zero;
- }
-
-};
-
-
-
-Fx.Transitions.extend = function(transitions){
- for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
-};
-
-Fx.Transitions.extend({
-
- Pow: function(p, x){
- return Math.pow(p, x && x[0] || 6);
- },
-
- Expo: function(p){
- return Math.pow(2, 8 * (p - 1));
- },
-
- Circ: function(p){
- return 1 - Math.sin(Math.acos(p));
- },
-
- Sine: function(p){
- return 1 - Math.cos(p * Math.PI / 2);
- },
-
- Back: function(p, x){
- x = x && x[0] || 1.618;
- return Math.pow(p, 2) * ((x + 1) * p - x);
- },
-
- Bounce: function(p){
- var value;
- for (var a = 0, b = 1; 1; a += b, b /= 2){
- if (p >= (7 - 4 * a) / 11){
- value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
- break;
- }
- }
- return value;
- },
-
- Elastic: function(p, x){
- return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
- }
-
-});
-
-['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
- Fx.Transitions[transition] = new Fx.Transition(function(p){
- return Math.pow(p, i + 2);
- });
-});
-
-
-/*
----
-
-name: Request
-
-description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
-
-license: MIT-style license.
-
-requires: [Object, Element, Chain, Events, Options, Browser]
-
-provides: Request
-
-...
-*/
-
-(function(){
-
-var empty = function(){},
- progressSupport = ('onprogress' in new Browser.Request);
-
-var Request = this.Request = new Class({
-
- Implements: [Chain, Events, Options],
-
- options: {/*
- onRequest: function(){},
- onLoadstart: function(event, xhr){},
- onProgress: function(event, xhr){},
- onComplete: function(){},
- onCancel: function(){},
- onSuccess: function(responseText, responseXML){},
- onFailure: function(xhr){},
- onException: function(headerName, value){},
- onTimeout: function(){},
- user: '',
- password: '',*/
- url: '',
- data: '',
- headers: {
- 'X-Requested-With': 'XMLHttpRequest',
- 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
- },
- async: true,
- format: false,
- method: 'post',
- link: 'ignore',
- isSuccess: null,
- emulation: true,
- urlEncoded: true,
- encoding: 'utf-8',
- evalScripts: false,
- evalResponse: false,
- timeout: 0,
- noCache: false
- },
-
- initialize: function(options){
- this.xhr = new Browser.Request();
- this.setOptions(options);
- this.headers = this.options.headers;
- },
-
- onStateChange: function(){
- var xhr = this.xhr;
- if (xhr.readyState != 4 || !this.running) return;
- this.running = false;
- this.status = 0;
- Function.attempt(function(){
- var status = xhr.status;
- this.status = (status == 1223) ? 204 : status;
- }.bind(this));
- xhr.onreadystatechange = empty;
- if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
- clearTimeout(this.timer);
-
- this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
- if (this.options.isSuccess.call(this, this.status))
- this.success(this.response.text, this.response.xml);
- else
- this.failure();
- },
-
- isSuccess: function(){
- var status = this.status;
- return (status >= 200 && status < 300);
- },
-
- isRunning: function(){
- return !!this.running;
- },
-
- processScripts: function(text){
- if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
- return text.stripScripts(this.options.evalScripts);
- },
-
- success: function(text, xml){
- this.onSuccess(this.processScripts(text), xml);
- },
-
- onSuccess: function(){
- this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
- },
-
- failure: function(){
- this.onFailure();
- },
-
- onFailure: function(){
- this.fireEvent('complete').fireEvent('failure', this.xhr);
- },
-
- loadstart: function(event){
- this.fireEvent('loadstart', [event, this.xhr]);
- },
-
- progress: function(event){
- this.fireEvent('progress', [event, this.xhr]);
- },
-
- timeout: function(){
- this.fireEvent('timeout', this.xhr);
- },
-
- setHeader: function(name, value){
- this.headers[name] = value;
- return this;
- },
-
- getHeader: function(name){
- return Function.attempt(function(){
- return this.xhr.getResponseHeader(name);
- }.bind(this));
- },
-
- check: function(){
- if (!this.running) return true;
- switch (this.options.link){
- case 'cancel': this.cancel(); return true;
- case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
- }
- return false;
- },
-
- send: function(options){
- if (!this.check(options)) return this;
-
- this.options.isSuccess = this.options.isSuccess || this.isSuccess;
- this.running = true;
-
- var type = typeOf(options);
- if (type == 'string' || type == 'element') options = {data: options};
-
- var old = this.options;
- options = Object.append({data: old.data, url: old.url, method: old.method}, options);
- var data = options.data, url = String(options.url), method = options.method.toLowerCase();
-
- switch (typeOf(data)){
- case 'element': data = document.id(data).toQueryString(); break;
- case 'object': case 'hash': data = Object.toQueryString(data);
- }
-
- if (this.options.format){
- var format = 'format=' + this.options.format;
- data = (data) ? format + '&' + data : format;
- }
-
- if (this.options.emulation && !['get', 'post'].contains(method)){
- var _method = '_method=' + method;
- data = (data) ? _method + '&' + data : _method;
- method = 'post';
- }
-
- if (this.options.urlEncoded && ['post', 'put'].contains(method)){
- var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
- this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
- }
-
- if (!url) url = document.location.pathname;
-
- var trimPosition = url.lastIndexOf('/');
- if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
-
- if (this.options.noCache)
- url += (url.contains('?') ? '&' : '?') + String.uniqueID();
-
- if (data && method == 'get'){
- url += (url.contains('?') ? '&' : '?') + data;
- data = null;
- }
-
- var xhr = this.xhr;
- if (progressSupport){
- xhr.onloadstart = this.loadstart.bind(this);
- xhr.onprogress = this.progress.bind(this);
- }
-
- xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
- if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
-
- xhr.onreadystatechange = this.onStateChange.bind(this);
-
- Object.each(this.headers, function(value, key){
- try {
- xhr.setRequestHeader(key, value);
- } catch (e){
- this.fireEvent('exception', [key, value]);
- }
- }, this);
-
- this.fireEvent('request');
- xhr.send(data);
- if (!this.options.async) this.onStateChange();
- if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
- return this;
- },
-
- cancel: function(){
- if (!this.running) return this;
- this.running = false;
- var xhr = this.xhr;
- xhr.abort();
- clearTimeout(this.timer);
- xhr.onreadystatechange = empty;
- if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
- this.xhr = new Browser.Request();
- this.fireEvent('cancel');
- return this;
- }
-
-});
-
-var methods = {};
-['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
- methods[method] = function(data){
- var object = {
- method: method
- };
- if (data != null) object.data = data;
- return this.send(object);
- };
-});
-
-Request.implement(methods);
-
-Element.Properties.send = {
-
- set: function(options){
- var send = this.get('send').cancel();
- send.setOptions(options);
- return this;
- },
-
- get: function(){
- var send = this.retrieve('send');
- if (!send){
- send = new Request({
- data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
- });
- this.store('send', send);
- }
- return send;
- }
-
-};
-
-Element.implement({
-
- send: function(url){
- var sender = this.get('send');
- sender.send({data: this, url: url || sender.options.url});
- return this;
- }
-
-});
-
-})();
-
-/*
----
-
-name: Request.HTML
-
-description: Extends the basic Request Class with additional methods for interacting with HTML responses.
-
-license: MIT-style license.
-
-requires: [Element, Request]
-
-provides: Request.HTML
-
-...
-*/
-
-Request.HTML = new Class({
-
- Extends: Request,
-
- options: {
- update: false,
- append: false,
- evalScripts: true,
- filter: false,
- headers: {
- Accept: 'text/html, application/xml, text/xml, */*'
- }
- },
-
- success: function(text){
- var options = this.options, response = this.response;
-
- response.html = text.stripScripts(function(script){
- response.javascript = script;
- });
-
- var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
- if (match) response.html = match[1];
- var temp = new Element('div').set('html', response.html);
-
- response.tree = temp.childNodes;
- response.elements = temp.getElements('*');
-
- if (options.filter) response.tree = response.elements.filter(options.filter);
- if (options.update) document.id(options.update).empty().set('html', response.html);
- else if (options.append) document.id(options.append).adopt(temp.getChildren());
- if (options.evalScripts) Browser.exec(response.javascript);
-
- this.onSuccess(response.tree, response.elements, response.html, response.javascript);
- }
-
-});
-
-Element.Properties.load = {
-
- set: function(options){
- var load = this.get('load').cancel();
- load.setOptions(options);
- return this;
- },
-
- get: function(){
- var load = this.retrieve('load');
- if (!load){
- load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
- this.store('load', load);
- }
- return load;
- }
-
-};
-
-Element.implement({
-
- load: function(){
- this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
- return this;
- }
-
-});
-
-
-/*
----
-
-name: JSON
-
-description: JSON encoder and decoder.
-
-license: MIT-style license.
-
-See Also: <http://www.json.org/>
-
-requires: [Array, String, Number, Function]
-
-provides: JSON
-
-...
-*/
-
-if (typeof JSON == 'undefined') this.JSON = {};
-
-
-
-(function(){
-
-var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
-
-var escape = function(chr){
- return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
-};
-
-JSON.validate = function(string){
- string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
- replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
- replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
- return (/^[\],:{}\s]*$/).test(string);
-};
-
-JSON.encode = JSON.stringify ? function(obj){
- return JSON.stringify(obj);
-} : function(obj){
- if (obj && obj.toJSON) obj = obj.toJSON();
-
- switch (typeOf(obj)){
- case 'string':
- return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
- case 'array':
- return '[' + obj.map(JSON.encode).clean() + ']';
- case 'object': case 'hash':
- var string = [];
- Object.each(obj, function(value, key){
- var json = JSON.encode(value);
- if (json) string.push(JSON.encode(key) + ':' + json);
- });
- return '{' + string + '}';
- case 'number': case 'boolean': return '' + obj;
- case 'null': return 'null';
- }
-
- return null;
-};
-
-JSON.decode = function(string, secure){
- if (!string || typeOf(string) != 'string') return null;
-
- if (secure || JSON.secure){
- if (JSON.parse) return JSON.parse(string);
- if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
- }
-
- return eval('(' + string + ')');
-};
-
-}).call(this);
-
-
-/*
----
-
-name: Request.JSON
-
-description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
-
-license: MIT-style license.
-
-requires: [Request, JSON]
-
-provides: Request.JSON
-
-...
-*/
-
-Request.JSON = new Class({
-
- Extends: Request,
-
- options: {
- /*onError: function(text, error){},*/
- secure: true
- },
-
- initialize: function(options){
- this.parent(options);
- Object.append(this.headers, {
- 'Accept': 'application/json',
- 'X-Request': 'JSON'
- });
- },
-
- success: function(text){
- var json;
- try {
- json = this.response.json = JSON.decode(text, this.options.secure);
- } catch (error){
- this.fireEvent('error', [text, error]);
- return;
- }
- if (json == null) this.onFailure();
- else this.onSuccess(json, text);
- }
-
-});
-
-
-/*
----
-
-name: Cookie
-
-description: Class for creating, reading, and deleting browser Cookies.
-
-license: MIT-style license.
-
-credits:
- - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
-
-requires: [Options, Browser]
-
-provides: Cookie
-
-...
-*/
-
-var Cookie = new Class({
-
- Implements: Options,
-
- options: {
- path: '/',
- domain: false,
- duration: false,
- secure: false,
- document: document,
- encode: true
- },
-
- initialize: function(key, options){
- this.key = key;
- this.setOptions(options);
- },
-
- write: function(value){
- if (this.options.encode) value = encodeURIComponent(value);
- if (this.options.domain) value += '; domain=' + this.options.domain;
- if (this.options.path) value += '; path=' + this.options.path;
- if (this.options.duration){
- var date = new Date();
- date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
- value += '; expires=' + date.toGMTString();
- }
- if (this.options.secure) value += '; secure';
- this.options.document.cookie = this.key + '=' + value;
- return this;
- },
-
- read: function(){
- var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
- return (value) ? decodeURIComponent(value[1]) : null;
- },
-
- dispose: function(){
- new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
- return this;
- }
-
-});
-
-Cookie.write = function(key, value, options){
- return new Cookie(key, options).write(value);
-};
-
-Cookie.read = function(key){
- return new Cookie(key).read();
-};
-
-Cookie.dispose = function(key, options){
- return new Cookie(key, options).dispose();
-};
-
-
-/*
----
-
-name: DOMReady
-
-description: Contains the custom event domready.
-
-license: MIT-style license.
-
-requires: [Browser, Element, Element.Event]
-
-provides: [DOMReady, DomReady]
-
-...
-*/
-
-(function(window, document){
-
-var ready,
- loaded,
- checks = [],
- shouldPoll,
- timer,
- isFramed = true;
-
-// Thanks to Rich Dougherty <http://www.richdougherty.com/>
-try {
- isFramed = window.frameElement != null;
-} catch(e){}
-
-var domready = function(){
- clearTimeout(timer);
- if (ready) return;
- Browser.loaded = ready = true;
- document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
-
- document.fireEvent('domready');
- window.fireEvent('domready');
-};
-
-var check = function(){
- for (var i = checks.length; i--;) if (checks[i]()){
- domready();
- return true;
- }
-
- return false;
-};
-
-var poll = function(){
- clearTimeout(timer);
- if (!check()) timer = setTimeout(poll, 10);
-};
-
-document.addListener('DOMContentLoaded', domready);
-
-// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
-var testElement = document.createElement('div');
-if (testElement.doScroll && !isFramed){
- checks.push(function(){
- try {
- testElement.doScroll();
- return true;
- } catch (e){}
-
- return false;
- });
- shouldPoll = true;
-}
-
-if (document.readyState) checks.push(function(){
- var state = document.readyState;
- return (state == 'loaded' || state == 'complete');
-});
-
-if ('onreadystatechange' in document) document.addListener('readystatechange', check);
-else shouldPoll = true;
-
-if (shouldPoll) poll();
-
-Element.Events.domready = {
- onAdd: function(fn){
- if (ready) fn.call(this);
- }
-};
-
-// Make sure that domready fires before load
-Element.Events.load = {
- base: 'load',
- onAdd: function(fn){
- if (loaded && this == window) fn.call(this);
- },
- condition: function(){
- if (this == window){
- domready();
- delete Element.Events.load;
- }
-
- return true;
- }
-};
-
-// This is based on the custom load event
-window.addEvent('load', function(){
- loaded = true;
-});
-
-})(window, document);
-
-
-/*
----
-
-name: Swiff
-
-description: Wrapper for embedding SWF movies. Supports External Interface Communication.
-
-license: MIT-style license.
-
-credits:
- - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
-
-requires: [Options, Object, Element]
-
-provides: Swiff
-
-...
-*/
-
-(function(){
-
-var Swiff = this.Swiff = new Class({
-
- Implements: Options,
-
- options: {
- id: null,
- height: 1,
- width: 1,
- container: null,
- properties: {},
- params: {
- quality: 'high',
- allowScriptAccess: 'always',
- wMode: 'window',
- swLiveConnect: true
- },
- callBacks: {},
- vars: {}
- },
-
- toElement: function(){
- return this.object;
- },
-
- initialize: function(path, options){
- this.instance = 'Swiff_' + String.uniqueID();
-
- this.setOptions(options);
- options = this.options;
- var id = this.id = options.id || this.instance;
- var container = document.id(options.container);
-
- Swiff.CallBacks[this.instance] = {};
-
- var params = options.params, vars = options.vars, callBacks = options.callBacks;
- var properties = Object.append({height: options.height, width: options.width}, options.properties);
-
- var self = this;
-
- for (var callBack in callBacks){
- Swiff.CallBacks[this.instance][callBack] = (function(option){
- return function(){
- return option.apply(self.object, arguments);
- };
- })(callBacks[callBack]);
- vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
- }
-
- params.flashVars = Object.toQueryString(vars);
- if (Browser.ie){
- properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
- params.movie = path;
- } else {
- properties.type = 'application/x-shockwave-flash';
- }
- properties.data = path;
-
- var build = '<object id="' + id + '"';
- for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
- build += '>';
- for (var param in params){
- if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
- }
- build += '</object>';
- this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
- },
-
- replaces: function(element){
- element = document.id(element, true);
- element.parentNode.replaceChild(this.toElement(), element);
- return this;
- },
-
- inject: function(element){
- document.id(element, true).appendChild(this.toElement());
- return this;
- },
-
- remote: function(){
- return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
- }
-
-});
-
-Swiff.CallBacks = {};
-
-Swiff.remote = function(obj, fn){
- var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
- return eval(rs);
-};
-
-}).call(this);
-
-
diff --git a/public/javascripts/octopress.js b/public/javascripts/octopress.js
index bf94ebe4..e69de29b 100644
--- a/public/javascripts/octopress.js
+++ b/public/javascripts/octopress.js
@@ -1,76 +0,0 @@
-window.addEvent('domready', function() {
- codeblocks = $$('div.highlight');
- codeblocks.each(addExpander);
-});
-
-window.addEvents({
- domready: function(){
- if(twitter_user){
- new Request.Twitter(twitter_user, {
- include_replies: false,
- data: { count: 3 },
- onSuccess: function(tweets){
- $('tweets').empty();
- for (var i = tweets.length; i--; ){
- new Element('li', {
- 'class': 'tweet'
- }).adopt(
- new Element('p', { 'html': tweets[i].text+' ' }).adopt(
- new Element('a', {
- 'href': 'http://twitter.com/'+twitter_user+'/status/'+tweets[i].id_str,
- 'text': new Date(tweets[i].created_at).timeDiffInWords()
- }))
- ).inject('tweets', 'top');
- }
- }
- }).send();
- }
- $$('#recent_posts time').each(function(date){
- date.set('text', new Date(date.get('text')).timeDiffInWords());
- });
- },
-});
-
-
-function addExpander(div){
- new Element('span',{
- html: 'expand &raquo;',
- 'class': 'pre_expander',
- 'events': {
- 'click': function(){
- toggleExpander(this);
- }
- }
- }).inject(div, 'top');
-}
-function toggleExpander(expander){
- var html = '';
- var expanderPos = expander.getPosition().y;
- if($('page').toggleClass('expanded').hasClass('expanded'))
- html = '&laquo; contract';
- else
- html = 'expand &raquo;';
- $$('div.highlight span.pre_expander').each(function(span){
- span.set('html',html);
- });
- fixScroll(expander, expanderPos);
-}
-function fixScroll(el, position){
- pos = el.getPosition().y - position;
- window.scrollTo(window.getScroll().x ,window.getScroll().y + pos);
-}
-function enableCompressedLayout(codeblocks){
- if(!codeblocks.length) return;
- new Element('span',{
- html: 'Collapse layout',
- 'id': 'collapser',
- 'events': {
- 'click': function(){
- if($('page').toggleClass('collapsed').hasClass('collapsed'))
- this.set('html','Expand layout');
- else
- this.set('html','Collapse layout');
- }
- }
- }).inject($('main'), 'top');
-}
diff --git a/public/javascripts/pinboard.js b/public/javascripts/pinboard.js
index 01d43621..9a69e0a6 100644
--- a/public/javascripts/pinboard.js
+++ b/public/javascripts/pinboard.js
@@ -26,7 +26,7 @@ function Pinboard_Linkroll() {
var str = this.format_item(item);
lines.push(str);
}
- $(linkroll).set('html', lines.join("\n"));
+ document.getElementById(linkroll).innerHTML = lines.join("\n");
}
this.cook = function(v) {
return v.replace('<', '&lt;').replace('>', '&gt>');
diff --git a/public/javascripts/twitter.js b/public/javascripts/twitter.js
index d633a781..d50efe1c 100644
--- a/public/javascripts/twitter.js
+++ b/public/javascripts/twitter.js
@@ -1,52 +1,70 @@
-Request.Twitter = new Class({
+/* http://www.JSON.org/json2.js 2009-09-29 Public Domain. NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. See http://www.JSON.org/js.html */
+if(!this.JSON){this.JSON={}}(function(){function l(c){return c<10?'0'+c:c}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(c){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+l(this.getUTCMonth()+1)+'-'+l(this.getUTCDate())+'T'+l(this.getUTCHours())+':'+l(this.getUTCMinutes())+':'+l(this.getUTCSeconds())+'Z':null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(c){return this.valueOf()}}var o=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,h,m,r={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},j;function q(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(c){var f=r[c];return typeof f==='string'?f:'\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function n(c,f){var a,e,d,i,k=h,g,b=f[c];if(b&&typeof b==='object'&&typeof b.toJSON==='function'){b=b.toJSON(c)}if(typeof j==='function'){b=j.call(f,c,b)}switch(typeof b){case'string':return q(b);case'number':return isFinite(b)?String(b):'null';case'boolean':case'null':return String(b);case'object':if(!b){return'null'}h+=m;g=[];if(Object.prototype.toString.apply(b)==='[object Array]'){i=b.length;for(a=0;a<i;a+=1){g[a]=n(a,b)||'null'}d=g.length===0?'[]':h?'[\n'+h+g.join(',\n'+h)+'\n'+k+']':'['+g.join(',')+']';h=k;return d}if(j&&typeof j==='object'){i=j.length;for(a=0;a<i;a+=1){e=j[a];if(typeof e==='string'){d=n(e,b);if(d){g.push(q(e)+(h?': ':':')+d)}}}}else{for(e in b){if(Object.hasOwnProperty.call(b,e)){d=n(e,b);if(d){g.push(q(e)+(h?': ':':')+d)}}}}d=g.length===0?'{}':h?'{\n'+h+g.join(',\n'+h)+'\n'+k+'}':'{'+g.join(',')+'}';h=k;return d}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(c,f,a){var e;h='';m='';if(typeof a==='number'){for(e=0;e<a;e+=1){m+=' '}}else if(typeof a==='string'){m=a}j=f;if(f&&typeof f!=='function'&&(typeof f!=='object'||typeof f.length!=='number')){throw new Error('JSON.stringify');}return n('',{'':c})}}if(typeof JSON.parse!=='function'){JSON.parse=function(i,k){var g;function b(c,f){var a,e,d=c[f];if(d&&typeof d==='object'){for(a in d){if(Object.hasOwnProperty.call(d,a)){e=b(d,a);if(e!==undefined){d[a]=e}else{delete d[a]}}}}return k.call(c,f,d)}o.lastIndex=0;if(o.test(i)){i=i.replace(o,function(c){return'\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(i.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){g=eval('('+i+')');return typeof k==='function'?b({'':g},''):g}throw new SyntaxError('JSON.parse');}}}());
- Extends: Request.JSONP,
+// jXHR.js (JSON-P XHR) | v0.1 (c) Kyle Simpson | MIT License
+(function(c){var b=c.setTimeout,d=c.document,a=0;c.jXHR=function(){var e,g,n,h,m=null;function l(){try{h.parentNode.removeChild(h)}catch(o){}}function k(){g=false;e="";l();h=null;i(0)}function f(p){try{m.onerror.call(m,p,e)}catch(o){throw new Error(p)}}function j(){if((this.readyState&&this.readyState!=="complete"&&this.readyState!=="loaded")||g){return}this.onload=this.onreadystatechange=null;g=true;if(m.readyState!==4){f("Script failed to load ["+e+"].")}l()}function i(o,p){p=p||[];m.readyState=o;if(typeof m.onreadystatechange==="function"){m.onreadystatechange.apply(m,p)}}m={onerror:null,onreadystatechange:null,readyState:0,open:function(p,o){k();internal_callback="cb"+(a++);(function(q){c.jXHR[q]=function(){try{i.call(m,4,arguments)}catch(r){m.readyState=-1;f("Script failed to run ["+e+"].")}c.jXHR[q]=null}})(internal_callback);e=o.replace(/=\?/,"=jXHR."+internal_callback);i(1)},send:function(){b(function(){h=d.createElement("script");h.setAttribute("type","text/javascript");h.onload=h.onreadystatechange=function(){j.call(h)};h.setAttribute("src",e);d.getElementsByTagName("head")[0].appendChild(h)},0);i(2)},setRequestHeader:function(){},getResponseHeader:function(){return""},getAllResponseHeaders:function(){return[]}};k();return m}})(window);
- options: {
- linkify: true,
- url: 'http://twitter.com/statuses/user_timeline/{term}.json',
- include_replies: true,
- data: {
- count: 5,
- trim_user: true
+function getTwitterFeed(success, user, count, replies) {
+ feed = new jXHR();
+ feed.onerror = function (msg,url) { alert(msg); }
+ feed.onreadystatechange = function(data){
+ if (feed.readyState === 4) {
+ var tweets = new Array();
+ for (i in data){
+ if(tweets.length < count){
+ if(replies || data[i].in_reply_to_user_id == null){
+ tweets.push(data[i]);
+ }
+ }
+ }
+ success(tweets);
}
- },
+ };
+ feed.open("GET","http://twitter.com/statuses/user_timeline/"+user+".json?trim_user=true&count="+parseInt(count)+25+"&callback=?");
+ feed.send();
+}
- initialize: function(term, options){
- this.parent(options);
- if(this.options.include_replies == false){
- this.options.count = this.options.data.count
- this.options.data.count += 30; // adds 30 tweets to request for filtering
- }
- this.options.url = this.options.url.substitute({term: term});
- console.log(this.options.url);
- },
-
- success: function(args, index){
- if(!this.options.include_replies){
- args[0] = args[0].filter(function(item, index, array){
- return item.in_reply_to_screen_name == null;
- });
- if(args[0].length > this.options.count){ args[0].length = this.options.count; }
- }
- var data = args[0];
-
- if (this.options.linkify) data.each(function(tweet){
- tweet.text = this.linkify(tweet.text);
- }, this);
-
- if (data[0]) this.options.data.since_id = data[0].id; // keep subsequent calls newer
-
- this.parent(args, index);
- },
+getTwitterFeed(showTwitterFeed, twitter_user, tweet_count, show_replies);
- linkify: function(text){
- // modified from TwitterGitter by David Walsh (davidwalsh.name)
- // courtesy of Jeremy Parrish (rrish.org)
- return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '<a href="$1">$1</a>')
- .replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>')
- .replace(/(^|\W)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2">$2</a>');
+function showTwitterFeed(tweets){
+ var timeline = document.getElementById('tweets');
+ timeline.innerHTML='';
+ for (t in tweets){
+ timeline.innerHTML+='<li>'+'<p>'+linkifyTweet(tweets[t].text)+'<a href="http://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a></p>'+'</li>';
}
+}
+function linkifyTweet(text){
+ return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '<a href="$1">$1</a>')
+ .replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>')
+ .replace(/(^|\W)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2">$2</a>');
+}
-});
-
+function prettyDate(date_str){
+ var time_formats = [
+ [60, 'just now', 1], // 60
+ [120, '1 min', '1 minute from now'], // 60*2
+ [3600, 'mins', 60], // 60*60, 60
+ [7200, '1 hour', '1 hour from now'], // 60*60*2
+ [86400, 'hours', 3600], // 60*60*24, 60*60
+ [172800, '1 day', 'tomorrow'], // 60*60*24*2
+ [2903040000, 'days', 86400], // 60*60*24*7, 60*60*24
+ ];
+ var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+ if(time.substr(time.length-4,1)==".") time =time.substr(0,time.length-4);
+ var seconds = (new Date - new Date(time)) / 1000;
+ var token = 'ago', list_choice = 1;
+ if (seconds < 0) {
+ seconds = Math.abs(seconds);
+ token = 'from now';
+ list_choice = 2;
+ }
+ var i = 0, format;
+ while (format = time_formats[i++])
+ if (seconds < format[0]) {
+ if (typeof format[2] == 'string')
+ return format[list_choice];
+ else
+ return Math.floor(seconds / format[2]) + ' ' + format[1];
+ }
+ return time;
+};