[DRE-commits] [SCM] ruby-fog.git branch, master, updated. debian/1.3.1-1-4-g25c8e39

Laurent Bigonville bigon at bigon.be
Fri Jun 1 11:28:39 UTC 2012


The following commit has been merged in the master branch:
commit 27d006de144ca0197349f47204280891eefaca21
Author: Laurent Bigonville <bigon at bigon.be>
Date:   Fri Jun 1 11:53:49 2012 +0200

    Add missing non-minified javascript files, the 2 patches have been taken from upstream

diff --git a/debian/changelog b/debian/changelog
index d2fe631..efd71a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,10 @@
 ruby-fog (1.3.1-2) UNRELEASED; urgency=low
 
   * debian/control: Run wrap-and-sort
+  * Add missing non-minified javascript files, the 2 patches have been taken
+    from upstream
 
- -- Laurent Bigonville <bigon at debian.org>  Fri, 11 May 2012 17:54:51 +0200
+ -- Laurent Bigonville <bigon at debian.org>  Fri, 01 Jun 2012 11:49:06 +0200
 
 ruby-fog (1.3.1-1) unstable; urgency=low
 
diff --git a/debian/patches/0001-Rename-dd_belatedpng.js-to-dd_belatedpng.min.js.patch b/debian/patches/0001-Rename-dd_belatedpng.js-to-dd_belatedpng.min.js.patch
new file mode 100644
index 0000000..6f2a0dd
--- /dev/null
+++ b/debian/patches/0001-Rename-dd_belatedpng.js-to-dd_belatedpng.min.js.patch
@@ -0,0 +1,49 @@
+From 5705fcf359c5969d57da5aae66f8f20b1b0a1ee6 Mon Sep 17 00:00:00 2001
+From: Laurent Bigonville <bigon at bigon.be>
+Date: Wed, 30 May 2012 14:43:02 +0200
+Subject: [PATCH 1/2] Rename dd_belatedpng.js to dd_belatedpng.min.js
+
+Rename dd_belatedpng.js to dd_belatedpng.min.js so we are consistant
+with the other minified javascript files
+---
+ docs/_layouts/default.html               |    2 +-
+ docs/public/js/libs/dd_belatedpng.min.js |   13 +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+ create mode 100755 docs/public/js/libs/dd_belatedpng.min.js
+
+diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
+index bda19dd..f0e6fd0 100755
+--- a/docs/_layouts/default.html
++++ b/docs/_layouts/default.html
+@@ -85,7 +85,7 @@
+ 
+ 
+   <!--[if lt IE 7 ]>
+-    <script src="public/js/libs/dd_belatedpng.js"></script>
++    <script src="public/js/libs/dd_belatedpng.min.js"></script>
+     <script> DD_belatedPNG.fix('img, .png_bg'); </script>
+   <![endif]-->
+ 
+diff --git a/docs/public/js/libs/dd_belatedpng.min.js b/docs/public/js/libs/dd_belatedpng.min.js
+new file mode 100755
+index 0000000..6062fb3
+--- /dev/null
++++ b/docs/public/js/libs/dd_belatedpng.min.js
+@@ -0,0 +1,13 @@
++/**
++* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
++* Author: Drew Diller
++* Email: drew.diller at gmail.com
++* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
++* Version: 0.0.8a
++* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
++*
++* Example usage:
++* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
++* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
++**/
++var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();
+\ No newline at end of file
+-- 
+1.7.10
+
diff --git a/debian/patches/0002-Add-non-minified-javascript-files-used-in-docs-939.patch b/debian/patches/0002-Add-non-minified-javascript-files-used-in-docs-939.patch
new file mode 100644
index 0000000..965b573
--- /dev/null
+++ b/debian/patches/0002-Add-non-minified-javascript-files-used-in-docs-939.patch
@@ -0,0 +1,2260 @@
+From 5d1fdc7941f010d0f80740e0284414163c03e301 Mon Sep 17 00:00:00 2001
+From: Laurent Bigonville <bigon at bigon.be>
+Date: Wed, 30 May 2012 15:21:19 +0200
+Subject: [PATCH 2/2] Add non-minified javascript files used in docs/ (#939)
+
+---
+ docs/public/js/libs/dd_belatedpng.js        |  302 +++++++-
+ docs/public/js/libs/modernizr-1.6.js        |  892 +++++++++++++++++++++++
+ docs/public/js/profiling/yahoo-profiling.js | 1028 +++++++++++++++++++++++++++
+ 3 files changed, 2209 insertions(+), 13 deletions(-)
+ mode change 100755 => 100644 docs/public/js/libs/dd_belatedpng.js
+ create mode 100644 docs/public/js/libs/modernizr-1.6.js
+ create mode 100644 docs/public/js/profiling/yahoo-profiling.js
+
+diff --git a/docs/public/js/libs/dd_belatedpng.js b/docs/public/js/libs/dd_belatedpng.js
+old mode 100755
+new mode 100644
+index 6062fb3..248955b
+--- a/docs/public/js/libs/dd_belatedpng.js
++++ b/docs/public/js/libs/dd_belatedpng.js
+@@ -1,13 +1,289 @@
+-/**
+-* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
+-* Author: Drew Diller
+-* Email: drew.diller at gmail.com
+-* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
+-* Version: 0.0.8a
+-* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
+-*
+-* Example usage:
+-* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
+-* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
+-**/
+-var DD_belatedPNG={ns:"DD_belatedPNG",imgSize:{},delay:10,nodesFixed:0,createVmlNameSpace:function(){if(document.namespaces&&!document.namespaces[this.ns]){document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")}},createVmlStyleSheet:function(){var b,a;b=document.createElement("style");b.setAttribute("media","screen");document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);if(b.styleSheet){b=b.styleSheet;b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");b.addRule(this.ns+"\\:shape","position:absolute;");b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");this.screenStyleSheet=b;a=document.createElement("style");a.setAttribute("media","print");document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);a=a.styleSheet;a.addRule(this.ns+"\\:*","{display: none !important;}");a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")}},readPropertyChange:function(){var b,c,a;b=event.srcElement;if(!b.vmlInitiated){return}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1){DD_belatedPNG.applyVML(b)}if(event.propertyName=="style.display"){c=(b.currentStyle.display=="none")?"none":"block";for(a in b.vml){if(b.vml.hasOwnProperty(a)){b.vml[a].shape.style.display=c}}}if(event.propertyName.search("filter")!=-1){DD_belatedPNG.vmlOpacity(b)}},vmlOpacity:function(b){if(b.currentStyle.filter.search("lpha")!=-1){var a=b.currentStyle.filter;a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;b.vml.color.shape.style.filter=b.currentStyle.filter;b.vml.image.fill.opacity=a}},handlePseudoHover:function(a){setTimeout(function(){DD_belatedPNG.applyVML(a)},1)},fix:function(a){if(this.screenStyleSheet){var c,b;c=a.split(",");for(b=0;b<c.length;b++){this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")}}},applyVML:function(a){a.runtimeStyle.cssText="";this.vmlFill(a);this.vmlOffsets(a);this.vmlOpacity(a);if(a.isImg){this.copyImageBorders(a)}},attachHandlers:function(i){var d,c,g,e,b,f;d=this;c={resize:"vmlOffsets",move:"vmlOffsets"};if(i.nodeName=="A"){e={mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"};for(b in e){if(e.hasOwnProperty(b)){c[b]=e[b]}}}for(f in c){if(c.hasOwnProperty(f)){g=function(){d[c[f]](i)};i.attachEvent("on"+f,g)}}i.attachEvent("onpropertychange",this.readPropertyChange)},giveLayout:function(a){a.style.zoom=1;if(a.currentStyle.position=="static"){a.style.position="relative"}},copyImageBorders:function(b){var c,a;c={borderStyle:true,borderWidth:true,borderColor:true};for(a in c){if(c.hasOwnProperty(a)){b.vml.color.shape.style[a]=b.currentStyle[a]}}},vmlFill:function(e){if(!e.currentStyle){return}else{var d,f,g,b,a,c;d=e.currentStyle}for(b in e.vml){if(e.vml.hasOwnProperty(b)){e.vml[b].shape.style.zIndex=d.zIndex}}e.runtimeStyle.backgroundColor="";e.runtimeStyle.backgroundImage="";f=true;if(d.backgroundImage!="none"||e.isImg){if(!e.isImg){e.vmlBg=d.backgroundImage;e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)}else{e.vmlBg=e.src}g=this;if(!g.imgSize[e.vmlBg]){a=document.createElement("img");g.imgSize[e.vmlBg]=a;a.className=g.ns+"_sizeFinder";a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";c=function(){this.width=this.offsetWidth;this.height=this.offsetHeight;g.vmlOffsets(e)};a.attachEvent("onload",c);a.src=e.vmlBg;a.removeAttribute("width");a.removeAttribute("height");document.body.insertBefore(a,document.body.firstChild)}e.vml.image.fill.src=e.vmlBg;f=false}e.vml.image.fill.on=!f;e.vml.image.fill.color="none";e.vml.color.shape.style.backgroundColor=d.backgroundColor;e.runtimeStyle.backgroundImage="none";e.runtimeStyle.backgroundColor="transparent"},vmlOffsets:function(d){var h,n,a,e,g,m,f,l,j,i,k;h=d.currentStyle;n={W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop};a=(n.L+n.bLW==1)?1:0;e=function(b,p,q,c,s,u){b.coordsize=c+","+s;b.coordorigin=u+","+u;b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";b.style.width=c+"px";b.style.height=s+"px";b.style.left=p+"px";b.style.top=q+"px"};e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);g={X:0,Y:0};if(d.isImg){g.X=parseInt(h.paddingLeft,10)+1;g.Y=parseInt(h.paddingTop,10)+1}else{for(j in g){if(g.hasOwnProperty(j)){this.figurePercentage(g,n,j,h["backgroundPosition"+j])}}}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);m=h.backgroundRepeat;f={T:1,R:n.W+a,B:n.H,L:1+a};l={X:{b1:"L",b2:"R",d:"W"},Y:{b1:"T",b2:"B",d:"H"}};if(m!="repeat"||d.isImg){i={T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)};if(m.search("repeat-")!=-1){k=m.split("repeat-")[1].toUpperCase();i[l[k].b1]=1;i[l[k].b2]=n[l[k].d]}if(i.B>n.H){i.B=n.H}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"}else{d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"}},figurePercentage:function(d,c,f,a){var b,e;e=true;b=(f=="X");switch(a){case"left":case"top":d[f]=0;break;case"center":d[f]=0.5;break;case"right":case"bottom":d[f]=1;break;default:if(a.search("%")!=-1){d[f]=parseInt(a,10)/100}else{e=false}}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));if(d[f]%2===0){d[f]++}return d[f]},fixPng:function(c){c.style.behavior="none";var g,b,f,a,d;if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR"){return}c.isImg=false;if(c.nodeName=="IMG"){if(c.src.toLowerCase().search(/\.png$/)!=-1){c.isImg=true;c.style.visibility="hidden"}else{return}}else{if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1){return}}g=DD_belatedPNG;c.vml={color:{},image:{}};b={shape:{},fill:{}};for(a in c.vml){if(c.vml.hasOwnProperty(a)){for(d in b){if(b.hasOwnProperty(d)){f=g.ns+":"+d;c.vml[a][d]=document.createElement(f)}}c.vml[a].shape.stroked=false;c.vml[a].shape.appendChild(c.vml[a].fill);c.parentNode.insertBefore(c.vml[a].shape,c)}}c.vml.image.shape.fillcolor="none";c.vml.image.fill.type="tile";c.vml.color.fill.on=false;g.attachHandlers(c);g.giveLayout(c);g.giveLayout(c.offsetParent);c.vmlInitiated=true;g.applyVML(c)}};try{document.execCommand("BackgroundImageCache",false,true)}catch(r){}DD_belatedPNG.createVmlNameSpace();DD_belatedPNG.createVmlStyleSheet();
+\ No newline at end of file
++/**
++* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
++* Author: Drew Diller
++* Email: drew.diller at gmail.com
++* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
++* Version: 0.0.8a
++* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
++*
++* Example usage:
++* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
++* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
++**/
++
++/*
++PLEASE READ:
++Absolutely everything in this script is SILLY.  I know this.  IE's rendering of certain pixels doesn't make sense, so neither does this code!
++*/
++
++var DD_belatedPNG = {
++	ns: 'DD_belatedPNG',
++	imgSize: {},
++	delay: 10,
++	nodesFixed: 0,
++	createVmlNameSpace: function () { /* enable VML */
++		if (document.namespaces && !document.namespaces[this.ns]) {
++			document.namespaces.add(this.ns, 'urn:schemas-microsoft-com:vml');
++		}
++	},
++	createVmlStyleSheet: function () { /* style VML, enable behaviors */
++		/*
++			Just in case lots of other developers have added
++			lots of other stylesheets using document.createStyleSheet
++			and hit the 31-limit mark, let's not use that method!
++			further reading: http://msdn.microsoft.com/en-us/library/ms531194(VS.85).aspx
++		*/
++		var screenStyleSheet, printStyleSheet;
++		screenStyleSheet = document.createElement('style');
++		screenStyleSheet.setAttribute('media', 'screen');
++		document.documentElement.firstChild.insertBefore(screenStyleSheet, document.documentElement.firstChild.firstChild);
++		if (screenStyleSheet.styleSheet) {
++			screenStyleSheet = screenStyleSheet.styleSheet;
++			screenStyleSheet.addRule(this.ns + '\\:*', '{behavior:url(#default#VML)}');
++			screenStyleSheet.addRule(this.ns + '\\:shape', 'position:absolute;');
++			screenStyleSheet.addRule('img.' + this.ns + '_sizeFinder', 'behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;'); /* large negative top value for avoiding vertical scrollbars for large images, suggested by James O'Brien, http://www.thanatopsic.org/hendrik/ */
++			this.screenStyleSheet = screenStyleSheet;
++			
++			/* Add a print-media stylesheet, for preventing VML artifacts from showing up in print (including preview). */
++			/* Thanks to Rémi Prévost for automating this! */
++			printStyleSheet = document.createElement('style');
++			printStyleSheet.setAttribute('media', 'print');
++			document.documentElement.firstChild.insertBefore(printStyleSheet, document.documentElement.firstChild.firstChild);
++			printStyleSheet = printStyleSheet.styleSheet;
++			printStyleSheet.addRule(this.ns + '\\:*', '{display: none !important;}');
++			printStyleSheet.addRule('img.' + this.ns + '_sizeFinder', '{display: none !important;}');
++		}
++	},
++	readPropertyChange: function () {
++		var el, display, v;
++		el = event.srcElement;
++		if (!el.vmlInitiated) {
++			return;
++		}
++		if (event.propertyName.search('background') != -1 || event.propertyName.search('border') != -1) {
++			DD_belatedPNG.applyVML(el);
++		}
++		if (event.propertyName == 'style.display') {
++			display = (el.currentStyle.display == 'none') ? 'none' : 'block';
++			for (v in el.vml) {
++				if (el.vml.hasOwnProperty(v)) {
++					el.vml[v].shape.style.display = display;
++				}
++			}
++		}
++		if (event.propertyName.search('filter') != -1) {
++			DD_belatedPNG.vmlOpacity(el);
++		}
++	},
++	vmlOpacity: function (el) {
++		if (el.currentStyle.filter.search('lpha') != -1) {
++			var trans = el.currentStyle.filter;
++			trans = parseInt(trans.substring(trans.lastIndexOf('=')+1, trans.lastIndexOf(')')), 10)/100;
++			el.vml.color.shape.style.filter = el.currentStyle.filter; /* complete guesswork */
++			el.vml.image.fill.opacity = trans; /* complete guesswork */
++		}
++	},
++	handlePseudoHover: function (el) {
++		setTimeout(function () { /* wouldn't work as intended without setTimeout */
++			DD_belatedPNG.applyVML(el);
++		}, 1);
++	},
++	/**
++	* This is the method to use in a document.
++	* @param {String} selector - REQUIRED - a CSS selector, such as '#doc .container'
++	**/
++	fix: function (selector) {
++		if (this.screenStyleSheet) {
++			var selectors, i;
++			selectors = selector.split(','); /* multiple selectors supported, no need for multiple calls to this anymore */
++			for (i=0; i<selectors.length; i++) {
++				this.screenStyleSheet.addRule(selectors[i], 'behavior:expression(DD_belatedPNG.fixPng(this))'); /* seems to execute the function without adding it to the stylesheet - interesting... */
++			}
++		}
++	},
++	applyVML: function (el) {
++		el.runtimeStyle.cssText = '';
++		this.vmlFill(el);
++		this.vmlOffsets(el);
++		this.vmlOpacity(el);
++		if (el.isImg) {
++			this.copyImageBorders(el);
++		}
++	},
++	attachHandlers: function (el) {
++		var self, handlers, handler, moreForAs, a, h;
++		self = this;
++		handlers = {resize: 'vmlOffsets', move: 'vmlOffsets'};
++		if (el.nodeName == 'A') {
++			moreForAs = {mouseleave: 'handlePseudoHover', mouseenter: 'handlePseudoHover', focus: 'handlePseudoHover', blur: 'handlePseudoHover'};
++			for (a in moreForAs) {			
++				if (moreForAs.hasOwnProperty(a)) {
++					handlers[a] = moreForAs[a];
++				}
++			}
++		}
++		for (h in handlers) {
++			if (handlers.hasOwnProperty(h)) {
				handler = function () {
					self[handlers[h]](el);
				};
++				el.attachEvent('on' + h, handler);
++			}
++		}
++		el.attachEvent('onpropertychange', this.readPropertyChange);
++	},
++	giveLayout: function (el) {
++		el.style.zoom = 1;
++		if (el.currentStyle.position == 'static') {
++			el.style.position = 'relative';
++		}
++	},
++	copyImageBorders: function (el) {
++		var styles, s;
++		styles = {'borderStyle':true, 'borderWidth':true, 'borderColor':true};
++		for (s in styles) {
++			if (styles.hasOwnProperty(s)) {
++				el.vml.color.shape.style[s] = el.currentStyle[s];
++			}
++		}
++	},
++	vmlFill: function (el) {
++		if (!el.currentStyle) {
++			return;
++		} else {
++			var elStyle, noImg, lib, v, img, imgLoaded;
++			elStyle = el.currentStyle;
++		}
++		for (v in el.vml) {
++			if (el.vml.hasOwnProperty(v)) {
++				el.vml[v].shape.style.zIndex = elStyle.zIndex;
++			}
++		}
++		el.runtimeStyle.backgroundColor = '';
++		el.runtimeStyle.backgroundImage = '';
++		noImg = true;
++		if (elStyle.backgroundImage != 'none' || el.isImg) {
++			if (!el.isImg) {
++				el.vmlBg = elStyle.backgroundImage;
++				el.vmlBg = el.vmlBg.substr(5, el.vmlBg.lastIndexOf('")')-5);
++			}
++			else {
++				el.vmlBg = el.src;
++			}
++			lib = this;
++			if (!lib.imgSize[el.vmlBg]) { /* determine size of loaded image */
++				img = document.createElement('img');
++				lib.imgSize[el.vmlBg] = img;
++				img.className = lib.ns + '_sizeFinder';
++				img.runtimeStyle.cssText = 'behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;'; /* make sure to set behavior to none to prevent accidental matching of the helper elements! */
				imgLoaded = function () {
					this.width = this.offsetWidth; /* weird cache-busting requirement! */
					this.height = this.offsetHeight;
					lib.vmlOffsets(el);
				};
++				img.attachEvent('onload', imgLoaded);
++				img.src = el.vmlBg;
++				img.removeAttribute('width');
++				img.removeAttribute('height');
++				document.body.insertBefore(img, document.body.firstChild);
++			}
++			el.vml.image.fill.src = el.vmlBg;
++			noImg = false;
++		}
++		el.vml.image.fill.on = !noImg;
++		el.vml.image.fill.color = 'none';
++		el.vml.color.shape.style.backgroundColor = elStyle.backgroundColor;
++		el.runtimeStyle.backgroundImage = 'none';
++		el.runtimeStyle.backgroundColor = 'transparent';
++	},
++	/* IE can't figure out what do when the offsetLeft and the clientLeft add up to 1, and the VML ends up getting fuzzy... so we have to push/enlarge things by 1 pixel and then clip off the excess */
++	vmlOffsets: function (el) {
++		var thisStyle, size, fudge, makeVisible, bg, bgR, dC, altC, b, c, v;
++		thisStyle = el.currentStyle;
++		size = {'W':el.clientWidth+1, 'H':el.clientHeight+1, 'w':this.imgSize[el.vmlBg].width, 'h':this.imgSize[el.vmlBg].height, 'L':el.offsetLeft, 'T':el.offsetTop, 'bLW':el.clientLeft, 'bTW':el.clientTop};
++		fudge = (size.L + size.bLW == 1) ? 1 : 0;
++		/* vml shape, left, top, width, height, origin */
++		makeVisible = function (vml, l, t, w, h, o) {
++			vml.coordsize = w+','+h;
++			vml.coordorigin = o+','+o;
++			vml.path = 'm0,0l'+w+',0l'+w+','+h+'l0,'+h+' xe';
++			vml.style.width = w + 'px';
++			vml.style.height = h + 'px';
++			vml.style.left = l + 'px';
++			vml.style.top = t + 'px';
++		};
++		makeVisible(el.vml.color.shape, (size.L + (el.isImg ? 0 : size.bLW)), (size.T + (el.isImg ? 0 : size.bTW)), (size.W-1), (size.H-1), 0);
++		makeVisible(el.vml.image.shape, (size.L + size.bLW), (size.T + size.bTW), (size.W), (size.H), 1 );
++		bg = {'X':0, 'Y':0};
++		if (el.isImg) {
++			bg.X = parseInt(thisStyle.paddingLeft, 10) + 1;
++			bg.Y = parseInt(thisStyle.paddingTop, 10) + 1;
++		}
++		else {
++			for (b in bg) {
++				if (bg.hasOwnProperty(b)) {
++					this.figurePercentage(bg, size, b, thisStyle['backgroundPosition'+b]);
++				}
++			}
++		}
++		el.vml.image.fill.position = (bg.X/size.W) + ',' + (bg.Y/size.H);
++		bgR = thisStyle.backgroundRepeat;
++		dC = {'T':1, 'R':size.W+fudge, 'B':size.H, 'L':1+fudge}; /* these are defaults for repeat of any kind */
++		altC = { 'X': {'b1': 'L', 'b2': 'R', 'd': 'W'}, 'Y': {'b1': 'T', 'b2': 'B', 'd': 'H'} };
++		if (bgR != 'repeat' || el.isImg) {
++			c = {'T':(bg.Y), 'R':(bg.X+size.w), 'B':(bg.Y+size.h), 'L':(bg.X)}; /* these are defaults for no-repeat - clips down to the image location */
++			if (bgR.search('repeat-') != -1) { /* now let's revert to dC for repeat-x or repeat-y */
++				v = bgR.split('repeat-')[1].toUpperCase();
++				c[altC[v].b1] = 1;
++				c[altC[v].b2] = size[altC[v].d];
++			}
++			if (c.B > size.H) {
++				c.B = size.H;
++			}
++			el.vml.image.shape.style.clip = 'rect('+c.T+'px '+(c.R+fudge)+'px '+c.B+'px '+(c.L+fudge)+'px)';
++		}
++		else {
++			el.vml.image.shape.style.clip = 'rect('+dC.T+'px '+dC.R+'px '+dC.B+'px '+dC.L+'px)';
++		}
++	},
	figurePercentage: function (bg, size, axis, position) {
		var horizontal, fraction;
		fraction = true;
		horizontal = (axis == 'X');
		switch(position) {
			case 'left':
			case 'top':
				bg[axis] = 0;
				break;
			case 'center':
				bg[axis] = 0.5;
				break;
			case 'right':
			case 'bottom':
				bg[axis] = 1;
				break;
			default:
				if (position.search('%') != -1) {
					bg[axis] = parseInt(position, 10) / 100;
				}
				else {
					fraction = false;
				}
		}
		bg[axis] = Math.ceil(  fraction ? ( (size[horizontal?'W': 'H'] * bg[axis]) - (size[horizontal?'w': 'h'] * bg[axis]) ) : parseInt(position, 10)  );
		if (bg[axis] % 2 === 0) {
			bg[axis]++;
		}
		return bg[axis];
	},
++	fixPng: function (el) {
++		el.style.behavior = 'none';
		var lib, els, nodeStr, v, e;
++		if (el.nodeName == 'BODY' || el.nodeName == 'TD' || el.nodeName == 'TR') { /* elements not supported yet */
++			return;
++		}
++		el.isImg = false;
++		if (el.nodeName == 'IMG') {
++			if(el.src.toLowerCase().search(/\.png$/) != -1) {
++				el.isImg = true;
++				el.style.visibility = 'hidden';
++			}
++			else {
++				return;
++			}
++		}
++		else if (el.currentStyle.backgroundImage.toLowerCase().search('.png') == -1) {
++			return;
++		}
++		lib = DD_belatedPNG;
++		el.vml = {color: {}, image: {}};
++		els = {shape: {}, fill: {}};
++		for (v in el.vml) {
++			if (el.vml.hasOwnProperty(v)) {
++				for (e in els) {
++					if (els.hasOwnProperty(e)) {
++						nodeStr = lib.ns + ':' + e;
++						el.vml[v][e] = document.createElement(nodeStr);
++					}
++				}
++				el.vml[v].shape.stroked = false;
++				el.vml[v].shape.appendChild(el.vml[v].fill);
++				el.parentNode.insertBefore(el.vml[v].shape, el);
++			}
++		}
++		el.vml.image.shape.fillcolor = 'none'; /* Don't show blank white shapeangle when waiting for image to load. */
++		el.vml.image.fill.type = 'tile'; /* Makes image show up. */
++		el.vml.color.fill.on = false; /* Actually going to apply vml element's style.backgroundColor, so hide the whiteness. */
++		lib.attachHandlers(el);
++		lib.giveLayout(el);
++		lib.giveLayout(el.offsetParent);
++		el.vmlInitiated = true;
++		lib.applyVML(el); /* Render! */
++	}
++};
++try {
++	document.execCommand("BackgroundImageCache", false, true); /* TredoSoft Multiple IE doesn't like this, so try{} it */
++} catch(r) {}
++DD_belatedPNG.createVmlNameSpace();
++DD_belatedPNG.createVmlStyleSheet();
+\ No newline at end of file
+diff --git a/docs/public/js/libs/modernizr-1.6.js b/docs/public/js/libs/modernizr-1.6.js
+new file mode 100644
+index 0000000..015e4bf
+--- /dev/null
++++ b/docs/public/js/libs/modernizr-1.6.js
+@@ -0,0 +1,892 @@
++/*!
++ * Modernizr v1.6
++ * http://www.modernizr.com
++ *
++ * Developed by: 
++ * - Faruk Ates  http://farukat.es/
++ * - Paul Irish  http://paulirish.com/
++ *
++ * Copyright (c) 2009-2010
++ * Dual-licensed under the BSD or MIT licenses.
++ * http://www.modernizr.com/license/
++ */
++
++ 
++/*
++ * Modernizr is a script that detects native CSS3 and HTML5 features
++ * available in the current UA and provides an object containing all
++ * features with a true/false value, depending on whether the UA has
++ * native support for it or not.
++ * 
++ * Modernizr will also add classes to the <html> element of the page,
++ * one for each feature it detects. If the UA supports it, a class
++ * like "cssgradients" will be added. If not, the class name will be
++ * "no-cssgradients". This allows for simple if-conditionals in your
++ * CSS, giving you fine control over the look & feel of your website.
++ * 
++ * @author        Faruk Ates
++ * @author        Paul Irish
++ * @copyright     (c) 2009-2010 Faruk Ates.
++ * @contributor   Ben Alman
++ */
++
++window.Modernizr = (function(window,doc,undefined){
++    
++    var version = '1.6',
++    
++    ret = {},
++
++    /**
++     * !! DEPRECATED !!
++     * 
++     * enableHTML5 is a private property for advanced use only. If enabled,
++     * it will make Modernizr.init() run through a brief while() loop in
++     * which it will create all HTML5 elements in the DOM to allow for
++     * styling them in Internet Explorer, which does not recognize any
++     * non-HTML4 elements unless created in the DOM this way.
++     * 
++     * enableHTML5 is ON by default.
++     * 
++     * The enableHTML5 toggle option is DEPRECATED as per 1.6, and will be
++     * replaced in 2.0 in lieu of the modular, configurable nature of 2.0.
++     */
++    enableHTML5 = true,
++    
++    
++    docElement = doc.documentElement,
++
++    /**
++     * Create our "modernizr" element that we do most feature tests on.
++     */
++    mod = 'modernizr',
++    m = doc.createElement( mod ),
++    m_style = m.style,
++
++    /**
++     * Create the input element for various Web Forms feature tests.
++     */
++    f = doc.createElement( 'input' ),
++    
++    smile = ':)',
++    
++    tostring = Object.prototype.toString,
++    
++    // List of property values to set for css tests. See ticket #21
++    prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '),
++
++    // Following spec is to expose vendor-specific style properties as:
++    //   elem.style.WebkitBorderRadius
++    // and the following would be incorrect:
++    //   elem.style.webkitBorderRadius
++    
++    // Webkit ghosts their properties in lowercase but Opera & Moz do not.
++    // Microsoft foregoes prefixes entirely <= IE8, but appears to 
++    //   use a lowercase `ms` instead of the correct `Ms` in IE9
++    
++    // More here: http://github.com/Modernizr/Modernizr/issues/issue/21
++    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
++
++    ns = {'svg': 'http://www.w3.org/2000/svg'},
++
++    tests = {},
++    inputs = {},
++    attrs = {},
++    
++    classes = [],
++    
++    featurename, // used in testing loop
++    
++    
++    
++    // todo: consider using http://javascript.nwbox.com/CSSSupport/css-support.js instead
++    testMediaQuery = function(mq){
++
++      var st = document.createElement('style'),
++          div = doc.createElement('div'),
++          ret;
++
++      st.textContent = mq + '{#modernizr{height:3px}}';
++      (doc.head || doc.getElementsByTagName('head')[0]).appendChild(st);
++      div.id = 'modernizr';
++      docElement.appendChild(div);
++
++      ret = div.offsetHeight === 3;
++
++      st.parentNode.removeChild(st);
++      div.parentNode.removeChild(div);
++
++      return !!ret;
++
++    },
++    
++    
++    /**
++      * isEventSupported determines if a given element supports the given event
++      * function from http://yura.thinkweb2.com/isEventSupported/
++      */
++    isEventSupported = (function(){
++
++      var TAGNAMES = {
++        'select':'input','change':'input',
++        'submit':'form','reset':'form',
++        'error':'img','load':'img','abort':'img'
++      };
++
++      function isEventSupported(eventName, element) {
++
++        element = element || document.createElement(TAGNAMES[eventName] || 'div');
++        eventName = 'on' + eventName;
++
++        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
++        var isSupported = (eventName in element);
++
++        if (!isSupported) {
++          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
++          if (!element.setAttribute) {
++            element = document.createElement('div');
++          }
++          if (element.setAttribute && element.removeAttribute) {
++            element.setAttribute(eventName, '');
++            isSupported = typeof element[eventName] == 'function';
++
++            // If property was created, "remove it" (by setting value to `undefined`)
++            if (typeof element[eventName] != 'undefined') {
++              element[eventName] = undefined;
++            }
++            element.removeAttribute(eventName);
++          }
++        }
++
++        element = null;
++        return isSupported;
++      }
++      return isEventSupported;
++    })();
++    
++    
++    // hasOwnProperty shim by kangax needed for Safari 2.0 support
++    var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty;
++    if (typeof _hasOwnProperty !== 'undefined' && typeof _hasOwnProperty.call !== 'undefined') {
++      hasOwnProperty = function (object, property) {
++        return _hasOwnProperty.call(object, property);
++      };
++    }
++    else {
++      hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
++        return ((property in object) && typeof object.constructor.prototype[property] === 'undefined');
++      };
++    }
++    
++    /**
++     * set_css applies given styles to the Modernizr DOM node.
++     */
++    function set_css( str ) {
++        m_style.cssText = str;
++    }
++
++    /**
++     * set_css_all extrapolates all vendor-specific css strings.
++     */
++    function set_css_all( str1, str2 ) {
++        return set_css(prefixes.join(str1 + ';') + ( str2 || '' ));
++    }
++
++    /**
++     * contains returns a boolean for if substr is found within str.
++     */
++    function contains( str, substr ) {
++        return (''+str).indexOf( substr ) !== -1;
++    }
++
++    /**
++     * test_props is a generic CSS / DOM property test; if a browser supports
++     *   a certain property, it won't return undefined for it.
++     *   A supported CSS property returns empty string when its not yet set.
++     */
++    function test_props( props, callback ) {
++        for ( var i in props ) {
++            if ( m_style[ props[i] ] !== undefined && ( !callback || callback( props[i], m ) ) ) {
++                return true;
++            }
++        }
++    }
++
++    /**
++     * test_props_all tests a list of DOM properties we want to check against.
++     *   We specify literally ALL possible (known and/or likely) properties on 
++     *   the element including the non-vendor prefixed one, for forward-
++     *   compatibility.
++     */
++    function test_props_all( prop, callback ) {
++      
++        var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1),
++            props   = (prop + ' ' + domPrefixes.join(uc_prop + ' ') + uc_prop).split(' ');
++
++        return !!test_props( props, callback );
++    }
++    
++
++    /**
++     * Tests
++     */
++
++    tests['flexbox'] = function() {
++        /**
++         * set_prefixed_value_css sets the property of a specified element
++         * adding vendor prefixes to the VALUE of the property.
++         * @param {Element} element
++         * @param {string} property The property name. This will not be prefixed.
++         * @param {string} value The value of the property. This WILL be prefixed.
++         * @param {string=} extra Additional CSS to append unmodified to the end of
++         * the CSS string.
++         */
++        function set_prefixed_value_css(element, property, value, extra) {
++            property += ':';
++            element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || '');
++        }
++
++        /**
++         * set_prefixed_property_css sets the property of a specified element
++         * adding vendor prefixes to the NAME of the property.
++         * @param {Element} element
++         * @param {string} property The property name. This WILL be prefixed.
++         * @param {string} value The value of the property. This will not be prefixed.
++         * @param {string=} extra Additional CSS to append unmodified to the end of
++         * the CSS string.
++         */
++        function set_prefixed_property_css(element, property, value, extra) {
++            element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || '');
++        }
++
++        var c = doc.createElement('div'),
++            elem = doc.createElement('div');
++
++        set_prefixed_value_css(c, 'display', 'box', 'width:42px;padding:0;');
++        set_prefixed_property_css(elem, 'box-flex', '1', 'width:10px;');
++
++        c.appendChild(elem);
++        docElement.appendChild(c);
++
++        var ret = elem.offsetWidth === 42;
++
++        c.removeChild(elem);
++        docElement.removeChild(c);
++
++        return ret;
++    };
++    
++    // On the S60 and BB Storm, getContext exists, but always returns undefined
++    // http://github.com/Modernizr/Modernizr/issues/issue/97/ 
++    
++    tests['canvas'] = function() {
++        var elem = doc.createElement( 'canvas' );
++        return !!(elem.getContext && elem.getContext('2d'));
++    };
++    
++    tests['canvastext'] = function() {
++        return !!(ret['canvas'] && typeof doc.createElement( 'canvas' ).getContext('2d').fillText == 'function');
++    };
++    
++    
++    tests['webgl'] = function(){
++
++        var elem = doc.createElement( 'canvas' ); 
++        
++        try {
++            if (elem.getContext('webgl')){ return true; }
++        } catch(e){	}
++        
++        try {
++            if (elem.getContext('experimental-webgl')){ return true; }
++        } catch(e){	}
++
++        return false;
++    };
++    
++    /*
++     * The Modernizr.touch test only indicates if the browser supports
++     *    touch events, which does not necessarily reflect a touchscreen
++     *    device, as evidenced by tablets running Windows 7 or, alas,
++     *    the Palm Pre / WebOS (touch) phones.
++     *    
++     * Additionally, Chrome (desktop) used to lie about its support on this,
++     *    but that has since been rectified: http://crbug.com/36415
++     *    
++     * We also test for Firefox 4 Multitouch Support.
++     *
++     * For more info, see: http://modernizr.github.com/Modernizr/touch.html
++     */
++     
++    tests['touch'] = function() {
++
++        return ('ontouchstart' in window) || testMediaQuery('@media ('+prefixes.join('touch-enabled),(')+'modernizr)');
++
++    };
++
++
++    /**
++     * geolocation tests for the new Geolocation API specification.
++     *   This test is a standards compliant-only test; for more complete
++     *   testing, including a Google Gears fallback, please see:
++     *   http://code.google.com/p/geo-location-javascript/
++     * or view a fallback solution using google's geo API:
++     *   http://gist.github.com/366184
++     */
++    tests['geolocation'] = function() {
++        return !!navigator.geolocation;
++    };
++
++    // Per 1.6: 
++    // This used to be Modernizr.crosswindowmessaging but the longer
++    // name has been deprecated in favor of a shorter and property-matching one.
++    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
++    // and in the first release thereafter disappear entirely.
++    tests['postmessage'] = function() {
++      return !!window.postMessage;
++    };
++
++    // Web SQL database detection is tricky:
++
++    // In chrome incognito mode, openDatabase is truthy, but using it will 
++    //   throw an exception: http://crbug.com/42380
++    // We can create a dummy database, but there is no way to delete it afterwards. 
++    
++    // Meanwhile, Safari users can get prompted on any database creation.
++    //   If they do, any page with Modernizr will give them a prompt:
++    //   http://github.com/Modernizr/Modernizr/issues/closed#issue/113
++    
++    // We have chosen to allow the Chrome incognito false positive, so that Modernizr
++    //   doesn't litter the web with these test databases. As a developer, you'll have
++    //   to account for this gotcha yourself.
++    tests['websqldatabase'] = function() {
++      var result = !!window.openDatabase;
++      /*
++      if (result){
++        try {
++          result = !!openDatabase( mod + "testdb", "1.0", mod + "testdb", 2e4);
++        } catch(e) {
++        }
++      }
++      */
++      return result;
++    };
++    
++    // Vendors have inconsistent prefixing with the experimental Indexed DB:
++    // - Firefox is shipping indexedDB in FF4 as moz_indexedDB
++    // - Webkit's implementation is accessible through webkitIndexedDB
++    // We test both styles.
++    tests['indexedDB'] = function(){
++      for (var i = -1, len = domPrefixes.length; ++i < len; ){ 
++        var prefix = domPrefixes[i].toLowerCase();
++        if (window[prefix + '_indexedDB'] || window[prefix + 'IndexedDB']){
++          return true;
++        } 
++      }
++      return false;
++    };
++
++    // documentMode logic from YUI to filter out IE8 Compat Mode
++    //   which false positives.
++    tests['hashchange'] = function() {
++      return isEventSupported('hashchange', window) && ( document.documentMode === undefined || document.documentMode > 7 );
++    };
++
++    // Per 1.6: 
++    // This used to be Modernizr.historymanagement but the longer
++    // name has been deprecated in favor of a shorter and property-matching one.
++    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
++    // and in the first release thereafter disappear entirely.
++    tests['history'] = function() {
++      return !!(window.history && history.pushState);
++    };
++
++    tests['draganddrop'] = function() {
++        return  isEventSupported('drag') && 
++                isEventSupported('dragstart') && 
++                isEventSupported('dragenter') &&
++                isEventSupported('dragover') &&
++                isEventSupported('dragleave') &&
++                isEventSupported('dragend') &&
++                isEventSupported('drop');
++    };
++    
++    tests['websockets'] = function(){
++        return ('WebSocket' in window);
++    };
++    
++    
++    // http://css-tricks.com/rgba-browser-support/
++    tests['rgba'] = function() {
++        // Set an rgba() color and check the returned value
++        
++        set_css(  'background-color:rgba(150,255,150,.5)' );
++        
++        return contains( m_style.backgroundColor, 'rgba' );
++    };
++    
++    tests['hsla'] = function() {
++        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
++        //   except IE9 who retains it as hsla
++        
++        set_css('background-color:hsla(120,40%,100%,.5)' );
++        
++        return contains( m_style.backgroundColor, 'rgba' ) || contains( m_style.backgroundColor, 'hsla' );
++    };
++    
++    tests['multiplebgs'] = function() {
++        // Setting multiple images AND a color on the background shorthand property
++        //  and then querying the style.background property value for the number of
++        //  occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
++        
++        set_css( 'background:url(//:),url(//:),red url(//:)' );
++        
++        // If the UA supports multiple backgrounds, there should be three occurrences
++        //   of the string "url(" in the return value for elem_style.background
++
++        return new RegExp("(url\\s*\\(.*?){3}").test(m_style.background);
++    };
++    
++    
++    // In testing support for a given CSS property, it's legit to test:
++    //    elem.style[styleName] !== undefined
++    // If the property is supported it will return an empty string,
++    // if unsupported it will return undefined.
++    // We'll take advantage of this quick test and skip setting a style 
++    // on our modernizr element, but instead just testing undefined vs
++    // empty string.
++    // The legacy set_css_all calls will remain in the source 
++    // (however, commented) for clarity, yet functionally they are 
++    // no longer needed.
++    
++
++    tests['backgroundsize'] = function() {
++        return test_props_all( 'backgroundSize' );
++    };
++    
++    tests['borderimage'] = function() {
++        //  set_css_all( 'border-image:url(m.png) 1 1 stretch' );
++        return test_props_all( 'borderImage' );
++    };
++    
++    
++    // Super comprehensive table about all the unique implementations of 
++    // border-radius: http://muddledramblings.com/table-of-css3-border-radius-compliance
++    
++    tests['borderradius'] = function() {
++        //  set_css_all( 'border-radius:10px' );
++        return test_props_all( 'borderRadius', '', function( prop ) {
++            return contains( prop, 'orderRadius' );
++        });
++    };
++    
++    
++    tests['boxshadow'] = function() {
++        //  set_css_all( 'box-shadow:#000 1px 1px 3px' );
++        return test_props_all( 'boxShadow' );
++    };
++    
++    // Note: FF3.0 will false positive on this test 
++    tests['textshadow'] = function(){
++        return doc.createElement('div').style.textShadow === '';
++    };
++    
++    
++    tests['opacity'] = function() {
++        // Browsers that actually have CSS Opacity implemented have done so
++        //  according to spec, which means their return values are within the
++        //  range of [0.0,1.0] - including the leading zero.
++        
++        set_css_all( 'opacity:.5' );
++        
++        return contains( m_style.opacity, '0.5' );
++    };
++    
++    
++    tests['cssanimations'] = function() {
++        //  set_css_all( 'animation:"animate" 2s ease 2', 'position:relative' );
++        return test_props_all( 'animationName' );
++    };
++    
++    
++    tests['csscolumns'] = function() {
++        //  set_css_all( 'column-count:3' );
++        return test_props_all( 'columnCount' );
++    };
++    
++    
++    tests['cssgradients'] = function() {
++        /**
++         * For CSS Gradients syntax, please see:
++         * http://webkit.org/blog/175/introducing-css-gradients/
++         * https://developer.mozilla.org/en/CSS/-moz-linear-gradient
++         * https://developer.mozilla.org/en/CSS/-moz-radial-gradient
++         * http://dev.w3.org/csswg/css3-images/#gradients-
++         */
++        
++        var str1 = 'background-image:',
++            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
++            str3 = 'linear-gradient(left top,#9f9, white);';
++        
++        set_css(
++            (str1 + prefixes.join(str2 + str1) + prefixes.join(str3 + str1)).slice(0,-str1.length)
++        );
++        
++        return contains( m_style.backgroundImage, 'gradient' );
++    };
++    
++    
++    tests['cssreflections'] = function() {
++        //  set_css_all( 'box-reflect:right 1px' );
++        return test_props_all( 'boxReflect' );
++    };
++    
++    
++    tests['csstransforms'] = function() {
++        //  set_css_all( 'transform:rotate(3deg)' );
++        return !!test_props([ 'transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform' ]);
++    };
++    
++    
++    tests['csstransforms3d'] = function() {
++        //  set_css_all( 'perspective:500' );
++        
++        var ret = !!test_props([ 'perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective' ]);
++        
++        // Webkit’s 3D transforms are passed off to the browser's own graphics renderer.
++        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome (yet?).
++        //   As a result, Webkit typically recognizes the syntax but will sometimes throw a false
++        //   positive, thus we must do a more thorough check:
++        if (ret){
++          
++          // Webkit allows this media query to succeed only if the feature is enabled.    
++          // "@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d),(modernizr){ ... }"      
++          ret = testMediaQuery('@media ('+prefixes.join('transform-3d),(')+'modernizr)');
++        }
++        return ret;
++    };
++    
++    
++    tests['csstransitions'] = function() {
++        //  set_css_all( 'transition:all .5s linear' );
++        return test_props_all( 'transitionProperty' );
++    };
++
++
++    // @font-face detection routine by Diego Perini
++    // http://javascript.nwbox.com/CSSSupport/
++    tests['fontface'] = function(){
++
++        var 
++        sheet,
++        head = doc.head || doc.getElementsByTagName('head')[0] || docElement,
++        style = doc.createElement("style"),
++        impl = doc.implementation || { hasFeature: function() { return false; } };
++        
++        style.type = 'text/css';
++        head.insertBefore(style, head.firstChild);
++        sheet = style.sheet || style.styleSheet;
++
++        // removing it crashes IE browsers
++        //head.removeChild(style);
++
++        var supportAtRule = impl.hasFeature('CSS2', '') ?
++                function(rule) {
++                    if (!(sheet && rule)) return false;
++                    var result = false;
++                    try {
++                        sheet.insertRule(rule, 0);
++                        result = !(/unknown/i).test(sheet.cssRules[0].cssText);
++                        sheet.deleteRule(sheet.cssRules.length - 1);
++                    } catch(e) { }
++                    return result;
++                } :
++                function(rule) {
++                    if (!(sheet && rule)) return false;
++                    sheet.cssText = rule;
++                    
++                    return sheet.cssText.length !== 0 && !(/unknown/i).test(sheet.cssText) &&
++                      sheet.cssText
++                            .replace(/\r+|\n+/g, '')
++                            .indexOf(rule.split(' ')[0]) === 0;
++                };
++
++
++        // DEPRECATED - allow for a callback
++        ret._fontfaceready = function(fn){
++          fn(ret.fontface);
++        };
++        
++        return supportAtRule('@font-face { font-family: "font"; src: "font.ttf"; }');
++        
++    };
++    
++
++    // These tests evaluate support of the video/audio elements, as well as
++    // testing what types of content they support.
++    //
++    // We're using the Boolean constructor here, so that we can extend the value
++    // e.g.  Modernizr.video     // true
++    //       Modernizr.video.ogg // 'probably'
++    //
++    // Codec values from : http://github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
++    //                     thx to NielsLeenheer and zcorpan
++    
++    // Note: in FF 3.5.1 and 3.5.0, "no" was a return value instead of empty string.
++    //   Modernizr does not normalize for that.
++    
++    tests['video'] = function() {
++        var elem = doc.createElement('video'),
++            bool = !!elem.canPlayType;
++        
++        if (bool){  
++            bool      = new Boolean(bool);  
++            bool.ogg  = elem.canPlayType('video/ogg; codecs="theora"');
++            
++            // Workaround required for IE9, which doesn't report video support without audio codec specified.
++            //   bug 599718 @ msft connect
++            var h264 = 'video/mp4; codecs="avc1.42E01E';
++            bool.h264 = elem.canPlayType(h264 + '"') || elem.canPlayType(h264 + ', mp4a.40.2"');
++            
++            bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"');
++        }
++        return bool;
++    };
++    
++    tests['audio'] = function() {
++        var elem = doc.createElement('audio'),
++            bool = !!elem.canPlayType;
++        
++        if (bool){  
++            bool      = new Boolean(bool);  
++            bool.ogg  = elem.canPlayType('audio/ogg; codecs="vorbis"');
++            bool.mp3  = elem.canPlayType('audio/mpeg;');
++            
++            // Mimetypes accepted: 
++            //   https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
++            //   http://bit.ly/iphoneoscodecs
++            bool.wav  = elem.canPlayType('audio/wav; codecs="1"');
++            bool.m4a  = elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;');
++        }
++        return bool;
++    };
++
++
++    // Both localStorage and sessionStorage are
++    //   tested via the `in` operator because otherwise Firefox will
++    //   throw an error: https://bugzilla.mozilla.org/show_bug.cgi?id=365772
++    //   if cookies are disabled
++    
++    // They require try/catch because of possible firefox configuration:
++    //   http://github.com/Modernizr/Modernizr/issues#issue/92
++    
++    // FWIW miller device resolves to [object Storage] in all supporting browsers
++    //   except for IE who does [object Object]
++    
++    // IE8 Compat mode supports these features completely:
++    //   http://www.quirksmode.org/dom/html5.html
++    
++    tests['localstorage'] = function() {
++        try {
++          return ('localStorage' in window) && window.localStorage !== null;
++        } catch(e) {
++          return false;
++        }
++    };
++
++    tests['sessionstorage'] = function() {
++        try {
++            return ('sessionStorage' in window) && window.sessionStorage !== null;
++        } catch(e){
++            return false;
++        }
++    };
++
++
++    tests['webWorkers'] = function () {
++        return !!window.Worker;
++    };
++
++
++    tests['applicationcache'] =  function() {
++        return !!window.applicationCache;
++    };
++
++ 
++    // Thanks to Erik Dahlstrom
++    tests['svg'] = function(){
++        return !!doc.createElementNS && !!doc.createElementNS(ns.svg, "svg").createSVGRect;
++    };
++
++    tests['inlinesvg'] = function() {
++      var div = document.createElement('div');
++      div.innerHTML = '<svg/>';
++      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
++    };
++
++    // Thanks to F1lt3r and lucideer
++    // http://github.com/Modernizr/Modernizr/issues#issue/35
++    tests['smil'] = function(){
++        return !!doc.createElementNS && /SVG/.test(tostring.call(doc.createElementNS(ns.svg,'animate')));
++    };
++
++    tests['svgclippaths'] = function(){
++        // Possibly returns a false positive in Safari 3.2?
++        return !!doc.createElementNS && /SVG/.test(tostring.call(doc.createElementNS(ns.svg,'clipPath')));
++    };
++
++
++    // input features and input types go directly onto the ret object, bypassing the tests loop.
++    // Hold this guy to execute in a moment.
++    function webforms(){
++    
++        // Run through HTML5's new input attributes to see if the UA understands any.
++        // We're using f which is the <input> element created early on
++        // Mike Taylr has created a comprehensive resource for testing these attributes
++        //   when applied to all input types: 
++        //   http://miketaylr.com/code/input-type-attr.html
++        // spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
++        ret['input'] = (function(props) {
++            for (var i = 0,len=props.length;i<len;i++) {
++                attrs[ props[i] ] = !!(props[i] in f);
++            }
++            return attrs;
++        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
++
++        // Run through HTML5's new input types to see if the UA understands any.
++        //   This is put behind the tests runloop because it doesn't return a
++        //   true/false like all the other tests; instead, it returns an object
++        //   containing each input type with its corresponding true/false value 
++        
++        // Big thanks to @miketaylr for the html5 forms expertise. http://miketaylr.com/
++        ret['inputtypes'] = (function(props) {
++            for (var i = 0, bool, len=props.length ; i < len ; i++) {
++              
++                f.setAttribute('type', props[i]);
++                bool = f.type !== 'text';
++                
++                // Chrome likes to falsely purport support, so we feed it a textual value;
++                // if that doesnt succeed then we know there's a custom UI
++                if (bool){  
++
++                    f.value = smile;
++     
++                    if (/^range$/.test(f.type) && f.style.WebkitAppearance !== undefined){
++                      
++                      docElement.appendChild(f);
++                      var defaultView = doc.defaultView;
++                      
++                      // Safari 2-4 allows the smiley as a value, despite making a slider
++                      bool =  defaultView.getComputedStyle && 
++                              defaultView.getComputedStyle(f, null).WebkitAppearance !== 'textfield' && 
++                      
++                              // Mobile android web browser has false positive, so must
++                              // check the height to see if the widget is actually there.
++                              (f.offsetHeight !== 0);
++                              
++                      docElement.removeChild(f);
++                              
++                    } else if (/^(search|tel)$/.test(f.type)){
++                      // Spec doesnt define any special parsing or detectable UI 
++                      //   behaviors so we pass these through as true
++                      
++                      // Interestingly, opera fails the earlier test, so it doesn't
++                      //  even make it here.
++                      
++                    } else if (/^(url|email)$/.test(f.type)) {
++
++                      // Real url and email support comes with prebaked validation.
++                      bool = f.checkValidity && f.checkValidity() === false;
++                      
++                    } else {
++                      // If the upgraded input compontent rejects the :) text, we got a winner
++                      bool = f.value != smile;
++                    }
++                }
++                
++                inputs[ props[i] ] = !!bool;
++            }
++            return inputs;
++        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
++
++    }
++
++
++
++    // End of test definitions
++
++
++
++    // Run through all tests and detect their support in the current UA.
++    // todo: hypothetically we could be doing an array of tests and use a basic loop here.
++    for ( var feature in tests ) {
++        if ( hasOwnProperty( tests, feature ) ) {
++            // run the test, throw the return value into the Modernizr,
++            //   then based on that boolean, define an appropriate className
++            //   and push it into an array of classes we'll join later.
++            featurename  = feature.toLowerCase();
++            ret[ featurename ] = tests[ feature ]();
++
++            classes.push( ( ret[ featurename ] ? '' : 'no-' ) + featurename );
++        }
++    }
++    
++    // input tests need to run.
++    if (!ret.input) webforms();
++    
++
++   
++    // Per 1.6: deprecated API is still accesible for now:
++    ret.crosswindowmessaging = ret.postmessage;
++    ret.historymanagement = ret.history;
++
++
++
++    /**
++     * Addtest allows the user to define their own feature tests
++     * the result will be added onto the Modernizr object,
++     * as well as an appropriate className set on the html element
++     * 
++     * @param feature - String naming the feature
++     * @param test - Function returning true if feature is supported, false if not
++     */
++    ret.addTest = function (feature, test) {
++      feature = feature.toLowerCase();
++      
++      if (ret[ feature ]) {
++        return; // quit if you're trying to overwrite an existing test
++      } 
++      test = !!(test());
++      docElement.className += ' ' + (test ? '' : 'no-') + feature; 
++      ret[ feature ] = test;
++      return ret; // allow chaining.
++    };
++
++    /**
++     * Reset m.style.cssText to nothing to reduce memory footprint.
++     */
++    set_css( '' );
++    m = f = null;
++
++    // Enable HTML 5 elements for styling in IE. 
++    // fyi: jscript version does not reflect trident version
++    //      therefore ie9 in ie7 mode will still have a jScript v.9
++    if ( enableHTML5 && window.attachEvent && (function(){ var elem = doc.createElement("div");
++                                      elem.innerHTML = "<elem></elem>";
++                                      return elem.childNodes.length !== 1; })()) {
++        // iepp v1.6 by @jon_neal : code.google.com/p/ie-print-protector
++        (function(f,l){var j="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",n=j.split("|"),k=n.length,g=new RegExp("<(/*)("+j+")","gi"),h=new RegExp("\\b("+j+")\\b(?!.*[;}])","gi"),m=l.createDocumentFragment(),d=l.documentElement,i=d.firstChild,b=l.createElement("style"),e=l.createElement("body");b.media="all";function c(p){var o=-1;while(++o<k){p.createElement(n[o])}}c(l);c(m);function a(t,s){var r=t.length,q=-1,o,p=[];while(++q<r){o=t[q];s=o.media||s;p.push(a(o.imports,s));p.push(o.cssText)}return p.join("")}f.attachEvent("onbeforeprint",function(){var r=-1;while(++r<k){var o=l.getElementsByTagName(n[r]),q=o.length,p=-1;while(++p<q){if(o[p].className.indexOf("iepp_")<0){o[p].className+=" iepp_"+n[r]}}}i.insertBefore(b,i.firstChild);b.styleSheet.cssText=a(l.styleSheets,"all").replace(h,".iepp_$1");m.appendChild(l.body);d.appendChild(e);e.innerHTML=m.firstChild.innerHTML.replace(g,"<$1bdo")});f.attachEvent("onafterprint",function(){e.innerHTML="";d.removeChild(e);i.removeChild(b);d.appendChild(m.firstChild)})})(this,document);
++    }
++
++    // Assign private properties to the return object with prefix
++    ret._enableHTML5     = enableHTML5;
++    ret._version         = version;
++
++    // Remove "no-js" class from <html> element, if it exists:
++    docElement.className=docElement.className.replace(/\bno-js\b/,'') + ' js';
++
++    // Add the new classes to the <html> element.
++    docElement.className += ' ' + classes.join( ' ' );
++    
++    return ret;
++
++})(this,this.document);
+diff --git a/docs/public/js/profiling/yahoo-profiling.js b/docs/public/js/profiling/yahoo-profiling.js
+new file mode 100644
+index 0000000..468f834
+--- /dev/null
++++ b/docs/public/js/profiling/yahoo-profiling.js
+@@ -0,0 +1,1028 @@
++/*
++Copyright (c) 2009, Yahoo! Inc. All rights reserved.
++Code licensed under the BSD License:
++http://developer.yahoo.net/yui/license.txt
++version: 2.7.0
++*/
++/**
++ * The YAHOO object is the single global object used by YUI Library.  It
++ * contains utility function for setting up namespaces, inheritance, and
++ * logging.  YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces
++ * created automatically for and used by the library.
++ * @module yahoo
++ * @title  YAHOO Global
++ */
++
++/**
++ * YAHOO_config is not included as part of the library.  Instead it is an 
++ * object that can be defined by the implementer immediately before 
++ * including the YUI library.  The properties included in this object
++ * will be used to configure global properties needed as soon as the 
++ * library begins to load.
++ * @class YAHOO_config
++ * @static
++ */
++
++/**
++ * A reference to a function that will be executed every time a YAHOO module
++ * is loaded.  As parameter, this function will receive the version
++ * information for the module. See <a href="YAHOO.env.html#getVersion">
++ * YAHOO.env.getVersion</a> for the description of the version data structure.
++ * @property listener
++ * @type Function
++ * @static
++ * @default undefined
++ */
++
++/**
++ * Set to true if the library will be dynamically loaded after window.onload.
++ * Defaults to false 
++ * @property injecting
++ * @type boolean
++ * @static
++ * @default undefined
++ */
++
++/**
++ * Instructs the yuiloader component to dynamically load yui components and
++ * their dependencies.  See the yuiloader documentation for more information
++ * about dynamic loading
++ * @property load
++ * @static
++ * @default undefined
++ * @see yuiloader
++ */
++
++/**
++ * Forces the use of the supplied locale where applicable in the library
++ * @property locale
++ * @type string
++ * @static
++ * @default undefined
++ */
++
++if (typeof YAHOO == "undefined" || !YAHOO) {
++    /**
++     * The YAHOO global namespace object.  If YAHOO is already defined, the
++     * existing YAHOO object will not be overwritten so that defined
++     * namespaces are preserved.
++     * @class YAHOO
++     * @static
++     */
++    var YAHOO = {};
++}
++
++/**
++ * Returns the namespace specified and creates it if it doesn't exist
++ * <pre>
++ * YAHOO.namespace("property.package");
++ * YAHOO.namespace("YAHOO.property.package");
++ * </pre>
++ * Either of the above would create YAHOO.property, then
++ * YAHOO.property.package
++ *
++ * Be careful when naming packages. Reserved words may work in some browsers
++ * and not others. For instance, the following will fail in Safari:
++ * <pre>
++ * YAHOO.namespace("really.long.nested.namespace");
++ * </pre>
++ * This fails because "long" is a future reserved word in ECMAScript
++ *
++ * For implementation code that uses YUI, do not create your components
++ * in the namespaces created by the library.  defined by YUI -- create 
++ * your own (YAHOO.util, YAHOO.widget, YAHOO.lang, YAHOO.env)
++ *
++ * @method namespace
++ * @static
++ * @param  {String*} arguments 1-n namespaces to create 
++ * @return {Object}  A reference to the last namespace object created
++ */
++YAHOO.namespace = function() {
++    var a=arguments, o=null, i, j, d;
++    for (i=0; i<a.length; i=i+1) {
++        d=(""+a[i]).split(".");
++        o=YAHOO;
++
++        // YAHOO is implied, so it is ignored if it is included
++        for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; j=j+1) {
++            o[d[j]]=o[d[j]] || {};
++            o=o[d[j]];
++        }
++    }
++
++    return o;
++};
++
++/**
++ * Uses YAHOO.widget.Logger to output a log message, if the widget is
++ * available.
++ *
++ * @method log
++ * @static
++ * @param  {String}  msg  The message to log.
++ * @param  {String}  cat  The log category for the message.  Default
++ *                        categories are "info", "warn", "error", time".
++ *                        Custom categories can be used as well. (opt)
++ * @param  {String}  src  The source of the the message (opt)
++ * @return {Boolean}      True if the log operation was successful.
++ */
++YAHOO.log = function(msg, cat, src) {
++    var l=YAHOO.widget.Logger;
++    if(l && l.log) {
++        return l.log(msg, cat, src);
++    } else {
++        return false;
++    }
++};
++
++/**
++ * Registers a module with the YAHOO object
++ * @method register
++ * @static
++ * @param {String}   name    the name of the module (event, slider, etc)
++ * @param {Function} mainClass a reference to class in the module.  This
++ *                             class will be tagged with the version info
++ *                             so that it will be possible to identify the
++ *                             version that is in use when multiple versions
++ *                             have loaded
++ * @param {Object}   data      metadata object for the module.  Currently it
++ *                             is expected to contain a "version" property
++ *                             and a "build" property at minimum.
++ */
++YAHOO.register = function(name, mainClass, data) {
++    var mods = YAHOO.env.modules, m, v, b, ls, i;
++
++    if (!mods[name]) {
++        mods[name] = { 
++            versions:[], 
++            builds:[] 
++        };
++    }
++
++    m  = mods[name];
++    v  = data.version;
++    b  = data.build;
++    ls = YAHOO.env.listeners;
++
++    m.name = name;
++    m.version = v;
++    m.build = b;
++    m.versions.push(v);
++    m.builds.push(b);
++    m.mainClass = mainClass;
++
++    // fire the module load listeners
++    for (i=0;i<ls.length;i=i+1) {
++        ls[i](m);
++    }
++    // label the main class
++    if (mainClass) {
++        mainClass.VERSION = v;
++        mainClass.BUILD = b;
++    } else {
++        YAHOO.log("mainClass is undefined for module " + name, "warn");
++    }
++};
++
++/**
++ * YAHOO.env is used to keep track of what is known about the YUI library and
++ * the browsing environment
++ * @class YAHOO.env
++ * @static
++ */
++YAHOO.env = YAHOO.env || {
++
++    /**
++     * Keeps the version info for all YUI modules that have reported themselves
++     * @property modules
++     * @type Object[]
++     */
++    modules: [],
++    
++    /**
++     * List of functions that should be executed every time a YUI module
++     * reports itself.
++     * @property listeners
++     * @type Function[]
++     */
++    listeners: []
++};
++
++/**
++ * Returns the version data for the specified module:
++ *      <dl>
++ *      <dt>name:</dt>      <dd>The name of the module</dd>
++ *      <dt>version:</dt>   <dd>The version in use</dd>
++ *      <dt>build:</dt>     <dd>The build number in use</dd>
++ *      <dt>versions:</dt>  <dd>All versions that were registered</dd>
++ *      <dt>builds:</dt>    <dd>All builds that were registered.</dd>
++ *      <dt>mainClass:</dt> <dd>An object that was was stamped with the
++ *                 current version and build. If 
++ *                 mainClass.VERSION != version or mainClass.BUILD != build,
++ *                 multiple versions of pieces of the library have been
++ *                 loaded, potentially causing issues.</dd>
++ *       </dl>
++ *
++ * @method getVersion
++ * @static
++ * @param {String}  name the name of the module (event, slider, etc)
++ * @return {Object} The version info
++ */
++YAHOO.env.getVersion = function(name) {
++    return YAHOO.env.modules[name] || null;
++};
++
++/**
++ * Do not fork for a browser if it can be avoided.  Use feature detection when
++ * you can.  Use the user agent as a last resort.  YAHOO.env.ua stores a version
++ * number for the browser engine, 0 otherwise.  This value may or may not map
++ * to the version number of the browser using the engine.  The value is 
++ * presented as a float so that it can easily be used for boolean evaluation 
++ * as well as for looking for a particular range of versions.  Because of this, 
++ * some of the granularity of the version info may be lost (e.g., Gecko 1.8.0.9 
++ * reports 1.8).
++ * @class YAHOO.env.ua
++ * @static
++ */
++YAHOO.env.ua = function() {
++    var o={
++
++        /**
++         * Internet Explorer version number or 0.  Example: 6
++         * @property ie
++         * @type float
++         */
++        ie:0,
++
++        /**
++         * Opera version number or 0.  Example: 9.2
++         * @property opera
++         * @type float
++         */
++        opera:0,
++
++        /**
++         * Gecko engine revision number.  Will evaluate to 1 if Gecko 
++         * is detected but the revision could not be found. Other browsers
++         * will be 0.  Example: 1.8
++         * <pre>
++         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
++         * Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8
++         * Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8
++         * Firefox 3 alpha: 1.9a4   <-- Reports 1.9
++         * </pre>
++         * @property gecko
++         * @type float
++         */
++        gecko:0,
++
++        /**
++         * AppleWebKit version.  KHTML browsers that are not WebKit browsers 
++         * will evaluate to 1, other browsers 0.  Example: 418.9.1
++         * <pre>
++         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the 
++         *                                   latest available for Mac OSX 10.3.
++         * Safari 2.0.2:         416     <-- hasOwnProperty introduced
++         * Safari 2.0.4:         418     <-- preventDefault fixed
++         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
++         *                                   different versions of webkit
++         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
++         *                                   updated, but not updated
++         *                                   to the latest patch.
++         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native SVG
++         *                                   and many major issues fixed).  
++         * 3.x yahoo.com, flickr:422     <-- Safari 3.x hacks the user agent
++         *                                   string when hitting yahoo.com and 
++         *                                   flickr.com.
++         * Safari 3.0.4 (523.12):523.12  <-- First Tiger release - automatic update
++         *                                   from 2.x via the 10.4.11 OS patch
++         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
++         *                                   yahoo.com user agent hack removed.
++         *                                   
++         * </pre>
++         * http://developer.apple.com/internet/safari/uamatrix.html
++         * @property webkit
++         * @type float
++         */
++        webkit: 0,
++
++        /**
++         * The mobile property will be set to a string containing any relevant
++         * user agent information when a modern mobile browser is detected.
++         * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
++         * devices with the WebKit-based browser, and Opera Mini.  
++         * @property mobile 
++         * @type string
++         */
++        mobile: null,
++
++        /**
++         * Adobe AIR version number or 0.  Only populated if webkit is detected.
++         * Example: 1.0
++         * @property air
++         * @type float
++         */
++        air: 0,
++
++        /**
++         * Google Caja version number or 0.
++         * @property caja
++         * @type float
++         */
++        caja: 0
++
++    },
++
++    ua = navigator.userAgent, 
++    
++    m;
++
++    // Modern KHTML browsers should qualify as Safari X-Grade
++    if ((/KHTML/).test(ua)) {
++        o.webkit=1;
++    }
++    // Modern WebKit browsers are at least X-Grade
++    m=ua.match(/AppleWebKit\/([^\s]*)/);
++    if (m&&m[1]) {
++        o.webkit=parseFloat(m[1]);
++
++        // Mobile browser check
++        if (/ Mobile\//.test(ua)) {
++            o.mobile = "Apple"; // iPhone or iPod Touch
++        } else {
++            m=ua.match(/NokiaN[^\/]*/);
++            if (m) {
++                o.mobile = m[0]; // Nokia N-series, ex: NokiaN95
++            }
++        }
++
++        m=ua.match(/AdobeAIR\/([^\s]*)/);
++        if (m) {
++            o.air = m[0]; // Adobe AIR 1.0 or better
++        }
++
++    }
++
++    if (!o.webkit) { // not webkit
++        // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
++        m=ua.match(/Opera[\s\/]([^\s]*)/);
++        if (m&&m[1]) {
++            o.opera=parseFloat(m[1]);
++            m=ua.match(/Opera Mini[^;]*/);
++            if (m) {
++                o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
++            }
++        } else { // not opera or webkit
++            m=ua.match(/MSIE\s([^;]*)/);
++            if (m&&m[1]) {
++                o.ie=parseFloat(m[1]);
++            } else { // not opera, webkit, or ie
++                m=ua.match(/Gecko\/([^\s]*)/);
++                if (m) {
++                    o.gecko=1; // Gecko detected, look for revision
++                    m=ua.match(/rv:([^\s\)]*)/);
++                    if (m&&m[1]) {
++                        o.gecko=parseFloat(m[1]);
++                    }
++                }
++            }
++        }
++    }
++
++    m=ua.match(/Caja\/([^\s]*)/);
++    if (m&&m[1]) {
++        o.caja=parseFloat(m[1]);
++    }
++    
++    return o;
++}();
++
++/*
++ * Initializes the global by creating the default namespaces and applying
++ * any new configuration information that is detected.  This is the setup
++ * for env.
++ * @method init
++ * @static
++ * @private
++ */
++(function() {
++    YAHOO.namespace("util", "widget", "example");
++    /*global YAHOO_config*/
++    if ("undefined" !== typeof YAHOO_config) {
++        var l=YAHOO_config.listener,ls=YAHOO.env.listeners,unique=true,i;
++        if (l) {
++            // if YAHOO is loaded multiple times we need to check to see if
++            // this is a new config object.  If it is, add the new component
++            // load listener to the stack
++            for (i=0;i<ls.length;i=i+1) {
++                if (ls[i]==l) {
++                    unique=false;
++                    break;
++                }
++            }
++            if (unique) {
++                ls.push(l);
++            }
++        }
++    }
++})();
++/**
++ * Provides the language utilites and extensions used by the library
++ * @class YAHOO.lang
++ */
++YAHOO.lang = YAHOO.lang || {};
++
++(function() {
++
++
++var L = YAHOO.lang,
++
++    ARRAY_TOSTRING = '[object Array]',
++    FUNCTION_TOSTRING = '[object Function]',
++    OP = Object.prototype,
++
++    // ADD = ["toString", "valueOf", "hasOwnProperty"],
++    ADD = ["toString", "valueOf"],
++
++    OB = {
++
++    /**
++     * Determines wheather or not the provided object is an array.
++     * @method isArray
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isArray: function(o) { 
++        return OP.toString.apply(o) === ARRAY_TOSTRING;
++    },
++
++    /**
++     * Determines whether or not the provided object is a boolean
++     * @method isBoolean
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isBoolean: function(o) {
++        return typeof o === 'boolean';
++    },
++    
++    /**
++     * Determines whether or not the provided object is a function.
++     * Note: Internet Explorer thinks certain functions are objects:
++     *
++     * var obj = document.createElement("object");
++     * YAHOO.lang.isFunction(obj.getAttribute) // reports false in IE
++     *
++     * var input = document.createElement("input"); // append to body
++     * YAHOO.lang.isFunction(input.focus) // reports false in IE
++     *
++     * You will have to implement additional tests if these functions
++     * matter to you.
++     *
++     * @method isFunction
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isFunction: function(o) {
++        return OP.toString.apply(o) === FUNCTION_TOSTRING;
++    },
++        
++    /**
++     * Determines whether or not the provided object is null
++     * @method isNull
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isNull: function(o) {
++        return o === null;
++    },
++        
++    /**
++     * Determines whether or not the provided object is a legal number
++     * @method isNumber
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isNumber: function(o) {
++        return typeof o === 'number' && isFinite(o);
++    },
++      
++    /**
++     * Determines whether or not the provided object is of type object
++     * or function
++     * @method isObject
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */  
++    isObject: function(o) {
++return (o && (typeof o === 'object' || L.isFunction(o))) || false;
++    },
++        
++    /**
++     * Determines whether or not the provided object is a string
++     * @method isString
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isString: function(o) {
++        return typeof o === 'string';
++    },
++        
++    /**
++     * Determines whether or not the provided object is undefined
++     * @method isUndefined
++     * @param {any} o The object being testing
++     * @return {boolean} the result
++     */
++    isUndefined: function(o) {
++        return typeof o === 'undefined';
++    },
++    
++ 
++    /**
++     * IE will not enumerate native functions in a derived object even if the
++     * function was overridden.  This is a workaround for specific functions 
++     * we care about on the Object prototype. 
++     * @property _IEEnumFix
++     * @param {Function} r  the object to receive the augmentation
++     * @param {Function} s  the object that supplies the properties to augment
++     * @static
++     * @private
++     */
++    _IEEnumFix: (YAHOO.env.ua.ie) ? function(r, s) {
++            var i, fname, f;
++            for (i=0;i<ADD.length;i=i+1) {
++
++                fname = ADD[i];
++                f = s[fname];
++
++                if (L.isFunction(f) && f!=OP[fname]) {
++                    r[fname]=f;
++                }
++            }
++    } : function(){},
++       
++    /**
++     * Utility to set up the prototype, constructor and superclass properties to
++     * support an inheritance strategy that can chain constructors and methods.
++     * Static members will not be inherited.
++     *
++     * @method extend
++     * @static
++     * @param {Function} subc   the object to modify
++     * @param {Function} superc the object to inherit
++     * @param {Object} overrides  additional properties/methods to add to the
++     *                              subclass prototype.  These will override the
++     *                              matching items obtained from the superclass 
++     *                              if present.
++     */
++    extend: function(subc, superc, overrides) {
++        if (!superc||!subc) {
++            throw new Error("extend failed, please check that " +
++                            "all dependencies are included.");
++        }
++        var F = function() {}, i;
++        F.prototype=superc.prototype;
++        subc.prototype=new F();
++        subc.prototype.constructor=subc;
++        subc.superclass=superc.prototype;
++        if (superc.prototype.constructor == OP.constructor) {
++            superc.prototype.constructor=superc;
++        }
++    
++        if (overrides) {
++            for (i in overrides) {
++                if (L.hasOwnProperty(overrides, i)) {
++                    subc.prototype[i]=overrides[i];
++                }
++            }
++
++            L._IEEnumFix(subc.prototype, overrides);
++        }
++    },
++   
++    /**
++     * Applies all properties in the supplier to the receiver if the
++     * receiver does not have these properties yet.  Optionally, one or 
++     * more methods/properties can be specified (as additional 
++     * parameters).  This option will overwrite the property if receiver 
++     * has it already.  If true is passed as the third parameter, all 
++     * properties will be applied and _will_ overwrite properties in 
++     * the receiver.
++     *
++     * @method augmentObject
++     * @static
++     * @since 2.3.0
++     * @param {Function} r  the object to receive the augmentation
++     * @param {Function} s  the object that supplies the properties to augment
++     * @param {String*|boolean}  arguments zero or more properties methods 
++     *        to augment the receiver with.  If none specified, everything
++     *        in the supplier will be used unless it would
++     *        overwrite an existing property in the receiver. If true
++     *        is specified as the third parameter, all properties will
++     *        be applied and will overwrite an existing property in
++     *        the receiver
++     */
++    augmentObject: function(r, s) {
++        if (!s||!r) {
++            throw new Error("Absorb failed, verify dependencies.");
++        }
++        var a=arguments, i, p, overrideList=a[2];
++        if (overrideList && overrideList!==true) { // only absorb the specified properties
++            for (i=2; i<a.length; i=i+1) {
++                r[a[i]] = s[a[i]];
++            }
++        } else { // take everything, overwriting only if the third parameter is true
++            for (p in s) { 
++                if (overrideList || !(p in r)) {
++                    r[p] = s[p];
++                }
++            }
++            
++            L._IEEnumFix(r, s);
++        }
++    },
++ 
++    /**
++     * Same as YAHOO.lang.augmentObject, except it only applies prototype properties
++     * @see YAHOO.lang.augmentObject
++     * @method augmentProto
++     * @static
++     * @param {Function} r  the object to receive the augmentation
++     * @param {Function} s  the object that supplies the properties to augment
++     * @param {String*|boolean}  arguments zero or more properties methods 
++     *        to augment the receiver with.  If none specified, everything 
++     *        in the supplier will be used unless it would overwrite an existing 
++     *        property in the receiver.  if true is specified as the third 
++     *        parameter, all properties will be applied and will overwrite an 
++     *        existing property in the receiver
++     */
++    augmentProto: function(r, s) {
++        if (!s||!r) {
++            throw new Error("Augment failed, verify dependencies.");
++        }
++        //var a=[].concat(arguments);
++        var a=[r.prototype,s.prototype], i;
++        for (i=2;i<arguments.length;i=i+1) {
++            a.push(arguments[i]);
++        }
++        L.augmentObject.apply(this, a);
++    },
++
++      
++    /**
++     * Returns a simple string representation of the object or array.
++     * Other types of objects will be returned unprocessed.  Arrays
++     * are expected to be indexed.  Use object notation for
++     * associative arrays.
++     * @method dump
++     * @since 2.3.0
++     * @param o {Object} The object to dump
++     * @param d {int} How deep to recurse child objects, default 3
++     * @return {String} the dump result
++     */
++    dump: function(o, d) {
++        var i,len,s=[],OBJ="{...}",FUN="f(){...}",
++            COMMA=', ', ARROW=' => ';
++
++        // Cast non-objects to string
++        // Skip dates because the std toString is what we want
++        // Skip HTMLElement-like objects because trying to dump 
++        // an element will cause an unhandled exception in FF 2.x
++        if (!L.isObject(o)) {
++            return o + "";
++        } else if (o instanceof Date || ("nodeType" in o && "tagName" in o)) {
++            return o;
++        } else if  (L.isFunction(o)) {
++            return FUN;
++        }
++
++        // dig into child objects the depth specifed. Default 3
++        d = (L.isNumber(d)) ? d : 3;
++
++        // arrays [1, 2, 3]
++        if (L.isArray(o)) {
++            s.push("[");
++            for (i=0,len=o.length;i<len;i=i+1) {
++                if (L.isObject(o[i])) {
++                    s.push((d > 0) ? L.dump(o[i], d-1) : OBJ);
++                } else {
++                    s.push(o[i]);
++                }
++                s.push(COMMA);
++            }
++            if (s.length > 1) {
++                s.pop();
++            }
++            s.push("]");
++        // objects {k1 => v1, k2 => v2}
++        } else {
++            s.push("{");
++            for (i in o) {
++                if (L.hasOwnProperty(o, i)) {
++                    s.push(i + ARROW);
++                    if (L.isObject(o[i])) {
++                        s.push((d > 0) ? L.dump(o[i], d-1) : OBJ);
++                    } else {
++                        s.push(o[i]);
++                    }
++                    s.push(COMMA);
++                }
++            }
++            if (s.length > 1) {
++                s.pop();
++            }
++            s.push("}");
++        }
++
++        return s.join("");
++    },
++
++    /**
++     * Does variable substitution on a string. It scans through the string 
++     * looking for expressions enclosed in { } braces. If an expression 
++     * is found, it is used a key on the object.  If there is a space in
++     * the key, the first word is used for the key and the rest is provided
++     * to an optional function to be used to programatically determine the
++     * value (the extra information might be used for this decision). If 
++     * the value for the key in the object, or what is returned from the
++     * function has a string value, number value, or object value, it is 
++     * substituted for the bracket expression and it repeats.  If this
++     * value is an object, it uses the Object's toString() if this has
++     * been overridden, otherwise it does a shallow dump of the key/value
++     * pairs.
++     * @method substitute
++     * @since 2.3.0
++     * @param s {String} The string that will be modified.
++     * @param o {Object} An object containing the replacement values
++     * @param f {Function} An optional function that can be used to
++     *                     process each match.  It receives the key,
++     *                     value, and any extra metadata included with
++     *                     the key inside of the braces.
++     * @return {String} the substituted string
++     */
++    substitute: function (s, o, f) {
++        var i, j, k, key, v, meta, saved=[], token, 
++            DUMP='dump', SPACE=' ', LBRACE='{', RBRACE='}',
++            dump;
++
++
++        for (;;) {
++            i = s.lastIndexOf(LBRACE);
++            if (i < 0) {
++                break;
++            }
++            j = s.indexOf(RBRACE, i);
++            if (i + 1 >= j) {
++                break;
++            }
++
++            //Extract key and meta info 
++            token = s.substring(i + 1, j);
++            key = token;
++            meta = null;
++            k = key.indexOf(SPACE);
++            if (k > -1) {
++                meta = key.substring(k + 1);
++                key = key.substring(0, k);
++            }
++
++            // lookup the value
++            v = o[key];
++
++            // if a substitution function was provided, execute it
++            if (f) {
++                v = f(key, v, meta);
++            }
++
++            if (L.isObject(v)) {
++                if (L.isArray(v)) {
++                    v = L.dump(v, parseInt(meta, 10));
++                } else {
++                    meta = meta || "";
++
++                    // look for the keyword 'dump', if found force obj dump
++                    dump = meta.indexOf(DUMP);
++                    if (dump > -1) {
++                        meta = meta.substring(4);
++                    }
++
++                    // use the toString if it is not the Object toString 
++                    // and the 'dump' meta info was not found
++                    if (v.toString===OP.toString || dump>-1) {
++                        v = L.dump(v, parseInt(meta, 10));
++                    } else {
++                        v = v.toString();
++                    }
++                }
++            } else if (!L.isString(v) && !L.isNumber(v)) {
++                // This {block} has no replace string. Save it for later.
++                v = "~-" + saved.length + "-~";
++                saved[saved.length] = token;
++
++                // break;
++            }
++
++            s = s.substring(0, i) + v + s.substring(j + 1);
++
++
++        }
++
++        // restore saved {block}s
++        for (i=saved.length-1; i>=0; i=i-1) {
++            s = s.replace(new RegExp("~-" + i + "-~"), "{"  + saved[i] + "}", "g");
++        }
++
++        return s;
++    },
++
++
++    /**
++     * Returns a string without any leading or trailing whitespace.  If 
++     * the input is not a string, the input will be returned untouched.
++     * @method trim
++     * @since 2.3.0
++     * @param s {string} the string to trim
++     * @return {string} the trimmed string
++     */
++    trim: function(s){
++        try {
++            return s.replace(/^\s+|\s+$/g, "");
++        } catch(e) {
++            return s;
++        }
++    },
++
++    /**
++     * Returns a new object containing all of the properties of
++     * all the supplied objects.  The properties from later objects
++     * will overwrite those in earlier objects.
++     * @method merge
++     * @since 2.3.0
++     * @param arguments {Object*} the objects to merge
++     * @return the new merged object
++     */
++    merge: function() {
++        var o={}, a=arguments, l=a.length, i;
++        for (i=0; i<l; i=i+1) {
++            L.augmentObject(o, a[i], true);
++        }
++        return o;
++    },
++
++    /**
++     * Executes the supplied function in the context of the supplied 
++     * object 'when' milliseconds later.  Executes the function a 
++     * single time unless periodic is set to true.
++     * @method later
++     * @since 2.4.0
++     * @param when {int} the number of milliseconds to wait until the fn 
++     * is executed
++     * @param o the context object
++     * @param fn {Function|String} the function to execute or the name of 
++     * the method in the 'o' object to execute
++     * @param data [Array] data that is provided to the function.  This accepts
++     * either a single item or an array.  If an array is provided, the
++     * function is executed with one parameter for each array item.  If
++     * you need to pass a single array parameter, it needs to be wrapped in
++     * an array [myarray]
++     * @param periodic {boolean} if true, executes continuously at supplied 
++     * interval until canceled
++     * @return a timer object. Call the cancel() method on this object to 
++     * stop the timer.
++     */
++    later: function(when, o, fn, data, periodic) {
++        when = when || 0; 
++        o = o || {};
++        var m=fn, d=data, f, r;
++
++        if (L.isString(fn)) {
++            m = o[fn];
++        }
++
++        if (!m) {
++            throw new TypeError("method undefined");
++        }
++
++        if (!L.isArray(d)) {
++            d = [data];
++        }
++
++        f = function() {
++            m.apply(o, d);
++        };
++
++        r = (periodic) ? setInterval(f, when) : setTimeout(f, when);
++
++        return {
++            interval: periodic,
++            cancel: function() {
++                if (this.interval) {
++                    clearInterval(r);
++                } else {
++                    clearTimeout(r);
++                }
++            }
++        };
++    },
++    
++    /**
++     * A convenience method for detecting a legitimate non-null value.
++     * Returns false for null/undefined/NaN, true for other values, 
++     * including 0/false/''
++     * @method isValue
++     * @since 2.3.0
++     * @param o {any} the item to test
++     * @return {boolean} true if it is not null/undefined/NaN || false
++     */
++    isValue: function(o) {
++        // return (o || o === false || o === 0 || o === ''); // Infinity fails
++return (L.isObject(o) || L.isString(o) || L.isNumber(o) || L.isBoolean(o));
++    }
++
++};
++
++/**
++ * Determines whether or not the property was added
++ * to the object instance.  Returns false if the property is not present
++ * in the object, or was inherited from the prototype.
++ * This abstraction is provided to enable hasOwnProperty for Safari 1.3.x.
++ * There is a discrepancy between YAHOO.lang.hasOwnProperty and
++ * Object.prototype.hasOwnProperty when the property is a primitive added to
++ * both the instance AND prototype with the same value:
++ * <pre>
++ * var A = function() {};
++ * A.prototype.foo = 'foo';
++ * var a = new A();
++ * a.foo = 'foo';
++ * alert(a.hasOwnProperty('foo')); // true
++ * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using fallback
++ * </pre>
++ * @method hasOwnProperty
++ * @param {any} o The object being testing
++ * @param prop {string} the name of the property to test
++ * @return {boolean} the result
++ */
++L.hasOwnProperty = (OP.hasOwnProperty) ?
++    function(o, prop) {
++        return o && o.hasOwnProperty(prop);
++    } : function(o, prop) {
++        return !L.isUndefined(o[prop]) && 
++                o.constructor.prototype[prop] !== o[prop];
++    };
++
++// new lang wins
++OB.augmentObject(L, OB, true);
++
++/*
++ * An alias for <a href="YAHOO.lang.html">YAHOO.lang</a>
++ * @class YAHOO.util.Lang
++ */
++YAHOO.util.Lang = L;
++ 
++/**
++ * Same as YAHOO.lang.augmentObject, except it only applies prototype 
++ * properties.  This is an alias for augmentProto.
++ * @see YAHOO.lang.augmentObject
++ * @method augment
++ * @static
++ * @param {Function} r  the object to receive the augmentation
++ * @param {Function} s  the object that supplies the properties to augment
++ * @param {String*|boolean}  arguments zero or more properties methods to 
++ *        augment the receiver with.  If none specified, everything
++ *        in the supplier will be used unless it would
++ *        overwrite an existing property in the receiver.  if true
++ *        is specified as the third parameter, all properties will
++ *        be applied and will overwrite an existing property in
++ *        the receiver
++ */
++L.augment = L.augmentProto;
++
++/**
++ * An alias for <a href="YAHOO.lang.html#augment">YAHOO.lang.augment</a>
++ * @for YAHOO
++ * @method augment
++ * @static
++ * @param {Function} r  the object to receive the augmentation
++ * @param {Function} s  the object that supplies the properties to augment
++ * @param {String*}  arguments zero or more properties methods to 
++ *        augment the receiver with.  If none specified, everything
++ *        in the supplier will be used unless it would
++ *        overwrite an existing property in the receiver
++ */
++YAHOO.augment = L.augmentProto;
++       
++/**
++ * An alias for <a href="YAHOO.lang.html#extend">YAHOO.lang.extend</a>
++ * @method extend
++ * @static
++ * @param {Function} subc   the object to modify
++ * @param {Function} superc the object to inherit
++ * @param {Object} overrides  additional properties/methods to add to the
++ *        subclass prototype.  These will override the
++ *        matching items obtained from the superclass if present.
++ */
++YAHOO.extend = L.extend;
++
++})();
++YAHOO.register("yahoo", YAHOO, {version: "2.7.0", build: "1796"});
+-- 
+1.7.10
+
diff --git a/debian/patches/series b/debian/patches/series
index 779be31..e6d4ef9 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,4 @@
 add_missing_requires.patch
 fog_import.patch
+0001-Rename-dd_belatedpng.js-to-dd_belatedpng.min.js.patch
+0002-Add-non-minified-javascript-files-used-in-docs-939.patch

-- 
ruby-fog.git



More information about the Pkg-ruby-extras-commits mailing list