function getElemList(el){if(isElement(el))return[el];else if(isString(el))return getElemList(el.split(/\s+/g));else if(isList(el)){var r=map(el,getElem);return filter(r,isElement).length==r.length?r:null;}else return null;};function filterElementNodes(nodeList,tagName){return filter(nodeList,function(n){return n.nodeType==1&&n.nodeName!='!'&&(undef(tagName)||tagName=='*'||n.nodeName.toUpperCase()==tagName.toUpperCase())})};function getAll(tagName,parent){parent=isdef(parent)?getElem(parent):document;if(undef(tagName))tagName='*';var r=parent.getElementsByTagName(tagName);return r.length||tagName!='*'?map(r):reduce(filterElementNodes(parent.childNodes),[],function(l,c){return l.merge([c],getAll(tagName,c))})};document.getElementsByClassName=function(className,tagName,parentNode){var noClassTags=list('#comment,BASE,BASEFONT,HEAD,HTML,META,PARAM,SCRIPT,STYLE,TITLE');return filter(getAll(tagName,parentNode),function(elem){return !noClassTags.include(elem.nodeName)&&hasClass(elem,className)});};function hasClass(elem,className){return getElem(elem).className.split(' ').count(className);};function remClass(elem,className,all){elem=getElem(elem);elem.className=elem.className.split(' ').remove(className,all).join(' ');};function addClass(elem,className,allowDuplicates){elem=getElem(elem);if(!allowDuplicates&&elem.className.split(' ').contains(className))return;elem.className+=(elem.className.length?' ':'')+className;};function swapClass(e,c){if(hasClass(e,c))remClass(e,c);else addClass(e,c);return !!hasClass(e,c);};function condClass(e,c,cond){(cond?addClass:remClass)(e,c)};function insertBefore(newChild,refChild){return refChild.parentNode.insertBefore(newChild,refChild);};function insertAfter(newChild,refChild){if(refChild.nextSibling)insertBefore(newChild,refChild.nextSibling);else refChild.parentNode.appendChild(newChild);return newChild;};var ALLOW_LEGACY_EVENTS=true;function getEventModel(){var d=document;return d.addEventListener?'DOM':d.attachEvent?'IE':'legacy';};function IE_Event(currentTarget){this.currentTarget=currentTarget;this.preventDefault=function(){window.event.returnValue=false;};this.stopPropagation=function(){window.event.cancelBubble=true;};this.target=window.event.srcElement;var self=this;list('altKey,ctrlKey,shiftKey,clientX,clientY').map(function(p){self[p]=event[p]});return this;};function Legacy_Event(currentTarget){this.currentTarget=currentTarget;return this;};function addEvent(els,ev,fn,capture){if(!ALLOW_LEGACY_EVENTS&&getEventModel()=='legacy')return false;if(undef(capture))capture=true;function DOM_addEvent(el,ev,fn,capture){el.addEventListener(ev,fn,capture);};function legacy_addEvent(el,ev,fn){var evn='on'+ev;if(!el[evn]||undef(el[evn].handlers)){el[evn]=function(){map(el[evn].handlers,function(h){h(new(el.attachEvent?IE_Event:Legacy_Event)(el));});};el[evn].handlers=[];}el[evn].handlers.push(fn);};var addEventFn=getEventModel()=='DOM'?DOM_addEvent:legacy_addEvent;map(getElemList(els),function(el){addEventFn(el,ev,fn,capture)});};function remEvent(els,ev,fn,capture){if(!ALLOW_LEGACY_EVENTS&&getEventModel()=='legacy')return false;if(undef(capture))capture=true;map(getElemList(els),function(el){if(getEventModel()=='DOM')el.removeEventListener(ev,fn,capture);else el['on'+ev].handlers.remove(fn);});};function addEventDict(els,evDict,capture){for(ev in evDict)addEvent(els,ev,evDict[ev],capture);};function addLoadEvent(fn){var w=getEventModel()=="DOM"&&!window.addEventListener?document:window;return addEvent(w,'load',fn,true)};function getAllChildren(e){return e.all?e.all:e.getElementsByTagName('*');};document.getElementsBySelector=function(selector){if(!document.getElementsByTagName){return new Array();};var tokens=selector.split(' ');var currentContext=new Array(document);for(var i=0;i<tokens.length;i++){token=tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;if(token.indexOf('#')>-1){var bits=token.split('#');var tagName=bits[0];var id=bits[1];var element=document.getElementById(id);if(tagName&&element.nodeName.toLowerCase()!=tagName){return new Array();}currentContext=new Array(element);continue;};if(token.indexOf('.')>-1){var bits=token.split('.');var tagName=bits[0];var className=bits[1];if(!tagName){tagName='*';};var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements;if(tagName=='*'){elements=getAllChildren(currentContext[h]);}else{elements=currentContext[h].getElementsByTagName(tagName);};for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}currentContext=new Array;var currentContextIndex=0;for(var k=0;k<found.length;k++){if(found[k].className&&found[k].className.match(new RegExp('\\b'+className+'\\b'))){currentContext[currentContextIndex++]=found[k];}}continue;};if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)){var tagName=RegExp.$1;var attrName=RegExp.$2;var attrOperator=RegExp.$3;var attrValue=RegExp.$4;if(!tagName){tagName='*';};var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements;if(tagName=='*'){elements=getAllChildren(currentContext[h]);}else{elements=currentContext[h].getElementsByTagName(tagName);};for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}currentContext=new Array;var currentContextIndex=0;var checkFunction;switch(attrOperator){case '=':checkFunction=function(e){return(e.getAttribute(attrName)==attrValue);};break;case '~':checkFunction=function(e){return(e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b')));};break;case '|':checkFunction=function(e){return(e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?')));};break;case '^':checkFunction=function(e){return(e.getAttribute(attrName).indexOf(attrValue)==0);};break;case '$':checkFunction=function(e){return(e.getAttribute(attrName).lastIndexOf(attrValue)==e.getAttribute(attrName).length-attrValue.length);};break;case '*':checkFunction=function(e){return(e.getAttribute(attrName).indexOf(attrValue)>-1);};break;default:checkFunction=function(e){return e.getAttribute(attrName);};}currentContext=new Array;var currentContextIndex=0;for(var k=0;k<found.length;k++){if(checkFunction(found[k])){currentContext[currentContextIndex++]=found[k];}}continue;};tagName=token;var found=new Array;var foundCount=0;for(var h=0;h<currentContext.length;h++){var elements=currentContext[h].getElementsByTagName(tagName);for(var j=0;j<elements.length;j++){found[foundCount++]=elements[j];}}currentContext=found;};return currentContext;};var Element={toggle:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display=(element.style.display=='none'?'':'none');}},hide:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='none';}},show:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='';}},remove:function(element){element=$(element);element.parentNode.removeChild(element);},getHeight:function(element){element=$(element);return element.offsetHeight;}};var Toggle=new Object();Toggle.display=Element.toggle;Abstract.Insertion=function(adjacency){this.adjacency=adjacency;};Abstract.Insertion.prototype={initialize:function(element,content){this.element=$(element);this.content=content;if(this.adjacency&&this.element.insertAdjacentHTML){this.element.insertAdjacentHTML(this.adjacency,this.content);}else{this.range=this.element.ownerDocument.createRange();if(this.initializeRange)this.initializeRange();this.fragment=this.range.createContextualFragment(this.content);this.insertContent();}}};var Insertion=new Object();Insertion.Before=Class.create();Insertion.Before.prototype=(new Abstract.Insertion('beforeBegin')).extend({initializeRange:function(){this.range.setStartBefore(this.element);},insertContent:function(){this.element.parentNode.insertBefore(this.fragment,this.element);}});Insertion.Top=Class.create();Insertion.Top.prototype=(new Abstract.Insertion('afterBegin')).extend({initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(true);},insertContent:function(){this.element.insertBefore(this.fragment,this.element.firstChild);}});Insertion.Bottom=Class.create();Insertion.Bottom.prototype=(new Abstract.Insertion('beforeEnd')).extend({initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(this.element);},insertContent:function(){this.element.appendChild(this.fragment);}});Insertion.After=Class.create();Insertion.After.prototype=(new Abstract.Insertion('afterEnd')).extend({initializeRange:function(){this.range.setStartAfter(this.element);},insertContent:function(){this.element.parentNode.insertBefore(this.fragment,this.element.nextSibling);}});


