Index: admin/js/ie7/IE7.js
===================================================================
--- admin/js/ie7/IE7.js	(revision 175)
+++ admin/js/ie7/IE7.js	(revision 703)
@@ -1,2 +1,2205 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){IE7={toString:function(){return"IE7 version 2.0 (beta2)"}};var k=IE7.appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(top.location.search)||k<5)return;var Q=bG();var C=document.compatMode!="CSS1Compat";var bm=document.documentElement,v,s;var bA="!";var G=":link{ie7-link:link}:visited{ie7-link:visited}";var cj=/^[\w\.]+[^:]*$/;function W(a,b){if(cj.test(a))a=(b||"")+a;return a};function bn(a,b){a=W(a,b);return a.slice(0,a.lastIndexOf("/")+1)};var bB=document.scripts[document.scripts.length-1];var ck=bn(bB.src);try{var H=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}var X={};function cl(a,b){try{a=W(a,b);if(!X[a]){H.open("GET",a,false);H.send();if(H.status==0||H.status==200){X[a]=H.responseText}}}catch(e){}finally{return X[a]||""}};if(k<5.5){undefined=Q();bA="HTML:!";var cm=/(g|gi)$/;var cn=String.prototype.replace;String.prototype.replace=function(a,b){if(typeof b=="function"){if(a&&a.constructor==RegExp){var c=a;var d=c.global;if(d==null)d=cm.test(c);if(d)c=new RegExp(c.source)}else{c=new RegExp(bb(a))}var f,g=this,h="";while(g&&(f=c.exec(g))){h+=g.slice(0,f.index)+b.apply(this,f);g=g.slice(f.index+f[0].length);if(!d)break}return h+g}return cn.apply(this,arguments)};Array.prototype.pop=function(){if(this.length){var a=this[this.length-1];this.length--;return a}return undefined};Array.prototype.push=function(){for(var a=0;a<arguments.length;a++){this[this.length]=arguments[a]}return this.length};var co=this;Function.prototype.apply=function(a,b){if(a===undefined)a=co;else if(a==null)a=window;else if(typeof a=="string")a=new String(a);else if(typeof a=="number")a=new Number(a);else if(typeof a=="boolean")a=new Boolean(a);if(arguments.length==1)b=[];else if(b[0]&&b[0].writeln)b[0]=b[0].documentElement.document||b[0];var c="#ie7_apply",d;a[c]=this;switch(b.length){case 0:d=a[c]();break;case 1:d=a[c](b[0]);break;case 2:d=a[c](b[0],b[1]);break;case 3:d=a[c](b[0],b[1],b[2]);break;case 4:d=a[c](b[0],b[1],b[2],b[3]);break;case 5:d=a[c](b[0],b[1],b[2],b[3],b[4]);break;default:var f=[],g=b.length-1;do f[g]="a["+g+"]";while(g--);eval("r=o[$]("+f+")")}if(typeof a.valueOf=="function"){delete a[c]}else{a[c]=undefined;if(d&&d.writeln)d=d.documentElement.document||d}return d};Function.prototype.call=function(a){return this.apply(a,bC.apply(arguments,[1]))};G+="address,blockquote,body,dd,div,dt,fieldset,form,"+"frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+"hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}"}var bC=Array.prototype.slice;var cJ=/%([1-9])/g;var cp=/^\s\s*/;var cq=/\s\s*$/;var cr=/([\/()[\]{}|*+-.,^$?\\])/g;var bD=/\bbase\b/;var bE=["constructor","toString"];var Y;function z(){};z.extend=function(a,b){Y=true;var c=new this;ba(c,a);Y=false;var d=c.constructor;function f(){if(!Y)d.apply(this,arguments)};c.constructor=f;f.extend=arguments.callee;ba(f,b);f.prototype=c;return f};z.prototype.extend=function(a){return ba(this,a)};var bo="#";var Z="~";var cs=/\\./g;var ct=/\(\?[:=!]|\[[^\]]+\]/g;var cu=/\(/g;var D=z.extend({constructor:function(a){this[Z]=[];this.merge(a)},exec:function(g){var h=this,p=this[Z];return String(g).replace(new RegExp(this,this.ignoreCase?"gi":"g"),function(){var a,b=1,c=0;while((a=h[bo+p[c++]])){var d=b+a.length+1;if(arguments[b]){var f=a.replacement;switch(typeof f){case"function":return f.apply(h,bC.call(arguments,b,d));case"number":return arguments[b+f];default:return f}}b=d}})},add:function(a,b){if(a instanceof RegExp){a=a.source}if(!this[bo+a])this[Z].push(String(a));this[bo+a]=new D.Item(a,b)},merge:function(a){for(var b in a)this.add(b,a[b])},toString:function(){return"("+this[Z].join(")|(")+")"}},{IGNORE:"$0",Item:z.extend({constructor:function(a,b){a=a instanceof RegExp?a.source:String(a);if(typeof b=="number")b=String(b);else if(b==null)b="";if(typeof b=="string"&&/\$(\d+)/.test(b)){if(/^\$\d+$/.test(b)){b=parseInt(b.slice(1))}else{var c=/'/.test(b.replace(/\\./g,""))?'"':"'";b=b.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\$(\d+)/g,c+"+(arguments[$1]||"+c+c+")+"+c);b=new Function("return "+c+b.replace(/(['"])\1\+(.*)\+\1\1$/,"$1")+c)}}this.length=D.count(a);this.replacement=b;this.toString=bG(a)}}),count:function(a){a=String(a).replace(cs,"").replace(ct,"");return I(a,cu).length}});function ba(a,b){if(a&&b){var c=(typeof b=="function"?Function:Object).prototype;var d=bE.length,f;if(Y)while(f=bE[--d]){var g=b[f];if(g!=c[f]){if(bD.test(g)){bF(a,f,g)}else{a[f]=g}}}for(f in b)if(c[f]===undefined){var g=b[f];if(a[f]&&typeof g=="function"&&bD.test(g)){bF(a,f,g)}else{a[f]=g}}}return a};function bF(c,d,f){var g=c[d];c[d]=function(){var a=this.base;this.base=g;var b=f.apply(this,arguments);this.base=a;return b}};function cv(a,b){if(!b)b=a;var c={};for(var d in a)c[d]=b[d];return c};function i(c){var d=arguments;var f=new RegExp("%([1-"+arguments.length+"])","g");return String(c).replace(f,function(a,b){return b<d.length?d[b]:a})};function I(a,b){return String(a).match(b)||[]};function bb(a){return String(a).replace(cr,"\\$1")};function cK(a){return String(a).replace(cp,"").replace(cq,"")};function bG(a){return function(){return a}};var bH=D.extend({ignoreCase:true});var cw=/\x01(\d+)/g,cx=/'/g,cy=/^\x01/,cz=/\\([\da-fA-F]{1,4})/g;var bp=[];var cA=new bH({"<!\\-\\-|\\-\\->":"","\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/":"","@(namespace|import)[^;\\n]+[;\\n]":"","'(\\\\.|[^'\\\\])*'":bJ,'"(\\\\.|[^"\\\\])*"':bJ,"\\s+":" "});function cB(a){return cA.exec(a)};function bI(c){return c.replace(cw,function(a,b){return bp[b-1]})};function bJ(c){return"\x01"+bp.push(c.replace(cz,function(a,b){return eval("'\\u"+"0000".slice(b.length)+b+"'")}).slice(1,-1).replace(cx,"\\'"))};function cC(a){return cy.test(a)?bp[a.slice(1)-1]:a};var cD=new D({Width:"Height",width:"height",Left:"Top",left:"top",Right:"Bottom",right:"bottom",onX:"onY"});function A(a){return cD.exec(a)};var bK=[];function bq(a){cF(a);w(window,"onresize",a)};function w(a,b,c){a.attachEvent(b,c);bK.push(arguments)};function cE(a,b,c){try{a.detachEvent(b,c)}catch(ignore){}};w(window,"onunload",function(){var a;while(a=bK.pop()){cE(a[0],a[1],a[2])}});function R(a,b,c){if(!a.elements)a.elements={};if(c)a.elements[b.uniqueID]=b;else delete a.elements[b.uniqueID];return c};w(window,"onbeforeprint",function(){if(!IE7.CSS.print)new bw("print");IE7.CSS.print.recalc()});var bL=/^\d+(px)?$/i;var J=/^\d+%$/;var E=function(a,b){if(bL.test(b))return parseInt(b);var c=a.style.left;var d=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;a.style.left=b||0;b=a.style.pixelLeft;a.style.left=c;a.runtimeStyle.left=d;return b};var br="ie7-";var bM=z.extend({constructor:function(){this.fixes=[];this.recalcs=[]},init:Q});var bs=[];function cF(a){bs.push(a)};IE7.recalc=function(){IE7.HTML.recalc();IE7.CSS.recalc();for(var a=0;a<bs.length;a++)bs[a]()};function bc(a){return a.currentStyle["ie7-position"]=="fixed"};function bt(a,b){return a.currentStyle[br+b]||a.currentStyle[b]};function K(a,b,c){if(a.currentStyle[br+b]==null){a.runtimeStyle[br+b]=a.currentStyle[b]}a.runtimeStyle[b]=c};function bN(a){var b=document.createElement(a||"object");b.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";b.ie7_anon=true;return b};function B(a,b,c){if(!be[a]){F=[];var d="";var f=T.escape(a).split(",");for(var g=0;g<f.length;g++){o=m=x=0;S=f.length>1?2:0;var h=T.exec(f[g])||"if(0){";if(o){h+=i("if(e%1.nodeName!='!'){",m)}var p=S>1?bV:"";h+=i(p+bW,m);h+=Array(I(h,/\{/g).length+1).join("}");d+=h}eval(i(bX,F)+T.unescape(d)+"return s?null:r}");be[a]=_h}return be[a](b||document,c)};var bd=k<6;var bO=/^(href|src)$/;var bu={"class":"className","for":"htmlFor"};IE7._5=1;IE7._e=function(a,b){var c=a.all[b]||null;if(!c||c.id==b)return c;for(var d=0;d<c.length;d++){if(c[d].id==b)return c[d]}return null};IE7._f=function(a,b){if(b=="src"&&a.pngSrc)return a.pngSrc;var c=bd?(a.attributes[b]||a.attributes[bu[b.toLowerCase()]]):a.getAttributeNode(b);if(c&&(c.specified||b=="value")){if(bO.test(b)){return a.getAttribute(b,2)}else if(b=="class"){return a.className.replace(/\sie7_\w+/g,"")}else if(b=="style"){return a.style.cssText}else{return c.nodeValue}}return null};var bP="colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";ba(bu,cv(bP.toLowerCase().split(","),bP.split(",")));IE7._a=function(a){while(a&&(a=a.nextSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};IE7._b=function(a){while(a&&(a=a.previousSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};var cG=/([\s>+~,]|[^(]\+|^)([#.:\[])/g,cH=/(^|,)([^\s>+~])/g,cI=/\s*([\s>+~(),]|^|$)\s*/g,bQ=/\s\*\s/g;var bR=D.extend({constructor:function(a){this.base(a);this.sorter=new D;this.sorter.add(/:not\([^)]*\)/,D.IGNORE);this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/,"$1$3$6$4")},ignoreCase:true,escape:function(a){return this.optimise(this.format(a))},format:function(a){return a.replace(cI,"$1").replace(cH,"$1 $2").replace(cG,"$1*$2")},optimise:function(a){return this.sorter.exec(a.replace(bQ,">* "))},unescape:function(a){return bI(a)}});var bS={"":"%1!=null","=":"%1=='%2'","~=":/(^| )%1( |$)/,"|=":/^%1(-|$)/,"^=":/^%1/,"$=":/%1$/,"*=":/%1/};var bT={"first-child":"!IE7._b(e%1)","link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'"};var bv="var p%2=0,i%2,e%2,n%2=e%1.";var bU="e%1.sourceIndex";var bV="var g="+bU+";if(!p[g]){p[g]=1;";var bW="r[r.length]=e%1;if(s)return e%1;";var bX="var _h=function(e0,s){IE7._5++;var r=[],p={},reg=[%1],d=document;";var F;var m;var o;var x;var S;var be={};var T=new bR({" (\\*|[\\w-]+)#([\\w-]+)":function(a,b,c){o=false;var d="var e%2=IE7._e(d,'%4');if(e%2&&";if(b!="*")d+="e%2.nodeName=='%3'&&";d+="(e%1==d||e%1.contains(e%2))){";if(x)d+=i("i%1=n%1.length;",x);return i(d,m++,m,b.toUpperCase(),c)}," (\\*|[\\w-]+)":function(a,b){S++;o=b=="*";var c=bv;c+=(o&&bd)?"all":"getElementsByTagName('%3')";c+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";return i(c,m++,x=m,b.toUpperCase())},">(\\*|[\\w-]+)":function(a,b){var c=x;o=b=="*";var d=bv;d+=c?"children":"childNodes";if(!o&&c)d+=".tags('%3')";d+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";if(o){d+="if(e%2.nodeType==1){";o=bd}else{if(!c)d+="if(e%2.nodeName=='%3'){"}return i(d,m++,x=m,b.toUpperCase())},"\\+(\\*|[\\w-]+)":function(a,b){var c="";if(o)c+="if(e%1.nodeName!='!'){";o=false;c+="e%1=IE7._a(e%1);if(e%1";if(b!="*")c+="&&e%1.nodeName=='%2'";c+="){";return i(c,m,b.toUpperCase())},"~(\\*|[\\w-]+)":function(a,b){var c="";if(o)c+="if(e%1.nodeName!='!'){";o=false;S=2;c+="while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._5)break;if(";if(b=="*"){c+="e%1.nodeType==1";if(bd)c+="&&e%1.nodeName!='!'"}else c+="e%1.nodeName=='%2'";c+="){e%1.ie7_adjacent=IE7._5;";return i(c,m,b.toUpperCase())},"#([\\w-]+)":function(a,b){o=false;var c="if(e%1.id=='%2'){";if(x)c+=i("i%1=n%1.length;",x);return i(c,m,b)},"\\.([\\w-]+)":function(a,b){o=false;F.push(new RegExp("(^|\\s)"+bb(b)+"(\\s|$)"));return i("if(e%1.className&&reg[%2].test(e%1.className)){",m,F.length-1)},"\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]":function(a,b,c,d){var f=bu[b]||b;if(c){var g="e%1.getAttribute('%2',2)";if(!bO.test(b)){g="e%1.%3||"+g}b=i("("+g+")",m,b,f)}else{b=i("IE7._f(e%1,'%2')",m,b)}var h=bS[c||""]||"0";if(h&&h.source){F.push(new RegExp(i(h.source,bb(T.unescape(d)))));h="reg[%2].test(%1)";d=F.length-1}return"if("+i(h,b,d)+"){"},":+([\\w-]+)(\\(([^)]+)\\))?":function(a,b,c,d){b=bT[b];return"if("+(b?i(b,m,d||""):"0")+"){"}});var bY=/a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;var bZ=/\s*\{\s*/,ca=/\s*\}\s*/,cb=/\s*\,\s*/;var cc=/(.*)(:first-(line|letter))/;var y=document.styleSheets;IE7.CSS=new(bM.extend({parser:new bH,screen:"",print:"",styles:[],rules:[],pseudoClasses:k<7?"first\\-child":"",dynamicPseudoClasses:{toString:function(){var a=[];for(var b in this)a.push(b);return a.join("|")}},init:function(){var a="^\x01$";var b="\\[class=?[^\\]]*\\]";var c=[];if(this.pseudoClasses)c.push(this.pseudoClasses);var d=this.dynamicPseudoClasses.toString();if(d)c.push(d);c=c.join("|");var f=k<7?["[>+~[(]|([:.])\\w+\\1"]:[b];if(c)f.push(":("+c+")");this.UNKNOWN=new RegExp(f.join("|")||a,"i");var g=k<7?["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"]:[b];var h=g.concat();if(c)h.push(":("+c+")");n.COMPLEX=new RegExp(h.join("|")||a,"ig");if(this.pseudoClasses)g.push(":("+this.pseudoClasses+")");L.COMPLEX=new RegExp(g.join("|")||a,"i");L.MATCH=new RegExp(d?"(.*):("+d+")(.*)":a,"i");this.createStyleSheet();this.refresh()},addEventHandler:function(){w.apply(null,arguments)},addFix:function(a,b){this.parser.add(a,b)},addRecalc:function(c,d,f,g){d=new RegExp("([{;\\s])"+c+"\\s*:\\s*"+d+"[^;}]*");var h=this.recalcs.length;if(g)g=c+":"+g;this.addFix(d,function(a,b){return(g?b+g:a)+";ie7-"+a.slice(1)+";ie7_recalc"+h+":1"});this.recalcs.push(arguments);return h},apply:function(){this.getInlineStyles();new bw("screen");this.trash()},createStyleSheet:function(){this.styleSheet=document.createStyleSheet();this.styleSheet.ie7=true;this.styleSheet.owningElement.ie7=true;this.styleSheet.cssText=G},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){this.styles.push(b.innerHTML)}}},getText:function(a,b){try{var c=a.cssText}catch(e){c=""}if(H)c=cl(a.href,b)||c;return c},recalc:function(){this.screen.recalc();var a=/ie7_recalc\d+/g;var b=G.match(/[{,]/g).length;var c=b+(this.screen.cssText.match(/\{/g)||"").length;var d=this.styleSheet.rules,f;var g,h,p,t,q,j,u,l;for(q=b;q<c;q++){f=d[q];var r=f.style.cssText;if(f&&(g=r.match(a))){p=B(f.selectorText);if(p.length)for(j=0;j<g.length;j++){l=g[j];h=IE7.CSS.recalcs[l.slice(10)][2];for(u=0;(t=p[u]);u++){if(t.currentStyle[l])h(t,r)}}}}},refresh:function(){this.styleSheet.cssText=G+this.screen+this.print},trash:function(){for(var a=0;a<y.length;a++){if(!y[a].ie7){try{var b=y[a].cssText}catch(e){b=""}if(b)y[a].cssText=""}}}}));var bw=z.extend({constructor:function(a){this.media=a;this.load();IE7.CSS[a]=this;IE7.CSS.refresh()},createRule:function(a,b){if(IE7.CSS.UNKNOWN.test(a)){var c;if(bf&&(c=a.match(bf.MATCH))){return new bf(c[1],c[2],b)}else if(c=a.match(L.MATCH)){if(!bY.test(c[0])||L.COMPLEX.test(c[0])){return new L(a,c[1],c[2],c[3],b)}}else return new n(a,b)}return a+" {"+b+"}"},getText:function(){var h=[].concat(IE7.CSS.styles);var p=/@media\s+([^{]*)\{([^@]+\})\s*\}/gi;var t=/\ball\b|^$/i,q=/\bscreen\b/i,j=/\bprint\b/i;function u(a,b){l.value=b;return a.replace(p,l)};function l(a,b,c){b=r(b);switch(b){case"screen":case"print":if(b!=l.value)return"";case"all":return c}return""};function r(a){if(t.test(a))return"all";else if(q.test(a))return(j.test(a))?"all":"screen";else if(j.test(a))return"print"};var N=this;function O(a,b,c,d){var f="";if(!d){c=r(a.media);d=0}if(c=="all"||c==N.media){if(d<3){for(var g=0;g<a.imports.length;g++){f+=O(a.imports[g],bn(a.href,b),c,d+1)}}f+=cB(a.href?cg(a,b):h.pop()||"");f=u(f,N.media)}return f};var bl={};function cg(a,b){var c=W(a.href,b);if(bl[c])return"";bl[c]=(a.disabled)?"":ci(IE7.CSS.getText(a,b),bn(a.href,b));return bl[c]};var ch=/(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function ci(a,b){return a.replace(ch,"$1"+b.slice(0,b.lastIndexOf("/")+1)+"$2")};for(var P=0;P<y.length;P++){if(!y[P].disabled&&!y[P].ie7){this.cssText+=O(y[P])}}},load:function(){this.cssText="";this.getText();this.parse();this.cssText=bI(this.cssText);X={}},parse:function(){this.cssText=IE7.CSS.parser.exec(this.cssText);var a=IE7.CSS.rules.length;var b=this.cssText.split(ca),c;var d,f,g,h;for(g=0;g<b.length;g++){c=b[g].split(bZ);d=c[0].split(cb);f=c[1];for(h=0;h<d.length;h++){d[h]=f?this.createRule(d[h],f):""}b[g]=d.join("\n")}this.cssText=b.join("\n");this.rules=IE7.CSS.rules.slice(a)},recalc:function(){var a,b;for(b=0;(a=this.rules[b]);b++)a.recalc()},toString:function(){return"@media "+this.media+"{"+this.cssText+"}"}});var bf;var n=IE7.Rule=z.extend({constructor:function(a,b){this.id=IE7.CSS.rules.length;this.className=n.PREFIX+this.id;a=a.match(cc)||a||"*";this.selector=a[1]||a;this.selectorText=this.parse(this.selector)+(a[2]||"");this.cssText=b;this.MATCH=new RegExp("\\s"+this.className+"(\\s|$)","g");IE7.CSS.rules.push(this);this.init()},init:Q,add:function(a){a.className+=" "+this.className},recalc:function(){var a=B(this.selector);for(var b=0;b<a.length;b++)this.add(a[b])},parse:function(a){var b=a.replace(n.CHILD," ").replace(n.COMPLEX,"");if(k<7)b=b.replace(n.MULTI,"");var c=I(b,n.TAGS).length-I(a,n.TAGS).length;var d=I(b,n.CLASSES).length-I(a,n.CLASSES).length+1;while(d>0&&n.CLASS.test(b)){b=b.replace(n.CLASS,"");d--}while(c>0&&n.TAG.test(b)){b=b.replace(n.TAG,"$1*");c--}b+="."+this.className;d=Math.min(d,2);c=Math.min(c,2);var f=-10*d-c;if(f>0){b=b+","+n.MAP[f]+" "+b}return b},remove:function(a){a.className=a.className.replace(this.MATCH,"$1")},toString:function(){return i("%1 {%2}",this.selectorText,this.cssText)}},{CHILD:/>/g,CLASS:/\.[\w-]+/,CLASSES:/[.:\[]/g,MULTI:/(\.[\w-]+)+/g,PREFIX:"ie7_class",TAG:/^\w+|([\s>+~])\w+/,TAGS:/^\w|[\s>+~]\w/g,MAP:{1:"html",2:"html body",10:".ie7_html",11:"html.ie7_html",12:"html.ie7_html body",20:".ie7_html .ie7_body",21:"html.ie7_html .ie7_body",22:"html.ie7_html body.ie7_body"}});var L=n.extend({constructor:function(a,b,c,d,f){this.attach=b||"*";this.dynamicPseudoClass=IE7.CSS.dynamicPseudoClasses[c];this.target=d;this.base(a,f)},recalc:function(){var a=B(this.attach),b;for(var c=0;b=a[c];c++){var d=this.target?B(this.target,b):[b];if(d.length)this.dynamicPseudoClass.apply(b,d,this)}}});var cd=z.extend({constructor:function(a,b){this.name=a;this.apply=b;this.instances={};IE7.CSS.dynamicPseudoClasses[a]=this},register:function(a){var b=a[2];a.id=b.id+a[0].uniqueID;if(!this.instances[a.id]){var c=a[1],d;for(d=0;d<c.length;d++)b.add(c[d]);this.instances[a.id]=a}},unregister:function(a){if(this.instances[a.id]){var b=a[2];var c=a[1],d;for(d=0;d<c.length;d++)b.remove(c[d]);delete this.instances[a.id]}}});if(k<7){var U=new cd("hover",function(a){var b=arguments;IE7.CSS.addEventHandler(a,k<5.5?"onmouseover":"onmouseenter",function(){U.register(b)});IE7.CSS.addEventHandler(a,k<5.5?"onmouseout":"onmouseleave",function(){U.unregister(b)})});w(document,"onmouseup",function(){var a=U.instances;for(var b in a)if(!a[b][0].contains(event.srcElement))U.unregister(a[b])})}IE7.CSS.addRecalc("[\\w-]+","inherit",function(c,d){var f=d.match(/[\w-]+\s*:\s*inherit/g);for(var g=0;g<f.length;g++){var h=f[g].replace(/ie7\-|\s*:\s*inherit/g,"").replace(/\-([a-z])/g,function(a,b){return b.toUpperCase()});c.runtimeStyle[h]=c.parentElement.currentStyle[h]}});IE7.HTML=new(bM.extend({fixed:{},init:Q,addFix:function(){this.fixes.push(arguments)},apply:function(){for(var a=0;a<this.fixes.length;a++){var b=B(this.fixes[a][0]);var c=this.fixes[a][1];for(var d=0;d<b.length;d++)c(b[d])}},addRecalc:function(){this.recalcs.push(arguments)},recalc:function(){for(var a=0;a<this.recalcs.length;a++){var b=B(this.recalcs[a][0]);var c=this.recalcs[a][1],d;var f=Math.pow(2,a);for(var g=0;(d=b[g]);g++){var h=d.uniqueID;if((this.fixed[h]&f)==0){d=c(d)||d;this.fixed[h]|=f}}}}}));if(k<7){document.createElement("abbr");IE7.HTML.addRecalc("label",function(a){if(!a.htmlFor){var b=B("input,textarea",a,true);if(b){w(a,"onclick",function(){b.click()})}}})}var V="[.\\d]";new function(_){var layout=IE7.Layout=this;G+="*{boxSizing:content-box}";IE7.hasLayout=k<5.5?function(a){return a.clientWidth}:function(a){return a.currentStyle.hasLayout};layout.boxSizing=function(a){if(!IE7.hasLayout(a)){a.style.height="0cm";if(a.currentStyle.verticalAlign=="auto")a.runtimeStyle.verticalAlign="top";collapseMargins(a)}};function collapseMargins(a){if(a!=s&&a.currentStyle.position!="absolute"){collapseMargin(a,"marginTop");collapseMargin(a,"marginBottom")}};function collapseMargin(a,b){if(!a.runtimeStyle[b]){var c=a.parentElement;if(c&&IE7.hasLayout(c)&&!IE7[b=="marginTop"?"_b":"_a"](a))return;var d=B(">*:"+(b=="marginTop"?"first":"last")+"-child",a,true);if(d&&d.currentStyle.styleFloat=="none"&&IE7.hasLayout(d)){collapseMargin(d,b);margin=_9(a,a.currentStyle[b]);childMargin=_9(d,d.currentStyle[b]);if(margin<0||childMargin<0){a.runtimeStyle[b]=margin+childMargin}else{a.runtimeStyle[b]=Math.max(childMargin,margin)}d.runtimeStyle[b]="0px"}}};function _9(a,b){return b=="auto"?0:E(a,b)};var UNIT=/^[.\d][\w%]*$/,AUTO=/^(auto|0cm)$/;var applyWidth,applyHeight;IE7.Layout.borderBox=function(a){applyWidth(a);applyHeight(a)};var fixWidth=function(g){applyWidth=function(a){if(!J.test(a.currentStyle.width))h(a);collapseMargins(a)};function h(a,b){if(!a.runtimeStyle.fixedWidth){if(!b)b=a.currentStyle.width;a.runtimeStyle.fixedWidth=(UNIT.test(b))?Math.max(0,q(a,b)):b;K(a,"width",a.runtimeStyle.fixedWidth)}};function p(a){if(!bc(a)){var b=a.offsetParent;while(b&&!IE7.hasLayout(b))b=b.offsetParent}return(b||s).clientWidth};function t(a,b){if(J.test(b))return parseInt(parseFloat(b)/100*p(a));return E(a,b)};var q=function(a,b){var c=a.currentStyle["box-sizing"]=="border-box";var d=0;if(C&&!c)d+=j(a)+u(a,"padding");else if(!C&&c)d-=j(a)+u(a,"padding");return t(a,b)+d};function j(a){return a.offsetWidth-a.clientWidth};function u(a,b){return t(a,a.currentStyle[b+"Left"])+t(a,a.currentStyle[b+"Right"])};G+="*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";layout.minWidth=function(a){if(a.currentStyle["min-width"]!=null){a.style.minWidth=a.currentStyle["min-width"]}if(R(arguments.callee,a,a.currentStyle.minWidth!="none")){layout.boxSizing(a);h(a);l(a)}};eval("IE7.Layout.maxWidth="+String(layout.minWidth).replace(/min/g,"max"));function l(a){var b=a.getBoundingClientRect();var c=b.right-b.left;if(a.currentStyle.minWidth!="none"&&c<=q(a,a.currentStyle.minWidth)){a.runtimeStyle.width=a.currentStyle.minWidth}else if(a.currentStyle.maxWidth!="none"&&c>=q(a,a.currentStyle.maxWidth)){a.runtimeStyle.width=a.currentStyle.maxWidth}else{a.runtimeStyle.width=a.runtimeStyle.fixedWidth}};function r(a){if(R(r,a,/^(fixed|absolute)$/.test(a.currentStyle.position)&&bt(a,"left")!="auto"&&bt(a,"right")!="auto"&&AUTO.test(bt(a,"width")))){N(a);IE7.Layout.boxSizing(a)}};IE7.Layout.fixRight=r;function N(a){var b=t(a,a.runtimeStyle._c||a.currentStyle.left);var c=p(a)-t(a,a.currentStyle.right)-b-u(a,"margin");if(parseInt(a.runtimeStyle.width)==c)return;a.runtimeStyle.width="";if(bc(a)||g||a.offsetWidth<c){if(!C)c-=j(a)+u(a,"padding");if(c<0)c=0;a.runtimeStyle.fixedWidth=c;K(a,"width",c)}};var O=0;bq(function(){if(!s)return;var a,b=(O<s.clientWidth);O=s.clientWidth;var c=layout.minWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==q(d,d.currentStyle.minWidth));if(b&&f)d.runtimeStyle.width="";if(b==f)l(d)}var c=layout.maxWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==q(d,d.currentStyle.maxWidth));if(!b&&f)d.runtimeStyle.width="";if(b!=f)l(d)}for(a in r.elements)N(r.elements[a])});if(C){IE7.CSS.addRecalc("width",V,applyWidth)}if(k<7){IE7.CSS.addRecalc("min-width",V,layout.minWidth);IE7.CSS.addRecalc("max-width",V,layout.maxWidth);IE7.CSS.addRecalc("right",V,r)}};eval("var fixHeight="+A(fixWidth));fixWidth();fixHeight(true)};var bg=W("blank.gif",ck);var bh="DXImageTransform.Microsoft.AlphaImageLoader";var bx="progid:"+bh+"(src='%1',sizingMethod='%2')";var bi;var M=[];function by(a){if(bi.test(a.src)){var b=new Image(a.width,a.height);b.onload=function(){a.width=b.width;a.height=b.height;b=null};b.src=a.src;a.pngSrc=a.src;bz(a)}};if(k>=5.5&&k<7){IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/,function(a,b,c,d,f){d=cC(d);return bi.test(d)?"filter:"+i(bx,d,"crop")+";zoom:1;background"+(b||"")+":"+(c||"")+"none"+(f||""):a});IE7.HTML.addRecalc("img,input",function(a){if(a.tagName=="INPUT"&&a.type!="image")return;by(a);w(a,"onpropertychange",function(){if(!bj&&event.propertyName=="src"&&a.src.indexOf(bg)==-1)by(a)})});var bj=false;w(window,"onbeforeprint",function(){bj=true;for(var a=0;a<M.length;a++)ce(M[a])});w(window,"onafterprint",function(){for(var a=0;a<M.length;a++)bz(M[a]);bj=false})}function bz(a,b){var c=a.filters[bh];if(c){c.src=a.src;c.enabled=true}else{a.runtimeStyle.filter=i(bx,a.src,b||"scale");M.push(a)}a.src=bg};function ce(a){a.src=a.pngSrc;a.filters[bh].enabled=false};new function(_){if(k>=7)return;IE7.CSS.addRecalc("position","fixed",_6,"absolute");IE7.CSS.addRecalc("background(-attachment)?","[^};]*fixed",_2);var $viewport=C?"body":"documentElement";function _3(){if(v.currentStyle.backgroundAttachment!="fixed"){if(v.currentStyle.backgroundImage=="none"){v.runtimeStyle.backgroundRepeat="no-repeat";v.runtimeStyle.backgroundImage="url("+bg+")"}v.runtimeStyle.backgroundAttachment="fixed"}_3=Q};var _0=bN("img");function _1(a){return a?bc(a)||_1(a.parentElement):false};function _d(a,b,c){setTimeout("document.all."+a.uniqueID+".runtimeStyle.setExpression('"+b+"','"+c+"')",0)};function _2(a){if(R(_2,a,a.currentStyle.backgroundAttachment=="fixed"&&!a.contains(v))){_3();bgLeft(a);bgTop(a);_8(a)}};function _8(a){_0.src=a.currentStyle.backgroundImage.slice(5,-2);var b=a.canHaveChildren?a:a.parentElement;b.appendChild(_0);setOffsetLeft(a);setOffsetTop(a);b.removeChild(_0)};function bgLeft(a){a.style.backgroundPositionX=a.currentStyle.backgroundPositionX;if(!_1(a)){_d(a,"backgroundPositionX","(parseInt(runtimeStyle.offsetLeft)+document."+$viewport+".scrollLeft)||0")}};eval(A(bgLeft));function setOffsetLeft(a){var b=_1(a)?"backgroundPositionX":"offsetLeft";a.runtimeStyle[b]=getOffsetLeft(a,a.style.backgroundPositionX)-a.getBoundingClientRect().left-a.clientLeft+2};eval(A(setOffsetLeft));function getOffsetLeft(a,b){switch(b){case"left":case"top":return 0;case"right":case"bottom":return s.clientWidth-_0.offsetWidth;case"center":return(s.clientWidth-_0.offsetWidth)/2;default:if(J.test(b)){return parseInt((s.clientWidth-_0.offsetWidth)*parseFloat(b)/100)}_0.style.left=b;return _0.offsetLeft}};eval(A(getOffsetLeft));function _6(a){if(R(_6,a,bc(a))){K(a,"position","absolute");K(a,"left",a.currentStyle.left);K(a,"top",a.currentStyle.top);_3();IE7.Layout.fixRight(a);_4(a)}};function _4(a,b){positionTop(a,b);positionLeft(a,b,true);if(!a.runtimeStyle.autoLeft&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.right!="auto"){var c=s.clientWidth-getPixelWidth(a,a.currentStyle.right)-getPixelWidth(a,a.runtimeStyle._c)-a.clientWidth;if(a.currentStyle.marginRight=="auto")c=parseInt(c/2);if(_1(a.offsetParent))a.runtimeStyle.pixelLeft+=c;else a.runtimeStyle.shiftLeft=c}clipWidth(a);clipHeight(a)};function clipWidth(a){var b=a.runtimeStyle.fixWidth;a.runtimeStyle.borderRightWidth="";a.runtimeStyle.width=b?getPixelWidth(a,b):"";if(a.currentStyle.width!="auto"){var c=a.getBoundingClientRect();var d=a.offsetWidth-s.clientWidth+c.left-2;if(d>=0){a.runtimeStyle.borderRightWidth="0px";d=Math.max(E(a,a.currentStyle.width)-d,0);K(a,"width",d);return d}}};eval(A(clipWidth));function positionLeft(a,b){if(!b&&J.test(a.currentStyle.width)){a.runtimeStyle.fixWidth=a.currentStyle.width}if(a.runtimeStyle.fixWidth){a.runtimeStyle.width=getPixelWidth(a,a.runtimeStyle.fixWidth)}a.runtimeStyle.shiftLeft=0;a.runtimeStyle._c=a.currentStyle.left;a.runtimeStyle.autoLeft=a.currentStyle.right!="auto"&&a.currentStyle.left=="auto";a.runtimeStyle.left="";a.runtimeStyle.screenLeft=getScreenLeft(a);a.runtimeStyle.pixelLeft=a.runtimeStyle.screenLeft;if(!b&&!_1(a.offsetParent)){_d(a,"pixelLeft","runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document."+$viewport+".scrollLeft")}};eval(A(positionLeft));function getScreenLeft(a){var b=a.offsetLeft,c=1;if(a.runtimeStyle.autoLeft){b=s.clientWidth-a.offsetWidth-getPixelWidth(a,a.currentStyle.right)}if(a.currentStyle.marginLeft!="auto"){b-=getPixelWidth(a,a.currentStyle.marginLeft)}while(a=a.offsetParent){if(a.currentStyle.position!="static")c=-1;b+=a.offsetLeft*c}return b};eval(A(getScreenLeft));function getPixelWidth(a,b){return J.test(b)?parseInt(parseFloat(b)/100*s.clientWidth):E(a,b)};eval(A(getPixelWidth));function _g(){var a=_2.elements;for(var b in a)_8(a[b]);a=_6.elements;for(b in a){_4(a[b],true);_4(a[b],true)}_7=0};var _7;bq(function(){if(!_7)_7=setTimeout(_g,0)})};var bk={backgroundColor:"transparent",backgroundImage:"none",backgroundPositionX:null,backgroundPositionY:null,backgroundRepeat:null,borderTopWidth:0,borderRightWidth:0,borderBottomWidth:0,borderLeftStyle:"none",borderTopStyle:"none",borderRightStyle:"none",borderBottomStyle:"none",borderLeftWidth:0,height:null,marginTop:0,marginBottom:0,marginRight:0,marginLeft:0,width:"100%"};IE7.CSS.addRecalc("overflow","visible",function(a){if(a.parentNode.ie7_wrapped)return;if(IE7.Layout&&a.currentStyle["max-height"]!="auto"){IE7.Layout.maxHeight(a)}if(a.currentStyle.marginLeft=="auto")a.style.marginLeft=0;if(a.currentStyle.marginRight=="auto")a.style.marginRight=0;var b=document.createElement(bA);b.ie7_wrapped=a;for(var c in bk){b.style[c]=a.currentStyle[c];if(bk[c]!=null){a.runtimeStyle[c]=bk[c]}}b.style.display="block";b.style.position="relative";a.runtimeStyle.position="absolute";a.parentNode.insertBefore(b,a);b.appendChild(a)});function cf(){var f="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var g=0;g<f.length;g++){f[f[g]]=f[g-1]||"0.67em"}IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/,function(a,b,c,d){return b+(f[d]||d)});if(k<6){var h=/^\-/,p=/(em|ex)$/i;var t=/em$/i,q=/ex$/i;E=function(a,b){if(bL.test(b))return parseInt(b)||0;var c=h.test(b)?-1:1;if(p.test(b))c*=u(a);j.style.width=(c<0)?b.slice(1):b;v.appendChild(j);b=c*j.offsetWidth;j.removeNode();return parseInt(b)};var j=bN();function u(a){var b=1;j.style.fontFamily=a.currentStyle.fontFamily;j.style.lineHeight=a.currentStyle.lineHeight;while(a!=v){var c=a.currentStyle["ie7-font-size"];if(c){if(t.test(c))b*=parseFloat(c);else if(J.test(c))b*=(parseFloat(c)/100);else if(q.test(c))b*=(parseFloat(c)/2);else{j.style.fontSize=c;return 1}}a=a.parentElement}return b};IE7.CSS.addFix(/cursor\s*:\s*pointer/,"cursor:hand");IE7.CSS.addFix(/display\s*:\s*list-item/,"display:block")}function l(a){if(k<5.5)IE7.Layout.boxSizing(a.parentElement);var b=a.parentElement;var c=b.offsetWidth-a.offsetWidth-r(b);var d=(a.currentStyle["ie7-margin"]&&a.currentStyle.marginRight=="auto")||a.currentStyle["ie7-margin-right"]=="auto";switch(b.currentStyle.textAlign){case"right":c=d?parseInt(c/2):0;a.runtimeStyle.marginRight=c+"px";break;case"center":if(d)c=0;default:if(d)c/=2;a.runtimeStyle.marginLeft=parseInt(c)+"px"}};function r(a){return E(a,a.currentStyle.paddingLeft)+E(a,a.currentStyle.paddingRight)};IE7.CSS.addRecalc("margin(-left|-right)?","[^};]*auto",function(a){if(R(l,a,a.parentElement&&a.currentStyle.display=="block"&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.position!="absolute")){l(a)}});bq(function(){for(var a in l.elements){var b=l.elements[a];b.runtimeStyle.marginLeft=b.runtimeStyle.marginRight="";l(b)}})};IE7.loaded=true;(function(){try{bm.doScroll("left")}catch(e){setTimeout(arguments.callee,1);return}try{eval(bB.innerHTML)}catch(e){}bi=new RegExp(bb(typeof IE7_PNG_SUFFIX=="string"?IE7_PNG_SUFFIX:"-trans.png")+"$","i");v=document.body;s=C?v:bm;v.className+=" ie7_body";bm.className+=" ie7_html";if(C)cf();IE7.CSS.init();IE7.HTML.init();IE7.HTML.apply();IE7.CSS.apply();IE7.recalc()})()})();
+// timestamp: Sun, 03 Feb 2008 19:26:22
+/*
+  IE7/IE8.js - copyright 2004-2008, Dean Edwards
+  http://dean.edwards.name/IE7/
+  http://www.opensource.org/licenses/mit-license.php
+*/
+
+/* W3C compliance for Microsoft Internet Explorer */
+
+/* credits/thanks:
+  Shaggy, Martijn Wargers, Jimmy Cerra, Mark D Anderson,
+  Lars Dieckow, Erik Arvidsson, Gellért Gyuris, James Denny,
+  Unknown W Brackets, Benjamin Westfarer, Rob Eberhardt,
+  Bill Edney, Kevin Newman, James Crompton, Matthew Mastracci,
+  Doug Wright, Richard York, Kenneth Kolano, MegaZone,
+  Thomas Verelst, Mark 'Tarquin' Wilton-Jones, Rainer Åhlfors,
+  David Zulaica, Ken Kolano, Kevin Newman
+*/
+
+// =======================================================================
+// TO DO
+// =======================================================================
+
+// PNG - unclickable content
+
+// =======================================================================
+// TEST/BUGGY
+// =======================================================================
+
+// hr{margin:1em auto} (doesn't look right in IE5)
+
+(function() {
+
+IE7 = {
+  toString: function(){return "IE7 version 2.0 (beta2)"}
+};
+var appVersion = IE7.appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1];
+
+if (/ie7_off/.test(top.location.search) || appVersion < 5) return;
+
+var Undefined = K();
+var quirksMode = document.compatMode != "CSS1Compat";
+var documentElement = document.documentElement, body, viewport;
+var ANON = "!";
+var HEADER = ":link{ie7-link:link}:visited{ie7-link:visited}";
+
+// -----------------------------------------------------------------------
+// external
+// -----------------------------------------------------------------------
+
+var RELATIVE = /^[\w\.]+[^:]*$/;
+function makePath(href, path) {
+  if (RELATIVE.test(href)) href = (path || "") + href;
+  return href;
+};
+
+function getPath(href, path) {
+  href = makePath(href, path);
+  return href.slice(0, href.lastIndexOf("/") + 1);
+};
+
+// get the path to this script
+var script = document.scripts[document.scripts.length - 1];
+var path = getPath(script.src);
+
+// we'll use microsoft's http request object to load external files
+try {
+  var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+} catch (e) {
+  // ActiveX disabled
+}
+
+var fileCache = {};
+function loadFile(href, path) {
+try {
+  href = makePath(href, path);
+  if (!fileCache[href]) {
+    // easy to load a file huh?
+    httpRequest.open("GET", href, false);
+    httpRequest.send();
+    if (httpRequest.status == 0 || httpRequest.status == 200) {
+      fileCache[href] = httpRequest.responseText;
+    }
+  }
+} catch (e) {
+  // ignore errors
+} finally {
+  return fileCache[href] || "";
+}};
+
+// -----------------------------------------------------------------------
+// IE5.0 compatibility
+// -----------------------------------------------------------------------
+
+
+if (appVersion < 5.5) {
+  undefined = Undefined();
+
+  ANON = "HTML:!"; // for anonymous content
+  
+  // Fix String.replace (Safari1.x/IE5.0).
+  var GLOBAL = /(g|gi)$/;
+  var _String_replace = String.prototype.replace; 
+  String.prototype.replace = function(expression, replacement) {
+    if (typeof replacement == "function") { // Safari doesn't like functions
+      if (expression && expression.constructor == RegExp) {
+        var regexp = expression;
+        var global = regexp.global;
+        if (global == null) global = GLOBAL.test(regexp);
+        // we have to convert global RexpExps for exec() to work consistently
+        if (global) regexp = new RegExp(regexp.source); // non-global
+      } else {
+        regexp = new RegExp(rescape(expression));
+      }
+      var match, string = this, result = "";
+      while (string && (match = regexp.exec(string))) {
+        result += string.slice(0, match.index) + replacement.apply(this, match);
+        string = string.slice(match.index + match[0].length);
+        if (!global) break;
+      }
+      return result + string;
+    }
+    return _String_replace.apply(this, arguments);
+  };
+  
+  Array.prototype.pop = function() {
+    if (this.length) {
+      var i = this[this.length - 1];
+      this.length--;
+      return i;
+    }
+    return undefined;
+  };
+  
+  Array.prototype.push = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      this[this.length] = arguments[i];
+    }
+    return this.length;
+  };
+  
+  var ns = this;
+  Function.prototype.apply = function(o, a) {
+    if (o === undefined) o = ns;
+    else if (o == null) o = window;
+    else if (typeof o == "string") o = new String(o);
+    else if (typeof o == "number") o = new Number(o);
+    else if (typeof o == "boolean") o = new Boolean(o);
+    if (arguments.length == 1) a = [];
+    else if (a[0] && a[0].writeln) a[0] = a[0].documentElement.document || a[0];
+    var $ = "#ie7_apply", r;
+    o[$] = this;
+    switch (a.length) { // unroll for speed
+      case 0: r = o[$](); break;
+      case 1: r = o[$](a[0]); break;
+      case 2: r = o[$](a[0],a[1]); break;
+      case 3: r = o[$](a[0],a[1],a[2]); break;
+      case 4: r = o[$](a[0],a[1],a[2],a[3]); break;
+      case 5: r = o[$](a[0],a[1],a[2],a[3],a[4]); break;
+      default:
+        var b = [], i = a.length - 1;
+        do b[i] = "a[" + i + "]"; while (i--);
+        eval("r=o[$](" + b + ")");
+    }
+    if (typeof o.valueOf == "function") { // not a COM object
+      delete o[$];
+    } else {
+      o[$] = undefined;
+      if (r && r.writeln) r = r.documentElement.document || r;
+    }
+    return r;
+  };
+  
+  Function.prototype.call = function(o) {
+    return this.apply(o, _slice.apply(arguments, [1]));
+  };
+
+  // block elements are "inline" according to IE5.0 so we'll fix it
+  HEADER += "address,blockquote,body,dd,div,dt,fieldset,form,"+
+    "frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+
+    "hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}";
+}
+
+// -----------------------------------------------------------------------
+// OO support
+// -----------------------------------------------------------------------
+
+
+// This is a cut-down version of base2 (http://code.google.com/p/base2/)
+
+var _slice = Array.prototype.slice;
+
+// private
+var _FORMAT = /%([1-9])/g;
+var _LTRIM = /^\s\s*/;
+var _RTRIM = /\s\s*$/;
+var _RESCAPE = /([\/()[\]{}|*+-.,^$?\\])/g;           // safe regular expressions
+var _BASE = /\bbase\b/;
+var _HIDDEN = ["constructor", "toString"];            // only override these when prototyping
+
+var prototyping;
+
+function Base(){};
+Base.extend = function(_instance, _static) {
+  // Build the prototype.
+  prototyping = true;
+  var _prototype = new this;
+  extend(_prototype, _instance);
+  prototyping = false;
+
+  // Create the wrapper for the constructor function.
+  var _constructor = _prototype.constructor;
+  function klass() {
+    // Don't call the constructor function when prototyping.
+    if (!prototyping) _constructor.apply(this, arguments);
+  };
+  _prototype.constructor = klass;
+
+  // Build the static interface.
+  klass.extend = arguments.callee;
+  extend(klass, _static);
+  klass.prototype = _prototype;
+  return klass;
+};
+Base.prototype.extend = function(source) {
+  return extend(this, source);
+};
+
+// A collection of regular expressions and their associated replacement values.
+// A Base class for creating parsers.
+
+var _HASH   = "#";
+var _KEYS   = "~";
+
+var _RG_ESCAPE_CHARS    = /\\./g;
+var _RG_ESCAPE_BRACKETS = /\(\?[:=!]|\[[^\]]+\]/g;
+var _RG_BRACKETS        = /\(/g;
+
+var RegGrp = Base.extend({
+  constructor: function(values) {
+    this[_KEYS] = [];
+    this.merge(values);
+  },
+
+  exec: function(string) {
+    var items = this, keys = this[_KEYS];    
+    return String(string).replace(new RegExp(this, this.ignoreCase ? "gi" : "g"), function() {
+      var item, offset = 1, i = 0;
+      // Loop through the RegGrp items.
+      while ((item = items[_HASH + keys[i++]])) {
+        var next = offset + item.length + 1;
+        if (arguments[offset]) { // do we have a result?
+          var replacement = item.replacement;
+          switch (typeof replacement) {
+            case "function":
+              return replacement.apply(items, _slice.call(arguments, offset, next));
+            case "number":
+              return arguments[offset + replacement];
+            default:
+              return replacement;
+          }
+        }
+        offset = next;
+      }
+    });
+  },
+
+  add: function(expression, replacement) {
+    if (expression instanceof RegExp) {
+      expression = expression.source;
+    }
+    if (!this[_HASH + expression]) this[_KEYS].push(String(expression));
+    this[_HASH + expression] = new RegGrp.Item(expression, replacement);
+  },
+
+  merge: function(values) {
+    for (var i in values) this.add(i, values[i]);
+  },
+
+  toString: function() {
+    // back references not supported in simple RegGrp
+    return "(" + this[_KEYS].join(")|(") + ")";
+  }
+}, {
+  IGNORE: "$0",
+
+  Item: Base.extend({
+    constructor: function(expression, replacement) {
+      expression = expression instanceof RegExp ? expression.source : String(expression);
+
+      if (typeof replacement == "number") replacement = String(replacement);
+      else if (replacement == null) replacement = "";
+
+      // does the pattern use sub-expressions?
+      if (typeof replacement == "string" && /\$(\d+)/.test(replacement)) {
+        // a simple lookup? (e.g. "$2")
+        if (/^\$\d+$/.test(replacement)) {
+          // store the index (used for fast retrieval of matched strings)
+          replacement = parseInt(replacement.slice(1));
+        } else { // a complicated lookup (e.g. "Hello $2 $1")
+          // build a function to do the lookup
+          var Q = /'/.test(replacement.replace(/\\./g, "")) ? '"' : "'";
+          replacement = replacement.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\$(\d+)/g, Q +
+            "+(arguments[$1]||" + Q+Q + ")+" + Q);
+          replacement = new Function("return " + Q + replacement.replace(/(['"])\1\+(.*)\+\1\1$/, "$1") + Q);
+        }
+      }
+
+      this.length = RegGrp.count(expression);
+      this.replacement = replacement;
+      this.toString = K(expression);
+    }
+  }),
+
+  count: function(expression) {
+    // Count the number of sub-expressions in a RegExp/RegGrp.Item.
+    expression = String(expression).replace(_RG_ESCAPE_CHARS, "").replace(_RG_ESCAPE_BRACKETS, "");
+    return match(expression, _RG_BRACKETS).length;
+  }
+});
+
+// =========================================================================
+// lang/extend.js
+// =========================================================================
+
+function extend(object, source) { // or extend(object, key, value)
+  if (object && source) {
+    var proto = (typeof source == "function" ? Function : Object).prototype;
+    // Add constructor, toString etc
+    var i = _HIDDEN.length, key;
+    if (prototyping) while (key = _HIDDEN[--i]) {
+      var value = source[key];
+      if (value != proto[key]) {
+        if (_BASE.test(value)) {
+          _override(object, key, value)
+        } else {
+          object[key] = value;
+        }
+      }
+    }
+    // Copy each of the source object's properties to the target object.
+    for (key in source) if (proto[key] === undefined) {
+      var value = source[key];
+      // Check for method overriding.
+      if (object[key] && typeof value == "function" && _BASE.test(value)) {
+        _override(object, key, value);
+      } else {
+        object[key] = value;
+      }
+    }
+  }
+  return object;
+};
+
+function _override(object, name, method) {
+  // Override an existing method.
+  var ancestor = object[name];
+  object[name] = function() {
+    var previous = this.base;
+    this.base = ancestor;
+    var returnValue = method.apply(this, arguments);
+    this.base = previous;
+    return returnValue;
+  };
+};
+
+function combine(keys, values) {
+  // Combine two arrays to make a hash.
+  if (!values) values = keys;
+  var hash = {};
+  for (var i in keys) hash[i] = values[i];
+  return hash;
+};
+
+function format(string) {
+  // Replace %n with arguments[n].
+  // e.g. format("%1 %2%3 %2a %1%3", "she", "se", "lls");
+  // ==> "she sells sea shells"
+  // Only %1 - %9 supported.
+  var args = arguments;
+  var _FORMAT = new RegExp("%([1-" + arguments.length + "])", "g");
+  return String(string).replace(_FORMAT, function(match, index) {
+    return index < args.length ? args[index] : match;
+  });
+};
+
+function match(string, expression) {
+  // Same as String.match() except that this function will return an empty
+  // array if there is no match.
+  return String(string).match(expression) || [];
+};
+
+function rescape(string) {
+  // Make a string safe for creating a RegExp.
+  return String(string).replace(_RESCAPE, "\\$1");
+};
+
+// http://blog.stevenlevithan.com/archives/faster-trim-javascript
+function trim(string) {
+  return String(string).replace(_LTRIM, "").replace(_RTRIM, "");
+};
+
+function K(k) {
+  return function() {
+    return k;
+  };
+};
+
+// -----------------------------------------------------------------------
+// parsing
+// -----------------------------------------------------------------------
+
+var Parser = RegGrp.extend({ignoreCase: true});
+
+var ENCODED = /\x01(\d+)/g,
+    QUOTES  = /'/g, 
+    STRING = /^\x01/,
+    UNICODE = /\\([\da-fA-F]{1,4})/g;
+
+var _strings = [];
+
+var encoder = new Parser({
+  // comments
+  "<!\\-\\-|\\-\\->": "",
+  "\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/": "",
+  // get rid
+  "@(namespace|import)[^;\\n]+[;\\n]": "",
+  // strings
+  "'(\\\\.|[^'\\\\])*'": encodeString,
+  '"(\\\\.|[^"\\\\])*"': encodeString,
+  // white space
+  "\\s+": " "
+});
+
+function encode(cssText) {
+  return encoder.exec(cssText);
+};
+
+function decode(cssText) {
+  return cssText.replace(ENCODED, function(match, index) {
+    return _strings[index - 1];
+  });
+};
+
+function encodeString(string) {
+  return "\x01" + _strings.push(string.replace(UNICODE, function(match, chr) {
+    return eval("'\\u" + "0000".slice(chr.length) + chr + "'");
+  }).slice(1, -1).replace(QUOTES, "\\'"));
+};
+
+function getString(value) {
+  return STRING.test(value) ? _strings[value.slice(1) - 1] : value;
+};
+
+// clone a "width" function to create a "height" function
+var rotater = new RegGrp({
+  Width: "Height",
+  width: "height",
+  Left:  "Top",
+  left:  "top",
+  Right: "Bottom",
+  right: "bottom",
+  onX:   "onY"
+});
+
+function rotate(fn) {
+  return rotater.exec(fn);
+};
+
+// -----------------------------------------------------------------------
+// event handling
+// -----------------------------------------------------------------------
+
+var eventHandlers = [];
+
+function addResize(handler) {
+  addRecalc(handler);
+  addEventHandler(window, "onresize", handler);
+};
+
+// add an event handler (function) to an element
+function addEventHandler(element, type, handler) {
+  element.attachEvent(type, handler);
+  // store the handler so it can be detached later
+  eventHandlers.push(arguments);
+};
+
+// remove an event handler assigned to an element by IE7
+function removeEventHandler(element, type, handler) {
+try {
+  element.detachEvent(type, handler);
+} catch (ignore) {
+  // write a letter of complaint to microsoft..
+}};
+
+// remove event handlers (they eat memory)
+addEventHandler(window, "onunload", function() {
+  var handler;
+  while (handler = eventHandlers.pop()) {
+    removeEventHandler(handler[0], handler[1], handler[2]);
+  }
+});
+
+function register(handler, element, condition) { // -@DRE
+  //var set = handler[element.uniqueID];
+  if (!handler.elements) handler.elements = {};
+  if (condition) handler.elements[element.uniqueID] = element;
+  else delete handler.elements[element.uniqueID];
+  //return !set && condition;
+  return condition;
+};
+
+addEventHandler(window, "onbeforeprint", function() {
+  if (!IE7.CSS.print) new StyleSheet("print");
+  IE7.CSS.print.recalc();
+});
+
+// -----------------------------------------------------------------------
+// pixel conversion
+// -----------------------------------------------------------------------
+
+// this is handy because it means that web developers can mix and match
+//  measurement units in their style sheets. it is not uncommon to
+//  express something like padding in "em" units whilst border thickness
+//  is most often expressed in pixels.
+
+var PIXEL = /^\d+(px)?$/i;
+var PERCENT = /^\d+%$/;
+var getPixelValue = function(element, value) {
+  if (PIXEL.test(value)) return parseInt(value);
+  var style = element.style.left;
+  var runtimeStyle = element.runtimeStyle.left;
+  element.runtimeStyle.left = element.currentStyle.left;
+  element.style.left = value || 0;
+  value = element.style.pixelLeft;
+  element.style.left = style;
+  element.runtimeStyle.left = runtimeStyle;
+  return value;
+};
+
+// -----------------------------------------------------------------------
+// generic
+// -----------------------------------------------------------------------
+
+var $IE7 = "ie7-";
+
+var Fix = Base.extend({
+  constructor: function() {
+    this.fixes = [];
+    this.recalcs = [];
+  },
+  init: Undefined
+});
+
+// a store for functions that will be called when refreshing IE7
+var recalcs = [];
+function addRecalc(recalc) {
+  recalcs.push(recalc);
+};
+
+IE7.recalc = function() {
+  IE7.HTML.recalc();
+  // re-apply style sheet rules (re-calculate ie7 classes)
+  IE7.CSS.recalc();
+  // apply global fixes to the document
+  for (var i = 0; i < recalcs.length; i++) recalcs[i]();
+};
+
+function isFixed(element) {
+  return element.currentStyle["ie7-position"] == "fixed";
+};
+
+// original style
+function getDefinedStyle(element, propertyName) {
+  return element.currentStyle[$IE7 + propertyName] || element.currentStyle[propertyName];
+};
+
+function setOverrideStyle(element, propertyName, value) {
+  if (element.currentStyle[$IE7 + propertyName] == null) {
+    element.runtimeStyle[$IE7 + propertyName] = element.currentStyle[propertyName];
+  }
+  element.runtimeStyle[propertyName] = value;
+};
+
+// create a temporary element which is used to inherit styles
+//  from the target element. the temporary element can be resized
+//  to determine pixel widths/heights
+function createTempElement(tagName) {
+  var element = document.createElement(tagName || "object");
+  element.style.cssText = "position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";
+  element.ie7_anon = true;
+  return element;
+};
+
+
+// =========================================================================
+// ie7-cssQuery.js
+// =========================================================================
+
+function cssQuery(selector, context, single) {
+  if (!_cache[selector]) {
+    reg = []; // store for RegExp objects
+    var fn = "";
+    var selectors = cssParser.escape(selector).split(",");
+    for (var i = 0; i < selectors.length; i++) {
+      _wild = _index = _list = 0; // reset
+      _duplicate = selectors.length > 1 ? 2 : 0; // reset
+      var block = cssParser.exec(selectors[i]) || "if(0){";
+      if (_wild) { // IE's pesky comment nodes
+        block += format("if(e%1.nodeName!='!'){", _index);
+      }
+      // check for duplicates before storing results
+      var store = _duplicate > 1 ? _TEST : "";
+      block += format(store + _STORE, _index);
+      // add closing braces
+      block += Array(match(block, /\{/g).length + 1).join("}");
+      fn += block;
+    }
+    eval(format(_FN, reg) + cssParser.unescape(fn) + "return s?null:r}");
+    _cache[selector] = _selectorFunction;
+  }
+  return _cache[selector](context || document, single);
+};
+
+var _MSIE5 = appVersion < 6;
+
+var _EVALUATED = /^(href|src)$/;
+var _ATTRIBUTES = {
+  "class": "className",
+  "for": "htmlFor"
+};
+
+IE7._indexed = 1;
+
+IE7._byId = function(document, id) {
+  var result = document.all[id] || null;
+  // returns a single element or a collection
+  if (!result || result.id == id) return result;
+  // document.all has returned a collection of elements with name/id
+  for (var i = 0; i < result.length; i++) {
+    if (result[i].id == id) return result[i];
+  }
+  return null;
+};
+
+IE7._getAttribute = function(element, name) {
+  if (name == "src" && element.pngSrc) return element.pngSrc;
+  
+  var attribute = _MSIE5 ? (element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]]) : element.getAttributeNode(name);
+  if (attribute && (attribute.specified || name == "value")) {
+    if (_EVALUATED.test(name)) {
+      return element.getAttribute(name, 2);
+    } else if (name == "class") {
+     return element.className.replace(/\sie7_\w+/g, "");
+    } else if (name == "style") {
+     return element.style.cssText;
+    } else {
+     return attribute.nodeValue;
+    }
+  }
+  return null;
+};
+
+var names = "colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";
+// Convert the list of strings to a hash, mapping the lowercase name to the camelCase name.
+extend(_ATTRIBUTES, combine(names.toLowerCase().split(","), names.split(",")));
+
+IE7._getNextElementSibling = function(node) {
+  // return the next element to the supplied element
+  //  nextSibling is not good enough as it might return a text or comment node
+  while (node && (node = node.nextSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+IE7._getPreviousElementSibling = function(node) {
+  // return the previous element to the supplied element
+  while (node && (node = node.previousSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+// =========================================================================
+// CSSParser
+// =========================================================================
+
+var IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g,
+    IMPLIED_SPACE =    /(^|,)([^\s>+~])/g,
+    WHITESPACE =       /\s*([\s>+~(),]|^|$)\s*/g,
+    WILD_CARD =        /\s\*\s/g;;
+
+var CSSParser = RegGrp.extend({
+  constructor: function(items) {
+    this.base(items);
+    this.sorter = new RegGrp;
+    this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE);
+    this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4");
+  },
+  
+  ignoreCase: true,
+
+  escape: function(selector) {
+    return this.optimise(this.format(selector));
+  },
+
+  format: function(selector) {
+    return selector
+      .replace(WHITESPACE, "$1")
+      .replace(IMPLIED_SPACE, "$1 $2")
+      .replace(IMPLIED_ASTERISK, "$1*$2");
+  },
+
+  optimise: function(selector) {
+    // optimise wild card descendant selectors
+    return this.sorter.exec(selector.replace(WILD_CARD, ">* "));
+  },
+
+  unescape: function(selector) {
+    return decode(selector);
+  }
+});
+
+// some constants
+var _OPERATORS = {
+  "":   "%1!=null",
+  "=":  "%1=='%2'",
+  "~=": /(^| )%1( |$)/,
+  "|=": /^%1(-|$)/,
+  "^=": /^%1/,
+  "$=": /%1$/,
+  "*=": /%1/
+};
+
+var _PSEUDO_CLASSES = {
+  "first-child": "!IE7._getPreviousElementSibling(e%1)",
+  "link":        "e%1.currentStyle['ie7-link']=='link'",
+  "visited":     "e%1.currentStyle['ie7-link']=='visited'"
+};
+
+var _VAR = "var p%2=0,i%2,e%2,n%2=e%1.";
+var _ID = "e%1.sourceIndex";
+var _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;";
+var _STORE = "r[r.length]=e%1;if(s)return e%1;";
+var _FN = "var _selectorFunction=function(e0,s){IE7._indexed++;var r=[],p={},reg=[%1],d=document;";
+var reg; // a store for RexExp objects
+var _index;
+var _wild; // need to flag certain _wild card selectors as MSIE includes comment nodes
+var _list; // are we processing a node _list?
+var _duplicate; // possible duplicates?
+var _cache = {}; // store parsed selectors
+
+// a hideous parser
+var cssParser = new CSSParser({
+  " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID
+    _wild = false;
+    var replacement = "var e%2=IE7._byId(d,'%4');if(e%2&&";
+    if (tagName != "*") replacement += "e%2.nodeName=='%3'&&";
+    replacement += "(e%1==d||e%1.contains(e%2))){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index++, _index, tagName.toUpperCase(), id);
+  },
+  
+  " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector
+    _duplicate++; // this selector may produce duplicates
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // IE5.x does not support getElementsByTagName("*");
+    replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  ">(\\*|[\\w-]+)": function(match, tagName) { // child selector
+    var children = _list;
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // use the children property for MSIE as it does not contain text nodes
+    //  (but the children collection still includes comments).
+    // the document object does not have a children collection
+    replacement += children ? "children": "childNodes";
+    if (!_wild && children) replacement += ".tags('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    if (_wild) {
+      replacement += "if(e%2.nodeType==1){";
+      _wild = _MSIE5;
+    } else {
+      if (!children) replacement += "if(e%2.nodeName=='%3'){";
+    }
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    replacement += "e%1=IE7._getNextElementSibling(e%1);if(e%1";
+    if (tagName != "*") replacement += "&&e%1.nodeName=='%2'";
+    replacement += "){";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    _duplicate = 2; // this selector may produce duplicates
+    replacement += "while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._indexed)break;if(";
+    if (tagName == "*") {
+      replacement += "e%1.nodeType==1";
+      if (_MSIE5) replacement += "&&e%1.nodeName!='!'";
+    } else replacement += "e%1.nodeName=='%2'";
+    replacement += "){e%1.ie7_adjacent=IE7._indexed;";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "#([\\w-]+)": function(match, id) { // ID selector
+    _wild = false;
+    var replacement = "if(e%1.id=='%2'){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index, id);
+  },
+  
+  "\\.([\\w-]+)": function(match, className) { // class selector
+    _wild = false;
+    // store RegExp objects - slightly faster on IE
+    reg.push(new RegExp("(^|\\s)" + rescape(className) + "(\\s|$)"));
+    return format("if(e%1.className&&reg[%2].test(e%1.className)){", _index, reg.length - 1);
+  },
+  
+  "\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]": function(match, attr, operator, value) { // attribute selectors
+    var alias = _ATTRIBUTES[attr] || attr;
+    if (operator) {
+      var getAttribute = "e%1.getAttribute('%2',2)";
+      if (!_EVALUATED.test(attr)) {
+        getAttribute = "e%1.%3||" + getAttribute;
+      }
+      attr = format("(" + getAttribute + ")", _index, attr, alias);
+    } else {
+      attr = format("IE7._getAttribute(e%1,'%2')", _index, attr);
+    }
+    var replacement = _OPERATORS[operator || ""] || "0";
+    if (replacement && replacement.source) {
+      reg.push(new RegExp(format(replacement.source, rescape(cssParser.unescape(value)))));
+      replacement = "reg[%2].test(%1)";
+      value = reg.length - 1;
+    }
+    return "if(" + format(replacement, attr, value) + "){";
+  },
+  
+  ":+([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // pseudo class selectors
+    pseudoClass = _PSEUDO_CLASSES[pseudoClass];
+    return "if(" + (pseudoClass ? format(pseudoClass, _index, args || "")  : "0") + "){";
+  }
+});
+
+// =========================================================================
+// ie7-css.js
+// =========================================================================
+
+var HYPERLINK = /a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;
+var BRACE1 = /\s*\{\s*/, BRACE2 = /\s*\}\s*/, COMMA = /\s*\,\s*/;
+var FIRST_LINE_LETTER = /(.*)(:first-(line|letter))/;
+
+//var UNKNOWN = /UNKNOWN|([:.])\w+\1/i;
+
+var styleSheets = document.styleSheets;
+
+IE7.CSS = new (Fix.extend({ // single instance
+  parser: new Parser,
+  screen: "",
+  print: "",
+  styles: [],
+  rules: [],
+  pseudoClasses: appVersion < 7 ? "first\\-child" : "",
+  dynamicPseudoClasses: {
+    toString: function() {
+      var strings = [];
+      for (var pseudoClass in this) strings.push(pseudoClass);
+      return strings.join("|");
+    }
+  },
+  
+  init: function() {
+    var NONE = "^\x01$";
+    var CLASS = "\\[class=?[^\\]]*\\]";
+    var pseudoClasses = [];
+    if (this.pseudoClasses) pseudoClasses.push(this.pseudoClasses);
+    var dynamicPseudoClasses = this.dynamicPseudoClasses.toString(); 
+    if (dynamicPseudoClasses) pseudoClasses.push(dynamicPseudoClasses);
+    pseudoClasses = pseudoClasses.join("|");
+    var unknown = appVersion < 7 ? ["[>+~[(]|([:.])\\w+\\1"] : [CLASS];
+    if (pseudoClasses) unknown.push(":(" + pseudoClasses + ")");
+    this.UNKNOWN = new RegExp(unknown.join("|") || NONE, "i");
+    var complex = appVersion < 7 ? ["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"] : [CLASS];
+    var complexRule = complex.concat();
+    if (pseudoClasses) complexRule.push(":(" + pseudoClasses + ")");
+    Rule.COMPLEX = new RegExp(complexRule.join("|") || NONE, "ig");
+    if (this.pseudoClasses) complex.push(":(" + this.pseudoClasses + ")");
+    DynamicRule.COMPLEX = new RegExp(complex.join("|") || NONE, "i");
+    DynamicRule.MATCH = new RegExp(dynamicPseudoClasses ? "(.*):(" + dynamicPseudoClasses + ")(.*)" : NONE, "i");
+    
+    this.createStyleSheet();
+    this.refresh();
+  },
+  
+	addEventHandler: function() {
+		addEventHandler.apply(null, arguments);
+	},
+  
+  addFix: function(expression, replacement) {
+    this.parser.add(expression, replacement);
+  },
+  
+  addRecalc: function(propertyName, test, handler, replacement) {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    test = new RegExp("([{;\\s])" + propertyName + "\\s*:\\s*" + test + "[^;}]*");
+    var id = this.recalcs.length;
+    if (replacement) replacement = propertyName + ":" + replacement;
+    this.addFix(test, function(match, $1) {
+      return (replacement ? $1 + replacement : match) + ";ie7-" + match.slice(1) + ";ie7_recalc" + id + ":1";
+    });
+    this.recalcs.push(arguments);
+    return id;
+  },
+  
+  apply: function() {
+    this.getInlineStyles();
+    new StyleSheet("screen");
+    this.trash();
+  },
+  
+  createStyleSheet: function() {
+    // create the IE7 style sheet
+    this.styleSheet = document.createStyleSheet();
+    // flag it so we can ignore it during parsing
+    this.styleSheet.ie7 = true;
+    this.styleSheet.owningElement.ie7 = true;
+    this.styleSheet.cssText = HEADER;
+  },
+  
+  getInlineStyles: function() {
+    // load inline styles
+    var styleSheets = document.getElementsByTagName("style"), styleSheet;
+    for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+      if (!styleSheet.disabled && !styleSheet.ie7) {
+        this.styles.push(styleSheet.innerHTML);
+      }
+    }
+  },
+  
+  getText: function(styleSheet, path) {
+    // explorer will trash unknown selectors (it converts them to "UNKNOWN").
+    // so we must reload external style sheets (internal style sheets can have their text
+    //  extracted through the innerHTML property).
+      // load the style sheet text from an external file
+    try {
+      var cssText = styleSheet.cssText;
+    } catch (e) {
+      cssText = "";
+    }
+    if (httpRequest) cssText = loadFile(styleSheet.href, path) || cssText;
+    return cssText;
+  },
+  
+  recalc: function() {
+    this.screen.recalc();
+    // we're going to read through all style rules.
+    //  certain rules have had ie7 properties added to them.
+    //   e.g. p{top:0; ie7_recalc2:1; left:0}
+    //  this flags a property in the rule as needing a fix.
+    //  the selector text is then used to query the document.
+    //  we can then loop through the results of the query
+    //  and fix the elements.
+    // we ignore the IE7 rules - so count them in the header
+    var RECALCS = /ie7_recalc\d+/g;
+    var start = HEADER.match(/[{,]/g).length;
+    // only calculate screen fixes. print fixes don't show up anyway
+    var stop = start + (this.screen.cssText.match(/\{/g)||"").length;
+    var rules = this.styleSheet.rules, rule;
+    var calcs, calc, elements, element, i, j, k, id;
+    // loop through all rules
+    for (i = start; i < stop; i++) {
+      rule = rules[i];
+      var cssText = rule.style.cssText;
+      // search for the "ie7_recalc" flag (there may be more than one)
+      if (rule && (calcs = cssText.match(RECALCS))) {
+        // use the selector text to query the document
+        elements = cssQuery(rule.selectorText);
+        // if there are matching elements then loop
+        //  through the recalc functions and apply them
+        //  to each element
+        if (elements.length) for (j = 0; j < calcs.length; j++) {
+          // get the matching flag (e.g. ie7_recalc3)
+          id = calcs[j];
+          // extract the numeric id from the end of the flag
+          //  and use it to index the collection of recalc
+          //  functions
+          calc = IE7.CSS.recalcs[id.slice(10)][2];
+          for (k = 0; (element = elements[k]); k++) {
+            // apply the fix
+            if (element.currentStyle[id]) calc(element, cssText);
+          }
+        }
+      }
+    }
+  },
+  
+  refresh: function() {
+    this.styleSheet.cssText = HEADER + this.screen + this.print;
+  },
+  
+  trash: function() {
+    // trash the old style sheets
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].ie7) {
+        try {
+          var cssText = styleSheets[i].cssText;
+        } catch (e) {
+          cssText = "";
+        }
+        if (cssText) styleSheets[i].cssText = "";
+      }
+    }
+  }
+}));
+
+// -----------------------------------------------------------------------
+//  IE7 StyleSheet class
+// -----------------------------------------------------------------------
+
+var StyleSheet = Base.extend({
+  constructor: function(media) {
+    this.media = media;
+    this.load();
+    IE7.CSS[media] = this;
+    IE7.CSS.refresh();
+  },
+  
+  createRule: function(selector, cssText) {
+    if (IE7.CSS.UNKNOWN.test(selector)) {
+      var match;
+      if (PseudoElement && (match = selector.match(PseudoElement.MATCH))) {
+        return new PseudoElement(match[1], match[2], cssText);
+      } else if (match = selector.match(DynamicRule.MATCH)) {
+        if (!HYPERLINK.test(match[0]) || DynamicRule.COMPLEX.test(match[0])) {
+          return new DynamicRule(selector, match[1], match[2], match[3], cssText);
+        }
+      } else return new Rule(selector, cssText);
+    }
+    return selector + " {" + cssText + "}";
+  },
+  
+  getText: function() {
+    // store for style sheet text
+    var _inlineStyles = [].concat(IE7.CSS.styles);
+    // parse media decalarations
+    var MEDIA = /@media\s+([^{]*)\{([^@]+\})\s*\}/gi;
+    var ALL = /\ball\b|^$/i, SCREEN = /\bscreen\b/i, PRINT = /\bprint\b/i;
+    function _parseMedia(cssText, media) {
+      _filterMedia.value = media;
+      return cssText.replace(MEDIA, _filterMedia);
+    };
+    function _filterMedia(match, media, cssText) {
+      media = _simpleMedia(media);
+      switch (media) {
+        case "screen":
+        case "print":
+          if (media != _filterMedia.value) return "";
+        case "all":
+          return cssText;
+      }
+      return "";
+    };
+    function _simpleMedia(media) {
+      if (ALL.test(media)) return "all";
+      else if (SCREEN.test(media)) return (PRINT.test(media)) ? "all" : "screen";
+      else if (PRINT.test(media)) return "print";
+    };
+    var self = this;
+    function _getCSSText(styleSheet, path, media, level) {
+      var cssText = "";
+      if (!level) {
+        media = _simpleMedia(styleSheet.media);
+        level = 0;
+      }
+      if (media == "all" || media == self.media) {
+        // IE only allows importing style sheets three levels deep.
+        // it will crash if you try to access a level below this
+        if (level < 3) {
+          // loop through imported style sheets
+          for (var i = 0; i < styleSheet.imports.length; i++) {
+            // call this function recursively to get all imported style sheets
+            cssText += _getCSSText(styleSheet.imports[i], getPath(styleSheet.href, path), media, level + 1);
+          }
+        }
+        // retrieve inline style or load an external style sheet
+        cssText += encode(styleSheet.href ? _loadStyleSheet(styleSheet, path) : _inlineStyles.pop() || "");
+        cssText = _parseMedia(cssText, self.media);
+      }
+      return cssText;
+    };
+    // store loaded cssText URLs
+    var fileCache = {};
+    // load an external style sheet
+    function _loadStyleSheet(styleSheet, path) {
+      var url = makePath(styleSheet.href, path);
+      // if the style sheet has already loaded then don't duplicate it
+      if (fileCache[url]) return "";
+      // load from source
+      fileCache[url] = (styleSheet.disabled) ? "" :
+        _fixUrls(IE7.CSS.getText(styleSheet, path), getPath(styleSheet.href, path));
+      return fileCache[url];
+    };
+    // fix css paths
+    // we're lumping all css text into one big style sheet so relative
+    //  paths have to be fixed. this is necessary anyway because of other
+    //  explorer bugs.
+    var URL = /(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;
+    function _fixUrls(cssText, pathname) {
+      // hack & slash
+      return cssText.replace(URL, "$1" + pathname.slice(0, pathname.lastIndexOf("/") + 1) + "$2");
+    };
+
+    // load all style sheets in the document
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].disabled && !styleSheets[i].ie7) {
+        this.cssText += _getCSSText(styleSheets[i]);
+      }
+    }
+  },
+  
+  load: function() {
+    this.cssText = "";
+    this.getText();
+    this.parse();
+    this.cssText = decode(this.cssText);
+    fileCache = {};
+  },
+  
+  parse: function() {
+    this.cssText = IE7.CSS.parser.exec(this.cssText);
+    
+    // parse the style sheet
+    var offset = IE7.CSS.rules.length;
+    var rules = this.cssText.split(BRACE2), rule;
+    var selectors, cssText, i, j;
+    for (i = 0; i < rules.length; i++) {
+      rule = rules[i].split(BRACE1);
+      selectors = rule[0].split(COMMA);
+      cssText = rule[1];
+      for (j = 0; j < selectors.length; j++) {
+        selectors[j] = cssText ? this.createRule(selectors[j], cssText) : "";
+      }
+      rules[i] = selectors.join("\n");
+    }
+    this.cssText = rules.join("\n");
+    this.rules = IE7.CSS.rules.slice(offset);
+  },
+  
+  recalc: function() {
+    var rule, i;
+    for (i = 0; (rule = this.rules[i]); i++) rule.recalc();
+  },
+  
+  toString: function() {
+    return "@media " + this.media + "{" + this.cssText + "}";
+  }
+});
+
+var PseudoElement;
+
+// -----------------------------------------------------------------------
+// IE7 style rules
+// -----------------------------------------------------------------------
+
+var Rule = IE7.Rule = Base.extend({
+  // properties
+  constructor: function(selector, cssText) {
+    this.id = IE7.CSS.rules.length;
+    this.className = Rule.PREFIX + this.id;
+    selector = selector.match(FIRST_LINE_LETTER) || selector || "*";
+    this.selector = selector[1] || selector;
+    this.selectorText = this.parse(this.selector) + (selector[2] || "");
+    this.cssText = cssText;
+    this.MATCH = new RegExp("\\s" + this.className + "(\\s|$)", "g");
+    IE7.CSS.rules.push(this);
+    this.init();
+  },
+  
+  init: Undefined,
+  
+  add: function(element) {
+    // allocate this class
+    element.className += " " + this.className;
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var match = cssQuery(this.selector);
+    // add the class name for all matching elements
+    for (var i = 0; i < match.length; i++) this.add(match[i]);
+  },
+
+  parse: function(selector) {
+    // attempt to preserve specificity for "loose" parsing by
+    //  removing unknown tokens from a css selector but keep as
+    //  much as we can..
+    var simple = selector.replace(Rule.CHILD, " ").replace(Rule.COMPLEX, "");
+    if (appVersion < 7) simple = simple.replace(Rule.MULTI, "");
+    var tags = match(simple, Rule.TAGS).length - match(selector, Rule.TAGS).length;
+    var classes = match(simple, Rule.CLASSES).length - match(selector, Rule.CLASSES).length + 1;
+    while (classes > 0 && Rule.CLASS.test(simple)) {
+      simple = simple.replace(Rule.CLASS, "");
+      classes--;
+    }
+    while (tags > 0 && Rule.TAG.test(simple)) {
+      simple = simple.replace(Rule.TAG, "$1*");
+      tags--;
+    }
+    simple += "." + this.className;
+    classes = Math.min(classes, 2);
+    tags = Math.min(tags, 2);
+    var score = -10 * classes - tags;
+    if (score > 0) {
+      simple = simple + "," + Rule.MAP[score] + " " + simple;
+    }
+    return simple;
+  },
+  
+  remove: function(element) {
+    // deallocate this class
+    element.className = element.className.replace(this.MATCH, "$1");
+  },
+  
+  toString: function() {
+    return format("%1 {%2}", this.selectorText, this.cssText);
+  }
+}, {
+  CHILD: />/g,
+  CLASS: /\.[\w-]+/,
+  CLASSES: /[.:\[]/g,
+  MULTI: /(\.[\w-]+)+/g,
+  PREFIX: "ie7_class",
+  TAG: /^\w+|([\s>+~])\w+/,
+  TAGS: /^\w|[\s>+~]\w/g,
+  MAP: {
+    1:  "html",
+    2:  "html body",
+    10: ".ie7_html",
+    11: "html.ie7_html",
+    12: "html.ie7_html body",
+    20: ".ie7_html .ie7_body",
+    21: "html.ie7_html .ie7_body",
+    22: "html.ie7_html body.ie7_body"
+  }
+});
+
+// -----------------------------------------------------------------------
+// IE7 dynamic style
+// -----------------------------------------------------------------------
+
+// object properties:
+// attach: the element that an event handler will be attached to
+// target: the element that will have the IE7 class applied
+
+var DynamicRule = Rule.extend({
+  // properties
+  constructor: function(selector, attach, dynamicPseudoClass, target, cssText) {
+    // initialise object properties
+    this.attach = attach || "*";
+    this.dynamicPseudoClass = IE7.CSS.dynamicPseudoClasses[dynamicPseudoClass];
+    this.target = target;
+    this.base(selector, cssText);
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var attaches = cssQuery(this.attach), attach;
+    // process results
+    for (var i = 0; attach = attaches[i]; i++) {
+      // retrieve the event handler's target element(s)
+      var target = this.target ? cssQuery(this.target, attach) : [attach];
+      // attach event handlers for dynamic pseudo-classes
+      if (target.length) this.dynamicPseudoClass.apply(attach, target, this);
+    }
+  }
+});
+
+// -----------------------------------------------------------------------
+//  IE7 dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var DynamicPseudoClass = Base.extend({
+  constructor: function(name, apply) {
+    this.name = name;
+    this.apply = apply;
+    this.instances = {};
+    IE7.CSS.dynamicPseudoClasses[name] = this;
+  },
+  
+  register: function(instance) {
+    // an "instance" is actually an Arguments object
+    var _class = instance[2];
+    instance.id = _class.id + instance[0].uniqueID;
+    if (!this.instances[instance.id]) {
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.add(target[j]);
+      this.instances[instance.id] = instance;
+    }
+  },
+  
+  unregister: function(instance) {
+    if (this.instances[instance.id]) {
+      var _class = instance[2];
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.remove(target[j]);
+      delete this.instances[instance.id];
+    }
+  }
+});
+  
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+if (appVersion < 7) {
+  var Hover = new DynamicPseudoClass("hover", function(element) {
+    var instance = arguments;
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseover" : "onmouseenter", function() {
+      Hover.register(instance);
+    });
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseout" : "onmouseleave", function() {
+      Hover.unregister(instance);
+    });
+  });
+  
+  // globally trap the mouseup event (thanks Martijn!)
+  addEventHandler(document, "onmouseup", function() {
+    var instances = Hover.instances;
+    for (var i in instances)
+      if (!instances[i][0].contains(event.srcElement))
+        Hover.unregister(instances[i]);
+  });
+}
+
+// -----------------------------------------------------------------------
+// propertyName: inherit;
+// -----------------------------------------------------------------------
+
+IE7.CSS.addRecalc("[\\w-]+", "inherit", function(element, cssText) {
+  var inherited = cssText.match(/[\w-]+\s*:\s*inherit/g);
+  for (var i = 0; i < inherited.length; i++) {
+    var propertyName = inherited[i].replace(/ie7\-|\s*:\s*inherit/g, "").replace(/\-([a-z])/g, function(match, chr) {
+      return chr.toUpperCase()
+    });
+    element.runtimeStyle[propertyName] = element.parentElement.currentStyle[propertyName];
+  }
+});
+
+// =========================================================================
+// ie7-html.js
+// =========================================================================
+
+// default font-sizes
+//HEADER += "h1{font-size:2em}h2{font-size:1.5em;}h3{font-size:1.17em;}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.67em}";
+
+IE7.HTML = new (Fix.extend({ // single instance  
+  fixed: {},
+  
+  init: Undefined,
+  
+  addFix: function() {
+    // fixes are a one-off, they are applied when the document is loaded
+    this.fixes.push(arguments);
+  },
+  
+  apply: function() {
+    for (var i = 0; i < this.fixes.length; i++) {
+      var match = cssQuery(this.fixes[i][0]);
+      var fix = this.fixes[i][1];
+      for (var j = 0; j < match.length; j++) fix(match[j]);
+    }
+  },
+  
+  addRecalc: function() {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    this.recalcs.push(arguments);
+  },
+  
+  recalc: function() {
+    // loop through the fixes
+    for (var i = 0; i < this.recalcs.length; i++) {
+      var match = cssQuery(this.recalcs[i][0]);
+      var recalc = this.recalcs[i][1], element;
+      var key = Math.pow(2, i);
+      for (var j = 0; (element = match[j]); j++) {
+        var uniqueID = element.uniqueID;
+        if ((this.fixed[uniqueID] & key) == 0) {
+          element = recalc(element) || element;
+          this.fixed[uniqueID] |= key;
+        }
+      }
+    }
+  }
+}));
+
+if (appVersion < 7) {  
+  // provide support for the <abbr> tag.
+  //  this is a proper fix, it preserves the DOM structure and
+  //  <abbr> elements report the correct tagName & namespace prefix
+  document.createElement("abbr");
+  
+  // bind to the first child control
+  IE7.HTML.addRecalc("label", function(label) {
+    if (!label.htmlFor) {
+      var firstChildControl = cssQuery("input,textarea", label, true);
+      if (firstChildControl) {
+        addEventHandler(label, "onclick", function() {
+          firstChildControl.click();
+        });
+      }
+    }
+  });
+}
+
+// =========================================================================
+// ie7-layout.js
+// =========================================================================
+
+var NUMERIC = "[.\\d]";
+
+new function(_) {
+var layout = IE7.Layout = this;
+
+  // big, ugly box-model hack + min/max stuff
+  
+  // #tantek > #erik > #dean { voice-family: hacker; }
+  
+  // -----------------------------------------------------------------------
+  // "layout"
+  // -----------------------------------------------------------------------
+  
+  HEADER += "*{boxSizing:content-box}";
+  
+  // does an element have "layout" ?
+  IE7.hasLayout = appVersion < 5.5 ? function(element) {
+    // element.currentStyle.hasLayout doesn't work for IE5.0
+    return element.clientWidth;
+  } : function(element) {
+    return element.currentStyle.hasLayout;
+  };
+  
+  // give an element "layout"
+  layout.boxSizing = function(element) {
+    if (!IE7.hasLayout(element)) {
+    //#  element.runtimeStyle.fixedHeight =
+      element.style.height = "0cm";
+      if (element.currentStyle.verticalAlign == "auto")
+        element.runtimeStyle.verticalAlign = "top";
+      // when an element acquires "layout", margins no longer collapse correctly
+      collapseMargins(element);
+    }
+  };
+  
+  // -----------------------------------------------------------------------
+  // Margin Collapse
+  // -----------------------------------------------------------------------
+  
+  function collapseMargins(element) {
+    if (element != viewport && element.currentStyle.position != "absolute") {
+      collapseMargin(element, "marginTop");
+      collapseMargin(element, "marginBottom");
+    }
+  };
+  
+  function collapseMargin(element, type) {
+    if (!element.runtimeStyle[type]) {
+      var parentElement = element.parentElement;
+      if (parentElement && IE7.hasLayout(parentElement) && !IE7[type == "marginTop" ? "_getPreviousElementSibling" : "_getNextElementSibling"](element)) return;
+      var child = cssQuery(">*:" + (type == "marginTop" ? "first" : "last") + "-child", element, true);
+      if (child && child.currentStyle.styleFloat == "none" && IE7.hasLayout(child)) {
+        collapseMargin(child, type);
+        margin = _getMargin(element, element.currentStyle[type]);
+        childMargin = _getMargin(child, child.currentStyle[type]);
+        if (margin < 0 || childMargin < 0) {
+          element.runtimeStyle[type] = margin + childMargin;
+        } else {
+          element.runtimeStyle[type] = Math.max(childMargin, margin);
+        }
+        child.runtimeStyle[type] = "0px";
+      }
+    }
+  };
+  
+  function _getMargin(element, value) {
+    return value == "auto" ? 0 : getPixelValue(element, value);
+  };
+  
+  // -----------------------------------------------------------------------
+  // box-model
+  // -----------------------------------------------------------------------
+  
+  // constants
+  var UNIT = /^[.\d][\w%]*$/, AUTO = /^(auto|0cm)$/;
+  
+  var applyWidth, applyHeight;
+  IE7.Layout.borderBox = function(element){
+    applyWidth(element);
+    applyHeight(element);
+  };
+  
+  var fixWidth = function(HEIGHT) {
+    applyWidth = function(element) {
+      if (!PERCENT.test(element.currentStyle.width)) fixWidth(element);
+      collapseMargins(element);
+    };
+  
+    function fixWidth(element, value) {
+      if (!element.runtimeStyle.fixedWidth) {
+        if (!value) value = element.currentStyle.width;
+        element.runtimeStyle.fixedWidth = (UNIT.test(value)) ? Math.max(0, getFixedWidth(element, value)) : value;
+        setOverrideStyle(element, "width", element.runtimeStyle.fixedWidth);
+      }
+    };
+  
+    function layoutWidth(element) {
+      if (!isFixed(element)) {
+        var layoutParent = element.offsetParent;
+        while (layoutParent && !IE7.hasLayout(layoutParent)) layoutParent = layoutParent.offsetParent;
+      }
+      return (layoutParent || viewport).clientWidth;
+    };
+  
+    function getPixelWidth(element, value) {
+      if (PERCENT.test(value)) return parseInt(parseFloat(value) / 100 * layoutWidth(element));
+      return getPixelValue(element, value);
+    };
+  
+    var getFixedWidth = function(element, value) {
+      var borderBox = element.currentStyle["box-sizing"] == "border-box";
+      var adjustment = 0;
+      if (quirksMode && !borderBox)
+        adjustment += getBorderWidth(element) + getWidth(element, "padding");
+      else if (!quirksMode && borderBox)
+        adjustment -= getBorderWidth(element) + getWidth(element, "padding");
+      return getPixelWidth(element, value) + adjustment;
+    };
+  
+    // easy way to get border thickness for elements with "layout"
+    function getBorderWidth(element) {
+      return element.offsetWidth - element.clientWidth;
+    };
+  
+    // have to do some pixel conversion to get padding/margin thickness :-(
+    function getWidth(element, type) {
+      return getPixelWidth(element, element.currentStyle[type + "Left"]) + getPixelWidth(element, element.currentStyle[type + "Right"]);
+    };
+  
+    // -----------------------------------------------------------------------
+    // min/max
+    // -----------------------------------------------------------------------
+  
+    HEADER += "*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";
+  
+    // handle min-width property
+    layout.minWidth = function(element) {
+      // IE6 supports min-height so we frig it here
+      //#if (element.currentStyle.minHeight == "auto") element.runtimeStyle.minHeight = 0;
+      if (element.currentStyle["min-width"] != null) {
+        element.style.minWidth = element.currentStyle["min-width"];
+      }
+      if (register(arguments.callee, element, element.currentStyle.minWidth != "none")) {
+        layout.boxSizing(element);
+        fixWidth(element);
+        resizeWidth(element);
+      }
+    };
+    
+    // clone the minWidth function to make a maxWidth function
+    eval("IE7.Layout.maxWidth=" + String(layout.minWidth).replace(/min/g, "max"));
+    
+    // apply min/max restrictions
+    function resizeWidth(element) {
+      // check boundaries
+      var rect = element.getBoundingClientRect();
+      var width = rect.right - rect.left;
+  
+      if (element.currentStyle.minWidth != "none" && width <= getFixedWidth(element, element.currentStyle.minWidth)) {
+        element.runtimeStyle.width = element.currentStyle.minWidth;
+      } else if (element.currentStyle.maxWidth != "none" && width >= getFixedWidth(element, element.currentStyle.maxWidth)) {
+        element.runtimeStyle.width = element.currentStyle.maxWidth;
+      } else {
+        element.runtimeStyle.width = element.runtimeStyle.fixedWidth; // || "auto";
+      }
+    };
+  
+    // -----------------------------------------------------------------------
+    // right/bottom
+    // -----------------------------------------------------------------------
+  
+    function fixRight(element) {
+      if (register(fixRight, element, /^(fixed|absolute)$/.test(element.currentStyle.position) &&
+        getDefinedStyle(element, "left") != "auto" &&
+        getDefinedStyle(element, "right") != "auto" &&
+        AUTO.test(getDefinedStyle(element, "width")))) {
+          resizeRight(element);
+          IE7.Layout.boxSizing(element);
+      }
+    };
+    IE7.Layout.fixRight = fixRight;
+  
+    function resizeRight(element) {
+      var left = getPixelWidth(element, element.runtimeStyle._left || element.currentStyle.left);
+      var width = layoutWidth(element) - getPixelWidth(element, element.currentStyle.right) -  left - getWidth(element, "margin");
+      if (parseInt(element.runtimeStyle.width) == width) return;
+      element.runtimeStyle.width = "";
+      if (isFixed(element) || HEIGHT || element.offsetWidth < width) {
+        if (!quirksMode) width -= getBorderWidth(element) + getWidth(element, "padding");
+        if (width < 0) width = 0;
+        element.runtimeStyle.fixedWidth = width;
+        setOverrideStyle(element, "width", width);
+      }
+    };
+  
+  // -----------------------------------------------------------------------
+  // window.onresize
+  // -----------------------------------------------------------------------
+  
+    // handle window resize
+    var clientWidth = 0;
+    addResize(function() {
+      if (!viewport) return;
+      var i, wider = (clientWidth < viewport.clientWidth);
+      clientWidth = viewport.clientWidth;
+      // resize elements with "min-width" set
+      var elements = layout.minWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.minWidth));
+        if (wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider == fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "max-width" set
+      var elements = layout.maxWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.maxWidth));
+        if (!wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider != fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "right" set
+      for (i in fixRight.elements) resizeRight(fixRight.elements[i]);
+    });
+  
+  // -----------------------------------------------------------------------
+  // fix CSS
+  // -----------------------------------------------------------------------
+    if (quirksMode) {
+      IE7.CSS.addRecalc("width", NUMERIC, applyWidth);
+    }
+    if (appVersion < 7) {
+      IE7.CSS.addRecalc("min-width", NUMERIC, layout.minWidth);
+      IE7.CSS.addRecalc("max-width", NUMERIC, layout.maxWidth);
+      IE7.CSS.addRecalc("right", NUMERIC, fixRight);
+    }
+  };
+  
+  eval("var fixHeight=" + rotate(fixWidth));
+  
+  // apply box-model + min/max fixes
+  fixWidth();
+  fixHeight(true);
+};
+
+// =========================================================================
+// ie7-graphics.js
+// =========================================================================
+
+// a small transparent image used as a placeholder
+var BLANK_GIF = makePath("blank.gif", path);
+
+var ALPHA_IMAGE_LOADER = "DXImageTransform.Microsoft.AlphaImageLoader";
+var PNG_FILTER = "progid:" + ALPHA_IMAGE_LOADER + "(src='%1',sizingMethod='%2')";
+  
+// regular expression version of the above
+var PNG;
+
+var filtered = [];
+
+function fixImage(element) {
+  if (PNG.test(element.src)) {
+    // we have to preserve width and height
+    var image = new Image(element.width, element.height);
+    image.onload = function() {
+      element.width = image.width;
+      element.height = image.height;
+      image = null;
+    };
+    image.src = element.src;
+    // store the original url (we'll put it back when it's printed)
+    element.pngSrc = element.src;
+    // add the AlphaImageLoader thingy
+    addFilter(element);
+  }
+};
+
+if (appVersion >= 5.5 && appVersion < 7) {
+  // ** IE7 VARIABLE
+  // e.g. only apply the hack to files ending in ".png"
+  // IE7_PNG_SUFFIX = ".png";
+
+  // replace background(-image): url(..) ..  with background(-image): .. ;filter: ..;
+  IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/, function(match, $1, $2, url, $4) {
+    url = getString(url);
+    return PNG.test(url) ? "filter:" + format(PNG_FILTER, url, "crop") +
+      ";zoom:1;background" + ($1||"") + ":" + ($2||"") + "none" + ($4||"") : match;
+  });
+  
+  // -----------------------------------------------------------------------
+  //  fix PNG transparency (HTML images)
+  // -----------------------------------------------------------------------
+
+  IE7.HTML.addRecalc("img,input", function(element) {
+    if (element.tagName == "INPUT" && element.type != "image") return;
+    fixImage(element);
+    addEventHandler(element, "onpropertychange", function() {
+      if (!printing && event.propertyName == "src" &&
+        element.src.indexOf(BLANK_GIF) == -1) fixImage(element);
+    });
+  });
+
+  // assume that background images should not be printed
+  //  (if they are not transparent then they'll just obscure content)
+  // but we'll put foreground images back...
+  var printing = false;
+  addEventHandler(window, "onbeforeprint", function() {
+    printing = true;
+    for (var i = 0; i < filtered.length; i++) removeFilter(filtered[i]);
+  });
+  addEventHandler(window, "onafterprint", function() {
+    for (var i = 0; i < filtered.length; i++) addFilter(filtered[i]);
+    printing = false;
+  });
+}
+
+// apply a filter
+function addFilter(element, sizingMethod) {
+  var filter = element.filters[ALPHA_IMAGE_LOADER];
+  if (filter) {
+    filter.src = element.src;
+    filter.enabled = true;
+  } else {
+    element.runtimeStyle.filter = format(PNG_FILTER, element.src, sizingMethod || "scale");
+    filtered.push(element);
+  }
+  // remove the real image
+  element.src = BLANK_GIF;
+};
+
+function removeFilter(element) {
+  element.src = element.pngSrc;
+  element.filters[ALPHA_IMAGE_LOADER].enabled = false;
+};
+
+// =========================================================================
+// ie7-fixed.js
+// =========================================================================
+
+new function(_) {
+  if (appVersion >= 7) return;
+  
+  // some things to consider for this hack.
+  // the document body requires a fixed background. even if
+  //  it is just a blank image.
+  // you have to use setExpression instead of onscroll, this
+  //  together with a fixed body background helps avoid the
+  //  annoying screen flicker of other solutions.
+  
+  IE7.CSS.addRecalc("position", "fixed", _positionFixed, "absolute");
+  IE7.CSS.addRecalc("background(-attachment)?", "[^};]*fixed", _backgroundFixed);
+  
+  // scrolling is relative to the documentElement (HTML tag) when in
+  //  standards mode, otherwise it's relative to the document body
+  var $viewport = quirksMode ? "body" : "documentElement";
+  
+  function _fixBackground() {
+    // this is required by both position:fixed and background-attachment:fixed.
+    // it is necessary for the document to also have a fixed background image.
+    // we can fake this with a blank image if necessary
+    if (body.currentStyle.backgroundAttachment != "fixed") {
+      if (body.currentStyle.backgroundImage == "none") {
+        body.runtimeStyle.backgroundRepeat = "no-repeat";
+        body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy
+      }
+      body.runtimeStyle.backgroundAttachment = "fixed";
+    }
+    _fixBackground = Undefined;
+  };
+  
+  var _tmp = createTempElement("img");
+  
+  function _isFixed(element) {
+    return element ? isFixed(element) || _isFixed(element.parentElement) : false;
+  };
+  
+  function _setExpression(element, propertyName, expression) {
+    setTimeout("document.all." + element.uniqueID + ".runtimeStyle.setExpression('" + propertyName + "','" + expression + "')", 0);
+  };
+  
+  // -----------------------------------------------------------------------
+  //  backgroundAttachment: fixed
+  // -----------------------------------------------------------------------
+  
+  function _backgroundFixed(element) {
+    if (register(_backgroundFixed, element, element.currentStyle.backgroundAttachment == "fixed" && !element.contains(body))) {
+      _fixBackground();
+      bgLeft(element);
+      bgTop(element);
+      _backgroundPosition(element);
+    }
+  };
+  
+  function _backgroundPosition(element) {
+    _tmp.src = element.currentStyle.backgroundImage.slice(5, -2);
+    var parentElement = element.canHaveChildren ? element : element.parentElement;
+    parentElement.appendChild(_tmp);
+    setOffsetLeft(element);
+    setOffsetTop(element);
+    parentElement.removeChild(_tmp);
+  };
+  
+  function bgLeft(element) {
+    element.style.backgroundPositionX = element.currentStyle.backgroundPositionX;
+    if (!_isFixed(element)) {
+      _setExpression(element, "backgroundPositionX", "(parseInt(runtimeStyle.offsetLeft)+document." + $viewport + ".scrollLeft)||0");
+    }
+  };
+  eval(rotate(bgLeft));
+  
+  function setOffsetLeft(element) {
+    var propertyName = _isFixed(element) ? "backgroundPositionX" : "offsetLeft";
+    element.runtimeStyle[propertyName] =
+      getOffsetLeft(element, element.style.backgroundPositionX) -
+      element.getBoundingClientRect().left - element.clientLeft + 2;
+  };
+  eval(rotate(setOffsetLeft));
+  
+  function getOffsetLeft(element, position) {
+    switch (position) {
+      case "left":
+      case "top":
+        return 0;
+      case "right":
+      case "bottom":
+        return viewport.clientWidth - _tmp.offsetWidth;
+      case "center":
+        return (viewport.clientWidth - _tmp.offsetWidth) / 2;
+      default:
+        if (PERCENT.test(position)) {
+          return parseInt((viewport.clientWidth - _tmp.offsetWidth) * parseFloat(position) / 100);
+        }
+        _tmp.style.left = position;
+        return _tmp.offsetLeft;
+    }
+  };
+  eval(rotate(getOffsetLeft));
+  
+  // -----------------------------------------------------------------------
+  //  position: fixed
+  // -----------------------------------------------------------------------
+  
+  function _positionFixed(element) {
+    if (register(_positionFixed, element, isFixed(element))) {
+      setOverrideStyle(element, "position",  "absolute");
+      setOverrideStyle(element, "left",  element.currentStyle.left);
+      setOverrideStyle(element, "top",  element.currentStyle.top);
+      _fixBackground();
+      IE7.Layout.fixRight(element);
+      _foregroundPosition(element);
+    }
+  };
+  
+  function _foregroundPosition(element, recalc) {
+    positionTop(element, recalc);
+    positionLeft(element, recalc, true);
+    if (!element.runtimeStyle.autoLeft && element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.right != "auto") {
+      var left = viewport.clientWidth - getPixelWidth(element, element.currentStyle.right) -
+        getPixelWidth(element, element.runtimeStyle._left) - element.clientWidth;
+      if (element.currentStyle.marginRight == "auto") left = parseInt(left / 2);
+      if (_isFixed(element.offsetParent)) element.runtimeStyle.pixelLeft += left;
+      else element.runtimeStyle.shiftLeft = left;
+    }
+    clipWidth(element);
+    clipHeight(element);
+  };
+
+  function clipWidth(element) {
+    var fixWidth = element.runtimeStyle.fixWidth;
+    element.runtimeStyle.borderRightWidth = "";
+    element.runtimeStyle.width = fixWidth ? getPixelWidth(element, fixWidth) : "";
+    if (element.currentStyle.width != "auto") {
+      var rect = element.getBoundingClientRect();
+      var width = element.offsetWidth - viewport.clientWidth + rect.left - 2;
+      if (width >= 0) {
+        element.runtimeStyle.borderRightWidth = "0px";
+        width = Math.max(getPixelValue(element, element.currentStyle.width) - width, 0);
+        setOverrideStyle(element, "width",  width);
+        return width;
+      }
+    }
+  };
+  eval(rotate(clipWidth));
+  
+  function positionLeft(element, recalc) {
+    // if the element's width is in % units then it must be recalculated
+    //  with respect to the viewport
+    if (!recalc && PERCENT.test(element.currentStyle.width)) {
+      element.runtimeStyle.fixWidth = element.currentStyle.width;
+    }
+    if (element.runtimeStyle.fixWidth) {
+      element.runtimeStyle.width = getPixelWidth(element, element.runtimeStyle.fixWidth);
+    }
+    //if (recalc) {
+    //  // if the element is fixed on the right then no need to recalculate
+    //  if (!element.runtimeStyle.autoLeft) return;
+    //} else {
+      element.runtimeStyle.shiftLeft = 0;
+      element.runtimeStyle._left = element.currentStyle.left;
+      // is the element fixed on the right?
+      element.runtimeStyle.autoLeft = element.currentStyle.right != "auto" &&
+        element.currentStyle.left == "auto";
+    //}
+    // reset the element's "left" value and get it's natural position
+    element.runtimeStyle.left = "";
+    element.runtimeStyle.screenLeft = getScreenLeft(element);
+    element.runtimeStyle.pixelLeft = element.runtimeStyle.screenLeft;
+    // if the element is contained by another fixed element then there is no need to
+    //  continually recalculate it's left position
+    if (!recalc && !_isFixed(element.offsetParent)) {
+      // onsrcoll produces jerky movement, so we use an expression
+      _setExpression(element, "pixelLeft", "runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document." + $viewport + ".scrollLeft");
+    }
+  };
+  // clone this function so we can do "top"
+  eval(rotate(positionLeft));
+  
+  // I've forgotten how this works...
+  function getScreenLeft(element) { // thanks to kevin newman (captainn)
+    var screenLeft = element.offsetLeft, nested = 1;
+    if (element.runtimeStyle.autoLeft) {
+      screenLeft = viewport.clientWidth - element.offsetWidth - getPixelWidth(element, element.currentStyle.right);
+    }
+    // accommodate margins
+    if (element.currentStyle.marginLeft != "auto") {
+      screenLeft -= getPixelWidth(element, element.currentStyle.marginLeft);
+    }
+    while (element = element.offsetParent) {
+      if (element.currentStyle.position != "static") nested = -1;
+      screenLeft += element.offsetLeft * nested;
+    }
+    return screenLeft;
+  };
+  eval(rotate(getScreenLeft));
+  
+  function getPixelWidth(element, value) {
+    return PERCENT.test(value) ? parseInt(parseFloat(value) / 100 * viewport.clientWidth) : getPixelValue(element, value);
+  };
+  eval(rotate(getPixelWidth));
+  
+  // -----------------------------------------------------------------------
+  //  capture window resize
+  // -----------------------------------------------------------------------
+  
+  function _resize() {
+    // if the window has been resized then some positions need to be
+    //  recalculated (especially those aligned to "right" or "top"
+    var elements = _backgroundFixed.elements;
+    for (var i in elements) _backgroundPosition(elements[i]);
+    elements = _positionFixed.elements;
+    for (i in elements) {
+      _foregroundPosition(elements[i], true);
+      // do this twice to be sure - hackish, I know :-)
+      _foregroundPosition(elements[i], true);
+    }
+    _timer = 0;
+  };
+  
+  // use a timer for some reason.
+  //  (sometimes this is a good way to prevent resize loops)
+  var _timer;
+  addResize(function() {
+    if (!_timer) _timer = setTimeout(_resize, 0);
+  });
+};
+
+// =========================================================================
+// ie7-oveflow.js
+// =========================================================================
+
+/* ---------------------------------------------------------------------
+
+  This module alters the structure of the document.
+  It may adversely affect other CSS rules. Be warned.
+
+--------------------------------------------------------------------- */
+
+var WRAPPER_STYLE = {
+  backgroundColor: "transparent",
+  backgroundImage: "none",
+  backgroundPositionX: null,
+  backgroundPositionY: null,
+  backgroundRepeat: null,
+  borderTopWidth: 0,
+  borderRightWidth: 0,
+  borderBottomWidth: 0,
+  borderLeftStyle: "none",
+  borderTopStyle: "none",
+  borderRightStyle: "none",
+  borderBottomStyle: "none",
+  borderLeftWidth: 0,
+  height: null,
+  marginTop: 0,
+  marginBottom: 0,
+  marginRight: 0,
+  marginLeft: 0,
+  width: "100%"
+};
+
+IE7.CSS.addRecalc("overflow", "visible", function(element) {
+  // don't do this again
+  if (element.parentNode.ie7_wrapped) return;
+
+  // if max-height is applied, makes sure it gets applied first
+  if (IE7.Layout && element.currentStyle["max-height"] != "auto") {
+    IE7.Layout.maxHeight(element);
+  }
+
+  if (element.currentStyle.marginLeft == "auto") element.style.marginLeft = 0;
+  if (element.currentStyle.marginRight == "auto") element.style.marginRight = 0;
+
+  var wrapper = document.createElement(ANON);
+  wrapper.ie7_wrapped = element;
+  for (var propertyName in WRAPPER_STYLE) {
+    wrapper.style[propertyName] = element.currentStyle[propertyName];
+    if (WRAPPER_STYLE[propertyName] != null) {
+      element.runtimeStyle[propertyName] = WRAPPER_STYLE[propertyName];
+    }
+  }
+  wrapper.style.display = "block";
+  wrapper.style.position = "relative";
+  element.runtimeStyle.position = "absolute";
+  element.parentNode.insertBefore(wrapper, element);
+  wrapper.appendChild(element);
+});
+
+// =========================================================================
+// ie7-quirks.js
+// =========================================================================
+
+function ie7Quirks() {
+  var FONT_SIZES = "xx-small,x-small,small,medium,large,x-large,xx-large".split(",");
+  for (var i = 0; i < FONT_SIZES.length; i++) {
+    FONT_SIZES[FONT_SIZES[i]] = FONT_SIZES[i - 1] || "0.67em";
+  }
+  
+  IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/, function(match, label, size, value) {
+    return label + (FONT_SIZES[value] || value);
+  });
+  
+  if (appVersion < 6) {
+    var NEGATIVE = /^\-/, LENGTH = /(em|ex)$/i;
+    var EM = /em$/i, EX = /ex$/i;
+  
+    getPixelValue = function(element, value) {
+      if (PIXEL.test(value)) return parseInt(value)||0;
+      var scale = NEGATIVE.test(value)? -1 : 1;
+      if (LENGTH.test(value)) scale *= getFontScale(element);
+      temp.style.width = (scale < 0) ? value.slice(1) : value;
+      body.appendChild(temp);
+      // retrieve pixel width
+      value = scale * temp.offsetWidth;
+      // remove the temporary element
+      temp.removeNode();
+      return parseInt(value);
+    };
+
+    var temp = createTempElement();
+    function getFontScale(element) {
+      var scale = 1;
+      temp.style.fontFamily = element.currentStyle.fontFamily;
+      temp.style.lineHeight = element.currentStyle.lineHeight;
+      //temp.style.fontSize = "";
+      while (element != body) {
+        var fontSize = element.currentStyle["ie7-font-size"];
+        if (fontSize) {
+          if (EM.test(fontSize)) scale *= parseFloat(fontSize);
+          else if (PERCENT.test(fontSize)) scale *= (parseFloat(fontSize) / 100);
+          else if (EX.test(fontSize)) scale *= (parseFloat(fontSize) / 2);
+          else {
+            temp.style.fontSize = fontSize;
+            return 1;
+          }
+        }
+        element = element.parentElement;
+      }
+      return scale;
+    };
+
+    // cursor:pointer (IE5.x)
+    IE7.CSS.addFix(/cursor\s*:\s*pointer/, "cursor:hand");
+    // display:list-item (IE5.x)
+    IE7.CSS.addFix(/display\s*:\s*list-item/, "display:block");
+  }
+  
+  // -----------------------------------------------------------------------
+  //  margin:auto
+  // -----------------------------------------------------------------------
+  
+  function fixMargin(element) {
+    if (appVersion < 5.5) IE7.Layout.boxSizing(element.parentElement);
+    var parent = element.parentElement;
+    var margin = parent.offsetWidth - element.offsetWidth - getPaddingWidth(parent);
+    var autoRight = (element.currentStyle["ie7-margin"] && element.currentStyle.marginRight == "auto") ||
+      element.currentStyle["ie7-margin-right"] == "auto";
+    switch (parent.currentStyle.textAlign) {
+      case "right":
+        margin = autoRight ? parseInt(margin / 2) : 0;
+        element.runtimeStyle.marginRight = margin + "px";
+        break;
+      case "center":
+        if (autoRight) margin = 0;
+      default:
+        if (autoRight) margin /= 2;
+        element.runtimeStyle.marginLeft = parseInt(margin) + "px";
+    }
+  };
+
+  function getPaddingWidth(element) {
+    return getPixelValue(element, element.currentStyle.paddingLeft) +
+      getPixelValue(element, element.currentStyle.paddingRight);
+  };
+  
+  IE7.CSS.addRecalc("margin(-left|-right)?", "[^};]*auto", function(element) {
+    if (register(fixMargin, element,
+      element.parentElement &&
+      element.currentStyle.display == "block" &&
+      element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.position != "absolute")) {
+        fixMargin(element);
+    }
+  });
+  
+  addResize(function() {
+    for (var i in fixMargin.elements) {
+      var element = fixMargin.elements[i];
+      element.runtimeStyle.marginLeft =
+      element.runtimeStyle.marginRight = "";
+      fixMargin(element);
+    }
+  });
+};
+
+
+// -----------------------------------------------------------------------
+// initialisation
+// -----------------------------------------------------------------------
+
+IE7.loaded = true;
+
+(function() {
+  try {
+    // http://javascript.nwbox.com/IEContentLoaded/
+    documentElement.doScroll("left");
+  } catch (e) {
+    setTimeout(arguments.callee, 1);
+    return;
+  }
+  // execute the inner text of the IE7 script
+  try {
+    eval(script.innerHTML);
+  } catch (e) {
+    // ignore errors
+  }
+  PNG = new RegExp(rescape(typeof IE7_PNG_SUFFIX == "string" ? IE7_PNG_SUFFIX : "-trans.png") + "$", "i");
+
+  // frequently used references
+  body = document.body;
+  viewport = quirksMode ? body : documentElement;
+
+  // classes
+  body.className += " ie7_body";
+  documentElement.className += " ie7_html";
+
+  if (quirksMode) ie7Quirks();
+
+  IE7.CSS.init();
+  IE7.HTML.init();
+
+  IE7.HTML.apply();
+  IE7.CSS.apply();
+
+  IE7.recalc();
+})();
+
+
+})();
Index: admin/js/ie7/IE8.js
===================================================================
--- admin/js/ie7/IE8.js	(revision 175)
+++ admin/js/ie7/IE8.js	(revision 703)
@@ -1,2 +1,2601 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){IE7={toString:function(){return"IE7 version 2.0 (beta2)"}};var m=IE7.appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(top.location.search)||m<5)return;var U=bT();var G=document.compatMode!="CSS1Compat";var bx=document.documentElement,w,t;var bN="!";var J=":link{ie7-link:link}:visited{ie7-link:visited}";var cB=/^[\w\.]+[^:]*$/;function bc(a,b){if(cB.test(a))a=(b||"")+a;return a};function by(a,b){a=bc(a,b);return a.slice(0,a.lastIndexOf("/")+1)};var bO=document.scripts[document.scripts.length-1];var cC=by(bO.src);try{var K=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}var bd={};function cD(a,b){try{a=bc(a,b);if(!bd[a]){K.open("GET",a,false);K.send();if(K.status==0||K.status==200){bd[a]=K.responseText}}}catch(e){}finally{return bd[a]||""}};if(m<5.5){undefined=U();bN="HTML:!";var cE=/(g|gi)$/;var cF=String.prototype.replace;String.prototype.replace=function(a,b){if(typeof b=="function"){if(a&&a.constructor==RegExp){var c=a;var d=c.global;if(d==null)d=cE.test(c);if(d)c=new RegExp(c.source)}else{c=new RegExp(W(a))}var f,g=this,h="";while(g&&(f=c.exec(g))){h+=g.slice(0,f.index)+b.apply(this,f);g=g.slice(f.index+f[0].length);if(!d)break}return h+g}return cF.apply(this,arguments)};Array.prototype.pop=function(){if(this.length){var a=this[this.length-1];this.length--;return a}return undefined};Array.prototype.push=function(){for(var a=0;a<arguments.length;a++){this[this.length]=arguments[a]}return this.length};var cG=this;Function.prototype.apply=function(a,b){if(a===undefined)a=cG;else if(a==null)a=window;else if(typeof a=="string")a=new String(a);else if(typeof a=="number")a=new Number(a);else if(typeof a=="boolean")a=new Boolean(a);if(arguments.length==1)b=[];else if(b[0]&&b[0].writeln)b[0]=b[0].documentElement.document||b[0];var c="#ie7_apply",d;a[c]=this;switch(b.length){case 0:d=a[c]();break;case 1:d=a[c](b[0]);break;case 2:d=a[c](b[0],b[1]);break;case 3:d=a[c](b[0],b[1],b[2]);break;case 4:d=a[c](b[0],b[1],b[2],b[3]);break;case 5:d=a[c](b[0],b[1],b[2],b[3],b[4]);break;default:var f=[],g=b.length-1;do f[g]="a["+g+"]";while(g--);eval("r=o[$]("+f+")")}if(typeof a.valueOf=="function"){delete a[c]}else{a[c]=undefined;if(d&&d.writeln)d=d.documentElement.document||d}return d};Function.prototype.call=function(a){return this.apply(a,bP.apply(arguments,[1]))};J+="address,blockquote,body,dd,div,dt,fieldset,form,"+"frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+"hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}"}var bP=Array.prototype.slice;var cZ=/%([1-9])/g;var cH=/^\s\s*/;var cI=/\s\s*$/;var cJ=/([\/()[\]{}|*+-.,^$?\\])/g;var bQ=/\bbase\b/;var bR=["constructor","toString"];var be;function B(){};B.extend=function(a,b){be=true;var c=new this;bf(c,a);be=false;var d=c.constructor;function f(){if(!be)d.apply(this,arguments)};c.constructor=f;f.extend=arguments.callee;bf(f,b);f.prototype=c;return f};B.prototype.extend=function(a){return bf(this,a)};var bz="#";var V="~";var cK=/\\./g;var cL=/\(\?[:=!]|\[[^\]]+\]/g;var cM=/\(/g;var H=B.extend({constructor:function(a){this[V]=[];this.merge(a)},exec:function(g){var h=this,j=this[V];return String(g).replace(new RegExp(this,this.ignoreCase?"gi":"g"),function(){var a,b=1,c=0;while((a=h[bz+j[c++]])){var d=b+a.length+1;if(arguments[b]){var f=a.replacement;switch(typeof f){case"function":return f.apply(h,bP.call(arguments,b,d));case"number":return arguments[b+f];default:return f}}b=d}})},add:function(a,b){if(a instanceof RegExp){a=a.source}if(!this[bz+a])this[V].push(String(a));this[bz+a]=new H.Item(a,b)},merge:function(a){for(var b in a)this.add(b,a[b])},toString:function(){return"("+this[V].join(")|(")+")"}},{IGNORE:"$0",Item:B.extend({constructor:function(a,b){a=a instanceof RegExp?a.source:String(a);if(typeof b=="number")b=String(b);else if(b==null)b="";if(typeof b=="string"&&/\$(\d+)/.test(b)){if(/^\$\d+$/.test(b)){b=parseInt(b.slice(1))}else{var c=/'/.test(b.replace(/\\./g,""))?'"':"'";b=b.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\$(\d+)/g,c+"+(arguments[$1]||"+c+c+")+"+c);b=new Function("return "+c+b.replace(/(['"])\1\+(.*)\+\1\1$/,"$1")+c)}}this.length=H.count(a);this.replacement=b;this.toString=bT(a)}}),count:function(a){a=String(a).replace(cK,"").replace(cL,"");return L(a,cM).length}});function bf(a,b){if(a&&b){var c=(typeof b=="function"?Function:Object).prototype;var d=bR.length,f;if(be)while(f=bR[--d]){var g=b[f];if(g!=c[f]){if(bQ.test(g)){bS(a,f,g)}else{a[f]=g}}}for(f in b)if(c[f]===undefined){var g=b[f];if(a[f]&&typeof g=="function"&&bQ.test(g)){bS(a,f,g)}else{a[f]=g}}}return a};function bS(c,d,f){var g=c[d];c[d]=function(){var a=this.base;this.base=g;var b=f.apply(this,arguments);this.base=a;return b}};function cN(a,b){if(!b)b=a;var c={};for(var d in a)c[d]=b[d];return c};function i(c){var d=arguments;var f=new RegExp("%([1-"+arguments.length+"])","g");return String(c).replace(f,function(a,b){return b<d.length?d[b]:a})};function L(a,b){return String(a).match(b)||[]};function W(a){return String(a).replace(cJ,"\\$1")};function da(a){return String(a).replace(cH,"").replace(cI,"")};function bT(a){return function(){return a}};var bU=H.extend({ignoreCase:true});var cO=/\x01(\d+)/g,cP=/'/g,cQ=/^\x01/,cR=/\\([\da-fA-F]{1,4})/g;var bA=[];var bV=new bU({"<!\\-\\-|\\-\\->":"","\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/":"","@(namespace|import)[^;\\n]+[;\\n]":"","'(\\\\.|[^'\\\\])*'":bW,'"(\\\\.|[^"\\\\])*"':bW,"\\s+":" "});function cS(a){return bV.exec(a)};function bg(c){return c.replace(cO,function(a,b){return bA[b-1]})};function bW(c){return"\x01"+bA.push(c.replace(cR,function(a,b){return eval("'\\u"+"0000".slice(b.length)+b+"'")}).slice(1,-1).replace(cP,"\\'"))};function bB(a){return cQ.test(a)?bA[a.slice(1)-1]:a};var cT=new H({Width:"Height",width:"height",Left:"Top",left:"top",Right:"Bottom",right:"bottom",onX:"onY"});function C(a){return cT.exec(a)};var bX=[];function bC(a){cV(a);v(window,"onresize",a)};function v(a,b,c){a.attachEvent(b,c);bX.push(arguments)};function cU(a,b,c){try{a.detachEvent(b,c)}catch(ignore){}};v(window,"onunload",function(){var a;while(a=bX.pop()){cU(a[0],a[1],a[2])}});function X(a,b,c){if(!a.elements)a.elements={};if(c)a.elements[b.uniqueID]=b;else delete a.elements[b.uniqueID];return c};v(window,"onbeforeprint",function(){if(!IE7.CSS.print)new bJ("print");IE7.CSS.print.recalc()});var bY=/^\d+(px)?$/i;var M=/^\d+%$/;var D=function(a,b){if(bY.test(b))return parseInt(b);var c=a.style.left;var d=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;a.style.left=b||0;b=a.style.pixelLeft;a.style.left=c;a.runtimeStyle.left=d;return b};var bD="ie7-";var bZ=B.extend({constructor:function(){this.fixes=[];this.recalcs=[]},init:U});var bE=[];function cV(a){bE.push(a)};IE7.recalc=function(){IE7.HTML.recalc();IE7.CSS.recalc();for(var a=0;a<bE.length;a++)bE[a]()};function bh(a){return a.currentStyle["ie7-position"]=="fixed"};function bF(a,b){return a.currentStyle[bD+b]||a.currentStyle[b]};function N(a,b,c){if(a.currentStyle[bD+b]==null){a.runtimeStyle[bD+b]=a.currentStyle[b]}a.runtimeStyle[b]=c};function ca(a){var b=document.createElement(a||"object");b.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";b.ie7_anon=true;return b};function x(a,b,c){if(!bj[a]){I=[];var d="";var f=E.escape(a).split(",");for(var g=0;g<f.length;g++){p=l=y=0;Y=f.length>1?2:0;var h=E.exec(f[g])||"if(0){";if(p){h+=i("if(e%1.nodeName!='!'){",l)}var j=Y>1?ch:"";h+=i(j+ci,l);h+=Array(L(h,/\{/g).length+1).join("}");d+=h}eval(i(cj,I)+E.unescape(d)+"return s?null:r}");bj[a]=_k}return bj[a](b||document,c)};var bi=m<6;var cb=/^(href|src)$/;var bG={"class":"className","for":"htmlFor"};IE7._1=1;IE7._e=function(a,b){var c=a.all[b]||null;if(!c||c.id==b)return c;for(var d=0;d<c.length;d++){if(c[d].id==b)return c[d]}return null};IE7._f=function(a,b){if(b=="src"&&a.pngSrc)return a.pngSrc;var c=bi?(a.attributes[b]||a.attributes[bG[b.toLowerCase()]]):a.getAttributeNode(b);if(c&&(c.specified||b=="value")){if(cb.test(b)){return a.getAttribute(b,2)}else if(b=="class"){return a.className.replace(/\sie7_\w+/g,"")}else if(b=="style"){return a.style.cssText}else{return c.nodeValue}}return null};var cc="colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";bf(bG,cN(cc.toLowerCase().split(","),cc.split(",")));IE7._3=function(a){while(a&&(a=a.nextSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};IE7._4=function(a){while(a&&(a=a.previousSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};var cW=/([\s>+~,]|[^(]\+|^)([#.:\[])/g,cX=/(^|,)([^\s>+~])/g,cY=/\s*([\s>+~(),]|^|$)\s*/g,cd=/\s\*\s/g;var ce=H.extend({constructor:function(a){this.base(a);this.sorter=new H;this.sorter.add(/:not\([^)]*\)/,H.IGNORE);this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/,"$1$3$6$4")},ignoreCase:true,escape:function(a){return this.optimise(this.format(a))},format:function(a){return a.replace(cY,"$1").replace(cX,"$1 $2").replace(cW,"$1*$2")},optimise:function(a){return this.sorter.exec(a.replace(cd,">* "))},unescape:function(a){return bg(a)}});var cf={"":"%1!=null","=":"%1=='%2'","~=":/(^| )%1( |$)/,"|=":/^%1(-|$)/,"^=":/^%1/,"$=":/%1$/,"*=":/%1/};var bH={"first-child":"!IE7._4(e%1)","link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'"};var bI="var p%2=0,i%2,e%2,n%2=e%1.";var cg="e%1.sourceIndex";var ch="var g="+cg+";if(!p[g]){p[g]=1;";var ci="r[r.length]=e%1;if(s)return e%1;";var cj="var _k=function(e0,s){IE7._1++;var r=[],p={},reg=[%1],d=document;";var I;var l;var p;var y;var Y;var bj={};var E=new ce({" (\\*|[\\w-]+)#([\\w-]+)":function(a,b,c){p=false;var d="var e%2=IE7._e(d,'%4');if(e%2&&";if(b!="*")d+="e%2.nodeName=='%3'&&";d+="(e%1==d||e%1.contains(e%2))){";if(y)d+=i("i%1=n%1.length;",y);return i(d,l++,l,b.toUpperCase(),c)}," (\\*|[\\w-]+)":function(a,b){Y++;p=b=="*";var c=bI;c+=(p&&bi)?"all":"getElementsByTagName('%3')";c+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";return i(c,l++,y=l,b.toUpperCase())},">(\\*|[\\w-]+)":function(a,b){var c=y;p=b=="*";var d=bI;d+=c?"children":"childNodes";if(!p&&c)d+=".tags('%3')";d+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";if(p){d+="if(e%2.nodeType==1){";p=bi}else{if(!c)d+="if(e%2.nodeName=='%3'){"}return i(d,l++,y=l,b.toUpperCase())},"\\+(\\*|[\\w-]+)":function(a,b){var c="";if(p)c+="if(e%1.nodeName!='!'){";p=false;c+="e%1=IE7._3(e%1);if(e%1";if(b!="*")c+="&&e%1.nodeName=='%2'";c+="){";return i(c,l,b.toUpperCase())},"~(\\*|[\\w-]+)":function(a,b){var c="";if(p)c+="if(e%1.nodeName!='!'){";p=false;Y=2;c+="while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._1)break;if(";if(b=="*"){c+="e%1.nodeType==1";if(bi)c+="&&e%1.nodeName!='!'"}else c+="e%1.nodeName=='%2'";c+="){e%1.ie7_adjacent=IE7._1;";return i(c,l,b.toUpperCase())},"#([\\w-]+)":function(a,b){p=false;var c="if(e%1.id=='%2'){";if(y)c+=i("i%1=n%1.length;",y);return i(c,l,b)},"\\.([\\w-]+)":function(a,b){p=false;I.push(new RegExp("(^|\\s)"+W(b)+"(\\s|$)"));return i("if(e%1.className&&reg[%2].test(e%1.className)){",l,I.length-1)},"\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]":function(a,b,c,d){var f=bG[b]||b;if(c){var g="e%1.getAttribute('%2',2)";if(!cb.test(b)){g="e%1.%3||"+g}b=i("("+g+")",l,b,f)}else{b=i("IE7._f(e%1,'%2')",l,b)}var h=cf[c||""]||"0";if(h&&h.source){I.push(new RegExp(i(h.source,W(E.unescape(d)))));h="reg[%2].test(%1)";d=I.length-1}return"if("+i(h,b,d)+"){"},":+([\\w-]+)(\\(([^)]+)\\))?":function(a,b,c,d){b=bH[b];return"if("+(b?i(b,l,d||""):"0")+"){"}});var ck=/a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;var cl=/\s*\{\s*/,cm=/\s*\}\s*/,cn=/\s*\,\s*/;var co=/(.*)(:first-(line|letter))/;var z=document.styleSheets;IE7.CSS=new(bZ.extend({parser:new bU,screen:"",print:"",styles:[],rules:[],pseudoClasses:m<7?"first\\-child":"",dynamicPseudoClasses:{toString:function(){var a=[];for(var b in this)a.push(b);return a.join("|")}},init:function(){var a="^\x01$";var b="\\[class=?[^\\]]*\\]";var c=[];if(this.pseudoClasses)c.push(this.pseudoClasses);var d=this.dynamicPseudoClasses.toString();if(d)c.push(d);c=c.join("|");var f=m<7?["[>+~[(]|([:.])\\w+\\1"]:[b];if(c)f.push(":("+c+")");this.UNKNOWN=new RegExp(f.join("|")||a,"i");var g=m<7?["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"]:[b];var h=g.concat();if(c)h.push(":("+c+")");o.COMPLEX=new RegExp(h.join("|")||a,"ig");if(this.pseudoClasses)g.push(":("+this.pseudoClasses+")");O.COMPLEX=new RegExp(g.join("|")||a,"i");O.MATCH=new RegExp(d?"(.*):("+d+")(.*)":a,"i");this.createStyleSheet();this.refresh()},addEventHandler:function(){v.apply(null,arguments)},addFix:function(a,b){this.parser.add(a,b)},addRecalc:function(c,d,f,g){d=new RegExp("([{;\\s])"+c+"\\s*:\\s*"+d+"[^;}]*");var h=this.recalcs.length;if(g)g=c+":"+g;this.addFix(d,function(a,b){return(g?b+g:a)+";ie7-"+a.slice(1)+";ie7_recalc"+h+":1"});this.recalcs.push(arguments);return h},apply:function(){this.getInlineStyles();new bJ("screen");this.trash()},createStyleSheet:function(){this.styleSheet=document.createStyleSheet();this.styleSheet.ie7=true;this.styleSheet.owningElement.ie7=true;this.styleSheet.cssText=J},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){this.styles.push(b.innerHTML)}}},getText:function(a,b){try{var c=a.cssText}catch(e){c=""}if(K)c=cD(a.href,b)||c;return c},recalc:function(){this.screen.recalc();var a=/ie7_recalc\d+/g;var b=J.match(/[{,]/g).length;var c=b+(this.screen.cssText.match(/\{/g)||"").length;var d=this.styleSheet.rules,f;var g,h,j,q,r,k,u,n;for(r=b;r<c;r++){f=d[r];var s=f.style.cssText;if(f&&(g=s.match(a))){j=x(f.selectorText);if(j.length)for(k=0;k<g.length;k++){n=g[k];h=IE7.CSS.recalcs[n.slice(10)][2];for(u=0;(q=j[u]);u++){if(q.currentStyle[n])h(q,s)}}}}},refresh:function(){this.styleSheet.cssText=J+this.screen+this.print},trash:function(){for(var a=0;a<z.length;a++){if(!z[a].ie7){try{var b=z[a].cssText}catch(e){b=""}if(b)z[a].cssText=""}}}}));var bJ=B.extend({constructor:function(a){this.media=a;this.load();IE7.CSS[a]=this;IE7.CSS.refresh()},createRule:function(a,b){if(IE7.CSS.UNKNOWN.test(a)){var c;if(F&&(c=a.match(F.MATCH))){return new F(c[1],c[2],b)}else if(c=a.match(O.MATCH)){if(!ck.test(c[0])||O.COMPLEX.test(c[0])){return new O(a,c[1],c[2],c[3],b)}}else return new o(a,b)}return a+" {"+b+"}"},getText:function(){var h=[].concat(IE7.CSS.styles);var j=/@media\s+([^{]*)\{([^@]+\})\s*\}/gi;var q=/\ball\b|^$/i,r=/\bscreen\b/i,k=/\bprint\b/i;function u(a,b){n.value=b;return a.replace(j,n)};function n(a,b,c){b=s(b);switch(b){case"screen":case"print":if(b!=n.value)return"";case"all":return c}return""};function s(a){if(q.test(a))return"all";else if(r.test(a))return(k.test(a))?"all":"screen";else if(k.test(a))return"print"};var R=this;function S(a,b,c,d){var f="";if(!d){c=s(a.media);d=0}if(c=="all"||c==R.media){if(d<3){for(var g=0;g<a.imports.length;g++){f+=S(a.imports[g],by(a.href,b),c,d+1)}}f+=cS(a.href?cy(a,b):h.pop()||"");f=u(f,R.media)}return f};var bw={};function cy(a,b){var c=bc(a.href,b);if(bw[c])return"";bw[c]=(a.disabled)?"":cA(IE7.CSS.getText(a,b),by(a.href,b));return bw[c]};var cz=/(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function cA(a,b){return a.replace(cz,"$1"+b.slice(0,b.lastIndexOf("/")+1)+"$2")};for(var T=0;T<z.length;T++){if(!z[T].disabled&&!z[T].ie7){this.cssText+=S(z[T])}}},load:function(){this.cssText="";this.getText();this.parse();this.cssText=bg(this.cssText);bd={}},parse:function(){this.cssText=IE7.CSS.parser.exec(this.cssText);var a=IE7.CSS.rules.length;var b=this.cssText.split(cm),c;var d,f,g,h;for(g=0;g<b.length;g++){c=b[g].split(cl);d=c[0].split(cn);f=c[1];for(h=0;h<d.length;h++){d[h]=f?this.createRule(d[h],f):""}b[g]=d.join("\n")}this.cssText=b.join("\n");this.rules=IE7.CSS.rules.slice(a)},recalc:function(){var a,b;for(b=0;(a=this.rules[b]);b++)a.recalc()},toString:function(){return"@media "+this.media+"{"+this.cssText+"}"}});var F;var o=IE7.Rule=B.extend({constructor:function(a,b){this.id=IE7.CSS.rules.length;this.className=o.PREFIX+this.id;a=a.match(co)||a||"*";this.selector=a[1]||a;this.selectorText=this.parse(this.selector)+(a[2]||"");this.cssText=b;this.MATCH=new RegExp("\\s"+this.className+"(\\s|$)","g");IE7.CSS.rules.push(this);this.init()},init:U,add:function(a){a.className+=" "+this.className},recalc:function(){var a=x(this.selector);for(var b=0;b<a.length;b++)this.add(a[b])},parse:function(a){var b=a.replace(o.CHILD," ").replace(o.COMPLEX,"");if(m<7)b=b.replace(o.MULTI,"");var c=L(b,o.TAGS).length-L(a,o.TAGS).length;var d=L(b,o.CLASSES).length-L(a,o.CLASSES).length+1;while(d>0&&o.CLASS.test(b)){b=b.replace(o.CLASS,"");d--}while(c>0&&o.TAG.test(b)){b=b.replace(o.TAG,"$1*");c--}b+="."+this.className;d=Math.min(d,2);c=Math.min(c,2);var f=-10*d-c;if(f>0){b=b+","+o.MAP[f]+" "+b}return b},remove:function(a){a.className=a.className.replace(this.MATCH,"$1")},toString:function(){return i("%1 {%2}",this.selectorText,this.cssText)}},{CHILD:/>/g,CLASS:/\.[\w-]+/,CLASSES:/[.:\[]/g,MULTI:/(\.[\w-]+)+/g,PREFIX:"ie7_class",TAG:/^\w+|([\s>+~])\w+/,TAGS:/^\w|[\s>+~]\w/g,MAP:{1:"html",2:"html body",10:".ie7_html",11:"html.ie7_html",12:"html.ie7_html body",20:".ie7_html .ie7_body",21:"html.ie7_html .ie7_body",22:"html.ie7_html body.ie7_body"}});var O=o.extend({constructor:function(a,b,c,d,f){this.attach=b||"*";this.dynamicPseudoClass=IE7.CSS.dynamicPseudoClasses[c];this.target=d;this.base(a,f)},recalc:function(){var a=x(this.attach),b;for(var c=0;b=a[c];c++){var d=this.target?x(this.target,b):[b];if(d.length)this.dynamicPseudoClass.apply(b,d,this)}}});var A=B.extend({constructor:function(a,b){this.name=a;this.apply=b;this.instances={};IE7.CSS.dynamicPseudoClasses[a]=this},register:function(a){var b=a[2];a.id=b.id+a[0].uniqueID;if(!this.instances[a.id]){var c=a[1],d;for(d=0;d<c.length;d++)b.add(c[d]);this.instances[a.id]=a}},unregister:function(a){if(this.instances[a.id]){var b=a[2];var c=a[1],d;for(d=0;d<c.length;d++)b.remove(c[d]);delete this.instances[a.id]}}});if(m<7){var Z=new A("hover",function(a){var b=arguments;IE7.CSS.addEventHandler(a,m<5.5?"onmouseover":"onmouseenter",function(){Z.register(b)});IE7.CSS.addEventHandler(a,m<5.5?"onmouseout":"onmouseleave",function(){Z.unregister(b)})});v(document,"onmouseup",function(){var a=Z.instances;for(var b in a)if(!a[b][0].contains(event.srcElement))Z.unregister(a[b])})}IE7.CSS.addRecalc("[\\w-]+","inherit",function(c,d){var f=d.match(/[\w-]+\s*:\s*inherit/g);for(var g=0;g<f.length;g++){var h=f[g].replace(/ie7\-|\s*:\s*inherit/g,"").replace(/\-([a-z])/g,function(a,b){return b.toUpperCase()});c.runtimeStyle[h]=c.parentElement.currentStyle[h]}});IE7.HTML=new(bZ.extend({fixed:{},init:U,addFix:function(){this.fixes.push(arguments)},apply:function(){for(var a=0;a<this.fixes.length;a++){var b=x(this.fixes[a][0]);var c=this.fixes[a][1];for(var d=0;d<b.length;d++)c(b[d])}},addRecalc:function(){this.recalcs.push(arguments)},recalc:function(){for(var a=0;a<this.recalcs.length;a++){var b=x(this.recalcs[a][0]);var c=this.recalcs[a][1],d;var f=Math.pow(2,a);for(var g=0;(d=b[g]);g++){var h=d.uniqueID;if((this.fixed[h]&f)==0){d=c(d)||d;this.fixed[h]|=f}}}}}));if(m<7){document.createElement("abbr");IE7.HTML.addRecalc("label",function(a){if(!a.htmlFor){var b=x("input,textarea",a,true);if(b){v(a,"onclick",function(){b.click()})}}})}var P="[.\\d]";new function(_){var layout=IE7.Layout=this;J+="*{boxSizing:content-box}";IE7.hasLayout=m<5.5?function(a){return a.clientWidth}:function(a){return a.currentStyle.hasLayout};layout.boxSizing=function(a){if(!IE7.hasLayout(a)){a.style.height="0cm";if(a.currentStyle.verticalAlign=="auto")a.runtimeStyle.verticalAlign="top";collapseMargins(a)}};function collapseMargins(a){if(a!=t&&a.currentStyle.position!="absolute"){collapseMargin(a,"marginTop");collapseMargin(a,"marginBottom")}};function collapseMargin(a,b){if(!a.runtimeStyle[b]){var c=a.parentElement;if(c&&IE7.hasLayout(c)&&!IE7[b=="marginTop"?"_4":"_3"](a))return;var d=x(">*:"+(b=="marginTop"?"first":"last")+"-child",a,true);if(d&&d.currentStyle.styleFloat=="none"&&IE7.hasLayout(d)){collapseMargin(d,b);margin=_b(a,a.currentStyle[b]);childMargin=_b(d,d.currentStyle[b]);if(margin<0||childMargin<0){a.runtimeStyle[b]=margin+childMargin}else{a.runtimeStyle[b]=Math.max(childMargin,margin)}d.runtimeStyle[b]="0px"}}};function _b(a,b){return b=="auto"?0:D(a,b)};var UNIT=/^[.\d][\w%]*$/,AUTO=/^(auto|0cm)$/;var applyWidth,applyHeight;IE7.Layout.borderBox=function(a){applyWidth(a);applyHeight(a)};var fixWidth=function(g){applyWidth=function(a){if(!M.test(a.currentStyle.width))h(a);collapseMargins(a)};function h(a,b){if(!a.runtimeStyle.fixedWidth){if(!b)b=a.currentStyle.width;a.runtimeStyle.fixedWidth=(UNIT.test(b))?Math.max(0,r(a,b)):b;N(a,"width",a.runtimeStyle.fixedWidth)}};function j(a){if(!bh(a)){var b=a.offsetParent;while(b&&!IE7.hasLayout(b))b=b.offsetParent}return(b||t).clientWidth};function q(a,b){if(M.test(b))return parseInt(parseFloat(b)/100*j(a));return D(a,b)};var r=function(a,b){var c=a.currentStyle["box-sizing"]=="border-box";var d=0;if(G&&!c)d+=k(a)+u(a,"padding");else if(!G&&c)d-=k(a)+u(a,"padding");return q(a,b)+d};function k(a){return a.offsetWidth-a.clientWidth};function u(a,b){return q(a,a.currentStyle[b+"Left"])+q(a,a.currentStyle[b+"Right"])};J+="*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";layout.minWidth=function(a){if(a.currentStyle["min-width"]!=null){a.style.minWidth=a.currentStyle["min-width"]}if(X(arguments.callee,a,a.currentStyle.minWidth!="none")){layout.boxSizing(a);h(a);n(a)}};eval("IE7.Layout.maxWidth="+String(layout.minWidth).replace(/min/g,"max"));function n(a){var b=a.getBoundingClientRect();var c=b.right-b.left;if(a.currentStyle.minWidth!="none"&&c<=r(a,a.currentStyle.minWidth)){a.runtimeStyle.width=a.currentStyle.minWidth}else if(a.currentStyle.maxWidth!="none"&&c>=r(a,a.currentStyle.maxWidth)){a.runtimeStyle.width=a.currentStyle.maxWidth}else{a.runtimeStyle.width=a.runtimeStyle.fixedWidth}};function s(a){if(X(s,a,/^(fixed|absolute)$/.test(a.currentStyle.position)&&bF(a,"left")!="auto"&&bF(a,"right")!="auto"&&AUTO.test(bF(a,"width")))){R(a);IE7.Layout.boxSizing(a)}};IE7.Layout.fixRight=s;function R(a){var b=q(a,a.runtimeStyle._c||a.currentStyle.left);var c=j(a)-q(a,a.currentStyle.right)-b-u(a,"margin");if(parseInt(a.runtimeStyle.width)==c)return;a.runtimeStyle.width="";if(bh(a)||g||a.offsetWidth<c){if(!G)c-=k(a)+u(a,"padding");if(c<0)c=0;a.runtimeStyle.fixedWidth=c;N(a,"width",c)}};var S=0;bC(function(){if(!t)return;var a,b=(S<t.clientWidth);S=t.clientWidth;var c=layout.minWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==r(d,d.currentStyle.minWidth));if(b&&f)d.runtimeStyle.width="";if(b==f)n(d)}var c=layout.maxWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==r(d,d.currentStyle.maxWidth));if(!b&&f)d.runtimeStyle.width="";if(b!=f)n(d)}for(a in s.elements)R(s.elements[a])});if(G){IE7.CSS.addRecalc("width",P,applyWidth)}if(m<7){IE7.CSS.addRecalc("min-width",P,layout.minWidth);IE7.CSS.addRecalc("max-width",P,layout.maxWidth);IE7.CSS.addRecalc("right",P,s)}};eval("var fixHeight="+C(fixWidth));fixWidth();fixHeight(true)};var bk=bc("blank.gif",cC);var bl="DXImageTransform.Microsoft.AlphaImageLoader";var bK="progid:"+bl+"(src='%1',sizingMethod='%2')";var bm;var Q=[];function bL(a){if(bm.test(a.src)){var b=new Image(a.width,a.height);b.onload=function(){a.width=b.width;a.height=b.height;b=null};b.src=a.src;a.pngSrc=a.src;bo(a)}};if(m>=5.5&&m<7){IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/,function(a,b,c,d,f){d=bB(d);return bm.test(d)?"filter:"+i(bK,d,"crop")+";zoom:1;background"+(b||"")+":"+(c||"")+"none"+(f||""):a});IE7.HTML.addRecalc("img,input",function(a){if(a.tagName=="INPUT"&&a.type!="image")return;bL(a);v(a,"onpropertychange",function(){if(!bn&&event.propertyName=="src"&&a.src.indexOf(bk)==-1)bL(a)})});var bn=false;v(window,"onbeforeprint",function(){bn=true;for(var a=0;a<Q.length;a++)cp(Q[a])});v(window,"onafterprint",function(){for(var a=0;a<Q.length;a++)bo(Q[a]);bn=false})}function bo(a,b){var c=a.filters[bl];if(c){c.src=a.src;c.enabled=true}else{a.runtimeStyle.filter=i(bK,a.src,b||"scale");Q.push(a)}a.src=bk};function cp(a){a.src=a.pngSrc;a.filters[bl].enabled=false};new function(_){if(m>=7)return;IE7.CSS.addRecalc("position","fixed",_8,"absolute");IE7.CSS.addRecalc("background(-attachment)?","[^};]*fixed",_5);var $viewport=G?"body":"documentElement";function _6(){if(w.currentStyle.backgroundAttachment!="fixed"){if(w.currentStyle.backgroundImage=="none"){w.runtimeStyle.backgroundRepeat="no-repeat";w.runtimeStyle.backgroundImage="url("+bk+")"}w.runtimeStyle.backgroundAttachment="fixed"}_6=U};var _0=ca("img");function _2(a){return a?bh(a)||_2(a.parentElement):false};function _d(a,b,c){setTimeout("document.all."+a.uniqueID+".runtimeStyle.setExpression('"+b+"','"+c+"')",0)};function _5(a){if(X(_5,a,a.currentStyle.backgroundAttachment=="fixed"&&!a.contains(w))){_6();bgLeft(a);bgTop(a);_a(a)}};function _a(a){_0.src=a.currentStyle.backgroundImage.slice(5,-2);var b=a.canHaveChildren?a:a.parentElement;b.appendChild(_0);setOffsetLeft(a);setOffsetTop(a);b.removeChild(_0)};function bgLeft(a){a.style.backgroundPositionX=a.currentStyle.backgroundPositionX;if(!_2(a)){_d(a,"backgroundPositionX","(parseInt(runtimeStyle.offsetLeft)+document."+$viewport+".scrollLeft)||0")}};eval(C(bgLeft));function setOffsetLeft(a){var b=_2(a)?"backgroundPositionX":"offsetLeft";a.runtimeStyle[b]=getOffsetLeft(a,a.style.backgroundPositionX)-a.getBoundingClientRect().left-a.clientLeft+2};eval(C(setOffsetLeft));function getOffsetLeft(a,b){switch(b){case"left":case"top":return 0;case"right":case"bottom":return t.clientWidth-_0.offsetWidth;case"center":return(t.clientWidth-_0.offsetWidth)/2;default:if(M.test(b)){return parseInt((t.clientWidth-_0.offsetWidth)*parseFloat(b)/100)}_0.style.left=b;return _0.offsetLeft}};eval(C(getOffsetLeft));function _8(a){if(X(_8,a,bh(a))){N(a,"position","absolute");N(a,"left",a.currentStyle.left);N(a,"top",a.currentStyle.top);_6();IE7.Layout.fixRight(a);_7(a)}};function _7(a,b){positionTop(a,b);positionLeft(a,b,true);if(!a.runtimeStyle.autoLeft&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.right!="auto"){var c=t.clientWidth-getPixelWidth(a,a.currentStyle.right)-getPixelWidth(a,a.runtimeStyle._c)-a.clientWidth;if(a.currentStyle.marginRight=="auto")c=parseInt(c/2);if(_2(a.offsetParent))a.runtimeStyle.pixelLeft+=c;else a.runtimeStyle.shiftLeft=c}clipWidth(a);clipHeight(a)};function clipWidth(a){var b=a.runtimeStyle.fixWidth;a.runtimeStyle.borderRightWidth="";a.runtimeStyle.width=b?getPixelWidth(a,b):"";if(a.currentStyle.width!="auto"){var c=a.getBoundingClientRect();var d=a.offsetWidth-t.clientWidth+c.left-2;if(d>=0){a.runtimeStyle.borderRightWidth="0px";d=Math.max(D(a,a.currentStyle.width)-d,0);N(a,"width",d);return d}}};eval(C(clipWidth));function positionLeft(a,b){if(!b&&M.test(a.currentStyle.width)){a.runtimeStyle.fixWidth=a.currentStyle.width}if(a.runtimeStyle.fixWidth){a.runtimeStyle.width=getPixelWidth(a,a.runtimeStyle.fixWidth)}a.runtimeStyle.shiftLeft=0;a.runtimeStyle._c=a.currentStyle.left;a.runtimeStyle.autoLeft=a.currentStyle.right!="auto"&&a.currentStyle.left=="auto";a.runtimeStyle.left="";a.runtimeStyle.screenLeft=getScreenLeft(a);a.runtimeStyle.pixelLeft=a.runtimeStyle.screenLeft;if(!b&&!_2(a.offsetParent)){_d(a,"pixelLeft","runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document."+$viewport+".scrollLeft")}};eval(C(positionLeft));function getScreenLeft(a){var b=a.offsetLeft,c=1;if(a.runtimeStyle.autoLeft){b=t.clientWidth-a.offsetWidth-getPixelWidth(a,a.currentStyle.right)}if(a.currentStyle.marginLeft!="auto"){b-=getPixelWidth(a,a.currentStyle.marginLeft)}while(a=a.offsetParent){if(a.currentStyle.position!="static")c=-1;b+=a.offsetLeft*c}return b};eval(C(getScreenLeft));function getPixelWidth(a,b){return M.test(b)?parseInt(parseFloat(b)/100*t.clientWidth):D(a,b)};eval(C(getPixelWidth));function _j(){var a=_5.elements;for(var b in a)_a(a[b]);a=_8.elements;for(b in a){_7(a[b],true);_7(a[b],true)}_9=0};var _9;bC(function(){if(!_9)_9=setTimeout(_j,0)})};var bp={backgroundColor:"transparent",backgroundImage:"none",backgroundPositionX:null,backgroundPositionY:null,backgroundRepeat:null,borderTopWidth:0,borderRightWidth:0,borderBottomWidth:0,borderLeftStyle:"none",borderTopStyle:"none",borderRightStyle:"none",borderBottomStyle:"none",borderLeftWidth:0,height:null,marginTop:0,marginBottom:0,marginRight:0,marginLeft:0,width:"100%"};IE7.CSS.addRecalc("overflow","visible",function(a){if(a.parentNode.ie7_wrapped)return;if(IE7.Layout&&a.currentStyle["max-height"]!="auto"){IE7.Layout.maxHeight(a)}if(a.currentStyle.marginLeft=="auto")a.style.marginLeft=0;if(a.currentStyle.marginRight=="auto")a.style.marginRight=0;var b=document.createElement(bN);b.ie7_wrapped=a;for(var c in bp){b.style[c]=a.currentStyle[c];if(bp[c]!=null){a.runtimeStyle[c]=bp[c]}}b.style.display="block";b.style.position="relative";a.runtimeStyle.position="absolute";a.parentNode.insertBefore(b,a);b.appendChild(a)});function cq(){var f="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var g=0;g<f.length;g++){f[f[g]]=f[g-1]||"0.67em"}IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/,function(a,b,c,d){return b+(f[d]||d)});if(m<6){var h=/^\-/,j=/(em|ex)$/i;var q=/em$/i,r=/ex$/i;D=function(a,b){if(bY.test(b))return parseInt(b)||0;var c=h.test(b)?-1:1;if(j.test(b))c*=u(a);k.style.width=(c<0)?b.slice(1):b;w.appendChild(k);b=c*k.offsetWidth;k.removeNode();return parseInt(b)};var k=ca();function u(a){var b=1;k.style.fontFamily=a.currentStyle.fontFamily;k.style.lineHeight=a.currentStyle.lineHeight;while(a!=w){var c=a.currentStyle["ie7-font-size"];if(c){if(q.test(c))b*=parseFloat(c);else if(M.test(c))b*=(parseFloat(c)/100);else if(r.test(c))b*=(parseFloat(c)/2);else{k.style.fontSize=c;return 1}}a=a.parentElement}return b};IE7.CSS.addFix(/cursor\s*:\s*pointer/,"cursor:hand");IE7.CSS.addFix(/display\s*:\s*list-item/,"display:block")}function n(a){if(m<5.5)IE7.Layout.boxSizing(a.parentElement);var b=a.parentElement;var c=b.offsetWidth-a.offsetWidth-s(b);var d=(a.currentStyle["ie7-margin"]&&a.currentStyle.marginRight=="auto")||a.currentStyle["ie7-margin-right"]=="auto";switch(b.currentStyle.textAlign){case"right":c=d?parseInt(c/2):0;a.runtimeStyle.marginRight=c+"px";break;case"center":if(d)c=0;default:if(d)c/=2;a.runtimeStyle.marginLeft=parseInt(c)+"px"}};function s(a){return D(a,a.currentStyle.paddingLeft)+D(a,a.currentStyle.paddingRight)};IE7.CSS.addRecalc("margin(-left|-right)?","[^};]*auto",function(a){if(X(n,a,a.parentElement&&a.currentStyle.display=="block"&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.position!="absolute")){n(a)}});bC(function(){for(var a in n.elements){var b=n.elements[a];b.runtimeStyle.marginLeft=b.runtimeStyle.marginRight="";n(b)}})};IE7._g=function(a){a=a.firstChild;while(a){if(a.nodeType==3||(a.nodeType==1&&a.nodeName!="!"))return false;a=a.nextSibling}return true};IE7._h=function(a,b){while(a&&!a.getAttribute("lang"))a=a.parentNode;return a&&new RegExp("^"+W(b),"i").test(a.getAttribute("lang"))};function cr(a,b,c,d){d=/last/i.test(a)?d+"+1-":"";if(!isNaN(b))b="0n+"+b;else if(b=="even")b="2n";else if(b=="odd")b="2n+1";b=b.split("n");var f=b[0]?(b[0]=="-")?-1:parseInt(b[0]):1;var g=parseInt(b[1])||0;var h=f<0;if(h){f=-f;if(f==1)g++}var j=i(f==0?"%3%7"+(d+g):"(%4%3-%2)%6%1%70%5%4%3>=%2",f,g,c,d,"&&","%","==");if(h)j="!("+j+")";return j};bH={"link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'","checked":"e%1.checked","contains":"e%1.innerText.indexOf('%2')!=-1","disabled":"e%1.isDisabled","empty":"IE7._g(e%1)","enabled":"e%1.disabled===false","first-child":"!IE7._4(e%1)","lang":"IE7._h(e%1,'%2')","last-child":"!IE7._3(e%1)","only-child":"!IE7._4(e%1)&&!IE7._3(e%1)","target":"e%1.id==location.hash.slice(1)","indeterminate":"e%1.indeterminate"};IE7._i=function(a){if(a.rows){a.ie7_length=a.rows.length;a.ie7_lookup="rowIndex"}else if(a.cells){a.ie7_length=a.cells.length;a.ie7_lookup="cellIndex"}else if(a.ie7_indexed!=IE7._1){var b=0;var c=a.firstChild;while(c){if(c.nodeType==1&&c.nodeName!="!"){c.ie7_index=++b}c=c.nextSibling}a.ie7_length=b;a.ie7_lookup="ie7_index"}a.ie7_indexed=IE7._1;return a};var ba=E[V];var cs=ba[ba.length-1];ba.length--;E.merge({":not\\((\\*|[\\w-]+)?([^)]*)\\)":function(a,b,c){var d=(b&&b!="*")?i("if(e%1.nodeName=='%2'){",l,b.toUpperCase()):"";d+=E.exec(c);return"if(!"+d.slice(2,-1).replace(/\)\{if\(/g,"&&")+"){"},":nth(-last)?-child\\(([^)]+)\\)":function(a,b,c){p=false;b=i("e%1.parentNode.ie7_length",l);var d="if(p%1!==e%1.parentNode)p%1=IE7._i(e%1.parentNode);";d+="var i=e%1[p%1.ie7_lookup];if(p%1.ie7_lookup!='ie7_index')i++;if(";return i(d,l)+cr(a,c,"i",b)+"){"}});ba.push(cs);var bM="\\([^)]*\\)";if(IE7.CSS.pseudoClasses)IE7.CSS.pseudoClasses+="|";IE7.CSS.pseudoClasses+="before|after|last\\-child|only\\-child|empty|root|"+"not|nth\\-child|nth\\-last\\-child|contains|lang".split("|").join(bM+"|")+bM;bV.add(/::/,":");var bb=new A("focus",function(a){var b=arguments;IE7.CSS.addEventHandler(a,"onfocus",function(){bb.unregister(b);bb.register(b)});IE7.CSS.addEventHandler(a,"onblur",function(){bb.unregister(b)});if(a==document.activeElement){bb.register(b)}});var bq=new A("active",function(a){var b=arguments;IE7.CSS.addEventHandler(a,"onmousedown",function(){bq.register(b)})});v(document,"onmouseup",function(){var a=bq.instances;for(var b in a)bq.unregister(a[b])});var br=new A("checked",function(a){if(typeof a.checked!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="checked"){if(a.checked)br.register(b);else br.unregister(b)}});if(a.checked)br.register(b)});var bs=new A("enabled",function(a){if(typeof a.disabled!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="disabled"){if(!a.isDisabled)bs.register(b);else bs.unregister(b)}});if(!a.isDisabled)bs.register(b)});var bt=new A("disabled",function(a){if(typeof a.disabled!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="disabled"){if(a.isDisabled)bt.register(b);else bt.unregister(b)}});if(a.isDisabled)bt.register(b)});var bu=new A("indeterminate",function(a){if(typeof a.indeterminate!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="indeterminate"){if(a.indeterminate)bu.register(b);else bu.unregister(b)}});IE7.CSS.addEventHandler(a,"onclick",function(){bu.unregister(b)})});var bv=new A("target",function(a){var b=arguments;if(!a.tabIndex)a.tabIndex=0;IE7.CSS.addEventHandler(document,"onpropertychange",function(){if(event.propertyName=="activeElement"){if(a.id&&a.id==location.hash.slice(1))bv.register(b);else bv.unregister(b)}});if(a.id&&a.id==location.hash.slice(1))bv.register(b)});var ct=/^attr/;var cu=/^url\s*\(\s*([^)]*)\)$/;var cv={before0:"beforeBegin",before1:"afterBegin",after0:"afterEnd",after1:"beforeEnd"};var F=IE7.PseudoElement=o.extend({constructor:function(a,b,c){this.position=b;var d=c.match(F.CONTENT),f,g;if(d){d=d[1];f=d.split(/\s+/);for(var h=0;(g=f[h]);h++){f[h]=ct.test(g)?{attr:g.slice(5,-1)}:(g.charAt(0)=="'")?bB(g):bg(g)}d=f}this.content=d;this.base(a,bg(c))},init:function(){this.match=x(this.selector);for(var a=0;a<this.match.length;a++){var b=this.match[a].runtimeStyle;if(!b[this.position])b[this.position]={cssText:""};b[this.position].cssText+=";"+this.cssText;if(this.content!=null)b[this.position].content=this.content}},create:function(a){var b=a.runtimeStyle[this.position];if(b){var c=[].concat(b.content||"");for(var d=0;d<c.length;d++){if(typeof c[d]=="object"){c[d]=a.getAttribute(c[d].attr)}}c=c.join("");var f=c.match(cu);var g="overflow:hidden;"+b.cssText.replace(/'/g,'"');if(a.currentStyle.styleFloat!="none"){}var h=cv[this.position+Number(a.canHaveChildren)];var j='ie7_pseudo'+F.count++;a.insertAdjacentHTML(h,i(F.ANON,this.className,j,g,f?"":c));if(f){var q=document.getElementById(j);q.src=bB(f[1]);bo(q,"crop")}a.runtimeStyle[this.position]=null}},recalc:function(){if(this.content==null)return;for(var a=0;a<this.match.length;a++){this.create(this.match[a])}},toString:function(){return"."+this.className+"{display:inline}"}},{CONTENT:/content\s*:\s*([^;]*)(;|$)/,ANON:"<ie7:! class='ie7_anon %1' id=%2 style='%3'>%4</ie7:!>",MATCH:/(.*):(before|after).*/,count:0});var cw=/^(submit|reset|button)$/;IE7.HTML.addRecalc("button,input",function(a){if(a.tagName=="BUTTON"){var b=a.outerHTML.match(/ value="([^"]*)"/i);a.runtimeStyle.value=(b)?b[1]:""}if(a.type=="submit"){v(a,"onclick",function(){a.runtimeStyle.clicked=true;setTimeout("document.all."+a.uniqueID+".runtimeStyle.clicked=false",1)})}});IE7.HTML.addRecalc("form",function(c){v(c,"onsubmit",function(){for(var a,b=0;a=c[b];b++){if(cw.test(a.type)&&!a.disabled&&!a.runtimeStyle.clicked){a.disabled=true;setTimeout("document.all."+a.uniqueID+".disabled=false",1)}else if(a.tagName=="BUTTON"&&a.type=="submit"){setTimeout("document.all."+a.uniqueID+".value='"+a.value+"'",1);a.value=a.runtimeStyle.value}}})});IE7.HTML.addRecalc("img",function(a){if(a.alt&&!a.title)a.title=""});IE7.CSS.addRecalc("border-spacing",P,function(a){if(a.currentStyle.borderCollapse!="collapse"){a.cellSpacing=D(a,a.currentStyle["border-spacing"])}});IE7.CSS.addRecalc("box-sizing","content-box",IE7.Layout.boxSizing);IE7.CSS.addRecalc("box-sizing","border-box",IE7.Layout.borderBox);IE7.CSS.addFix(/opacity\s*:\s*([\d.]+)/,function(a,b){return"zoom:1;filter:Alpha(opacity="+((b*100)||1)+")"});var cx=/^image/i;IE7.HTML.addRecalc("object",function(a){if(cx.test(a.type)){a.body.style.cssText="margin:0;padding:0;border:none;overflow:hidden";return a}});IE7.loaded=true;(function(){try{bx.doScroll("left")}catch(e){setTimeout(arguments.callee,1);return}try{eval(bO.innerHTML)}catch(e){}bm=new RegExp(W(typeof IE7_PNG_SUFFIX=="string"?IE7_PNG_SUFFIX:"-trans.png")+"$","i");w=document.body;t=G?w:bx;w.className+=" ie7_body";bx.className+=" ie7_html";if(G)cq();IE7.CSS.init();IE7.HTML.init();IE7.HTML.apply();IE7.CSS.apply();IE7.recalc()})()})();
+// timestamp: Sun, 03 Feb 2008 19:26:22
+/*
+  IE7/IE8.js - copyright 2004-2008, Dean Edwards
+  http://dean.edwards.name/IE7/
+  http://www.opensource.org/licenses/mit-license.php
+*/
+
+/* W3C compliance for Microsoft Internet Explorer */
+
+/* credits/thanks:
+  Shaggy, Martijn Wargers, Jimmy Cerra, Mark D Anderson,
+  Lars Dieckow, Erik Arvidsson, Gellért Gyuris, James Denny,
+  Unknown W Brackets, Benjamin Westfarer, Rob Eberhardt,
+  Bill Edney, Kevin Newman, James Crompton, Matthew Mastracci,
+  Doug Wright, Richard York, Kenneth Kolano, MegaZone,
+  Thomas Verelst, Mark 'Tarquin' Wilton-Jones, Rainer Åhlfors,
+  David Zulaica, Ken Kolano, Kevin Newman
+*/
+
+// =======================================================================
+// TO DO
+// =======================================================================
+
+// PNG - unclickable content
+
+// =======================================================================
+// TEST/BUGGY
+// =======================================================================
+
+// hr{margin:1em auto} (doesn't look right in IE5)
+
+(function() {
+
+IE7 = {
+  toString: function(){return "IE7 version 2.0 (beta2)"}
+};
+var appVersion = IE7.appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1];
+
+if (/ie7_off/.test(top.location.search) || appVersion < 5) return;
+
+var Undefined = K();
+var quirksMode = document.compatMode != "CSS1Compat";
+var documentElement = document.documentElement, body, viewport;
+var ANON = "!";
+var HEADER = ":link{ie7-link:link}:visited{ie7-link:visited}";
+
+// -----------------------------------------------------------------------
+// external
+// -----------------------------------------------------------------------
+
+var RELATIVE = /^[\w\.]+[^:]*$/;
+function makePath(href, path) {
+  if (RELATIVE.test(href)) href = (path || "") + href;
+  return href;
+};
+
+function getPath(href, path) {
+  href = makePath(href, path);
+  return href.slice(0, href.lastIndexOf("/") + 1);
+};
+
+// get the path to this script
+var script = document.scripts[document.scripts.length - 1];
+var path = getPath(script.src);
+
+// we'll use microsoft's http request object to load external files
+try {
+  var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+} catch (e) {
+  // ActiveX disabled
+}
+
+var fileCache = {};
+function loadFile(href, path) {
+try {
+  href = makePath(href, path);
+  if (!fileCache[href]) {
+    // easy to load a file huh?
+    httpRequest.open("GET", href, false);
+    httpRequest.send();
+    if (httpRequest.status == 0 || httpRequest.status == 200) {
+      fileCache[href] = httpRequest.responseText;
+    }
+  }
+} catch (e) {
+  // ignore errors
+} finally {
+  return fileCache[href] || "";
+}};
+
+// -----------------------------------------------------------------------
+// IE5.0 compatibility
+// -----------------------------------------------------------------------
+
+
+if (appVersion < 5.5) {
+  undefined = Undefined();
+
+  ANON = "HTML:!"; // for anonymous content
+  
+  // Fix String.replace (Safari1.x/IE5.0).
+  var GLOBAL = /(g|gi)$/;
+  var _String_replace = String.prototype.replace; 
+  String.prototype.replace = function(expression, replacement) {
+    if (typeof replacement == "function") { // Safari doesn't like functions
+      if (expression && expression.constructor == RegExp) {
+        var regexp = expression;
+        var global = regexp.global;
+        if (global == null) global = GLOBAL.test(regexp);
+        // we have to convert global RexpExps for exec() to work consistently
+        if (global) regexp = new RegExp(regexp.source); // non-global
+      } else {
+        regexp = new RegExp(rescape(expression));
+      }
+      var match, string = this, result = "";
+      while (string && (match = regexp.exec(string))) {
+        result += string.slice(0, match.index) + replacement.apply(this, match);
+        string = string.slice(match.index + match[0].length);
+        if (!global) break;
+      }
+      return result + string;
+    }
+    return _String_replace.apply(this, arguments);
+  };
+  
+  Array.prototype.pop = function() {
+    if (this.length) {
+      var i = this[this.length - 1];
+      this.length--;
+      return i;
+    }
+    return undefined;
+  };
+  
+  Array.prototype.push = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      this[this.length] = arguments[i];
+    }
+    return this.length;
+  };
+  
+  var ns = this;
+  Function.prototype.apply = function(o, a) {
+    if (o === undefined) o = ns;
+    else if (o == null) o = window;
+    else if (typeof o == "string") o = new String(o);
+    else if (typeof o == "number") o = new Number(o);
+    else if (typeof o == "boolean") o = new Boolean(o);
+    if (arguments.length == 1) a = [];
+    else if (a[0] && a[0].writeln) a[0] = a[0].documentElement.document || a[0];
+    var $ = "#ie7_apply", r;
+    o[$] = this;
+    switch (a.length) { // unroll for speed
+      case 0: r = o[$](); break;
+      case 1: r = o[$](a[0]); break;
+      case 2: r = o[$](a[0],a[1]); break;
+      case 3: r = o[$](a[0],a[1],a[2]); break;
+      case 4: r = o[$](a[0],a[1],a[2],a[3]); break;
+      case 5: r = o[$](a[0],a[1],a[2],a[3],a[4]); break;
+      default:
+        var b = [], i = a.length - 1;
+        do b[i] = "a[" + i + "]"; while (i--);
+        eval("r=o[$](" + b + ")");
+    }
+    if (typeof o.valueOf == "function") { // not a COM object
+      delete o[$];
+    } else {
+      o[$] = undefined;
+      if (r && r.writeln) r = r.documentElement.document || r;
+    }
+    return r;
+  };
+  
+  Function.prototype.call = function(o) {
+    return this.apply(o, _slice.apply(arguments, [1]));
+  };
+
+  // block elements are "inline" according to IE5.0 so we'll fix it
+  HEADER += "address,blockquote,body,dd,div,dt,fieldset,form,"+
+    "frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+
+    "hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}";
+}
+
+// -----------------------------------------------------------------------
+// OO support
+// -----------------------------------------------------------------------
+
+
+// This is a cut-down version of base2 (http://code.google.com/p/base2/)
+
+var _slice = Array.prototype.slice;
+
+// private
+var _FORMAT = /%([1-9])/g;
+var _LTRIM = /^\s\s*/;
+var _RTRIM = /\s\s*$/;
+var _RESCAPE = /([\/()[\]{}|*+-.,^$?\\])/g;           // safe regular expressions
+var _BASE = /\bbase\b/;
+var _HIDDEN = ["constructor", "toString"];            // only override these when prototyping
+
+var prototyping;
+
+function Base(){};
+Base.extend = function(_instance, _static) {
+  // Build the prototype.
+  prototyping = true;
+  var _prototype = new this;
+  extend(_prototype, _instance);
+  prototyping = false;
+
+  // Create the wrapper for the constructor function.
+  var _constructor = _prototype.constructor;
+  function klass() {
+    // Don't call the constructor function when prototyping.
+    if (!prototyping) _constructor.apply(this, arguments);
+  };
+  _prototype.constructor = klass;
+
+  // Build the static interface.
+  klass.extend = arguments.callee;
+  extend(klass, _static);
+  klass.prototype = _prototype;
+  return klass;
+};
+Base.prototype.extend = function(source) {
+  return extend(this, source);
+};
+
+// A collection of regular expressions and their associated replacement values.
+// A Base class for creating parsers.
+
+var _HASH   = "#";
+var _KEYS   = "~";
+
+var _RG_ESCAPE_CHARS    = /\\./g;
+var _RG_ESCAPE_BRACKETS = /\(\?[:=!]|\[[^\]]+\]/g;
+var _RG_BRACKETS        = /\(/g;
+
+var RegGrp = Base.extend({
+  constructor: function(values) {
+    this[_KEYS] = [];
+    this.merge(values);
+  },
+
+  exec: function(string) {
+    var items = this, keys = this[_KEYS];    
+    return String(string).replace(new RegExp(this, this.ignoreCase ? "gi" : "g"), function() {
+      var item, offset = 1, i = 0;
+      // Loop through the RegGrp items.
+      while ((item = items[_HASH + keys[i++]])) {
+        var next = offset + item.length + 1;
+        if (arguments[offset]) { // do we have a result?
+          var replacement = item.replacement;
+          switch (typeof replacement) {
+            case "function":
+              return replacement.apply(items, _slice.call(arguments, offset, next));
+            case "number":
+              return arguments[offset + replacement];
+            default:
+              return replacement;
+          }
+        }
+        offset = next;
+      }
+    });
+  },
+
+  add: function(expression, replacement) {
+    if (expression instanceof RegExp) {
+      expression = expression.source;
+    }
+    if (!this[_HASH + expression]) this[_KEYS].push(String(expression));
+    this[_HASH + expression] = new RegGrp.Item(expression, replacement);
+  },
+
+  merge: function(values) {
+    for (var i in values) this.add(i, values[i]);
+  },
+
+  toString: function() {
+    // back references not supported in simple RegGrp
+    return "(" + this[_KEYS].join(")|(") + ")";
+  }
+}, {
+  IGNORE: "$0",
+
+  Item: Base.extend({
+    constructor: function(expression, replacement) {
+      expression = expression instanceof RegExp ? expression.source : String(expression);
+
+      if (typeof replacement == "number") replacement = String(replacement);
+      else if (replacement == null) replacement = "";
+
+      // does the pattern use sub-expressions?
+      if (typeof replacement == "string" && /\$(\d+)/.test(replacement)) {
+        // a simple lookup? (e.g. "$2")
+        if (/^\$\d+$/.test(replacement)) {
+          // store the index (used for fast retrieval of matched strings)
+          replacement = parseInt(replacement.slice(1));
+        } else { // a complicated lookup (e.g. "Hello $2 $1")
+          // build a function to do the lookup
+          var Q = /'/.test(replacement.replace(/\\./g, "")) ? '"' : "'";
+          replacement = replacement.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\$(\d+)/g, Q +
+            "+(arguments[$1]||" + Q+Q + ")+" + Q);
+          replacement = new Function("return " + Q + replacement.replace(/(['"])\1\+(.*)\+\1\1$/, "$1") + Q);
+        }
+      }
+
+      this.length = RegGrp.count(expression);
+      this.replacement = replacement;
+      this.toString = K(expression);
+    }
+  }),
+
+  count: function(expression) {
+    // Count the number of sub-expressions in a RegExp/RegGrp.Item.
+    expression = String(expression).replace(_RG_ESCAPE_CHARS, "").replace(_RG_ESCAPE_BRACKETS, "");
+    return match(expression, _RG_BRACKETS).length;
+  }
+});
+
+// =========================================================================
+// lang/extend.js
+// =========================================================================
+
+function extend(object, source) { // or extend(object, key, value)
+  if (object && source) {
+    var proto = (typeof source == "function" ? Function : Object).prototype;
+    // Add constructor, toString etc
+    var i = _HIDDEN.length, key;
+    if (prototyping) while (key = _HIDDEN[--i]) {
+      var value = source[key];
+      if (value != proto[key]) {
+        if (_BASE.test(value)) {
+          _override(object, key, value)
+        } else {
+          object[key] = value;
+        }
+      }
+    }
+    // Copy each of the source object's properties to the target object.
+    for (key in source) if (proto[key] === undefined) {
+      var value = source[key];
+      // Check for method overriding.
+      if (object[key] && typeof value == "function" && _BASE.test(value)) {
+        _override(object, key, value);
+      } else {
+        object[key] = value;
+      }
+    }
+  }
+  return object;
+};
+
+function _override(object, name, method) {
+  // Override an existing method.
+  var ancestor = object[name];
+  object[name] = function() {
+    var previous = this.base;
+    this.base = ancestor;
+    var returnValue = method.apply(this, arguments);
+    this.base = previous;
+    return returnValue;
+  };
+};
+
+function combine(keys, values) {
+  // Combine two arrays to make a hash.
+  if (!values) values = keys;
+  var hash = {};
+  for (var i in keys) hash[i] = values[i];
+  return hash;
+};
+
+function format(string) {
+  // Replace %n with arguments[n].
+  // e.g. format("%1 %2%3 %2a %1%3", "she", "se", "lls");
+  // ==> "she sells sea shells"
+  // Only %1 - %9 supported.
+  var args = arguments;
+  var _FORMAT = new RegExp("%([1-" + arguments.length + "])", "g");
+  return String(string).replace(_FORMAT, function(match, index) {
+    return index < args.length ? args[index] : match;
+  });
+};
+
+function match(string, expression) {
+  // Same as String.match() except that this function will return an empty
+  // array if there is no match.
+  return String(string).match(expression) || [];
+};
+
+function rescape(string) {
+  // Make a string safe for creating a RegExp.
+  return String(string).replace(_RESCAPE, "\\$1");
+};
+
+// http://blog.stevenlevithan.com/archives/faster-trim-javascript
+function trim(string) {
+  return String(string).replace(_LTRIM, "").replace(_RTRIM, "");
+};
+
+function K(k) {
+  return function() {
+    return k;
+  };
+};
+
+// -----------------------------------------------------------------------
+// parsing
+// -----------------------------------------------------------------------
+
+var Parser = RegGrp.extend({ignoreCase: true});
+
+var ENCODED = /\x01(\d+)/g,
+    QUOTES  = /'/g, 
+    STRING = /^\x01/,
+    UNICODE = /\\([\da-fA-F]{1,4})/g;
+
+var _strings = [];
+
+var encoder = new Parser({
+  // comments
+  "<!\\-\\-|\\-\\->": "",
+  "\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/": "",
+  // get rid
+  "@(namespace|import)[^;\\n]+[;\\n]": "",
+  // strings
+  "'(\\\\.|[^'\\\\])*'": encodeString,
+  '"(\\\\.|[^"\\\\])*"': encodeString,
+  // white space
+  "\\s+": " "
+});
+
+function encode(cssText) {
+  return encoder.exec(cssText);
+};
+
+function decode(cssText) {
+  return cssText.replace(ENCODED, function(match, index) {
+    return _strings[index - 1];
+  });
+};
+
+function encodeString(string) {
+  return "\x01" + _strings.push(string.replace(UNICODE, function(match, chr) {
+    return eval("'\\u" + "0000".slice(chr.length) + chr + "'");
+  }).slice(1, -1).replace(QUOTES, "\\'"));
+};
+
+function getString(value) {
+  return STRING.test(value) ? _strings[value.slice(1) - 1] : value;
+};
+
+// clone a "width" function to create a "height" function
+var rotater = new RegGrp({
+  Width: "Height",
+  width: "height",
+  Left:  "Top",
+  left:  "top",
+  Right: "Bottom",
+  right: "bottom",
+  onX:   "onY"
+});
+
+function rotate(fn) {
+  return rotater.exec(fn);
+};
+
+// -----------------------------------------------------------------------
+// event handling
+// -----------------------------------------------------------------------
+
+var eventHandlers = [];
+
+function addResize(handler) {
+  addRecalc(handler);
+  addEventHandler(window, "onresize", handler);
+};
+
+// add an event handler (function) to an element
+function addEventHandler(element, type, handler) {
+  element.attachEvent(type, handler);
+  // store the handler so it can be detached later
+  eventHandlers.push(arguments);
+};
+
+// remove an event handler assigned to an element by IE7
+function removeEventHandler(element, type, handler) {
+try {
+  element.detachEvent(type, handler);
+} catch (ignore) {
+  // write a letter of complaint to microsoft..
+}};
+
+// remove event handlers (they eat memory)
+addEventHandler(window, "onunload", function() {
+  var handler;
+  while (handler = eventHandlers.pop()) {
+    removeEventHandler(handler[0], handler[1], handler[2]);
+  }
+});
+
+function register(handler, element, condition) { // -@DRE
+  //var set = handler[element.uniqueID];
+  if (!handler.elements) handler.elements = {};
+  if (condition) handler.elements[element.uniqueID] = element;
+  else delete handler.elements[element.uniqueID];
+  //return !set && condition;
+  return condition;
+};
+
+addEventHandler(window, "onbeforeprint", function() {
+  if (!IE7.CSS.print) new StyleSheet("print");
+  IE7.CSS.print.recalc();
+});
+
+// -----------------------------------------------------------------------
+// pixel conversion
+// -----------------------------------------------------------------------
+
+// this is handy because it means that web developers can mix and match
+//  measurement units in their style sheets. it is not uncommon to
+//  express something like padding in "em" units whilst border thickness
+//  is most often expressed in pixels.
+
+var PIXEL = /^\d+(px)?$/i;
+var PERCENT = /^\d+%$/;
+var getPixelValue = function(element, value) {
+  if (PIXEL.test(value)) return parseInt(value);
+  var style = element.style.left;
+  var runtimeStyle = element.runtimeStyle.left;
+  element.runtimeStyle.left = element.currentStyle.left;
+  element.style.left = value || 0;
+  value = element.style.pixelLeft;
+  element.style.left = style;
+  element.runtimeStyle.left = runtimeStyle;
+  return value;
+};
+
+// -----------------------------------------------------------------------
+// generic
+// -----------------------------------------------------------------------
+
+var $IE7 = "ie7-";
+
+var Fix = Base.extend({
+  constructor: function() {
+    this.fixes = [];
+    this.recalcs = [];
+  },
+  init: Undefined
+});
+
+// a store for functions that will be called when refreshing IE7
+var recalcs = [];
+function addRecalc(recalc) {
+  recalcs.push(recalc);
+};
+
+IE7.recalc = function() {
+  IE7.HTML.recalc();
+  // re-apply style sheet rules (re-calculate ie7 classes)
+  IE7.CSS.recalc();
+  // apply global fixes to the document
+  for (var i = 0; i < recalcs.length; i++) recalcs[i]();
+};
+
+function isFixed(element) {
+  return element.currentStyle["ie7-position"] == "fixed";
+};
+
+// original style
+function getDefinedStyle(element, propertyName) {
+  return element.currentStyle[$IE7 + propertyName] || element.currentStyle[propertyName];
+};
+
+function setOverrideStyle(element, propertyName, value) {
+  if (element.currentStyle[$IE7 + propertyName] == null) {
+    element.runtimeStyle[$IE7 + propertyName] = element.currentStyle[propertyName];
+  }
+  element.runtimeStyle[propertyName] = value;
+};
+
+// create a temporary element which is used to inherit styles
+//  from the target element. the temporary element can be resized
+//  to determine pixel widths/heights
+function createTempElement(tagName) {
+  var element = document.createElement(tagName || "object");
+  element.style.cssText = "position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";
+  element.ie7_anon = true;
+  return element;
+};
+
+
+// =========================================================================
+// ie7-cssQuery.js
+// =========================================================================
+
+function cssQuery(selector, context, single) {
+  if (!_cache[selector]) {
+    reg = []; // store for RegExp objects
+    var fn = "";
+    var selectors = cssParser.escape(selector).split(",");
+    for (var i = 0; i < selectors.length; i++) {
+      _wild = _index = _list = 0; // reset
+      _duplicate = selectors.length > 1 ? 2 : 0; // reset
+      var block = cssParser.exec(selectors[i]) || "if(0){";
+      if (_wild) { // IE's pesky comment nodes
+        block += format("if(e%1.nodeName!='!'){", _index);
+      }
+      // check for duplicates before storing results
+      var store = _duplicate > 1 ? _TEST : "";
+      block += format(store + _STORE, _index);
+      // add closing braces
+      block += Array(match(block, /\{/g).length + 1).join("}");
+      fn += block;
+    }
+    eval(format(_FN, reg) + cssParser.unescape(fn) + "return s?null:r}");
+    _cache[selector] = _selectorFunction;
+  }
+  return _cache[selector](context || document, single);
+};
+
+var _MSIE5 = appVersion < 6;
+
+var _EVALUATED = /^(href|src)$/;
+var _ATTRIBUTES = {
+  "class": "className",
+  "for": "htmlFor"
+};
+
+IE7._indexed = 1;
+
+IE7._byId = function(document, id) {
+  var result = document.all[id] || null;
+  // returns a single element or a collection
+  if (!result || result.id == id) return result;
+  // document.all has returned a collection of elements with name/id
+  for (var i = 0; i < result.length; i++) {
+    if (result[i].id == id) return result[i];
+  }
+  return null;
+};
+
+IE7._getAttribute = function(element, name) {
+  if (name == "src" && element.pngSrc) return element.pngSrc;
+  
+  var attribute = _MSIE5 ? (element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]]) : element.getAttributeNode(name);
+  if (attribute && (attribute.specified || name == "value")) {
+    if (_EVALUATED.test(name)) {
+      return element.getAttribute(name, 2);
+    } else if (name == "class") {
+     return element.className.replace(/\sie7_\w+/g, "");
+    } else if (name == "style") {
+     return element.style.cssText;
+    } else {
+     return attribute.nodeValue;
+    }
+  }
+  return null;
+};
+
+var names = "colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";
+// Convert the list of strings to a hash, mapping the lowercase name to the camelCase name.
+extend(_ATTRIBUTES, combine(names.toLowerCase().split(","), names.split(",")));
+
+IE7._getNextElementSibling = function(node) {
+  // return the next element to the supplied element
+  //  nextSibling is not good enough as it might return a text or comment node
+  while (node && (node = node.nextSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+IE7._getPreviousElementSibling = function(node) {
+  // return the previous element to the supplied element
+  while (node && (node = node.previousSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+// =========================================================================
+// CSSParser
+// =========================================================================
+
+var IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g,
+    IMPLIED_SPACE =    /(^|,)([^\s>+~])/g,
+    WHITESPACE =       /\s*([\s>+~(),]|^|$)\s*/g,
+    WILD_CARD =        /\s\*\s/g;;
+
+var CSSParser = RegGrp.extend({
+  constructor: function(items) {
+    this.base(items);
+    this.sorter = new RegGrp;
+    this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE);
+    this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4");
+  },
+  
+  ignoreCase: true,
+
+  escape: function(selector) {
+    return this.optimise(this.format(selector));
+  },
+
+  format: function(selector) {
+    return selector
+      .replace(WHITESPACE, "$1")
+      .replace(IMPLIED_SPACE, "$1 $2")
+      .replace(IMPLIED_ASTERISK, "$1*$2");
+  },
+
+  optimise: function(selector) {
+    // optimise wild card descendant selectors
+    return this.sorter.exec(selector.replace(WILD_CARD, ">* "));
+  },
+
+  unescape: function(selector) {
+    return decode(selector);
+  }
+});
+
+// some constants
+var _OPERATORS = {
+  "":   "%1!=null",
+  "=":  "%1=='%2'",
+  "~=": /(^| )%1( |$)/,
+  "|=": /^%1(-|$)/,
+  "^=": /^%1/,
+  "$=": /%1$/,
+  "*=": /%1/
+};
+
+var _PSEUDO_CLASSES = {
+  "first-child": "!IE7._getPreviousElementSibling(e%1)",
+  "link":        "e%1.currentStyle['ie7-link']=='link'",
+  "visited":     "e%1.currentStyle['ie7-link']=='visited'"
+};
+
+var _VAR = "var p%2=0,i%2,e%2,n%2=e%1.";
+var _ID = "e%1.sourceIndex";
+var _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;";
+var _STORE = "r[r.length]=e%1;if(s)return e%1;";
+var _FN = "var _selectorFunction=function(e0,s){IE7._indexed++;var r=[],p={},reg=[%1],d=document;";
+var reg; // a store for RexExp objects
+var _index;
+var _wild; // need to flag certain _wild card selectors as MSIE includes comment nodes
+var _list; // are we processing a node _list?
+var _duplicate; // possible duplicates?
+var _cache = {}; // store parsed selectors
+
+// a hideous parser
+var cssParser = new CSSParser({
+  " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID
+    _wild = false;
+    var replacement = "var e%2=IE7._byId(d,'%4');if(e%2&&";
+    if (tagName != "*") replacement += "e%2.nodeName=='%3'&&";
+    replacement += "(e%1==d||e%1.contains(e%2))){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index++, _index, tagName.toUpperCase(), id);
+  },
+  
+  " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector
+    _duplicate++; // this selector may produce duplicates
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // IE5.x does not support getElementsByTagName("*");
+    replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  ">(\\*|[\\w-]+)": function(match, tagName) { // child selector
+    var children = _list;
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // use the children property for MSIE as it does not contain text nodes
+    //  (but the children collection still includes comments).
+    // the document object does not have a children collection
+    replacement += children ? "children": "childNodes";
+    if (!_wild && children) replacement += ".tags('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    if (_wild) {
+      replacement += "if(e%2.nodeType==1){";
+      _wild = _MSIE5;
+    } else {
+      if (!children) replacement += "if(e%2.nodeName=='%3'){";
+    }
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    replacement += "e%1=IE7._getNextElementSibling(e%1);if(e%1";
+    if (tagName != "*") replacement += "&&e%1.nodeName=='%2'";
+    replacement += "){";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    _duplicate = 2; // this selector may produce duplicates
+    replacement += "while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._indexed)break;if(";
+    if (tagName == "*") {
+      replacement += "e%1.nodeType==1";
+      if (_MSIE5) replacement += "&&e%1.nodeName!='!'";
+    } else replacement += "e%1.nodeName=='%2'";
+    replacement += "){e%1.ie7_adjacent=IE7._indexed;";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "#([\\w-]+)": function(match, id) { // ID selector
+    _wild = false;
+    var replacement = "if(e%1.id=='%2'){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index, id);
+  },
+  
+  "\\.([\\w-]+)": function(match, className) { // class selector
+    _wild = false;
+    // store RegExp objects - slightly faster on IE
+    reg.push(new RegExp("(^|\\s)" + rescape(className) + "(\\s|$)"));
+    return format("if(e%1.className&&reg[%2].test(e%1.className)){", _index, reg.length - 1);
+  },
+  
+  "\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]": function(match, attr, operator, value) { // attribute selectors
+    var alias = _ATTRIBUTES[attr] || attr;
+    if (operator) {
+      var getAttribute = "e%1.getAttribute('%2',2)";
+      if (!_EVALUATED.test(attr)) {
+        getAttribute = "e%1.%3||" + getAttribute;
+      }
+      attr = format("(" + getAttribute + ")", _index, attr, alias);
+    } else {
+      attr = format("IE7._getAttribute(e%1,'%2')", _index, attr);
+    }
+    var replacement = _OPERATORS[operator || ""] || "0";
+    if (replacement && replacement.source) {
+      reg.push(new RegExp(format(replacement.source, rescape(cssParser.unescape(value)))));
+      replacement = "reg[%2].test(%1)";
+      value = reg.length - 1;
+    }
+    return "if(" + format(replacement, attr, value) + "){";
+  },
+  
+  ":+([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // pseudo class selectors
+    pseudoClass = _PSEUDO_CLASSES[pseudoClass];
+    return "if(" + (pseudoClass ? format(pseudoClass, _index, args || "")  : "0") + "){";
+  }
+});
+
+// =========================================================================
+// ie7-css.js
+// =========================================================================
+
+var HYPERLINK = /a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;
+var BRACE1 = /\s*\{\s*/, BRACE2 = /\s*\}\s*/, COMMA = /\s*\,\s*/;
+var FIRST_LINE_LETTER = /(.*)(:first-(line|letter))/;
+
+//var UNKNOWN = /UNKNOWN|([:.])\w+\1/i;
+
+var styleSheets = document.styleSheets;
+
+IE7.CSS = new (Fix.extend({ // single instance
+  parser: new Parser,
+  screen: "",
+  print: "",
+  styles: [],
+  rules: [],
+  pseudoClasses: appVersion < 7 ? "first\\-child" : "",
+  dynamicPseudoClasses: {
+    toString: function() {
+      var strings = [];
+      for (var pseudoClass in this) strings.push(pseudoClass);
+      return strings.join("|");
+    }
+  },
+  
+  init: function() {
+    var NONE = "^\x01$";
+    var CLASS = "\\[class=?[^\\]]*\\]";
+    var pseudoClasses = [];
+    if (this.pseudoClasses) pseudoClasses.push(this.pseudoClasses);
+    var dynamicPseudoClasses = this.dynamicPseudoClasses.toString(); 
+    if (dynamicPseudoClasses) pseudoClasses.push(dynamicPseudoClasses);
+    pseudoClasses = pseudoClasses.join("|");
+    var unknown = appVersion < 7 ? ["[>+~[(]|([:.])\\w+\\1"] : [CLASS];
+    if (pseudoClasses) unknown.push(":(" + pseudoClasses + ")");
+    this.UNKNOWN = new RegExp(unknown.join("|") || NONE, "i");
+    var complex = appVersion < 7 ? ["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"] : [CLASS];
+    var complexRule = complex.concat();
+    if (pseudoClasses) complexRule.push(":(" + pseudoClasses + ")");
+    Rule.COMPLEX = new RegExp(complexRule.join("|") || NONE, "ig");
+    if (this.pseudoClasses) complex.push(":(" + this.pseudoClasses + ")");
+    DynamicRule.COMPLEX = new RegExp(complex.join("|") || NONE, "i");
+    DynamicRule.MATCH = new RegExp(dynamicPseudoClasses ? "(.*):(" + dynamicPseudoClasses + ")(.*)" : NONE, "i");
+    
+    this.createStyleSheet();
+    this.refresh();
+  },
+  
+	addEventHandler: function() {
+		addEventHandler.apply(null, arguments);
+	},
+  
+  addFix: function(expression, replacement) {
+    this.parser.add(expression, replacement);
+  },
+  
+  addRecalc: function(propertyName, test, handler, replacement) {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    test = new RegExp("([{;\\s])" + propertyName + "\\s*:\\s*" + test + "[^;}]*");
+    var id = this.recalcs.length;
+    if (replacement) replacement = propertyName + ":" + replacement;
+    this.addFix(test, function(match, $1) {
+      return (replacement ? $1 + replacement : match) + ";ie7-" + match.slice(1) + ";ie7_recalc" + id + ":1";
+    });
+    this.recalcs.push(arguments);
+    return id;
+  },
+  
+  apply: function() {
+    this.getInlineStyles();
+    new StyleSheet("screen");
+    this.trash();
+  },
+  
+  createStyleSheet: function() {
+    // create the IE7 style sheet
+    this.styleSheet = document.createStyleSheet();
+    // flag it so we can ignore it during parsing
+    this.styleSheet.ie7 = true;
+    this.styleSheet.owningElement.ie7 = true;
+    this.styleSheet.cssText = HEADER;
+  },
+  
+  getInlineStyles: function() {
+    // load inline styles
+    var styleSheets = document.getElementsByTagName("style"), styleSheet;
+    for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+      if (!styleSheet.disabled && !styleSheet.ie7) {
+        this.styles.push(styleSheet.innerHTML);
+      }
+    }
+  },
+  
+  getText: function(styleSheet, path) {
+    // explorer will trash unknown selectors (it converts them to "UNKNOWN").
+    // so we must reload external style sheets (internal style sheets can have their text
+    //  extracted through the innerHTML property).
+      // load the style sheet text from an external file
+    try {
+      var cssText = styleSheet.cssText;
+    } catch (e) {
+      cssText = "";
+    }
+    if (httpRequest) cssText = loadFile(styleSheet.href, path) || cssText;
+    return cssText;
+  },
+  
+  recalc: function() {
+    this.screen.recalc();
+    // we're going to read through all style rules.
+    //  certain rules have had ie7 properties added to them.
+    //   e.g. p{top:0; ie7_recalc2:1; left:0}
+    //  this flags a property in the rule as needing a fix.
+    //  the selector text is then used to query the document.
+    //  we can then loop through the results of the query
+    //  and fix the elements.
+    // we ignore the IE7 rules - so count them in the header
+    var RECALCS = /ie7_recalc\d+/g;
+    var start = HEADER.match(/[{,]/g).length;
+    // only calculate screen fixes. print fixes don't show up anyway
+    var stop = start + (this.screen.cssText.match(/\{/g)||"").length;
+    var rules = this.styleSheet.rules, rule;
+    var calcs, calc, elements, element, i, j, k, id;
+    // loop through all rules
+    for (i = start; i < stop; i++) {
+      rule = rules[i];
+      var cssText = rule.style.cssText;
+      // search for the "ie7_recalc" flag (there may be more than one)
+      if (rule && (calcs = cssText.match(RECALCS))) {
+        // use the selector text to query the document
+        elements = cssQuery(rule.selectorText);
+        // if there are matching elements then loop
+        //  through the recalc functions and apply them
+        //  to each element
+        if (elements.length) for (j = 0; j < calcs.length; j++) {
+          // get the matching flag (e.g. ie7_recalc3)
+          id = calcs[j];
+          // extract the numeric id from the end of the flag
+          //  and use it to index the collection of recalc
+          //  functions
+          calc = IE7.CSS.recalcs[id.slice(10)][2];
+          for (k = 0; (element = elements[k]); k++) {
+            // apply the fix
+            if (element.currentStyle[id]) calc(element, cssText);
+          }
+        }
+      }
+    }
+  },
+  
+  refresh: function() {
+    this.styleSheet.cssText = HEADER + this.screen + this.print;
+  },
+  
+  trash: function() {
+    // trash the old style sheets
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].ie7) {
+        try {
+          var cssText = styleSheets[i].cssText;
+        } catch (e) {
+          cssText = "";
+        }
+        if (cssText) styleSheets[i].cssText = "";
+      }
+    }
+  }
+}));
+
+// -----------------------------------------------------------------------
+//  IE7 StyleSheet class
+// -----------------------------------------------------------------------
+
+var StyleSheet = Base.extend({
+  constructor: function(media) {
+    this.media = media;
+    this.load();
+    IE7.CSS[media] = this;
+    IE7.CSS.refresh();
+  },
+  
+  createRule: function(selector, cssText) {
+    if (IE7.CSS.UNKNOWN.test(selector)) {
+      var match;
+      if (PseudoElement && (match = selector.match(PseudoElement.MATCH))) {
+        return new PseudoElement(match[1], match[2], cssText);
+      } else if (match = selector.match(DynamicRule.MATCH)) {
+        if (!HYPERLINK.test(match[0]) || DynamicRule.COMPLEX.test(match[0])) {
+          return new DynamicRule(selector, match[1], match[2], match[3], cssText);
+        }
+      } else return new Rule(selector, cssText);
+    }
+    return selector + " {" + cssText + "}";
+  },
+  
+  getText: function() {
+    // store for style sheet text
+    var _inlineStyles = [].concat(IE7.CSS.styles);
+    // parse media decalarations
+    var MEDIA = /@media\s+([^{]*)\{([^@]+\})\s*\}/gi;
+    var ALL = /\ball\b|^$/i, SCREEN = /\bscreen\b/i, PRINT = /\bprint\b/i;
+    function _parseMedia(cssText, media) {
+      _filterMedia.value = media;
+      return cssText.replace(MEDIA, _filterMedia);
+    };
+    function _filterMedia(match, media, cssText) {
+      media = _simpleMedia(media);
+      switch (media) {
+        case "screen":
+        case "print":
+          if (media != _filterMedia.value) return "";
+        case "all":
+          return cssText;
+      }
+      return "";
+    };
+    function _simpleMedia(media) {
+      if (ALL.test(media)) return "all";
+      else if (SCREEN.test(media)) return (PRINT.test(media)) ? "all" : "screen";
+      else if (PRINT.test(media)) return "print";
+    };
+    var self = this;
+    function _getCSSText(styleSheet, path, media, level) {
+      var cssText = "";
+      if (!level) {
+        media = _simpleMedia(styleSheet.media);
+        level = 0;
+      }
+      if (media == "all" || media == self.media) {
+        // IE only allows importing style sheets three levels deep.
+        // it will crash if you try to access a level below this
+        if (level < 3) {
+          // loop through imported style sheets
+          for (var i = 0; i < styleSheet.imports.length; i++) {
+            // call this function recursively to get all imported style sheets
+            cssText += _getCSSText(styleSheet.imports[i], getPath(styleSheet.href, path), media, level + 1);
+          }
+        }
+        // retrieve inline style or load an external style sheet
+        cssText += encode(styleSheet.href ? _loadStyleSheet(styleSheet, path) : _inlineStyles.pop() || "");
+        cssText = _parseMedia(cssText, self.media);
+      }
+      return cssText;
+    };
+    // store loaded cssText URLs
+    var fileCache = {};
+    // load an external style sheet
+    function _loadStyleSheet(styleSheet, path) {
+      var url = makePath(styleSheet.href, path);
+      // if the style sheet has already loaded then don't duplicate it
+      if (fileCache[url]) return "";
+      // load from source
+      fileCache[url] = (styleSheet.disabled) ? "" :
+        _fixUrls(IE7.CSS.getText(styleSheet, path), getPath(styleSheet.href, path));
+      return fileCache[url];
+    };
+    // fix css paths
+    // we're lumping all css text into one big style sheet so relative
+    //  paths have to be fixed. this is necessary anyway because of other
+    //  explorer bugs.
+    var URL = /(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;
+    function _fixUrls(cssText, pathname) {
+      // hack & slash
+      return cssText.replace(URL, "$1" + pathname.slice(0, pathname.lastIndexOf("/") + 1) + "$2");
+    };
+
+    // load all style sheets in the document
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].disabled && !styleSheets[i].ie7) {
+        this.cssText += _getCSSText(styleSheets[i]);
+      }
+    }
+  },
+  
+  load: function() {
+    this.cssText = "";
+    this.getText();
+    this.parse();
+    this.cssText = decode(this.cssText);
+    fileCache = {};
+  },
+  
+  parse: function() {
+    this.cssText = IE7.CSS.parser.exec(this.cssText);
+    
+    // parse the style sheet
+    var offset = IE7.CSS.rules.length;
+    var rules = this.cssText.split(BRACE2), rule;
+    var selectors, cssText, i, j;
+    for (i = 0; i < rules.length; i++) {
+      rule = rules[i].split(BRACE1);
+      selectors = rule[0].split(COMMA);
+      cssText = rule[1];
+      for (j = 0; j < selectors.length; j++) {
+        selectors[j] = cssText ? this.createRule(selectors[j], cssText) : "";
+      }
+      rules[i] = selectors.join("\n");
+    }
+    this.cssText = rules.join("\n");
+    this.rules = IE7.CSS.rules.slice(offset);
+  },
+  
+  recalc: function() {
+    var rule, i;
+    for (i = 0; (rule = this.rules[i]); i++) rule.recalc();
+  },
+  
+  toString: function() {
+    return "@media " + this.media + "{" + this.cssText + "}";
+  }
+});
+
+var PseudoElement;
+
+// -----------------------------------------------------------------------
+// IE7 style rules
+// -----------------------------------------------------------------------
+
+var Rule = IE7.Rule = Base.extend({
+  // properties
+  constructor: function(selector, cssText) {
+    this.id = IE7.CSS.rules.length;
+    this.className = Rule.PREFIX + this.id;
+    selector = selector.match(FIRST_LINE_LETTER) || selector || "*";
+    this.selector = selector[1] || selector;
+    this.selectorText = this.parse(this.selector) + (selector[2] || "");
+    this.cssText = cssText;
+    this.MATCH = new RegExp("\\s" + this.className + "(\\s|$)", "g");
+    IE7.CSS.rules.push(this);
+    this.init();
+  },
+  
+  init: Undefined,
+  
+  add: function(element) {
+    // allocate this class
+    element.className += " " + this.className;
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var match = cssQuery(this.selector);
+    // add the class name for all matching elements
+    for (var i = 0; i < match.length; i++) this.add(match[i]);
+  },
+
+  parse: function(selector) {
+    // attempt to preserve specificity for "loose" parsing by
+    //  removing unknown tokens from a css selector but keep as
+    //  much as we can..
+    var simple = selector.replace(Rule.CHILD, " ").replace(Rule.COMPLEX, "");
+    if (appVersion < 7) simple = simple.replace(Rule.MULTI, "");
+    var tags = match(simple, Rule.TAGS).length - match(selector, Rule.TAGS).length;
+    var classes = match(simple, Rule.CLASSES).length - match(selector, Rule.CLASSES).length + 1;
+    while (classes > 0 && Rule.CLASS.test(simple)) {
+      simple = simple.replace(Rule.CLASS, "");
+      classes--;
+    }
+    while (tags > 0 && Rule.TAG.test(simple)) {
+      simple = simple.replace(Rule.TAG, "$1*");
+      tags--;
+    }
+    simple += "." + this.className;
+    classes = Math.min(classes, 2);
+    tags = Math.min(tags, 2);
+    var score = -10 * classes - tags;
+    if (score > 0) {
+      simple = simple + "," + Rule.MAP[score] + " " + simple;
+    }
+    return simple;
+  },
+  
+  remove: function(element) {
+    // deallocate this class
+    element.className = element.className.replace(this.MATCH, "$1");
+  },
+  
+  toString: function() {
+    return format("%1 {%2}", this.selectorText, this.cssText);
+  }
+}, {
+  CHILD: />/g,
+  CLASS: /\.[\w-]+/,
+  CLASSES: /[.:\[]/g,
+  MULTI: /(\.[\w-]+)+/g,
+  PREFIX: "ie7_class",
+  TAG: /^\w+|([\s>+~])\w+/,
+  TAGS: /^\w|[\s>+~]\w/g,
+  MAP: {
+    1:  "html",
+    2:  "html body",
+    10: ".ie7_html",
+    11: "html.ie7_html",
+    12: "html.ie7_html body",
+    20: ".ie7_html .ie7_body",
+    21: "html.ie7_html .ie7_body",
+    22: "html.ie7_html body.ie7_body"
+  }
+});
+
+// -----------------------------------------------------------------------
+// IE7 dynamic style
+// -----------------------------------------------------------------------
+
+// object properties:
+// attach: the element that an event handler will be attached to
+// target: the element that will have the IE7 class applied
+
+var DynamicRule = Rule.extend({
+  // properties
+  constructor: function(selector, attach, dynamicPseudoClass, target, cssText) {
+    // initialise object properties
+    this.attach = attach || "*";
+    this.dynamicPseudoClass = IE7.CSS.dynamicPseudoClasses[dynamicPseudoClass];
+    this.target = target;
+    this.base(selector, cssText);
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var attaches = cssQuery(this.attach), attach;
+    // process results
+    for (var i = 0; attach = attaches[i]; i++) {
+      // retrieve the event handler's target element(s)
+      var target = this.target ? cssQuery(this.target, attach) : [attach];
+      // attach event handlers for dynamic pseudo-classes
+      if (target.length) this.dynamicPseudoClass.apply(attach, target, this);
+    }
+  }
+});
+
+// -----------------------------------------------------------------------
+//  IE7 dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var DynamicPseudoClass = Base.extend({
+  constructor: function(name, apply) {
+    this.name = name;
+    this.apply = apply;
+    this.instances = {};
+    IE7.CSS.dynamicPseudoClasses[name] = this;
+  },
+  
+  register: function(instance) {
+    // an "instance" is actually an Arguments object
+    var _class = instance[2];
+    instance.id = _class.id + instance[0].uniqueID;
+    if (!this.instances[instance.id]) {
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.add(target[j]);
+      this.instances[instance.id] = instance;
+    }
+  },
+  
+  unregister: function(instance) {
+    if (this.instances[instance.id]) {
+      var _class = instance[2];
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.remove(target[j]);
+      delete this.instances[instance.id];
+    }
+  }
+});
+  
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+if (appVersion < 7) {
+  var Hover = new DynamicPseudoClass("hover", function(element) {
+    var instance = arguments;
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseover" : "onmouseenter", function() {
+      Hover.register(instance);
+    });
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseout" : "onmouseleave", function() {
+      Hover.unregister(instance);
+    });
+  });
+  
+  // globally trap the mouseup event (thanks Martijn!)
+  addEventHandler(document, "onmouseup", function() {
+    var instances = Hover.instances;
+    for (var i in instances)
+      if (!instances[i][0].contains(event.srcElement))
+        Hover.unregister(instances[i]);
+  });
+}
+
+// -----------------------------------------------------------------------
+// propertyName: inherit;
+// -----------------------------------------------------------------------
+
+IE7.CSS.addRecalc("[\\w-]+", "inherit", function(element, cssText) {
+  var inherited = cssText.match(/[\w-]+\s*:\s*inherit/g);
+  for (var i = 0; i < inherited.length; i++) {
+    var propertyName = inherited[i].replace(/ie7\-|\s*:\s*inherit/g, "").replace(/\-([a-z])/g, function(match, chr) {
+      return chr.toUpperCase()
+    });
+    element.runtimeStyle[propertyName] = element.parentElement.currentStyle[propertyName];
+  }
+});
+
+// =========================================================================
+// ie7-html.js
+// =========================================================================
+
+// default font-sizes
+//HEADER += "h1{font-size:2em}h2{font-size:1.5em;}h3{font-size:1.17em;}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.67em}";
+
+IE7.HTML = new (Fix.extend({ // single instance  
+  fixed: {},
+  
+  init: Undefined,
+  
+  addFix: function() {
+    // fixes are a one-off, they are applied when the document is loaded
+    this.fixes.push(arguments);
+  },
+  
+  apply: function() {
+    for (var i = 0; i < this.fixes.length; i++) {
+      var match = cssQuery(this.fixes[i][0]);
+      var fix = this.fixes[i][1];
+      for (var j = 0; j < match.length; j++) fix(match[j]);
+    }
+  },
+  
+  addRecalc: function() {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    this.recalcs.push(arguments);
+  },
+  
+  recalc: function() {
+    // loop through the fixes
+    for (var i = 0; i < this.recalcs.length; i++) {
+      var match = cssQuery(this.recalcs[i][0]);
+      var recalc = this.recalcs[i][1], element;
+      var key = Math.pow(2, i);
+      for (var j = 0; (element = match[j]); j++) {
+        var uniqueID = element.uniqueID;
+        if ((this.fixed[uniqueID] & key) == 0) {
+          element = recalc(element) || element;
+          this.fixed[uniqueID] |= key;
+        }
+      }
+    }
+  }
+}));
+
+if (appVersion < 7) {  
+  // provide support for the <abbr> tag.
+  //  this is a proper fix, it preserves the DOM structure and
+  //  <abbr> elements report the correct tagName & namespace prefix
+  document.createElement("abbr");
+  
+  // bind to the first child control
+  IE7.HTML.addRecalc("label", function(label) {
+    if (!label.htmlFor) {
+      var firstChildControl = cssQuery("input,textarea", label, true);
+      if (firstChildControl) {
+        addEventHandler(label, "onclick", function() {
+          firstChildControl.click();
+        });
+      }
+    }
+  });
+}
+
+// =========================================================================
+// ie7-layout.js
+// =========================================================================
+
+var NUMERIC = "[.\\d]";
+
+new function(_) {
+var layout = IE7.Layout = this;
+
+  // big, ugly box-model hack + min/max stuff
+  
+  // #tantek > #erik > #dean { voice-family: hacker; }
+  
+  // -----------------------------------------------------------------------
+  // "layout"
+  // -----------------------------------------------------------------------
+  
+  HEADER += "*{boxSizing:content-box}";
+  
+  // does an element have "layout" ?
+  IE7.hasLayout = appVersion < 5.5 ? function(element) {
+    // element.currentStyle.hasLayout doesn't work for IE5.0
+    return element.clientWidth;
+  } : function(element) {
+    return element.currentStyle.hasLayout;
+  };
+  
+  // give an element "layout"
+  layout.boxSizing = function(element) {
+    if (!IE7.hasLayout(element)) {
+    //#  element.runtimeStyle.fixedHeight =
+      element.style.height = "0cm";
+      if (element.currentStyle.verticalAlign == "auto")
+        element.runtimeStyle.verticalAlign = "top";
+      // when an element acquires "layout", margins no longer collapse correctly
+      collapseMargins(element);
+    }
+  };
+  
+  // -----------------------------------------------------------------------
+  // Margin Collapse
+  // -----------------------------------------------------------------------
+  
+  function collapseMargins(element) {
+    if (element != viewport && element.currentStyle.position != "absolute") {
+      collapseMargin(element, "marginTop");
+      collapseMargin(element, "marginBottom");
+    }
+  };
+  
+  function collapseMargin(element, type) {
+    if (!element.runtimeStyle[type]) {
+      var parentElement = element.parentElement;
+      if (parentElement && IE7.hasLayout(parentElement) && !IE7[type == "marginTop" ? "_getPreviousElementSibling" : "_getNextElementSibling"](element)) return;
+      var child = cssQuery(">*:" + (type == "marginTop" ? "first" : "last") + "-child", element, true);
+      if (child && child.currentStyle.styleFloat == "none" && IE7.hasLayout(child)) {
+        collapseMargin(child, type);
+        margin = _getMargin(element, element.currentStyle[type]);
+        childMargin = _getMargin(child, child.currentStyle[type]);
+        if (margin < 0 || childMargin < 0) {
+          element.runtimeStyle[type] = margin + childMargin;
+        } else {
+          element.runtimeStyle[type] = Math.max(childMargin, margin);
+        }
+        child.runtimeStyle[type] = "0px";
+      }
+    }
+  };
+  
+  function _getMargin(element, value) {
+    return value == "auto" ? 0 : getPixelValue(element, value);
+  };
+  
+  // -----------------------------------------------------------------------
+  // box-model
+  // -----------------------------------------------------------------------
+  
+  // constants
+  var UNIT = /^[.\d][\w%]*$/, AUTO = /^(auto|0cm)$/;
+  
+  var applyWidth, applyHeight;
+  IE7.Layout.borderBox = function(element){
+    applyWidth(element);
+    applyHeight(element);
+  };
+  
+  var fixWidth = function(HEIGHT) {
+    applyWidth = function(element) {
+      if (!PERCENT.test(element.currentStyle.width)) fixWidth(element);
+      collapseMargins(element);
+    };
+  
+    function fixWidth(element, value) {
+      if (!element.runtimeStyle.fixedWidth) {
+        if (!value) value = element.currentStyle.width;
+        element.runtimeStyle.fixedWidth = (UNIT.test(value)) ? Math.max(0, getFixedWidth(element, value)) : value;
+        setOverrideStyle(element, "width", element.runtimeStyle.fixedWidth);
+      }
+    };
+  
+    function layoutWidth(element) {
+      if (!isFixed(element)) {
+        var layoutParent = element.offsetParent;
+        while (layoutParent && !IE7.hasLayout(layoutParent)) layoutParent = layoutParent.offsetParent;
+      }
+      return (layoutParent || viewport).clientWidth;
+    };
+  
+    function getPixelWidth(element, value) {
+      if (PERCENT.test(value)) return parseInt(parseFloat(value) / 100 * layoutWidth(element));
+      return getPixelValue(element, value);
+    };
+  
+    var getFixedWidth = function(element, value) {
+      var borderBox = element.currentStyle["box-sizing"] == "border-box";
+      var adjustment = 0;
+      if (quirksMode && !borderBox)
+        adjustment += getBorderWidth(element) + getWidth(element, "padding");
+      else if (!quirksMode && borderBox)
+        adjustment -= getBorderWidth(element) + getWidth(element, "padding");
+      return getPixelWidth(element, value) + adjustment;
+    };
+  
+    // easy way to get border thickness for elements with "layout"
+    function getBorderWidth(element) {
+      return element.offsetWidth - element.clientWidth;
+    };
+  
+    // have to do some pixel conversion to get padding/margin thickness :-(
+    function getWidth(element, type) {
+      return getPixelWidth(element, element.currentStyle[type + "Left"]) + getPixelWidth(element, element.currentStyle[type + "Right"]);
+    };
+  
+    // -----------------------------------------------------------------------
+    // min/max
+    // -----------------------------------------------------------------------
+  
+    HEADER += "*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";
+  
+    // handle min-width property
+    layout.minWidth = function(element) {
+      // IE6 supports min-height so we frig it here
+      //#if (element.currentStyle.minHeight == "auto") element.runtimeStyle.minHeight = 0;
+      if (element.currentStyle["min-width"] != null) {
+        element.style.minWidth = element.currentStyle["min-width"];
+      }
+      if (register(arguments.callee, element, element.currentStyle.minWidth != "none")) {
+        layout.boxSizing(element);
+        fixWidth(element);
+        resizeWidth(element);
+      }
+    };
+    
+    // clone the minWidth function to make a maxWidth function
+    eval("IE7.Layout.maxWidth=" + String(layout.minWidth).replace(/min/g, "max"));
+    
+    // apply min/max restrictions
+    function resizeWidth(element) {
+      // check boundaries
+      var rect = element.getBoundingClientRect();
+      var width = rect.right - rect.left;
+  
+      if (element.currentStyle.minWidth != "none" && width <= getFixedWidth(element, element.currentStyle.minWidth)) {
+        element.runtimeStyle.width = element.currentStyle.minWidth;
+      } else if (element.currentStyle.maxWidth != "none" && width >= getFixedWidth(element, element.currentStyle.maxWidth)) {
+        element.runtimeStyle.width = element.currentStyle.maxWidth;
+      } else {
+        element.runtimeStyle.width = element.runtimeStyle.fixedWidth; // || "auto";
+      }
+    };
+  
+    // -----------------------------------------------------------------------
+    // right/bottom
+    // -----------------------------------------------------------------------
+  
+    function fixRight(element) {
+      if (register(fixRight, element, /^(fixed|absolute)$/.test(element.currentStyle.position) &&
+        getDefinedStyle(element, "left") != "auto" &&
+        getDefinedStyle(element, "right") != "auto" &&
+        AUTO.test(getDefinedStyle(element, "width")))) {
+          resizeRight(element);
+          IE7.Layout.boxSizing(element);
+      }
+    };
+    IE7.Layout.fixRight = fixRight;
+  
+    function resizeRight(element) {
+      var left = getPixelWidth(element, element.runtimeStyle._left || element.currentStyle.left);
+      var width = layoutWidth(element) - getPixelWidth(element, element.currentStyle.right) -  left - getWidth(element, "margin");
+      if (parseInt(element.runtimeStyle.width) == width) return;
+      element.runtimeStyle.width = "";
+      if (isFixed(element) || HEIGHT || element.offsetWidth < width) {
+        if (!quirksMode) width -= getBorderWidth(element) + getWidth(element, "padding");
+        if (width < 0) width = 0;
+        element.runtimeStyle.fixedWidth = width;
+        setOverrideStyle(element, "width", width);
+      }
+    };
+  
+  // -----------------------------------------------------------------------
+  // window.onresize
+  // -----------------------------------------------------------------------
+  
+    // handle window resize
+    var clientWidth = 0;
+    addResize(function() {
+      if (!viewport) return;
+      var i, wider = (clientWidth < viewport.clientWidth);
+      clientWidth = viewport.clientWidth;
+      // resize elements with "min-width" set
+      var elements = layout.minWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.minWidth));
+        if (wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider == fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "max-width" set
+      var elements = layout.maxWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.maxWidth));
+        if (!wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider != fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "right" set
+      for (i in fixRight.elements) resizeRight(fixRight.elements[i]);
+    });
+  
+  // -----------------------------------------------------------------------
+  // fix CSS
+  // -----------------------------------------------------------------------
+    if (quirksMode) {
+      IE7.CSS.addRecalc("width", NUMERIC, applyWidth);
+    }
+    if (appVersion < 7) {
+      IE7.CSS.addRecalc("min-width", NUMERIC, layout.minWidth);
+      IE7.CSS.addRecalc("max-width", NUMERIC, layout.maxWidth);
+      IE7.CSS.addRecalc("right", NUMERIC, fixRight);
+    }
+  };
+  
+  eval("var fixHeight=" + rotate(fixWidth));
+  
+  // apply box-model + min/max fixes
+  fixWidth();
+  fixHeight(true);
+};
+
+// =========================================================================
+// ie7-graphics.js
+// =========================================================================
+
+// a small transparent image used as a placeholder
+var BLANK_GIF = makePath("blank.gif", path);
+
+var ALPHA_IMAGE_LOADER = "DXImageTransform.Microsoft.AlphaImageLoader";
+var PNG_FILTER = "progid:" + ALPHA_IMAGE_LOADER + "(src='%1',sizingMethod='%2')";
+  
+// regular expression version of the above
+var PNG;
+
+var filtered = [];
+
+function fixImage(element) {
+  if (PNG.test(element.src)) {
+    // we have to preserve width and height
+    var image = new Image(element.width, element.height);
+    image.onload = function() {
+      element.width = image.width;
+      element.height = image.height;
+      image = null;
+    };
+    image.src = element.src;
+    // store the original url (we'll put it back when it's printed)
+    element.pngSrc = element.src;
+    // add the AlphaImageLoader thingy
+    addFilter(element);
+  }
+};
+
+if (appVersion >= 5.5 && appVersion < 7) {
+  // ** IE7 VARIABLE
+  // e.g. only apply the hack to files ending in ".png"
+  // IE7_PNG_SUFFIX = ".png";
+
+  // replace background(-image): url(..) ..  with background(-image): .. ;filter: ..;
+  IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/, function(match, $1, $2, url, $4) {
+    url = getString(url);
+    return PNG.test(url) ? "filter:" + format(PNG_FILTER, url, "crop") +
+      ";zoom:1;background" + ($1||"") + ":" + ($2||"") + "none" + ($4||"") : match;
+  });
+  
+  // -----------------------------------------------------------------------
+  //  fix PNG transparency (HTML images)
+  // -----------------------------------------------------------------------
+
+  IE7.HTML.addRecalc("img,input", function(element) {
+    if (element.tagName == "INPUT" && element.type != "image") return;
+    fixImage(element);
+    addEventHandler(element, "onpropertychange", function() {
+      if (!printing && event.propertyName == "src" &&
+        element.src.indexOf(BLANK_GIF) == -1) fixImage(element);
+    });
+  });
+
+  // assume that background images should not be printed
+  //  (if they are not transparent then they'll just obscure content)
+  // but we'll put foreground images back...
+  var printing = false;
+  addEventHandler(window, "onbeforeprint", function() {
+    printing = true;
+    for (var i = 0; i < filtered.length; i++) removeFilter(filtered[i]);
+  });
+  addEventHandler(window, "onafterprint", function() {
+    for (var i = 0; i < filtered.length; i++) addFilter(filtered[i]);
+    printing = false;
+  });
+}
+
+// apply a filter
+function addFilter(element, sizingMethod) {
+  var filter = element.filters[ALPHA_IMAGE_LOADER];
+  if (filter) {
+    filter.src = element.src;
+    filter.enabled = true;
+  } else {
+    element.runtimeStyle.filter = format(PNG_FILTER, element.src, sizingMethod || "scale");
+    filtered.push(element);
+  }
+  // remove the real image
+  element.src = BLANK_GIF;
+};
+
+function removeFilter(element) {
+  element.src = element.pngSrc;
+  element.filters[ALPHA_IMAGE_LOADER].enabled = false;
+};
+
+// =========================================================================
+// ie7-fixed.js
+// =========================================================================
+
+new function(_) {
+  if (appVersion >= 7) return;
+  
+  // some things to consider for this hack.
+  // the document body requires a fixed background. even if
+  //  it is just a blank image.
+  // you have to use setExpression instead of onscroll, this
+  //  together with a fixed body background helps avoid the
+  //  annoying screen flicker of other solutions.
+  
+  IE7.CSS.addRecalc("position", "fixed", _positionFixed, "absolute");
+  IE7.CSS.addRecalc("background(-attachment)?", "[^};]*fixed", _backgroundFixed);
+  
+  // scrolling is relative to the documentElement (HTML tag) when in
+  //  standards mode, otherwise it's relative to the document body
+  var $viewport = quirksMode ? "body" : "documentElement";
+  
+  function _fixBackground() {
+    // this is required by both position:fixed and background-attachment:fixed.
+    // it is necessary for the document to also have a fixed background image.
+    // we can fake this with a blank image if necessary
+    if (body.currentStyle.backgroundAttachment != "fixed") {
+      if (body.currentStyle.backgroundImage == "none") {
+        body.runtimeStyle.backgroundRepeat = "no-repeat";
+        body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy
+      }
+      body.runtimeStyle.backgroundAttachment = "fixed";
+    }
+    _fixBackground = Undefined;
+  };
+  
+  var _tmp = createTempElement("img");
+  
+  function _isFixed(element) {
+    return element ? isFixed(element) || _isFixed(element.parentElement) : false;
+  };
+  
+  function _setExpression(element, propertyName, expression) {
+    setTimeout("document.all." + element.uniqueID + ".runtimeStyle.setExpression('" + propertyName + "','" + expression + "')", 0);
+  };
+  
+  // -----------------------------------------------------------------------
+  //  backgroundAttachment: fixed
+  // -----------------------------------------------------------------------
+  
+  function _backgroundFixed(element) {
+    if (register(_backgroundFixed, element, element.currentStyle.backgroundAttachment == "fixed" && !element.contains(body))) {
+      _fixBackground();
+      bgLeft(element);
+      bgTop(element);
+      _backgroundPosition(element);
+    }
+  };
+  
+  function _backgroundPosition(element) {
+    _tmp.src = element.currentStyle.backgroundImage.slice(5, -2);
+    var parentElement = element.canHaveChildren ? element : element.parentElement;
+    parentElement.appendChild(_tmp);
+    setOffsetLeft(element);
+    setOffsetTop(element);
+    parentElement.removeChild(_tmp);
+  };
+  
+  function bgLeft(element) {
+    element.style.backgroundPositionX = element.currentStyle.backgroundPositionX;
+    if (!_isFixed(element)) {
+      _setExpression(element, "backgroundPositionX", "(parseInt(runtimeStyle.offsetLeft)+document." + $viewport + ".scrollLeft)||0");
+    }
+  };
+  eval(rotate(bgLeft));
+  
+  function setOffsetLeft(element) {
+    var propertyName = _isFixed(element) ? "backgroundPositionX" : "offsetLeft";
+    element.runtimeStyle[propertyName] =
+      getOffsetLeft(element, element.style.backgroundPositionX) -
+      element.getBoundingClientRect().left - element.clientLeft + 2;
+  };
+  eval(rotate(setOffsetLeft));
+  
+  function getOffsetLeft(element, position) {
+    switch (position) {
+      case "left":
+      case "top":
+        return 0;
+      case "right":
+      case "bottom":
+        return viewport.clientWidth - _tmp.offsetWidth;
+      case "center":
+        return (viewport.clientWidth - _tmp.offsetWidth) / 2;
+      default:
+        if (PERCENT.test(position)) {
+          return parseInt((viewport.clientWidth - _tmp.offsetWidth) * parseFloat(position) / 100);
+        }
+        _tmp.style.left = position;
+        return _tmp.offsetLeft;
+    }
+  };
+  eval(rotate(getOffsetLeft));
+  
+  // -----------------------------------------------------------------------
+  //  position: fixed
+  // -----------------------------------------------------------------------
+  
+  function _positionFixed(element) {
+    if (register(_positionFixed, element, isFixed(element))) {
+      setOverrideStyle(element, "position",  "absolute");
+      setOverrideStyle(element, "left",  element.currentStyle.left);
+      setOverrideStyle(element, "top",  element.currentStyle.top);
+      _fixBackground();
+      IE7.Layout.fixRight(element);
+      _foregroundPosition(element);
+    }
+  };
+  
+  function _foregroundPosition(element, recalc) {
+    positionTop(element, recalc);
+    positionLeft(element, recalc, true);
+    if (!element.runtimeStyle.autoLeft && element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.right != "auto") {
+      var left = viewport.clientWidth - getPixelWidth(element, element.currentStyle.right) -
+        getPixelWidth(element, element.runtimeStyle._left) - element.clientWidth;
+      if (element.currentStyle.marginRight == "auto") left = parseInt(left / 2);
+      if (_isFixed(element.offsetParent)) element.runtimeStyle.pixelLeft += left;
+      else element.runtimeStyle.shiftLeft = left;
+    }
+    clipWidth(element);
+    clipHeight(element);
+  };
+
+  function clipWidth(element) {
+    var fixWidth = element.runtimeStyle.fixWidth;
+    element.runtimeStyle.borderRightWidth = "";
+    element.runtimeStyle.width = fixWidth ? getPixelWidth(element, fixWidth) : "";
+    if (element.currentStyle.width != "auto") {
+      var rect = element.getBoundingClientRect();
+      var width = element.offsetWidth - viewport.clientWidth + rect.left - 2;
+      if (width >= 0) {
+        element.runtimeStyle.borderRightWidth = "0px";
+        width = Math.max(getPixelValue(element, element.currentStyle.width) - width, 0);
+        setOverrideStyle(element, "width",  width);
+        return width;
+      }
+    }
+  };
+  eval(rotate(clipWidth));
+  
+  function positionLeft(element, recalc) {
+    // if the element's width is in % units then it must be recalculated
+    //  with respect to the viewport
+    if (!recalc && PERCENT.test(element.currentStyle.width)) {
+      element.runtimeStyle.fixWidth = element.currentStyle.width;
+    }
+    if (element.runtimeStyle.fixWidth) {
+      element.runtimeStyle.width = getPixelWidth(element, element.runtimeStyle.fixWidth);
+    }
+    //if (recalc) {
+    //  // if the element is fixed on the right then no need to recalculate
+    //  if (!element.runtimeStyle.autoLeft) return;
+    //} else {
+      element.runtimeStyle.shiftLeft = 0;
+      element.runtimeStyle._left = element.currentStyle.left;
+      // is the element fixed on the right?
+      element.runtimeStyle.autoLeft = element.currentStyle.right != "auto" &&
+        element.currentStyle.left == "auto";
+    //}
+    // reset the element's "left" value and get it's natural position
+    element.runtimeStyle.left = "";
+    element.runtimeStyle.screenLeft = getScreenLeft(element);
+    element.runtimeStyle.pixelLeft = element.runtimeStyle.screenLeft;
+    // if the element is contained by another fixed element then there is no need to
+    //  continually recalculate it's left position
+    if (!recalc && !_isFixed(element.offsetParent)) {
+      // onsrcoll produces jerky movement, so we use an expression
+      _setExpression(element, "pixelLeft", "runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document." + $viewport + ".scrollLeft");
+    }
+  };
+  // clone this function so we can do "top"
+  eval(rotate(positionLeft));
+  
+  // I've forgotten how this works...
+  function getScreenLeft(element) { // thanks to kevin newman (captainn)
+    var screenLeft = element.offsetLeft, nested = 1;
+    if (element.runtimeStyle.autoLeft) {
+      screenLeft = viewport.clientWidth - element.offsetWidth - getPixelWidth(element, element.currentStyle.right);
+    }
+    // accommodate margins
+    if (element.currentStyle.marginLeft != "auto") {
+      screenLeft -= getPixelWidth(element, element.currentStyle.marginLeft);
+    }
+    while (element = element.offsetParent) {
+      if (element.currentStyle.position != "static") nested = -1;
+      screenLeft += element.offsetLeft * nested;
+    }
+    return screenLeft;
+  };
+  eval(rotate(getScreenLeft));
+  
+  function getPixelWidth(element, value) {
+    return PERCENT.test(value) ? parseInt(parseFloat(value) / 100 * viewport.clientWidth) : getPixelValue(element, value);
+  };
+  eval(rotate(getPixelWidth));
+  
+  // -----------------------------------------------------------------------
+  //  capture window resize
+  // -----------------------------------------------------------------------
+  
+  function _resize() {
+    // if the window has been resized then some positions need to be
+    //  recalculated (especially those aligned to "right" or "top"
+    var elements = _backgroundFixed.elements;
+    for (var i in elements) _backgroundPosition(elements[i]);
+    elements = _positionFixed.elements;
+    for (i in elements) {
+      _foregroundPosition(elements[i], true);
+      // do this twice to be sure - hackish, I know :-)
+      _foregroundPosition(elements[i], true);
+    }
+    _timer = 0;
+  };
+  
+  // use a timer for some reason.
+  //  (sometimes this is a good way to prevent resize loops)
+  var _timer;
+  addResize(function() {
+    if (!_timer) _timer = setTimeout(_resize, 0);
+  });
+};
+
+// =========================================================================
+// ie7-oveflow.js
+// =========================================================================
+
+/* ---------------------------------------------------------------------
+
+  This module alters the structure of the document.
+  It may adversely affect other CSS rules. Be warned.
+
+--------------------------------------------------------------------- */
+
+var WRAPPER_STYLE = {
+  backgroundColor: "transparent",
+  backgroundImage: "none",
+  backgroundPositionX: null,
+  backgroundPositionY: null,
+  backgroundRepeat: null,
+  borderTopWidth: 0,
+  borderRightWidth: 0,
+  borderBottomWidth: 0,
+  borderLeftStyle: "none",
+  borderTopStyle: "none",
+  borderRightStyle: "none",
+  borderBottomStyle: "none",
+  borderLeftWidth: 0,
+  height: null,
+  marginTop: 0,
+  marginBottom: 0,
+  marginRight: 0,
+  marginLeft: 0,
+  width: "100%"
+};
+
+IE7.CSS.addRecalc("overflow", "visible", function(element) {
+  // don't do this again
+  if (element.parentNode.ie7_wrapped) return;
+
+  // if max-height is applied, makes sure it gets applied first
+  if (IE7.Layout && element.currentStyle["max-height"] != "auto") {
+    IE7.Layout.maxHeight(element);
+  }
+
+  if (element.currentStyle.marginLeft == "auto") element.style.marginLeft = 0;
+  if (element.currentStyle.marginRight == "auto") element.style.marginRight = 0;
+
+  var wrapper = document.createElement(ANON);
+  wrapper.ie7_wrapped = element;
+  for (var propertyName in WRAPPER_STYLE) {
+    wrapper.style[propertyName] = element.currentStyle[propertyName];
+    if (WRAPPER_STYLE[propertyName] != null) {
+      element.runtimeStyle[propertyName] = WRAPPER_STYLE[propertyName];
+    }
+  }
+  wrapper.style.display = "block";
+  wrapper.style.position = "relative";
+  element.runtimeStyle.position = "absolute";
+  element.parentNode.insertBefore(wrapper, element);
+  wrapper.appendChild(element);
+});
+
+// =========================================================================
+// ie7-quirks.js
+// =========================================================================
+
+function ie7Quirks() {
+  var FONT_SIZES = "xx-small,x-small,small,medium,large,x-large,xx-large".split(",");
+  for (var i = 0; i < FONT_SIZES.length; i++) {
+    FONT_SIZES[FONT_SIZES[i]] = FONT_SIZES[i - 1] || "0.67em";
+  }
+  
+  IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/, function(match, label, size, value) {
+    return label + (FONT_SIZES[value] || value);
+  });
+  
+  if (appVersion < 6) {
+    var NEGATIVE = /^\-/, LENGTH = /(em|ex)$/i;
+    var EM = /em$/i, EX = /ex$/i;
+  
+    getPixelValue = function(element, value) {
+      if (PIXEL.test(value)) return parseInt(value)||0;
+      var scale = NEGATIVE.test(value)? -1 : 1;
+      if (LENGTH.test(value)) scale *= getFontScale(element);
+      temp.style.width = (scale < 0) ? value.slice(1) : value;
+      body.appendChild(temp);
+      // retrieve pixel width
+      value = scale * temp.offsetWidth;
+      // remove the temporary element
+      temp.removeNode();
+      return parseInt(value);
+    };
+
+    var temp = createTempElement();
+    function getFontScale(element) {
+      var scale = 1;
+      temp.style.fontFamily = element.currentStyle.fontFamily;
+      temp.style.lineHeight = element.currentStyle.lineHeight;
+      //temp.style.fontSize = "";
+      while (element != body) {
+        var fontSize = element.currentStyle["ie7-font-size"];
+        if (fontSize) {
+          if (EM.test(fontSize)) scale *= parseFloat(fontSize);
+          else if (PERCENT.test(fontSize)) scale *= (parseFloat(fontSize) / 100);
+          else if (EX.test(fontSize)) scale *= (parseFloat(fontSize) / 2);
+          else {
+            temp.style.fontSize = fontSize;
+            return 1;
+          }
+        }
+        element = element.parentElement;
+      }
+      return scale;
+    };
+
+    // cursor:pointer (IE5.x)
+    IE7.CSS.addFix(/cursor\s*:\s*pointer/, "cursor:hand");
+    // display:list-item (IE5.x)
+    IE7.CSS.addFix(/display\s*:\s*list-item/, "display:block");
+  }
+  
+  // -----------------------------------------------------------------------
+  //  margin:auto
+  // -----------------------------------------------------------------------
+  
+  function fixMargin(element) {
+    if (appVersion < 5.5) IE7.Layout.boxSizing(element.parentElement);
+    var parent = element.parentElement;
+    var margin = parent.offsetWidth - element.offsetWidth - getPaddingWidth(parent);
+    var autoRight = (element.currentStyle["ie7-margin"] && element.currentStyle.marginRight == "auto") ||
+      element.currentStyle["ie7-margin-right"] == "auto";
+    switch (parent.currentStyle.textAlign) {
+      case "right":
+        margin = autoRight ? parseInt(margin / 2) : 0;
+        element.runtimeStyle.marginRight = margin + "px";
+        break;
+      case "center":
+        if (autoRight) margin = 0;
+      default:
+        if (autoRight) margin /= 2;
+        element.runtimeStyle.marginLeft = parseInt(margin) + "px";
+    }
+  };
+
+  function getPaddingWidth(element) {
+    return getPixelValue(element, element.currentStyle.paddingLeft) +
+      getPixelValue(element, element.currentStyle.paddingRight);
+  };
+  
+  IE7.CSS.addRecalc("margin(-left|-right)?", "[^};]*auto", function(element) {
+    if (register(fixMargin, element,
+      element.parentElement &&
+      element.currentStyle.display == "block" &&
+      element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.position != "absolute")) {
+        fixMargin(element);
+    }
+  });
+  
+  addResize(function() {
+    for (var i in fixMargin.elements) {
+      var element = fixMargin.elements[i];
+      element.runtimeStyle.marginLeft =
+      element.runtimeStyle.marginRight = "";
+      fixMargin(element);
+    }
+  });
+};
+
+
+// =========================================================================
+// ie8-cssQuery.js
+// =========================================================================
+
+IE7._isEmpty = function(element) {
+  element = element.firstChild;
+  while (element) {
+    if (element.nodeType == 3 || (element.nodeType == 1 && element.nodeName != "!")) return false;
+    element = element.nextSibling;
+  }
+  return true;
+};
+
+IE7._isLang = function(element, code) {
+  while (element && !element.getAttribute("lang")) element = element.parentNode;
+  return element && new RegExp("^" + rescape(code), "i").test(element.getAttribute("lang"));
+};
+
+function _nthChild(match, args, position, last) {
+  // ugly but it works...
+  last = /last/i.test(match) ? last + "+1-" : "";
+  if (!isNaN(args)) args = "0n+" + args;
+  else if (args == "even") args = "2n";
+  else if (args == "odd") args = "2n+1";
+  args = args.split("n");
+  var a = args[0] ? (args[0] == "-") ? -1 : parseInt(args[0]) : 1;
+  var b = parseInt(args[1]) || 0;
+  var negate = a < 0;
+  if (negate) {
+    a = -a;
+    if (a == 1) b++;
+  }
+  var query = format(a == 0 ? "%3%7" + (last + b) : "(%4%3-%2)%6%1%70%5%4%3>=%2", a, b, position, last, "&&", "%", "==");
+  if (negate) query = "!(" + query + ")";
+  return query;
+};
+
+_PSEUDO_CLASSES = {
+  "link":          "e%1.currentStyle['ie7-link']=='link'",
+  "visited":       "e%1.currentStyle['ie7-link']=='visited'",
+  "checked":       "e%1.checked",
+  "contains":      "e%1.innerText.indexOf('%2')!=-1",
+  "disabled":      "e%1.isDisabled",
+  "empty":         "IE7._isEmpty(e%1)",
+  "enabled":       "e%1.disabled===false",
+  "first-child":   "!IE7._getPreviousElementSibling(e%1)",
+  "lang":          "IE7._isLang(e%1,'%2')",
+  "last-child":    "!IE7._getNextElementSibling(e%1)",
+  "only-child":    "!IE7._getPreviousElementSibling(e%1)&&!IE7._getNextElementSibling(e%1)",
+  "target":        "e%1.id==location.hash.slice(1)",
+  "indeterminate": "e%1.indeterminate"
+};
+
+
+// register a node and index its children
+IE7._register = function(element) {
+  if (element.rows) {
+    element.ie7_length = element.rows.length;
+    element.ie7_lookup = "rowIndex";
+  } else if (element.cells) {
+    element.ie7_length = element.cells.length;
+    element.ie7_lookup = "cellIndex";
+  } else if (element.ie7_indexed != IE7._indexed) {
+    var index = 0;
+    var child = element.firstChild;
+    while (child) {
+      if (child.nodeType == 1 && child.nodeName != "!") {
+        child.ie7_index = ++index;
+      }
+      child = child.nextSibling;
+    }
+    element.ie7_length = index;
+    element.ie7_lookup = "ie7_index";
+  }
+  element.ie7_indexed = IE7._indexed;
+  return element;
+};
+
+var keys = cssParser[_KEYS];
+var pseudoClass = keys[keys.length - 1];
+keys.length--;
+
+cssParser.merge({
+  ":not\\((\\*|[\\w-]+)?([^)]*)\\)": function(match, tagName, filters) { // :not pseudo class
+    var replacement = (tagName && tagName != "*") ? format("if(e%1.nodeName=='%2'){", _index, tagName.toUpperCase()) : "";
+    replacement += cssParser.exec(filters);
+    return "if(!" + replacement.slice(2, -1).replace(/\)\{if\(/g, "&&") + "){";
+  },
+  
+  ":nth(-last)?-child\\(([^)]+)\\)": function(match, last, args) { // :nth-child pseudo classes
+    _wild = false;
+    last = format("e%1.parentNode.ie7_length", _index);
+    var replacement = "if(p%1!==e%1.parentNode)p%1=IE7._register(e%1.parentNode);";
+    replacement += "var i=e%1[p%1.ie7_lookup];if(p%1.ie7_lookup!='ie7_index')i++;if(";
+    return format(replacement, _index) + _nthChild(match, args, "i", last) + "){";
+  }
+});
+
+keys.push(pseudoClass);
+
+// =========================================================================
+// ie8-css.js
+// =========================================================================
+
+var BRACKETS = "\\([^)]*\\)";
+
+if (IE7.CSS.pseudoClasses) IE7.CSS.pseudoClasses += "|";
+IE7.CSS.pseudoClasses += "before|after|last\\-child|only\\-child|empty|root|" +
+  "not|nth\\-child|nth\\-last\\-child|contains|lang".split("|").join(BRACKETS + "|") + BRACKETS;
+
+// pseudo-elements can be declared with a double colon
+encoder.add(/::/, ":");
+
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var Focus = new DynamicPseudoClass("focus", function(element) {
+  var instance = arguments;
+  
+  IE7.CSS.addEventHandler(element, "onfocus", function() {
+    Focus.unregister(instance); // in case it starts with focus
+    Focus.register(instance);
+  });
+  
+  IE7.CSS.addEventHandler(element, "onblur", function() {
+    Focus.unregister(instance);
+  });
+  
+  // check the active element for initial state
+  if (element == document.activeElement) {
+    Focus.register(instance)
+  }
+});
+
+var Active = new DynamicPseudoClass("active", function(element) {
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onmousedown", function() {
+    Active.register(instance);
+  });
+});
+
+// globally trap the mouseup event (thanks Martijn!)
+addEventHandler(document, "onmouseup", function() {
+  var instances = Active.instances;
+  for (var i in instances) Active.unregister(instances[i]);
+});
+
+// :checked
+var Checked = new DynamicPseudoClass("checked", function(element) {
+  if (typeof element.checked != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "checked") {
+      if (element.checked) Checked.register(instance);
+      else Checked.unregister(instance);
+    }
+  });
+  // check current checked state
+  if (element.checked) Checked.register(instance);
+});
+
+// :enabled
+var Enabled = new DynamicPseudoClass("enabled", function(element) {
+  if (typeof element.disabled != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "disabled") {
+      if (!element.isDisabled) Enabled.register(instance);
+      else Enabled.unregister(instance);
+    }
+  });
+  // check current disabled state
+  if (!element.isDisabled) Enabled.register(instance);
+});
+
+// :disabled
+var Disabled = new DynamicPseudoClass("disabled", function(element) {
+  if (typeof element.disabled != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "disabled") {
+      if (element.isDisabled) Disabled.register(instance);
+      else Disabled.unregister(instance);
+    }
+  });
+  // check current disabled state
+  if (element.isDisabled) Disabled.register(instance);
+});
+
+// :indeterminate (Kevin Newman)
+var Indeterminate = new DynamicPseudoClass("indeterminate", function(element) {
+  if (typeof element.indeterminate != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "indeterminate") {
+      if (element.indeterminate) Indeterminate.register(instance);
+      else Indeterminate.unregister(instance);
+    }
+  });
+  IE7.CSS.addEventHandler(element, "onclick", function() {
+    Indeterminate.unregister(instance);
+  });
+  // clever Kev says no need to check this up front
+});
+
+// :target
+var Target = new DynamicPseudoClass("target", function(element) {
+  var instance = arguments;
+  // if an element has a tabIndex then it can become "active".
+  //  The default is zero anyway but it works...
+  if (!element.tabIndex) element.tabIndex = 0;
+  // this doesn't detect the back button. I don't know how to do that :-(
+  IE7.CSS.addEventHandler(document, "onpropertychange", function() {
+    if (event.propertyName == "activeElement") {
+      if (element.id && element.id == location.hash.slice(1)) Target.register(instance);
+      else Target.unregister(instance);
+    }
+  });
+  // check the current location
+  if (element.id && element.id == location.hash.slice(1)) Target.register(instance);
+});
+
+// -----------------------------------------------------------------------
+// IE7 pseudo elements
+// -----------------------------------------------------------------------
+
+// constants
+var ATTR = /^attr/;
+var URL = /^url\s*\(\s*([^)]*)\)$/;
+var POSITION_MAP = {
+  before0: "beforeBegin",
+  before1: "afterBegin",
+  after0: "afterEnd",
+  after1: "beforeEnd"
+};
+
+var PseudoElement = IE7.PseudoElement = Rule.extend({
+  constructor: function(selector, position, cssText) {
+    // initialise object properties
+    this.position = position;
+    var content = cssText.match(PseudoElement.CONTENT), match, entity;
+    if (content) {
+      content = content[1];
+      match = content.split(/\s+/);
+      for (var i = 0; (entity = match[i]); i++) {
+        match[i] = ATTR.test(entity) ? {attr: entity.slice(5, -1)} :
+          (entity.charAt(0) == "'") ? getString(entity) : decode(entity);
+      }
+      content = match;
+    }
+    this.content = content;
+    // CSS text needs to be decoded immediately
+    this.base(selector, decode(cssText));
+  },
+  
+  init: function() {
+    // execute the underlying css query for this class
+    this.match = cssQuery(this.selector);
+    for (var i = 0; i < this.match.length; i++) {
+      var runtimeStyle = this.match[i].runtimeStyle;
+      if (!runtimeStyle[this.position]) runtimeStyle[this.position] = {cssText:""};
+      runtimeStyle[this.position].cssText += ";" + this.cssText;
+      if (this.content != null) runtimeStyle[this.position].content = this.content;
+    }
+  },
+  
+  create: function(target) {
+    var generated = target.runtimeStyle[this.position];
+    if (generated) {
+      // copy the array of values
+      var content = [].concat(generated.content || "");
+      for (var j = 0; j < content.length; j++) {
+        if (typeof content[j] == "object") {
+          content[j] = target.getAttribute(content[j].attr);
+        }
+      }
+      content = content.join("");
+      var url = content.match(URL);
+      var cssText = "overflow:hidden;" + generated.cssText.replace(/'/g, '"');
+      if (target.currentStyle.styleFloat != "none") {
+        //cssText = cssText.replace(/display\s*:\s*block/, "display:inline-block");
+      }
+      var position = POSITION_MAP[this.position + Number(target.canHaveChildren)];
+      var id = 'ie7_pseudo' + PseudoElement.count++;
+      target.insertAdjacentHTML(position, format(PseudoElement.ANON, this.className, id, cssText, url ? "" : content));
+      if (url) {
+        var pseudoElement = document.getElementById(id);
+        pseudoElement.src = getString(url[1]);
+        addFilter(pseudoElement, "crop");
+      }
+      target.runtimeStyle[this.position] = null;
+    }
+  },
+  
+  recalc: function() {
+    if (this.content == null) return;
+    for (var i = 0; i < this.match.length; i++) {
+      this.create(this.match[i]);
+    }
+  },
+
+  toString: function() {
+    return "." + this.className + "{display:inline}";
+  }
+}, {  
+  CONTENT: /content\s*:\s*([^;]*)(;|$)/,
+  ANON: "<ie7:! class='ie7_anon %1' id=%2 style='%3'>%4</ie7:!>",
+  MATCH: /(.*):(before|after).*/,
+  
+  count: 0
+});
+
+// =========================================================================
+// ie8-html.js
+// =========================================================================
+
+var UNSUCCESSFUL = /^(submit|reset|button)$/;
+
+// -----------------------------------------------------------------------
+// <button>
+// -----------------------------------------------------------------------
+
+// IE bug means that innerText is submitted instead of "value"
+IE7.HTML.addRecalc("button,input", function(button) {
+  if (button.tagName == "BUTTON") {
+    var match = button.outerHTML.match(/ value="([^"]*)"/i);
+    button.runtimeStyle.value = (match) ? match[1] : "";
+  }
+  // flag the button/input that was used to submit the form
+  if (button.type == "submit") {
+    addEventHandler(button, "onclick", function() {
+      button.runtimeStyle.clicked = true;
+      setTimeout("document.all." + button.uniqueID + ".runtimeStyle.clicked=false", 1);
+    });
+  }
+});
+
+// -----------------------------------------------------------------------
+// <form>
+// -----------------------------------------------------------------------
+
+// only submit "successful controls
+IE7.HTML.addRecalc("form", function(form) {
+  addEventHandler(form, "onsubmit", function() {
+    for (var element, i = 0; element = form[i]; i++) {
+      if (UNSUCCESSFUL.test(element.type) && !element.disabled && !element.runtimeStyle.clicked) {
+        element.disabled = true;
+        setTimeout("document.all." + element.uniqueID + ".disabled=false", 1);
+      } else if (element.tagName == "BUTTON" && element.type == "submit") {
+        setTimeout("document.all." + element.uniqueID + ".value='" +
+          element.value + "'", 1);
+        element.value = element.runtimeStyle.value;
+      }
+    }
+  });
+});
+
+// -----------------------------------------------------------------------
+// <img>
+// -----------------------------------------------------------------------
+
+// get rid of the spurious tooltip produced by the alt attribute on images
+IE7.HTML.addRecalc("img", function(img) {
+  if (img.alt && !img.title) img.title = "";
+});
+
+// =========================================================================
+// ie8-layout.js
+// =========================================================================
+
+IE7.CSS.addRecalc("border-spacing", NUMERIC, function(element) {
+  if (element.currentStyle.borderCollapse != "collapse") {
+    element.cellSpacing = getPixelValue(element, element.currentStyle["border-spacing"]);
+  }
+});
+IE7.CSS.addRecalc("box-sizing", "content-box", IE7.Layout.boxSizing);
+IE7.CSS.addRecalc("box-sizing", "border-box", IE7.Layout.borderBox);
+
+// =========================================================================
+// ie8-graphics.js
+// =========================================================================
+
+IE7.CSS.addFix(/opacity\s*:\s*([\d.]+)/, function(match, value) {
+  return "zoom:1;filter:Alpha(opacity=" + ((value * 100) || 1) + ")";
+});
+
+// fix object[type=image/*]
+var IMAGE = /^image/i;
+IE7.HTML.addRecalc("object", function(element) {
+  if (IMAGE.test(element.type)) {
+    element.body.style.cssText = "margin:0;padding:0;border:none;overflow:hidden";
+    return element;
+  }
+});
+
+// -----------------------------------------------------------------------
+// initialisation
+// -----------------------------------------------------------------------
+
+IE7.loaded = true;
+
+(function() {
+  try {
+    // http://javascript.nwbox.com/IEContentLoaded/
+    documentElement.doScroll("left");
+  } catch (e) {
+    setTimeout(arguments.callee, 1);
+    return;
+  }
+  // execute the inner text of the IE7 script
+  try {
+    eval(script.innerHTML);
+  } catch (e) {
+    // ignore errors
+  }
+  PNG = new RegExp(rescape(typeof IE7_PNG_SUFFIX == "string" ? IE7_PNG_SUFFIX : "-trans.png") + "$", "i");
+
+  // frequently used references
+  body = document.body;
+  viewport = quirksMode ? body : documentElement;
+
+  // classes
+  body.className += " ie7_body";
+  documentElement.className += " ie7_html";
+
+  if (quirksMode) ie7Quirks();
+
+  IE7.CSS.init();
+  IE7.HTML.init();
+
+  IE7.HTML.apply();
+  IE7.CSS.apply();
+
+  IE7.recalc();
+})();
+
+
+})();
Index: admin/js/ie7/ie7-recalc.js
===================================================================
--- admin/js/ie7/ie7-recalc.js	(revision 0)
+++ admin/js/ie7/ie7-recalc.js	(revision 703)
@@ -1,2 +1,166 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){if(!IE7.loaded)return;CLASSES=/\sie7_class\d+/g;IE7.CSS.extend({elements:{},handlers:[],reset:function(){this.removeEventHandlers();var a=this.elements;for(var b in a)a[b].runtimeStyle.cssText="";this.elements={};var a=IE7.Rule.elements;for(var b in a){with(a[b])className=className.replace(CLASSES,"")}IE7.Rule.elements={}},reload:function(){this.rules=[];this.getInlineStyles();this.screen.load();if(this.print)this.print.load();this.refresh();this.trash()},addRecalc:function(b,c,d,e){this.base(b,c,function(a){d(a);IE7.CSS.elements[a.uniqueID]=a},e)},recalc:function(){this.reset();this.base()},addEventHandler:function(a,b,c){a.attachEvent(b,c);this.handlers.push(arguments)},removeEventHandlers:function(){var a;while(a=this.handlers.pop()){a[0].detachEvent(a[1],a[2])}},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){var d=b.cssText||b.innerHTML;this.styles.push(d);b.cssText=d}}},trash:function(){var a=document.styleSheets,b,c;for(c=0;c<a.length;c++){b=a[c];if(!b.ie7&&!b.cssText){b.cssText=b.cssText}}this.base()},getText:function(a){return a.cssText||this.base(a)}});IE7.CSS.addEventHandler(window,"onunload",function(){IE7.CSS.removeEventHandlers()});IE7.Rule.elements={};IE7.Rule.prototype.extend({add:function(a){this.base(a);IE7.Rule.elements[a.uniqueID]=a}});if(IE7.PseudoElement){IE7.PseudoElement.hash={};IE7.PseudoElement.prototype.extend({create:function(a){var b=this.selector+":"+a.uniqueID;if(!IE7.PseudoElement.hash[b]){IE7.PseudoElement.hash[b]=true;this.base(a)}}})}IE7.HTML.extend({elements:{},addRecalc:function(b,c){this.base(b,function(a){if(!this.elements[a.uniqueID]){c(a);this.elements[a.uniqueID]=a}})}});document.recalc=function(a){if(IE7.CSS.screen){if(a)IE7.CSS.reload();IE7.recalc()}}})();
+
+// =========================================================================
+// ie7-recalc.js
+// =========================================================================
+
+(function() {
+  /* ---------------------------------------------------------------------
+  
+    This allows refreshing of IE7 style rules. If you modify the DOM
+    you can update IE7 by calling document.recalc().
+  
+    This should be the LAST module included.
+  
+  --------------------------------------------------------------------- */
+  
+  if (!IE7.loaded) return;
+  
+  // remove all IE7 classes from an element
+  CLASSES = /\sie7_class\d+/g;
+  
+  IE7.CSS.extend({
+    // store for elements that have style properties calculated
+    elements: {},
+    handlers: [],
+    
+    // clear IE7 classes and styles
+    reset: function() {
+      this.removeEventHandlers();
+      // reset IE7 classes here
+      var elements = this.elements;
+      for (var i in elements) elements[i].runtimeStyle.cssText = "";
+      this.elements = {};
+      // reset runtimeStyle here
+      var elements = IE7.Rule.elements;
+      for (var i in elements) {
+        with (elements[i]) className = className.replace(CLASSES, "");
+      }
+      IE7.Rule.elements = {};
+    },
+    
+    reload: function() {
+      this.rules = [];
+      this.getInlineStyles();
+      this.screen.load();
+      if (this.print) this.print.load();
+      this.refresh();
+      this.trash();
+    },
+    
+    addRecalc: function(propertyName, test, handler, replacement) {
+      // call the ancestor method to add a wrapped recalc method
+      this.base(propertyName, test, function(element) {
+        // execute the original recalc method
+        handler(element);
+        // store a reference to this element so we can clear its style later
+        IE7.CSS.elements[element.uniqueID] = element;
+      }, replacement);
+    },
+    
+    recalc: function() {
+      // clear IE7 styles and classes
+      this.reset();
+      // execute the ancestor method to perform recalculations
+      this.base();
+    },
+    
+    addEventHandler: function(element, type, handler) {
+      element.attachEvent(type, handler);
+      // store the handler so it can be detached later
+      this.handlers.push(arguments);
+    },
+    
+    removeEventHandlers: function() {
+      var handler;
+       while (handler = this.handlers.pop()) {
+         handler[0].detachEvent(handler[1], handler[2]);
+       }
+    },
+    
+    getInlineStyles: function() {
+      // load inline styles
+      var styleSheets = document.getElementsByTagName("style"), styleSheet;
+      for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+        if (!styleSheet.disabled && !styleSheet.ie7) {
+          var cssText = styleSheet.cssText || styleSheet.innerHTML;
+          this.styles.push(cssText);
+          styleSheet.cssText = cssText;
+        }
+      }
+    },
+    
+    trash: function() {
+      // trash the old style sheets
+      var styleSheets = document.styleSheets, styleSheet, i;
+      for (i = 0; i < styleSheets.length; i++) {
+        styleSheet = styleSheets[i];
+        if (!styleSheet.ie7 && !styleSheet.cssText) {
+          styleSheet.cssText = styleSheet.cssText;
+        }
+      }
+      this.base();
+    },
+    
+    getText: function(styleSheet) {
+      return styleSheet.cssText || this.base(styleSheet);
+    }
+  });
+  
+  // remove event handlers (they eat memory)
+  IE7.CSS.addEventHandler(window, "onunload", function() {
+     IE7.CSS.removeEventHandlers();
+  });
+  
+  // store all elements with an IE7 class assigned
+  IE7.Rule.elements = {};
+
+  IE7.Rule.prototype.extend({
+    add: function(element) {
+      // execute the ancestor "add" method
+      this.base(element);
+      // store a reference to this element so we can clear its classes later
+      IE7.Rule.elements[element.uniqueID] = element;
+    }
+  });
+
+  // store created pseudo elements
+  if (IE7.PseudoElement) {
+    IE7.PseudoElement.hash = {};
+  
+    IE7.PseudoElement.prototype.extend({
+      create: function(target) {
+        var key = this.selector + ":" + target.uniqueID;
+        if (!IE7.PseudoElement.hash[key]) {
+          IE7.PseudoElement.hash[key] = true;
+          this.base(target);
+        }
+      }
+    });
+  }
+  
+  IE7.HTML.extend({
+    elements: {},
+    
+    addRecalc: function(selector, handler) {
+      // call the ancestor method to add a wrapped recalc method
+      this.base(selector, function(element) {
+        if (!this.elements[element.uniqueID]) {
+          // execute the original recalc method
+          handler(element);
+          // store a reference to this element so that
+          //  it is not "fixed" again
+          this.elements[element.uniqueID] = element;
+        }
+      });
+    }
+  });
+  
+  // allow refreshing of IE7 fixes
+  document.recalc = function(reload) {
+    if (IE7.CSS.screen) {
+      if (reload) IE7.CSS.reload();
+      IE7.recalc();
+    }
+  };
+
+})();
Index: admin/js/ie7/ie7-squish.js
===================================================================
--- admin/js/ie7/ie7-squish.js	(revision 0)
+++ admin/js/ie7/ie7-squish.js	(revision 703)
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 501)
+++ plugins/tags/_admin.php	(revision 703)
@@ -108,5 +108,5 @@
 		
 		return 
-		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.min.js"></script>'.
+		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
 		'<script type="text/javascript" src="index.php?pf=tags/js/post.js"></script>'.
 		'<script type="text/javascript">'."\n".
@@ -137,5 +137,5 @@
 		
 		return 
-		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.min.js"></script>'.
+		'<script type="text/javascript" src="index.php?pf=tags/js/jquery.autocomplete.js"></script>'.
 		'<script type="text/javascript" src="index.php?pf=tags/js/posts_actions.js"></script>'.
 		'<script type="text/javascript">'."\n".
