Commits

Anonymous committed 20f1437

finally after discussion, go back to jquery.

Comments (0)

Files changed (14)

static/js/jquery-1.2.6.min.js

+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();

static/js/lib/base2-dom-strict.js

-/*
-  base2 - copyright 2007-2008, Dean Edwards
-  http://code.google.com/p/base2/
-  http://www.opensource.org/licenses/mit-license.php
-
-  Contributors:
-    Doeke Zanstra
-*/
-
-// timestamp: Sat, 06 Sep 2008 16:52:33
-
-new function(_no_shrink_) { ///////////////  BEGIN: CLOSURE  ///////////////
-
-// =========================================================================
-// DOM/strict/package.js
-// =========================================================================
-
-// employ strict validation of DOM calls
-
-eval(base2.namespace);
-eval(DOM.namespace);
-eval(lang.namespace);
-
-// =========================================================================
-// DOM/strict/DocumentEvent.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-DocumentEvent
-
-DocumentEvent.implement({
-  createEvent: function(document, type) {
-    assertArity(arguments);
-    assert(Traversal.isDocument(document), "Invalid object.");
-    return this.base(document, type);
-  }
-});
-
-// =========================================================================
-// DOM/strict/EventTarget.js
-// =========================================================================
-
-EventTarget.implement({
-  addEventListener: strictEventListener,
-
-  dispatchEvent: function(target, event) {
-    assertArity(arguments);
-    assertEventTarget(target);
-    assert(event && event.type, "Invalid event object.", TypeError);
-    return this.base(target, event);
-  },
-
-  removeEventListener: strictEventListener
-});
-
-function strictEventListener(target, type, listener, capture) {
-  assertArity(arguments);
-  assertEventTarget(target);
-  assertType(listener.handleEvent || listener, "function", "Invalid event listener.");
-  assertType(capture, "boolean", "Invalid capture argument.");
-  return this.base(target, type, listener, capture);
-};
-
-function assertEventTarget(target) {
-  assert(target == window || Traversal.isDocument(target) || Traversal.isElement(target), "Invalid event target.", TypeError);
-};
-
-if (detect("Gecko")) {
-  EventTarget.removeEventListener._delegate = "removeEventListener";
-  delete EventTarget.prototype.removeEventListener;
-}
-
-// =========================================================================
-// DOM/strict/NodeSelector.js
-// =========================================================================
-
-NodeSelector.implement({ 
-  querySelector:    strictNodeSelector,
-  querySelectorAll: strictNodeSelector
-});
-
-function strictNodeSelector(node, selector) {
-  assertArity(arguments);
-  assert(Traversal.isDocument(node) || Traversal.isElement(node), "Invalid object.", TypeError);
-  return this.base(node, selector);
-};
-
-}; ////////////////////  END: CLOSURE  /////////////////////////////////////

static/js/lib/base2-dom.js

-/*
-  base2 - copyright 2007-2008, Dean Edwards
-  http://code.google.com/p/base2/
-  http://www.opensource.org/licenses/mit-license.php
-
-  Contributors:
-    Doeke Zanstra
-*/
-
-// timestamp: Mon, 08 Sep 2008 15:48:07
-
-new function(_no_shrink_) { ///////////////  BEGIN: CLOSURE  ///////////////
-
-// =========================================================================
-// DOM/package.js
-// =========================================================================
-
-var DOM = new base2.Package(this, {
-  name:    "DOM",
-  version: "1.0.1",
-  imports: "Function2",
-  exports:
-    "Interface,Binding,Node,Document,Element,AbstractView,HTMLDocument,HTMLElement,"+
-    "Selector,Traversal,CSSParser,XPathParser,NodeSelector,DocumentSelector,ElementSelector,"+
-    "StaticNodeList,Event,EventTarget,DocumentEvent,ViewCSS,CSSStyleDeclaration,ClassList",
-  
-  bind: function(node) {
-    // Apply a base2 DOM Binding to a native DOM node.
-    if (node && node.nodeType) {
-      var base2ID = assignID(node);
-      if (!DOM.bind[base2ID]) {
-        switch (node.nodeType) {
-          case 1: // Element
-            if (typeof node.className == "string") {
-              // It's an HTML element, so use bindings based on tag name.
-              (HTMLElement.bindings[node.tagName] || HTMLElement).bind(node);
-            } else {
-              Element.bind(node);
-            }
-            break;
-          case 9: // Document
-            if (node.writeln) {
-              HTMLDocument.bind(node);
-            } else {
-              Document.bind(node);
-            }
-            break;
-          default:
-            Node.bind(node);
-        }
-        DOM.bind[base2ID] = true;
-      }
-    }
-    return node;
-  },
-  
-  "@MSIE5.+win": {
-    bind: function(node) {
-      if (node && node.writeln) {
-        node.nodeType = 9;
-      }
-      return this.base(node);
-    }
-  }
-});
-
-eval(this.imports);
-
-var _MSIE = detect("MSIE");
-var _MSIE5 = detect("MSIE5");
-
-// =========================================================================
-// DOM/Interface.js
-// =========================================================================
-
-// The Interface module is the base module for defining DOM interfaces.
-// Interfaces are defined with reference to the original W3C IDL.
-// e.g. http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247
-
-var Interface = Module.extend(null, {
-  forEach: function(block, context) {
-    forEach (this, function(method, name) {
-      if (typeOf(method) == "function" && (this.prototype[name] || method._delegate)) {
-        block.call(context, method, name, this);
-      }
-    }, this, Module);
-  },
-  
-  implement: function(_interface) {
-    if (typeof _interface == "object") {
-      _createDelegates(this, _interface);
-    } else if (Interface.ancestorOf(_interface)) {
-      for (var name in _interface) {
-        if (_interface[name] && _interface[name]._delegate) {
-          this[name] = bind(name, _interface);
-          this[name]._delegate = name;
-        }
-      }
-    }
-    return this.base(_interface);
-  }
-});
-
-function _createDelegates(module, _interface) {
-  var id = module.toString().slice(1, -1);
-  for (var name in _interface) {
-    var property = _interface[name];
-    if (name.charAt(0) == "@") {
-      _createDelegates(module, property);
-    } else if (!module[name] && typeof property == "function" && property.call) {
-      // delegate a static method to the bound object
-      //  e.g. for most browsers:
-      //    EventTarget.addEventListener(element, type, listener, capture)
-      //  forwards to:
-      //    element.addEventListener(type, listener, capture)
-      var args = "abcdefghij".slice(0, property.length).split("");
-      var fn = new Function(args.join(","), format("%2.base=%2.%1.ancestor;var m=%2.base?'base':'%1';return %2[m](%3)", name, args[0], args.slice(1)));
-      fn._delegate = name;
-      module[name] = fn;
-      module.namespace += "var " + name + "=base2.lang.bind('" + name + "'," + id + ");";
-    }
-  }
-};
-
-// =========================================================================
-// DOM/Binding.js
-// =========================================================================
-
-var Binding = Interface.extend(null, {
-  bind: function(object) {
-    return extend(object, this.prototype);
-  }
-});
-
-// =========================================================================
-// DOM/Node.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247
-
-var Node = Binding.extend({  
-  "@!(element.compareDocumentPosition)" : {
-    compareDocumentPosition: function(node, other) {
-      // http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition
-      
-      if (Traversal.contains(node, other)) {
-        return 4|16; // following|contained_by
-      } else if (Traversal.contains(other, node)) {
-        return 2|8;  // preceding|contains
-      }
-      
-      var nodeIndex = _getSourceIndex(node);
-      var otherIndex = _getSourceIndex(other);
-      
-      if (nodeIndex < otherIndex) {
-        return 4; // following
-      } else if (nodeIndex > otherIndex) {
-        return 2; // preceding
-      }      
-      return 0;
-    }
-  }
-}, {
-  "@Gecko": {
-    bind: function(node) {
-      return extend(this.base(node), "removeEventListener", function() {
-        var args = Array2.slice(arguments);
-        args.unshift(this);
-        EventTarget.removeEventListener.apply(EventTarget, args);
-      });
-    }
-  }
-});
-
-var _getSourceIndex = document.documentElement.sourceIndex ? function(node) {
-  return node.sourceIndex;
-} : function(node) {
-  // return a key suitable for comparing nodes
-  var key = 0;
-  while (node) {
-    key = Traversal.getNodeIndex(node) + "." + key;
-    node = node.parentNode;
-  }
-  return key;
-};
-
-// =========================================================================
-// DOM/Document.js
-// =========================================================================
-
-var Document = Node.extend(null, {
-  bind: function(document) {
-    extend(document, "createElement", function(tagName) {
-      return DOM.bind(this.base(tagName));
-    });
-    AbstractView.bind(document.defaultView);
-    if (document != window.document)
-      new DOMContentLoadedEvent(document);
-    return this.base(document);
-  },
-  
-  "@!(document.defaultView)": {
-    bind: function(document) {
-      document.defaultView = Traversal.getDefaultView(document);
-      return this.base(document);
-    }
-  }
-});
-
-// =========================================================================
-// DOM/Element.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-745549614
-
-// getAttribute() will return null if the attribute is not specified. This is
-//  contrary to the specification but has become the de facto standard.
-
-var _ATTRIBUTES = {
-  "class": "className",
-  "for": "htmlFor"
-};
-
-var Element = Node.extend({
-  "@MSIE.+win": {
-    getAttribute: function(element, name) {
-      if (element.className === undefined) { // XML
-        return this.base(element, name);
-      }
-      var attribute = _getAttributeNode(element, name);
-      if (attribute && (attribute.specified || name == "value")) {
-        if (name == "href" || name == "src") {
-          element.base = element.getAttribute.ancestor;
-          return element[element.base ? "base" : "getAttribute"](name, 2);
-        } else if (name == "style") {
-         return element.style.cssText.toLowerCase();
-        } else {
-         return attribute.nodeValue;
-        }
-      } else if (name == "type" && element.nodeName == "INPUT") {
-        var outerHTML = element.outerHTML;
-  			with (outerHTML) outerHTML = slice(0, indexOf(">") + 1);
-  			return match(outerHTML, /type="?([^\s">]*)"?/i)[1] || null;
-      }
-      return null;
-    },
-
-    removeAttribute: function(element, name) {
-      if (element.className !== undefined) { // XML
-        name = _ATTRIBUTES[name.toLowerCase()] || name;
-      }
-      this.base(element, name);
-    },
-
-    setAttribute: function(element, name, value) {
-      if (element.className === undefined) { // XML
-        this.base(element, name, value);
-      } else if (name == "style") {
-        element.style.cssText = value;
-      } else {
-        value = String(value);
-        var attribute = _getAttributeNode(element, name);
-        if (attribute) {
-          attribute.nodeValue = value;
-        } else {
-          this.base(element, _ATTRIBUTES[name.toLowerCase()] || name, value);
-        }
-      }
-    }
-  },
-
-  "@!(element.hasAttribute)": {
-    hasAttribute: function(element, name) {
-      if (element.className === undefined) { // XML
-        return this.base(element, name);
-      }
-      return this.getAttribute(element, name) != null;
-    }
-  }
-});
-
-// remove the base2ID for clones
-if (detect("MSIE.+win")) extend(Element.prototype, "cloneNode", function(deep) {
-  var clone = this.base(deep || false);
-  clone.base2ID = undefined;
-  return clone;
-});
-
-var _HTML_ATTRIBUTES = "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, Array2.combine(_HTML_ATTRIBUTES.toLowerCase().split(","), _HTML_ATTRIBUTES.split(",")));
-
-var _getAttributeNode = document.documentElement.getAttributeNode ? function(element, name) {
-  return element.getAttributeNode(name);
-} : function(element, name) {
-  return element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]];
-};
-
-// =========================================================================
-// DOM/Traversal.js
-// =========================================================================
-
-// DOM Traversal. Just the basics.
-
-var TEXT = detect("(element.textContent===undefined)") ? "innerText" : "textContent";
-
-var Traversal = Module.extend({
-  getDefaultView: function(node) {
-    return this.getDocument(node).defaultView;
-  },
-  
-  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) && !this.isElement(node)) continue;
-    return node;
-  },
-
-  getNodeIndex: function(node) {
-    var index = 0;
-    while (node && (node = node.previousSibling)) index++;
-    return index;
-  },
-  
-  getOwnerDocument: function(node) {
-    // return the node's containing document
-    return node.ownerDocument;
-  },
-  
-  getPreviousElementSibling: function(node) {
-    // return the previous element to the supplied element
-    while (node && (node = node.previousSibling) && !this.isElement(node)) continue;
-    return node;
-  },
-
-  getTextContent: function(node, isHTML) {
-    return node[isHTML ? "innerHTML" : TEXT];
-  },
-
-  isEmpty: function(node) {
-    node = node.firstChild;
-    while (node) {
-      if (node.nodeType == 3 || this.isElement(node)) return false;
-      node = node.nextSibling;
-    }
-    return true;
-  },
-
-  setTextContent: function(node, text, isHTML) {
-    return node[isHTML ? "innerHTML" : TEXT] = text;
-  },
-
-  "@!MSIE": {
-    setTextContent: function(node, text, isHTML) {
-      // Destroy the DOM (slightly faster for non-MISE browsers)
-      with (node) while (lastChild) parentNode.removeChild(lastChild);
-      return this.base(node, text, isHTML);
-    }
-  },
-
-  "@MSIE": {
-    getDefaultView: function(node) {
-      return (node.document || node).parentWindow;
-    },
-  
-    "@MSIE5": {
-      // return the node's containing document
-      getOwnerDocument: function(node) {
-        return node.ownerDocument || node.document;
-      }
-    }
-  }
-}, {
-  contains: function(node, target) {
-    node.nodeType; // throw an error if no node supplied
-    while (target && (target = target.parentNode) && node != target) continue;
-    return !!target;
-  },
-  
-  getDocument: function(node) {
-    // return the document object
-    return this.isDocument(node) ? node : node.ownerDocument || node.document;
-  },
-  
-  isDocument: function(node) {
-    return !!(node && node.documentElement);
-  },
-  
-  isElement: function(node) {
-    return !!(node && node.nodeType == 1);
-  },
-  
-  "@(element.contains)": {  
-    contains: function(node, target) {
-      return node != target && (this.isDocument(node) ? node == this.getOwnerDocument(target) : node.contains(target));
-    }
-  },
-  
-  "@MSIE5": {
-    isElement: function(node) {
-      return !!(node && node.nodeType == 1 && node.nodeName != "!");
-    }
-  }
-});
-
-// =========================================================================
-// DOM/views/AbstractView.js
-// =========================================================================
-
-var AbstractView = Binding.extend();
-
-// =========================================================================
-// DOM/events/header.js
-// =========================================================================
-
-// TO DO
-
-// textInput event
-
-var _CAPTURE_TYPE = {},
-    _TYPE_MAP     = {"2": 2, "4": 1};
-
-var _CAPTURING_PHASE = 1,
-    _AT_TARGET       = 2,
-    _BUBBLING_PHASE  = 3;
-    
-var _MOUSE_BUTTON   = /^mouse(up|down)|click$/,
-    _MOUSE_CLICK    = /click$/,
-    _BUBBLES        = "abort|error|select|change|resize|scroll|", // + _CANCELABLE
-    _CANCELABLE     = "(dbl)?click|mouse(down|up|over|move|out|wheel)|key(down|up)|submit|reset";
-
-    _BUBBLES = new RegExp("^(" + _BUBBLES + _CANCELABLE + ")$");
-    _CANCELABLE = new RegExp("^(" + _CANCELABLE + ")$");
-
-if (_MSIE) {
-  var _W3C_EVENT_TYPE = {focusin: "focus", focusout: "blur"};
-      _CAPTURE_TYPE   = {focus: "focusin", blur: "focusout"};
-}
-
-var _CAN_DELEGATE = /^(blur|submit|reset|change|select)$|^(mouse|key|focus)|click$/;
-
-// =========================================================================
-// DOM/events/Event.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event
-
-var Event = Binding.extend({
-  "@!(document.createEvent)": {
-    initEvent: function(event, type, bubbles, cancelable) {
-      event.type = String(type);
-      event.bubbles = !!bubbles;
-      event.cancelable = !!cancelable;
-    },
-
-    preventDefault: function(event) {
-      if (event.cancelable !== false) {
-        event.returnValue = false;
-      }
-    },
-
-    stopPropagation: function(event) {
-      event.cancelBubble = true;
-    },
-    
-    "@MSIE": {
-      preventDefault: function(event) {
-        this.base(event);
-        if (event.type == "mousedown") {
-          var type = "onbeforedeactivate";
-          var document = Traversal.getDocument(event.target);
-          document.attachEvent(type, function(event) {
-            // Allow a mousedown event to cancel a focus event.
-            event.returnValue = false;
-            document.detachEvent(type, arguments.callee);
-          });
-        }
-      }
-    }
-  }
-}, {
-  CAPTURING_PHASE: _CAPTURING_PHASE,
-  AT_TARGET:       _AT_TARGET,
-  BUBBLING_PHASE:  _BUBBLING_PHASE,
-    
-  "@!(document.createEvent)": {
-    "@MSIE": {
-      bind: function(event) {
-        var type = event.type;
-        if (!event.timeStamp) {
-          event.bubbles = _BUBBLES.test(type);
-          event.cancelable = _CANCELABLE.test(type);
-          event.timeStamp = new Date().valueOf();
-        }
-        event.relatedTarget = event[(event.target == event.fromElement ? "to" : "from") + "Element"];
-        return this.base(event);
-      }
-    }
-  },
-
-  cloneEvent: function(event) {
-    var clone = copy(event);
-    clone.stopPropagation = function() {
-      event.stopPropagation();
-    };
-    clone.preventDefault = function() {
-      event.preventDefault();
-    };
-    return clone;
-  },
-
-  "@MSIE" : {
-    cloneEvent: copy
-  }
-});
-
-// =========================================================================
-// DOM/events/EventDispatcher.js
-// =========================================================================
-
-var EventDispatcher = Base.extend({
-  constructor: function(state) {
-    this.state = state;
-    this.events = state.events;
-  },
-
-  dispatch: function(nodes, event, phase) {
-    event.eventPhase = phase;
-    var map = this.events[event.type][phase];
-    if (map) {
-      var i = nodes.length;
-      while (i-- && !event.cancelBubble) {
-        var currentTarget = nodes[i];
-        var listeners = map[currentTarget.base2ID];
-        if (listeners) {
-          listeners = copy(listeners);
-          event.currentTarget = currentTarget;
-          event.eventPhase = currentTarget == event.target ? _AT_TARGET : phase;
-          for (var listenerID in listeners) {
-            var listener = listeners[listenerID];
-            if (typeof listener == "function") {
-              listener.call(currentTarget, event);
-            } else {
-              listener.handleEvent(event);
-            }
-          }
-        }
-      }
-    }
-  },
-
-  handleEvent: function(event, fixed) {
-    Event.bind(event);
-    var type = event.type;
-    var w3cType = _W3C_EVENT_TYPE[type];
-    if (w3cType) {
-      event = copy(event);
-      type = event.type = w3cType;
-    }
-    if (this.events[type]) {
-      // Fix the mouse button (left=0, middle=1, right=2)
-      if (_MOUSE_BUTTON.test(type)) {
-        var button = _MOUSE_CLICK.test(type) ? this.state._button : event.button;
-        button = _TYPE_MAP[button] || 0;
-        if (event.button != button) {
-          event = copy(event);
-          event.button = button;
-        }
-      }
-      // Collect nodes in the event hierarchy
-      var currentTarget = event.target;
-      var nodes = [], i = 0;
-      while (currentTarget) {
-        nodes[i++] = currentTarget;
-        currentTarget = currentTarget.parentNode;
-      }
-      this.dispatch(nodes, event, _CAPTURING_PHASE);
-      if (!event.cancelBubble) {
-        if (!event.bubbles) nodes.length = 1;
-        nodes.reverse();
-        this.dispatch(nodes, event, _BUBBLING_PHASE);
-      }
-    }
-    return event.returnValue !== false;
-  },
-
-  "@MSIE.+win": {
-    handleEvent: function(event) {
-      if (event.type == "scroll") {
-        // horrible IE bug (setting style during scroll event causes crash)
-        // the scroll event can't be cancelled so it's not a problem to use a timer
-        setTimeout(bind(this.base, this, copy(event), true), 0);
-        return true;
-      } else {
-        return this.base(event);
-      }
-    },
-    
-    "@MSIE5": {
-      dispatch: function(nodes, event, phase) {
-        // IE5.x documentElement does not have a parentNode so document is missing
-        // from the nodes collection
-        if (phase == _CAPTURING_PHASE && !Array2.item(nodes, -1).documentElement) {
-          nodes.push(nodes[0].document);
-        }
-        this.base(nodes, event, phase);
-      }
-    }
-  }
-});
-
-// =========================================================================
-// DOM/events/EventTarget.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces
-
-var _wrappedListeners = {};
-
-var EventTarget = Interface.extend({
-  "@!(element.addEventListener)": {
-    addEventListener: function(target, type, listener, useCapture) {
-      var documentState = DocumentState.getInstance(target);
-
-      // assign a unique id to both objects
-      var targetID = assignID(target);
-      var listenerID = assignID(listener);
-
-      // create a hash table of event types for the target object
-      var phase = useCapture ? _CAPTURING_PHASE : _BUBBLING_PHASE;
-      var typeMap = documentState.registerEvent(type, target);
-      var phaseMap = typeMap[phase];
-      if (!phaseMap) phaseMap = typeMap[phase] = {};
-      // focus/blur (MSIE)
-      if (useCapture) type = _CAPTURE_TYPE[type] || type;
-      // create a hash table of event listeners for each object/event pair
-      var listeners = phaseMap[targetID];
-      if (!listeners) listeners = phaseMap[targetID] = {};
-      // store the event listener in the hash table
-      listeners[listenerID] = listener;
-    },
-
-    dispatchEvent: function(target, event) {
-      event.target = target;
-      return DocumentState.getInstance(target).handleEvent(event);
-    },
-
-    removeEventListener: function(target, type, listener, useCapture) {
-      var events = DocumentState.getInstance(target).events;
-      // delete the event listener from the hash table
-      var typeMap = events[type];
-      if (typeMap) {
-        var phaseMap = typeMap[useCapture ? _CAPTURING_PHASE : _BUBBLING_PHASE];
-        if (phaseMap) {
-          var listeners = phaseMap[target.base2ID];
-          if (listeners) delete listeners[listener.base2ID];
-        }
-      }
-    }
-  },
-
-  "@(element.addEventListener)": {
-    "@Gecko": {
-      addEventListener: function(target, type, listener, useCapture) {
-        if (type == "mousewheel") {
-          type = "DOMMouseScroll";
-          var originalListener = listener;
-          listener = _wrappedListeners[assignID(listener)] = function(event) {
-            event = Event.cloneEvent(event);
-            event.type = "mousewheel";
-            event.wheelDelta = (-event.detail * 40) || 0;
-            _handleEvent(target, originalListener, event);
-          };
-        }
-        this.base(target, type, listener, useCapture);
-      }
-    },
-
-    // http://unixpapa.com/js/mouse.html
-    "@webkit[1-4]|KHTML[34]": {
-      addEventListener: function(target, type, listener, useCapture) {
-        if (_MOUSE_BUTTON.test(type)) {
-          var originalListener = listener;
-          listener = _wrappedListeners[assignID(listener)] = function(event) {
-            var button = _TYPE_MAP[event.button] || 0;
-            if (event.button != button) {
-              event = Event.cloneEvent(event);
-              event.button = button;
-            }
-            _handleEvent(target, originalListener, event);
-          };
-        } else if (typeof listener == "object") {
-          listener = _wrappedListeners[assignID(listener)] = bind("handleEvent", listener);
-        }
-        this.base(target, type, listener, useCapture);
-      }
-    },
-
-    // http://unixpapa.com/js/key.html
-    "@Linux|Mac|opera": {
-      addEventListener: function(target, type, listener, useCapture) {
-        // Some browsers do not fire repeated "keydown" events when a key
-        // is held down. They do fire repeated "keypress" events though.
-        // Cancelling the "keydown" event does not cancel the repeated
-        // "keypress" events. We fix all of this here...
-        if (type == "keydown") {
-          var originalListener = listener;
-          listener = _wrappedListeners[assignID(listener)] = function(keydownEvent) {
-            var firedCount = 0, cancelled = false;
-            extend(keydownEvent, "preventDefault", function() {
-              this.base();
-              cancelled = true;
-            });
-            function handleEvent(event) {
-              if (cancelled) event.preventDefault();
-              if (event == keydownEvent || firedCount > 1) {
-                _handleEvent(target, originalListener, keydownEvent);
-              }
-              firedCount++;
-            };
-            handleEvent(keydownEvent);
-            target.addEventListener("keyup", function() {
-              target.removeEventListener("keypress", handleEvent, true);
-              target.removeEventListener("keyup", arguments.callee, true);
-            }, true);
-            target.addEventListener("keypress", handleEvent, true);
-          };
-        }
-        this.base(target, type, listener, useCapture);
-      }
-    },
-
-    removeEventListener: function(target, type, listener, useCapture) {
-      this.base(target, type, _wrappedListeners[listener.base2ID] || listener, useCapture);
-    }
-  }
-});
-
-if (detect("Gecko")) {
-  EventTarget.removeEventListener._delegate = "removeEventListener";
-  delete EventTarget.prototype.removeEventListener;
-}
-
-function _handleEvent(target, listener, event) {
-  if (typeof listener == "function") {
-    listener.call(target, event);
-  } else {
-    listener.handleEvent(event);
-  }
-};
-
-// =========================================================================
-// DOM/events/DocumentEvent.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-DocumentEvent
-
-var DocumentEvent = Interface.extend({  
-  "@!(document.createEvent)": {
-    createEvent: function(document, type) {
-      var event = document.createEventObject ? document.createEventObject() : {};
-      event.bubbles = false;
-      event.cancelable = false;
-      event.eventPhase = 0;
-      event.target = document;
-      event.currentTarget = null;
-      event.relatedTarget = null;
-      event.timeStamp = new Date().valueOf();
-      return Event(event);
-    }
-  },
-  
-  "@(document.createEvent)": {
-    "@!(document.createEvent('Events'))": { // before Safari 3
-      createEvent: function(document, type) {
-        return this.base(document, type == "Events" ? "UIEvents" : type);
-      }
-    }
-  }
-});
-
-// =========================================================================
-// DOM/events/DOMContentLoadedEvent.js
-// =========================================================================
-
-// http://dean.edwards.name/weblog/2006/06/again
-
-var DOMContentLoadedEvent = Base.extend({
-  constructor: function(document) {
-    var fired = false;
-    this.fire = function() {
-      if (!fired) {
-        fired = true;
-        // this function will be called from another event handler so we'll user a timer
-        //  to drop out of any current event
-        setTimeout(function() {
-          var event = DocumentEvent.createEvent(document, "Events");
-          Event.initEvent(event, "DOMContentLoaded", true, false);
-          EventTarget.dispatchEvent(document, event);
-        }, 1);
-      }
-    };
-    // use the real event for browsers that support it (opera & firefox)
-    EventTarget.addEventListener(document, "DOMContentLoaded", function() {
-      fired = true;
-    }, false);
-    this.listen(document);
-  },
-
-  listen: Undefined,
-
-  "@!Gecko20([^0]|0[3-9])|Webkit[5-9]|Opera[19]|MSIE.+mac": {
-    listen: function(document) {
-      // if all else fails fall back on window.onload
-      EventTarget.addEventListener(Traversal.getDefaultView(document), "load", this.fire, false);
-    },
-
-    "@MSIE.+win": {
-      listen: function(document) {
-        // http://javascript.nwbox.com/IEContentLoaded/
-        try {
-          document.body.doScroll("left");
-          if (!this.__constructing) this.fire();
-        } catch (e) {
-          setTimeout(bind(this.listen, this, document), 10);
-        }
-      }
-    },
-
-    "@KHTML": {
-      listen: function(document) {
-        // John Resig
-        if (/loaded|complete/.test(document.readyState)) { // loaded
-          if (!this.__constructing) this.fire();
-        } else {
-          setTimeout(bind(this.listen, this, document), 10);
-        }
-      }
-    }
-  }
-});
-
-// =========================================================================
-// DOM/events/implementations.js
-// =========================================================================
-
-Document.implement(DocumentEvent);
-Document.implement(EventTarget);
-
-Element.implement(EventTarget);
-
-// =========================================================================
-// DOM/style/ViewCSS.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-ViewCSS
-
-var _PIXEL     = /^\d+(px)?$/i,
-    _METRICS   = /(width|height|top|bottom|left|right|fontSize)$/,
-    _COLOR     = /^(color|backgroundColor)$/,
-    _RGB_BLACK = "rgb(0, 0, 0)",
-    _BLACK     = {black:1, "#000":1, "#000000":1};
-
-var ViewCSS = Interface.extend({
-  "@!(document.defaultView.getComputedStyle)": {
-    "@MSIE": {
-      getComputedStyle: function(view, element, pseudoElement) {
-        // pseudoElement parameter is not supported
-        var currentStyle = element.currentStyle;
-        var computedStyle = {};
-        for (var propertyName in currentStyle) {
-          if (_METRICS.test(propertyName) || _COLOR.test(propertyName)) {
-            computedStyle[propertyName] = this.getComputedPropertyValue(view, element, propertyName);
-          } else if (propertyName.indexOf("ruby") != 0) {
-            computedStyle[propertyName] = currentStyle[propertyName];
-          }
-        }
-        return computedStyle;
-      }
-    }
-  },
-  
-  getComputedStyle: function(view, element, pseudoElement) {
-    return _CSSStyleDeclaration_ReadOnly.bind(this.base(view, element, pseudoElement));
-  }
-}, {
-  getComputedPropertyValue: function(view, element, propertyName) {
-    return CSSStyleDeclaration.getPropertyValue(this.getComputedStyle(view, element, null), propertyName);
-  },
-  
-  "@MSIE": {
-    getComputedPropertyValue: function(view, element, propertyName) {
-      propertyName = this.toCamelCase(propertyName);
-      var value = element.currentStyle[propertyName];
-      if (_METRICS.test(propertyName))
-        return _MSIE_getPixelValue(element, value) + "px";
-      if (!_MSIE5 && _COLOR.test(propertyName)) {
-        var rgb = _MSIE_getColorValue(element, propertyName == "color" ? "ForeColor" : "BackColor");
-        return (rgb == _RGB_BLACK && !_BLACK[value]) ? value : rgb;
-      }
-      return value;
-    }
-  },
-  
-  toCamelCase: function(string) {
-    return string.replace(/\-([a-z])/g, flip(String2.toUpperCase));
-  }
-});
-
-function _MSIE_getPixelValue(element, value) {
-  if (_PIXEL.test(value)) return parseInt(value);
-  var styleLeft = element.style.left;
-  var runtimeStyleLeft = element.runtimeStyle.left;
-  element.runtimeStyle.left = element.currentStyle.left;
-  element.style.left = value || 0;
-  value = element.style.pixelLeft;
-  element.style.left = styleLeft;
-  element.runtimeStyle.left = runtimeStyleLeft;
-  return value;
-};
-
-function _MSIE_getColorValue(element, type) {
-  // elements need to have "layout" for this to work.
-  if (element.createTextRange) {
-    var range = element.createTextRange();
-  } else {
-    range = element.document.body.createTextRange();
-    range.moveToElementText(element);
-  }
-  var color = range.queryCommandValue(type);
-  return format("rgb(%1, %2, %3)", color & 0xff, (color & 0xff00) >> 8,  (color & 0xff0000) >> 16);
-};
-
-// =========================================================================
-// DOM/style/CSSStyleDeclaration.js
-// =========================================================================
-
-// http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
-
-var _CSSStyleDeclaration_ReadOnly = Binding.extend({
-  getPropertyValue: function(style, propertyName) {
-    return this.base(style, _CSSPropertyNameMap[propertyName] || propertyName);
-  },
-  
-  "@MSIE.+win": {
-    getPropertyValue: function(style, propertyName) {
-      return propertyName == "float" ? style.styleFloat : style[ViewCSS.toCamelCase(propertyName)];
-    }
-  }
-});
-
-var CSSStyleDeclaration = _CSSStyleDeclaration_ReadOnly.extend({
-  setProperty: function(style, propertyName, value, priority) {
-    return this.base(style, _CSSPropertyNameMap[propertyName] || propertyName, value, priority);
-  },
-  
-  "@MSIE.+win": {
-    setProperty: function(style, propertyName, value, priority) {
-      if (propertyName == "opacity") {
-        value *= 100;
-        style.opacity = value;
-        style.zoom = 1;
-        style.filter = "Alpha(opacity=" + value + ")";
-      } else {
-        if (priority == "important") {
-          style.cssText += format(";%1:%2!important;", propertyName, value);
-        } else {
-          style.setAttribute(ViewCSS.toCamelCase(propertyName), value);
-        }
-      }
-    }
-  }
-}, {
-  "@MSIE": {
-    bind: function(style) {
-      style.getPropertyValue = this.prototype.getPropertyValue;
-      style.setProperty = this.prototype.setProperty;
-      return style;
-    }
-  }
-});
-
-var _CSSPropertyNameMap = new Base({
-  "@Gecko": {
-    opacity: "-moz-opacity"
-  },
-
-  "@KHTML": {
-    opacity: "-khtml-opacity"
-  }
-});
-
-with (CSSStyleDeclaration.prototype) getPropertyValue.toString = setProperty.toString = K("[base2]");
-
-// =========================================================================
-// DOM/style/implementations.js
-// =========================================================================
-
-AbstractView.implement(ViewCSS);
-
-// =========================================================================
-// DOM/selectors-api/NodeSelector.js
-// =========================================================================
-
-// http://www.w3.org/TR/selectors-api/
-
-var NodeSelector = Interface.extend({
-  "@(element.querySelector)": {
-    querySelector: function(node, selector) {
-      try {
-        var element = this.base(node, trim(selector));
-        if (element) return element;
-      } catch(x) {}
-      // assume it's an unsupported selector
-      return new Selector(selector).exec(node, 1);
-    },
-    
-    querySelectorAll: function(node, selector) {
-      try {
-        var nodeList = this.base(node, trim(selector));
-        if (nodeList) return new StaticNodeList(nodeList);
-      } catch(x) {}
-      // assume it's an unsupported selector
-      return new Selector(selector).exec(node);
-    }
-  },
-
-  "@!(element.querySelector)": {
-    querySelector: function(node, selector) {
-      return new Selector(selector).exec(node, 1);
-    },
-
-    querySelectorAll: function(node, selector) {
-      return new Selector(selector).exec(node);
-    }
-  }
-});
-
-// automatically bind objects retrieved using the Selectors API on a bound node
-
-extend(NodeSelector.prototype, {
-  querySelector: function(selector) {
-    return DOM.bind(this.base(selector));
-  },
-
-  querySelectorAll: function(selector) {
-    return extend(this.base(selector), "item", function(index) {
-      return DOM.bind(this.base(index));
-    });
-  }
-});
-
-// =========================================================================
-// DOM/selectors-api/DocumentSelector.js
-// =========================================================================
-
-// http://www.w3.org/TR/selectors-api/#documentselector
-
-var DocumentSelector = NodeSelector.extend();
-
-// =========================================================================
-// DOM/selectors-api/ElementSelector.js
-// =========================================================================
-
-var ElementSelector = NodeSelector.extend({
-  "@!(element.matchesSelector)": { // future-proof
-    matchesSelector: function(element, selector) {
-      return new Selector(selector).test(element);
-    }
-  }
-});
-
-// =========================================================================
-// DOM/selectors-api/CSSParser.js
-// =========================================================================
-
-var _CSS_ESCAPE =           /'(\\.|[^'\\])*'|"(\\.|[^"\\])*"/g,
-    _CSS_IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g,
-    _CSS_IMPLIED_SPACE =    /(^|,)([^\s>+~])/g,
-    _CSS_WHITESPACE =       /\s*([\s>+~,]|^|$)\s*/g,
-    _CSS_WILD_CARD =        /\s\*\s/g,
-    _CSS_UNESCAPE =         /\x01(\d+)/g,
-    _QUOTE =                /'/g;
-  
-var CSSParser = RegGrp.extend({
-  constructor: function(items) {
-    this.base(items);
-    this.cache = {};
-    this.sorter = new RegGrp;
-    this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE);
-    this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4");
-  },
-  
-  cache: null,
-  ignoreCase: true,
-
-  escape: function(selector, simple) {
-    // remove strings
-    var strings = this._strings = [];
-    selector = this.optimise(this.format(String(selector).replace(_CSS_ESCAPE, function(string) {
-      return "\x01" + strings.push(string.slice(1, -1).replace(_QUOTE, "\\'"));
-    })));
-    if (simple) selector = selector.replace(/(^|,) \*?/g, "$1");
-    return selector;
-  },
-  
-  format: function(selector) {
-    return selector
-      .replace(_CSS_WHITESPACE, "$1")
-      .replace(_CSS_IMPLIED_SPACE, "$1 $2")
-      .replace(_CSS_IMPLIED_ASTERISK, "$1*$2");
-  },
-  
-  optimise: function(selector) {
-    // optimise wild card descendant selectors
-    return this.sorter.exec(selector.replace(_CSS_WILD_CARD, ">* "));
-  },
-  
-  parse: function(selector, simple) {
-    return this.cache[selector] ||
-      (this.cache[selector] = this.unescape(this.exec(this.escape(selector, simple))));
-  },
-  
-  unescape: function(selector) {
-    // put string values back
-    var strings = this._strings;
-    return selector.replace(_CSS_UNESCAPE, function(match, index) {
-      return strings[index - 1];
-    });
-  }
-});
-
-function _nthChild(match, args, position, last, not, and, mod, equals) {
-  // ugly but it works for both CSS and XPath
-  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, and, mod, equals);
-  if (negate) query = not + "(" + query + ")";
-  return query;
-};
-
-// =========================================================================
-// DOM/selectors-api/XPathParser.js
-// =========================================================================
-
-// XPath parser
-// converts CSS expressions to *optimised* XPath queries
-
-// This code used to be quite readable until I added code to optimise *-child selectors. 
-
-var XPathParser = CSSParser.extend({
-  constructor: function() {
-    this.base(XPathParser.build());
-    // The sorter sorts child selectors to the end because they are slow.
-    // For XPath we need the child selectors to be sorted to the beginning,
-    // so we reverse the sort order. That's what this line does:
-    this.sorter.putAt(1, "$1$4$3$6");
-  },
-  
-  escape: function(selector, simple) {
-    return this.base(selector, simple).replace(/,/g, "\x02");
-  },
-  
-  unescape: function(selector) {
-    return this.base(selector
-      .replace(/\[self::\*\]/g, "")   // remove redundant wild cards
-      .replace(/(^|\x02)\//g, "$1./") // context
-      .replace(/\x02/g, " | ")        // put commas back      
-    ).replace(/'[^'\\]*\\'(\\.|[^'\\])*'/g, function(match) { // escape single quotes
-      return "concat(" + match.split("\\'").join("',\"'\",'") + ")";
-    });
-  },
-
-  "@opera(7|8|9\\.[1-4])": {
-    unescape: function(selector) {
-      // opera pre 9.5 does not seem to support last() but I can't find any
-      //  documentation to confirm this
-      return this.base(selector.replace(/last\(\)/g, "count(preceding-sibling::*)+count(following-sibling::*)+1"));
-    }
-  }
-}, {
-  build: function() {
-    // build the rules collection
-    this.values.attributes[""] = "[@$1]";
-    forEach (this.types, function(add, type) {
-      forEach (this.values[type], add, this.rules);
-    }, this);
-    this.build = K(this.rules);
-    return this.rules;
-  },
-  
-  optimised: {
-    pseudoClasses: {
-      "first-child": "[1]",
-      "last-child":  "[last()]",
-      "only-child":  "[last()=1]"
-    }
-  },
-  
-  rules: extend({}, {
-    "@!KHTML|opera": { // this optimisation does not work on Safari/opera
-      // fast id() search
-      "(^|\\x02) (\\*|[\\w-]+)#([\\w-]+)": "$1id('$3')[self::$2]"
-    },
-    
-    "@!KHTML": { // this optimisation does not work on Safari
-      // optimise positional searches
-      "([ >])(\\*|[\\w-]+):([\\w-]+-child(\\(([^)]+)\\))?)": function(match, token, tagName, pseudoClass, $4, args) {
-        var replacement = (token == " ") ? "//*" : "/*";
-        if (/^nth/i.test(pseudoClass)) {
-          replacement += _xpath_nthChild(pseudoClass, args, "position()");
-        } else {
-          replacement += XPathParser.optimised.pseudoClasses[pseudoClass];
-        }
-        return replacement + "[self::" + tagName + "]";
-      }
-    }
-  }),
-  
-  types: {
-    identifiers: function(replacement, token) {
-      this[rescape(token) + "([\\w-]+)"] = replacement;
-    },
-    
-    combinators: function(replacement, combinator) {
-      this[rescape(combinator) + "(\\*|[\\w-]+)"] = replacement;
-    },
-    
-    attributes: function(replacement, operator) {
-      this["\\[\\s*([\\w-]+)\\s*" + rescape(operator) +  "\\s*([^\\]\\s]*)\\s*\\]"] = replacement;
-    },
-    
-    pseudoClasses: function(replacement, pseudoClass) {
-      this[":" + pseudoClass.replace(/\(\)$/, "\\(([^)]+)\\)")] = replacement;
-    }
-  },
-  
-  values: {
-    identifiers: {
-      "#": "[@id='$1'][1]", // ID selector
-      ".": "[contains(concat(' ',@class,' '),' $1 ')]" // class selector
-    },
-    
-    combinators: {
-      " ": "/descendant::$1", // descendant selector
-      ">": "/child::$1", // child selector
-      "+": "/following-sibling::*[1][self::$1]", // direct adjacent selector
-      "~": "/following-sibling::$1" // indirect adjacent selector
-    },
-    
-    attributes: { // attribute selectors
-      "*=": "[contains(@$1,'$2')]",
-      "^=": "[starts-with(@$1,'$2')]",
-      "$=": "[substring(@$1,string-length(@$1)-string-length('$2')+1)='$2']",
-      "~=": "[contains(concat(' ',@$1,' '),' $2 ')]",
-      "|=": "[contains(concat('-',@$1,'-'),'-$2-')]",
-      "!=": "[not(@$1='$2')]",
-      "=":  "[@$1='$2']"
-    },
-    
-    pseudoClasses: { // pseudo class selectors
-      "link":             "[false]",
-      "visited":          "[false]",
-      "empty":            "[not(child::*) and not(text())]",
-//-   "lang()":           "[boolean(lang('$1') or boolean(ancestor-or-self::*[@lang][1][starts-with(@lang,'$1')]))]",
-      "first-child":      "[not(preceding-sibling::*)]",
-      "last-child":       "[not(following-sibling::*)]",
-      "not()":            _xpath_not,
-      "nth-child()":      _xpath_nthChild,
-      "nth-last-child()": _xpath_nthChild,
-      "only-child":       "[not(preceding-sibling::*) and not(following-sibling::*)]",
-      "root":             "[not(parent::*)]"
-    }
-  },
-  
-  "@opera(7|8|9\\.[1-4])": {
-    build: function() {
-      this.optimised.pseudoClasses["last-child"] = this.values.pseudoClasses["last-child"];
-      this.optimised.pseudoClasses["only-child"] = this.values.pseudoClasses["only-child"];
-      return this.base();
-    }
-  }
-});
-
-// these functions defined here to make the code more readable
-var _notParser;
-function _xpath_not(match, args) {
-  if (!_notParser) _notParser = new XPathParser;
-  return "[not(" + _notParser.exec(trim(args))
-    .replace(/\[1\]/g, "") // remove the "[1]" introduced by ID selectors
-    .replace(/^(\*|[\w-]+)/, "[self::$1]") // tagName test
-    .replace(/\]\[/g, " and ") // merge predicates
-    .slice(1, -1)
-  + ")]";
-};
-
-function _xpath_nthChild(match, args, position) {
-  return "[" + _nthChild(match, args, position || "count(preceding-sibling::*)+1", "last()", "not", " and ", " mod ", "=") + "]";
-};
-
-// =========================================================================
-// DOM/selectors-api/Selector.js
-// =========================================================================
-
-// This object can be instantiated, however it is probably better to use
-// the querySelector/querySelectorAll methods on DOM nodes.
-
-// There is no public standard for this object.
-
-var Selector = Base.extend({
-  constructor: function(selector) {
-    this.toString = K(trim(selector));
-  },
-
-  exec: function(context, count, simple) {
-    return Selector.parse(this, simple)(context, count);
-  },
-
-  isSimple: function() {
-    if (!_parser.exec) _parser = new CSSParser(_parser);
-    return !_COMBINATOR.test(trim(_parser.escape(this)));
-  },
-
-  test: function(element) {
-    if (this.isSimple()) {
-      return !!Selector.parse(this, true)(element, 1);
-    } else {
-      element.setAttribute("b2-test", true);
-      var result = new Selector(this + "[b2-test]").exec(Traversal.getOwnerDocument(element), 1);
-      element.removeAttribute("b2-test");
-      return result == element;
-    }
-  },
-
-  toXPath: function(simple) {
-    return Selector.toXPath(this, simple);
-  },
-
-  "@(XPathResult)": {
-    exec: function(context, count, simple) {
-      // use DOM methods if the XPath engine can't be used
-      if (_NOT_XPATH.test(this)) {
-        return this.base(context, count, simple);
-      }
-      var document = Traversal.getDocument(context);
-      var type = count == 1
-        ? 9 /* FIRST_ORDERED_NODE_TYPE */
-        : 7 /* ORDERED_NODE_SNAPSHOT_TYPE */;
-      var result = document.evaluate(this.toXPath(simple), context, null, type, null);
-      return count == 1 ? result.singleNodeValue : result;
-    }
-  },
-
-  "@MSIE": {
-    exec: function(context, count, simple) {
-      if (typeof context.selectNodes != "undefined" && !_NOT_XPATH.test(this)) { // xml
-        var method = single ? "selectSingleNode" : "selectNodes";
-        return context[method](this.toXPath(simple));
-      }
-      return this.base(context, count, simple);
-    }
-  },
-
-  "@(true)": {
-    exec: function(context, count, simple) {
-      try {
-        var result = this.base(context || document, count, simple);
-      } catch (error) { // probably an invalid selector =)
-        throw new SyntaxError(format("'%1' is not a valid CSS selector.", this));
-      }
-      return count == 1 ? result : new StaticNodeList(result);
-    }
-  }
-}, {
-  toXPath: function(selector, simple) {
-    if (!_xpathParser) _xpathParser = new XPathParser;
-    return _xpathParser.parse(selector, simple);
-  }
-});
-
-var _COMBINATOR = /[^,]\s|[+>~]/;
-
-var _NOT_XPATH = ":(checked|disabled|enabled|contains|hover|active|focus)|^(#[\\w-]+\\s*)?\\w+$";
-if (detect("KHTML")) {
-  if (detect("WebKit5")) {
-    _NOT_XPATH += "|nth\\-|,";
-  } else {
-    _NOT_XPATH = ".";
-  }
-}
-_NOT_XPATH = new RegExp(_NOT_XPATH);
-
-// Selector.parse() - converts CSS selectors to DOM queries.
-
-// Hideous code but it produces fast DOM queries.
-// Respect due to Alex Russell and Jack Slocum for inspiration.
-
-Selector.operators = {
-  "=":  "%1=='%2'",
-//"!=": "%1!='%2'", //  not standard but other libraries support it
-  "~=": /(^| )%1( |$)/,
-  "|=": /^%1(-|$)/,
-  "^=": /^%1/,
-  "$=": /%1$/,
-  "*=": /%1/
-};
-Selector.operators[""] = "%1!=null";
-
-Selector.pseudoClasses = { //-dean: lang()
-  "checked":     "e%1.checked",
-  "contains":    "e%1[TEXT].indexOf('%2')!=-1",
-  "disabled":    "e%1.disabled",
-  "empty":       "Traversal.isEmpty(e%1)",
-  "enabled":     "e%1.disabled===false",
-  "first-child": "!Traversal.getPreviousElementSibling(e%1)",
-  "last-child":  "!Traversal.getNextElementSibling(e%1)",
-  "only-child":  "!Traversal.getPreviousElementSibling(e%1)&&!Traversal.getNextElementSibling(e%1)",
-  "root":        "e%1==Traversal.getDocument(e%1).documentElement",
-  "target":      "e%1.id&&e%1.id==location.hash.slice(1)",
-  "hover":       "DocumentState.getInstance(d).isHover(e%1)",
-  "active":      "DocumentState.getInstance(d).isActive(e%1)",
-  "focus":       "DocumentState.getInstance(d).hasFocus(e%1)",
-  "link":        "false", // not implemented (security)
-  "visited":     "false"
-// nth-child     // defined below
-// not
-};
-
-var _INDEXED = document.documentElement.sourceIndex !== undefined,
-    _VAR = "var p%2=0,i%2,e%3,n%2=e%1.",
-    _ID = _INDEXED ? "e%1.sourceIndex" : "assignID(e%1)",
-    _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;",
-    _STORE = "r[k++]=e%1;if(s==1)return e%1;if(k===s){_query.state=[%2];_query.complete=%3;return r;",
-    _FN = "var _query=function(e0,s%1){_indexed++;var r=[],p={},p0=0,reg=[%4],d=Traversal.getDocument(e0),c=d.writeln?'toUpperCase':'toString',k=0;";
-
-var _xpathParser;
-
-// variables used by the parser
-
-var _reg,        // a store for RexExp objects
-    _index,
-    _wild,       // need to flag certain wild card selectors as MSIE includes comment nodes
-    _list,       // are we processing a node list?
-    _group,
-    _listAll,
-    _duplicate,  // possible duplicates?
-    _cache = {}, // store parsed selectors
-    _simple = {};
-
-function sum(list) {
-  var total = 0;
-  for (var i = 0; i < list.length; i++) {
-    total += list[i];
-  }
-  return total;
-};
-
-// a hideous parser
-var _parser = {
-  "^(\\*|[\\w-]+)": function(match, tagName) {
-    return tagName == "*" ? "" : format("if(e0.nodeName=='%1'[c]()){", tagName);
-  },
-
-  "^ \\*:root": function(match) { // :root pseudo class
-    _wild = false;
-    var replacement = "e%2=d.documentElement;if(Traversal.contains(e%1,e%2)){";
-    return format(replacement, _index++, _index);
-  },
-
-  " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID
-    _wild = false;
-    var replacement = "var e%2=_byId(d,'%4');if(e%2&&";
-    if (tagName != "*") replacement += "e%2.nodeName=='%3'[c]()&&";
-    replacement += "Traversal.contains(e%1,e%2)){";
-    if (_list[_group]) replacement += format("i%1=n%1.length;", sum(_list));
-    return format(replacement, _index++, _index, tagName, id);
-  },
-
-  " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector
-    _duplicate++; // this selector may produce duplicates
-    _wild = tagName == "*";
-    var replacement = format(_VAR, _index++, "%2", _index);
-    // IE5.x does not support getElementsByTagName("*");
-    replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')";
-    replacement += ";for(i%2=a%2||0;(e%1=n%2[i%2]);i%2++){";
-    _list[_group]++;
-    return format(replacement, _index, sum(_list), tagName);
-  },
-
-  ">(\\*|[\\w-]+)": function(match, tagName) { // child selector
-    var children = _MSIE && _index;
-    _wild = tagName == "*";
-    var replacement = _VAR + (children ? "children" : "childNodes");
-    replacement = format(replacement, _index++, "%2", _index);
-    if (!_wild && _MSIE && children) replacement += ".tags('%3')";
-    replacement += ";for(i%2=a%2||0;(e%1=n%2[i%2]);i%2++){";
-    if (_wild) {
-      replacement += "if(e%1.nodeType==1){";
-      _wild = _MSIE5;
-    } else {
-      if (!_MSIE || !children) replacement += "if(e%1.nodeName=='%3'[c]()){";
-    }
-    _list[_group]++;
-    return format(replacement, _index, sum(_list), tagName);
-  },
-
-  "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector
-    var replacement = "";
-    if (_wild && _MSIE) replacement += "if(e%1.nodeName!='!'){";
-    _wild = false;
-    replacement += "e%1=Traversal.getNextElementSibling(e%1);if(e%1";
-    if (tagName != "*") replacement += "&&e%1.nodeName=='%2'[c]()";
-    replacement += "){";
-    return format(replacement, _index, tagName);
-  },
-
-  "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector
-    var replacement = "";
-    if (_wild && _MSIE) replacement += "if(e%1.nodeName!='!'){";
-    _wild = false;
-    _duplicate = 2; // this selector may produce duplicates
-    replacement += "while(e%1=e%1.nextSibling){if(e%1.b2_adjacent==_indexed)break;if(";
-    if (tagName == "*") {
-      replacement += "e%1.nodeType==1";
-      if (_MSIE5) replacement += "&&e%1.nodeName!='!'";
-    } else replacement += "e%1.nodeName=='%2'[c]()";
-    replacement += "){e%1.b2_adjacent=_indexed;";
-    return format(replacement, _index, tagName);
-  },
-
-  "#([\\w-]+)": function(match, id) { // ID selector
-    _wild = false;
-    var replacement = "if(e%1.id=='%2'){";
-    if (_list[_group]) replacement += format("i%1=n%1.length;", sum(_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);
-  },
-
-  ":not\\((\\*|[\\w-]+)?([^)]*)\\)": function(match, tagName, filters) { // :not pseudo class
-    var replacement = (tagName && tagName != "*") ? format("if(e%1.nodeName=='%2'[c]()){", _index, tagName) : "";
-    replacement += _parser.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.b2_length", _index);
-    var replacement = "if(p%1!==e%1.parentNode)p%1=_register(e%1.parentNode);";
-    replacement += "var i=e%1[p%1.b2_lookup];if(p%1.b2_lookup!='b2_index')i++;if(";
-    return format(replacement, _index) + _nthChild(match, args, "i", last, "!", "&&", "% ", "==") + "){";
-  },
-
-  ":([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // other pseudo class selectors
-    return "if(" + format(Selector.pseudoClasses[pseudoClass] || "throw", _index, args || "") + "){";
-  },
-
-  "\\[\\s*([\\w-]+)\\s*([^=]?=)?\\s*([^\\]\\s]*)\\s*\\]": function(match, attr, operator, value) { // attribute selectors
-    value = trim(value);
-    if (_MSIE) {
-      var getAttribute = "Element.getAttribute(e%1,'%2')";
-    } else {
-      getAttribute = "e%1.getAttribute('%2')";
-    }
-    getAttribute = format(getAttribute, _index, attr);
-    var replacement = Selector.operators[operator || ""];
-    if (instanceOf(replacement, RegExp)) {
-      _reg.push(new RegExp(format(replacement.source, rescape(_parser.unescape(value)))));
-      replacement = "reg[%2].test(%1)";
-      value = _reg.length - 1;
-    }
-    return "if(" + format(replacement, getAttribute, value) + "){";
-  }
-};
-
-(function(_no_shrink_) {
-  // IE confuses the name attribute with id for form elements,
-  // use document.all to retrieve elements with name/id instead
-  var _byId = detect("MSIE[5-7]") ? 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;
-  } : function(document, id) {
-    return document.getElementById(id);
-  };
-
-  // register a node and index its children
-  var _indexed = 1;
-  function _register(element) {
-    if (element.rows) {
-      element.b2_length = element.rows.length;
-      element.b2_lookup = "rowIndex";
-    } else if (element.cells) {
-      element.b2_length = element.cells.length;
-      element.b2_lookup = "cellIndex";
-    } else if (element.b2_indexed != _indexed) {
-      var index = 0;
-      var child = element.firstChild;
-      while (child) {
-        if (child.nodeType == 1 && child.nodeName != "!") {
-          child.b2_index = ++index;
-        }
-        child = child.nextSibling;
-      }
-      element.b2_length = index;
-      element.b2_lookup = "b2_index";
-    }
-    element.b2_indexed = _indexed;
-    return element;
-  };
-
-  Selector.parse = function(selector, simple) {
-    var cache = simple ? _simple : _cache;
-    if (!cache[selector]) {
-      if (!_parser.exec) _parser = new CSSParser(_parser);
-      _reg = []; // store for RegExp objects
-      _list = [];
-      var fn = "";
-      var selectors = _parser.escape(selector, simple).split(",");
-      for (_group = 0; _group < selectors.length; _group++) {
-        _wild = _index = _list[_group] = 0; // reset
-        _duplicate = selectors.length > 1 ? 2 : 0; // reset
-        var block = _parser.exec(selectors[_group]) || "throw;";
-        if (_wild && _MSIE) { // IE's pesky comment nodes
-          block += format("if(e%1.tagName!='!'){", _index);
-        }
-        // check for duplicates before storing results
-        var store = (_duplicate > 1) ? _TEST : "";
-        block += format(store + _STORE, _index, "%2");
-        // add closing braces
-        block += Array(match(block, /\{/g).length + 1).join("}");
-        fn += block;
-      }
-      fn = _parser.unescape(fn);
-      if (selectors.length > 1) fn += "r.unsorted=1;";
-      var args = "";
-      var state = [];
-      var total = sum(_list);
-      for (var i = 1; i <= total; i++) {
-        args += ",a" + i;
-        //state.push("i" + i);
-        state.push("i" + i + "?(i" + i + "-1):0");
-      }
-      if (total) {
-        var complete = [], k = 0;
-        for (var i = 0; i < _group; i++) {
-          k += _list[i];
-          if (_list[i]) complete.push(format("n%1&&i%1==n%1.length", k));
-        }
-      }
-      fn += "_query.state=[%2];_query.complete=%3;return s==1?null:r}";
-      eval(format(_FN + fn, args, state.join(","), total ? complete.join("&&") : true, _reg));
-      cache[selector] = _query;
-    }
-    return cache[selector];
-  };
-})();
-
-// =========================================================================
-// DOM/selectors-api/StaticNodeList.js
-// =========================================================================
-
-// http://www.w3.org/TR/selectors-api/#staticnodelist
-
-// A wrapper for an array of elements or an XPathResult.
-// The item() method provides access to elements.
-// Implements Enumerable so you can forEach() to your heart's content... :-)
-
-var StaticNodeList = Base.extend({
-  constructor: function(nodes) {
-    nodes = nodes || [];
-    this.length = nodes.length;
-    this.item = function(index) {
-      if (index < 0) index += this.length; // starting from the end
-      return nodes[index];
-    };
-    if (nodes.unsorted) nodes.sort(_SORTER);
-  },
-  
-  length: 0,
-  
-  forEach: function(block, context) {
-    for (var i = 0; i < this.length; i++) {
-      block.call(context, this.item(i), i, this);
-    }
-  },
-
-  item: Undefined, // defined in the constructor function
-
-  not: function(test, context) {
-    return this.filter(not(test), context);
-  },
-
-  slice: function(start, end) {
-    return new StaticNodeList(this.map(I).slice(start, end));
-  },
-
-  "@(XPathResult)": {
-    constructor: function(nodes) {
-      if (nodes && nodes.snapshotItem) {
-        this.length = nodes.snapshotLength;
-        this.item = function(index) {
-          if (index < 0) index += this.length; // starting from the end
-          return nodes.snapshotItem(index);
-        };
-      } else this.base(nodes);
-    }
-  }
-});
-
-StaticNodeList.implement(Enumerable);
-
-var _matchesSelector = function(test, context) {
-  if (typeof test != "function") {
-    test = bind("test", new Selector(test));
-  }
-  return this.base(test, context);
-};
-
-StaticNodeList.implement({
-  every: _matchesSelector,
-  filter: _matchesSelector,
-  not: _matchesSelector,
-  some: _matchesSelector
-});
-
-StaticNodeList.implement({
-  filter: function(test, context) {
-    return new StaticNodeList(this.base(test, context));
-  }
-});
-
-var _SORTER = _INDEXED ? function(node1, node2) {
-  return node1.sourceIndex - node2.sourceIndex;
-} : function(node1, node2) {
-  return (Node.compareDocumentPosition(node1, node2) & 2) - 1;
-};
-
-// =========================================================================
-// DOM/selectors-api/implementations.js
-// =========================================================================
-
-Document.implement(DocumentSelector);
-Element.implement(ElementSelector);
-
-// =========================================================================
-// DOM/html/HTMLDocument.js
-// =========================================================================
-
-// http://www.whatwg.org/specs/web-apps/current-work/#htmldocument
-
-var HTMLDocument = Document.extend(null, {
-  bind: function(document) {
-    DocumentState.createState(document);
-    return this.base(document);
-  }
-});
-
-// =========================================================================
-// DOM/html/HTMLElement.js
-// =========================================================================
-
-var HTMLElement = Element.extend(null, {
-  bindings: {},
-  tags: "*",
-  
-  bind: function(element) {
-    if (!element.classList) {
-      element.classList = new _ElementClassList(element);
-    }
-    if (!element.ownerDocument) {
-      element.ownerDocument = Traversal.getOwnerDocument(element);
-    }
-    return this.base(element);
-  },
-
-  extend: function() {
-    // Maintain HTML element bindings.
-    // This allows us to map specific interfaces to elements by reference
-    // to tag name.
-    var binding = base(this, arguments);
-    forEach.csv(binding.tags, function(tagName) {
-      HTMLElement.bindings[tagName] = binding;
-    });
-    return binding;
-  }
-});
-
-HTMLElement.extend(null, {
-  tags: "APPLET,EMBED",  
-  bind: I // Binding not allowed for these elements.
-});
-
-// =========================================================================
-// DOM/html/ClassList.js
-// =========================================================================
-
-// http://www.whatwg.org/specs/web-apps/current-work/#domtokenlist0
-
-// I'm not supporting length/index(). What's the point?
-
-var ClassList = Module.extend({
-  add: function(element, token) {
-    if (!this.has(element, token)) {
-      element.className += (element.className ? " " : "") + token;
-    }
-  },
-
-  has: function(element, token) {
-    var regexp = new RegExp("(^|\\s)" + token + "(\\s|$)");
-    return regexp.test(element.className);
-  },
-