/* Merged Plone Javascript file
 * This file is dynamically assembled from separate parts.
 * Some of these parts have 3rd party licenses or copyright information attached
 * Such information is valid for that section,
 * not for the entire composite file
 * originating files are separated by - filename.js -
 */

/* - sarissa.js - */
// http://www.duwe-3d.eu/portal_javascripts/sarissa.js?original=1
function Sarissa(){};Sarissa.VERSION="${project.version}";Sarissa.PARSED_OK="Document contains no parsing errors";Sarissa.PARSED_EMPTY="Document is empty";Sarissa.PARSED_UNKNOWN_ERROR="Not well-formed or other error";Sarissa.IS_ENABLED_TRANSFORM_NODE=false;var _sarissa_iNsCounter=0;var _SARISSA_IEPREFIX4XSLPARAM="";var _SARISSA_HAS_DOM_IMPLEMENTATION=document.implementation&&true;var _SARISSA_HAS_DOM_CREATE_DOCUMENT=_SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.createDocument;var _SARISSA_HAS_DOM_FEATURE=_SARISSA_HAS_DOM_IMPLEMENTATION&&document.implementation.hasFeature;var _SARISSA_IS_MOZ=_SARISSA_HAS_DOM_CREATE_DOCUMENT&&_SARISSA_HAS_DOM_FEATURE;var _SARISSA_IS_SAFARI=navigator.userAgent.toLowerCase().indexOf("safari")!=-1||navigator.userAgent.toLowerCase().indexOf("konqueror")!=-1;var _SARISSA_IS_SAFARI_OLD=_SARISSA_IS_SAFARI&&parseInt((navigator.userAgent.match(/AppleWebKit\/(\d+)/)||{})[1])<420;var _SARISSA_IS_IE=document.all&&window.ActiveXObject&&navigator.userAgent.toLowerCase().indexOf("msie")>-1&&navigator.userAgent.toLowerCase().indexOf("opera")==-1;var _SARISSA_IS_OPERA=navigator.userAgent.toLowerCase().indexOf("opera")!=-1;if(!window.Node||!Node.ELEMENT_NODE){Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12}};if(_SARISSA_IS_SAFARI_OLD){HTMLHtmlElement=document.createElement("html").constructor;Node=HTMLElement={};HTMLElement.prototype=HTMLHtmlElement.__proto__.__proto__;HTMLDocument=Document=document.constructor;var x=new DOMParser();XMLDocument=x.constructor;Element=x.parseFromString("<Single />","text/xml").documentElement.constructor;x=null}
if(typeof XMLDocument=="undefined"&&typeof Document!="undefined"){XMLDocument=Document}
if(_SARISSA_IS_IE){_SARISSA_IEPREFIX4XSLPARAM="xsl:";var _SARISSA_DOM_PROGID="";var _SARISSA_XMLHTTP_PROGID="";var _SARISSA_DOM_XMLWRITER="";Sarissa.pickRecentProgID=function(idList){var bFound=false,e;for(var i=0;i<idList.length&&!bFound;i++){try{var oDoc=new ActiveXObject(idList[i]);var o2Store=idList[i];bFound=true}catch(objException){e=objException}};if(!bFound){throw "Could not retrieve a valid progID of Class: "+idList[idList.length-1]+". (original exception: "+e+")"};idList=null;return o2Store};_SARISSA_DOM_PROGID=null;_SARISSA_THREADEDDOM_PROGID=null;_SARISSA_XSLTEMPLATE_PROGID=null;_SARISSA_XMLHTTP_PROGID=null;if(!window.XMLHttpRequest){XMLHttpRequest=function(){if(!_SARISSA_XMLHTTP_PROGID){_SARISSA_XMLHTTP_PROGID=Sarissa.pickRecentProgID(["Msxml2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"])};return new ActiveXObject(_SARISSA_XMLHTTP_PROGID)}};Sarissa.getDomDocument=function(sUri,sName){if(!_SARISSA_DOM_PROGID){_SARISSA_DOM_PROGID=Sarissa.pickRecentProgID(["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.3.0","MSXML2.DOMDocument","MSXML.DOMDocument","Microsoft.XMLDOM"])};var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(sName){var prefix="";if(sUri){if(sName.indexOf(":")>1){prefix=sName.substring(0,sName.indexOf(":"));sName=sName.substring(sName.indexOf(":")+1)}else{prefix="a"+(_sarissa_iNsCounter++)}};if(sUri){oDoc.loadXML('<'+prefix+':'+sName+" xmlns:"+prefix+"=\""+sUri+"\""+" />")} else{oDoc.loadXML('<'+sName+" />")}};return oDoc};Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if(oDoc&&oDoc.parseError&&oDoc.parseError.errorCode&&oDoc.parseError.errorCode!=0){parseErrorText="XML Parsing Error: "+oDoc.parseError.reason+"\nLocation: "+oDoc.parseError.url+"\nLine Number "+oDoc.parseError.line+", Column "+oDoc.parseError.linepos+":\n"+oDoc.parseError.srcText+"\n";for(var i=0;i<oDoc.parseError.linepos;i++){parseErrorText+="-"};parseErrorText+="^\n"}
else if(oDoc.documentElement==null){parseErrorText=Sarissa.PARSED_EMPTY};return parseErrorText};Sarissa.setXpathNamespaces=function(oDoc,sNsSet){oDoc.setProperty("SelectionLanguage","XPath");oDoc.setProperty("SelectionNamespaces",sNsSet)};XSLTProcessor=function(){if(!_SARISSA_XSLTEMPLATE_PROGID){_SARISSA_XSLTEMPLATE_PROGID=Sarissa.pickRecentProgID(["Msxml2.XSLTemplate.6.0","MSXML2.XSLTemplate.3.0"])};this.template=new ActiveXObject(_SARISSA_XSLTEMPLATE_PROGID);this.processor=null};XSLTProcessor.prototype.importStylesheet=function(xslDoc){if(!_SARISSA_THREADEDDOM_PROGID){_SARISSA_THREADEDDOM_PROGID=Sarissa.pickRecentProgID(["MSXML2.FreeThreadedDOMDocument.6.0","MSXML2.FreeThreadedDOMDocument.3.0"])};xslDoc.setProperty("SelectionLanguage","XPath");xslDoc.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var converted=new ActiveXObject(_SARISSA_THREADEDDOM_PROGID);try{converted.resolveExternals=true;converted.setProperty("AllowDocumentFunction",true)}
catch(e){};if(xslDoc.url&&xslDoc.selectSingleNode("//xsl:*[local-name() = 'import' or local-name() = 'include']")!=null){converted.async=false;converted.load(xslDoc.url)} else{converted.loadXML(xslDoc.xml)};converted.setProperty("SelectionNamespaces","xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");var output=converted.selectSingleNode("//xsl:output");this.outputMethod=output?output.getAttribute("method"):"html";this.template.stylesheet=converted;this.processor=this.template.createProcessor();this.paramsSet=[]};XSLTProcessor.prototype.transformToDocument=function(sourceDoc){if(_SARISSA_THREADEDDOM_PROGID){this.processor.input=sourceDoc;var outDoc=new ActiveXObject(_SARISSA_DOM_PROGID);this.processor.output=outDoc;this.processor.transform();return outDoc}
else{if(!_SARISSA_DOM_XMLWRITER){_SARISSA_DOM_XMLWRITER=Sarissa.pickRecentProgID(["Msxml2.MXXMLWriter.6.0","Msxml2.MXXMLWriter.3.0","MSXML2.MXXMLWriter","MSXML.MXXMLWriter","Microsoft.XMLDOM"])};this.processor.input=sourceDoc;var outDoc=new ActiveXObject(_SARISSA_DOM_XMLWRITER);this.processor.output=outDoc;this.processor.transform();var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);oDoc.loadXML(outDoc.output+"");return oDoc}};XSLTProcessor.prototype.transformToFragment=function(sourceDoc,ownerDoc){this.processor.input=sourceDoc;this.processor.transform();var s=this.processor.output;var f=ownerDoc.createDocumentFragment();if(this.outputMethod=='text'){f.appendChild(ownerDoc.createTextNode(s))} else if(ownerDoc.body&&ownerDoc.body.innerHTML){var container=ownerDoc.createElement('div');container.innerHTML=s;while(container.hasChildNodes()){f.appendChild(container.firstChild)}}
else{var oDoc=new ActiveXObject(_SARISSA_DOM_PROGID);if(s.substring(0,5)=='<?xml'){s=s.substring(s.indexOf('?>')+2)}
var xml=''.concat('<my>',s,'</my>');oDoc.loadXML(xml);var container=oDoc.documentElement;while(container.hasChildNodes()){f.appendChild(container.firstChild)}}
return f};XSLTProcessor.prototype.setParameter=function(nsURI,name,value){value=value?value:"";if(nsURI){this.processor.addParameter(name,value,nsURI)}else{this.processor.addParameter(name,value)};nsURI=""+(nsURI||"");if(!this.paramsSet[nsURI]){this.paramsSet[nsURI]=new Array()};this.paramsSet[nsURI][name]=value};XSLTProcessor.prototype.getParameter=function(nsURI,name){nsURI=""+(nsURI||"");if(this.paramsSet[nsURI]&&this.paramsSet[nsURI][name]){return this.paramsSet[nsURI][name]}else{return null}};XSLTProcessor.prototype.clearParameters=function(){for(var nsURI in this.paramsSet){for(var name in this.paramsSet[nsURI]){if(nsURI!=""){this.processor.addParameter(name,"",nsURI)}else{this.processor.addParameter(name,"")}}};this.paramsSet=new Array()}}else{if(_SARISSA_HAS_DOM_CREATE_DOCUMENT){Sarissa.__handleLoad__=function(oDoc){Sarissa.__setReadyState__(oDoc,4)};_sarissa_XMLDocument_onload=function(){Sarissa.__handleLoad__(this)};Sarissa.__setReadyState__=function(oDoc,iReadyState){oDoc.readyState=iReadyState;oDoc.readystate=iReadyState;if(oDoc.onreadystatechange!=null&&typeof oDoc.onreadystatechange=="function"){oDoc.onreadystatechange()}};Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(!oDoc.onreadystatechange){oDoc.onreadystatechange=null};if(!oDoc.readyState){oDoc.readyState=0};oDoc.addEventListener("load",_sarissa_XMLDocument_onload,false);return oDoc};if(window.XMLDocument){}
else if(_SARISSA_HAS_DOM_FEATURE&&window.Document&&!Document.prototype.load&&document.implementation.hasFeature('LS','3.0')){Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);return oDoc}}
else{Sarissa.getDomDocument=function(sUri,sName){var oDoc=document.implementation.createDocument(sUri?sUri:null,sName?sName:null,null);if(oDoc&&(sUri||sName)&&!oDoc.documentElement){oDoc.appendChild(oDoc.createElementNS(sUri,sName))};return oDoc}}}};if(!window.DOMParser){if(_SARISSA_IS_SAFARI){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET","data:text/xml;charset=utf-8,"+encodeURIComponent(sXml),false);xmlhttp.send(null);return xmlhttp.responseXML}}else if(Sarissa.getDomDocument&&Sarissa.getDomDocument()&&Sarissa.getDomDocument(null,"bar").xml){DOMParser=function(){};DOMParser.prototype.parseFromString=function(sXml,contentType){var doc=Sarissa.getDomDocument();doc.loadXML(sXml);return doc}}};if((typeof(document.importNode)=="undefined")&&_SARISSA_IS_IE){try{document.importNode=function(oNode,bChildren){var tmp;if(oNode.nodeName=='#text'){return document.createTextNode(oNode.data)}
else{if(oNode.nodeName=="tbody"||oNode.nodeName=="tr"){tmp=document.createElement("table")}
else if(oNode.nodeName=="td"){tmp=document.createElement("tr")}
else if(oNode.nodeName=="option"){tmp=document.createElement("select")}
else{tmp=document.createElement("div")};if(bChildren){tmp.innerHTML=oNode.xml?oNode.xml:oNode.outerHTML}else{tmp.innerHTML=oNode.xml?oNode.cloneNode(false).xml:oNode.cloneNode(false).outerHTML};return tmp.getElementsByTagName("*")[0]}}}catch(e){}};if(!Sarissa.getParseErrorText){Sarissa.getParseErrorText=function(oDoc){var parseErrorText=Sarissa.PARSED_OK;if(!oDoc.documentElement){parseErrorText=Sarissa.PARSED_EMPTY} else if(oDoc.documentElement.tagName=="parsererror"){parseErrorText=oDoc.documentElement.firstChild.data;parseErrorText+="\n"+oDoc.documentElement.firstChild.nextSibling.firstChild.data} else if(oDoc.getElementsByTagName("parsererror").length>0){var parsererror=oDoc.getElementsByTagName("parsererror")[0];parseErrorText=Sarissa.getText(parsererror,true)+"\n"} else if(oDoc.parseError&&oDoc.parseError.errorCode!=0){parseErrorText=Sarissa.PARSED_UNKNOWN_ERROR};return parseErrorText}};Sarissa.getText=function(oNode,deep){var s="";var nodes=oNode.childNodes;for(var i=0;i<nodes.length;i++){var node=nodes[i];var nodeType=node.nodeType;if(nodeType==Node.TEXT_NODE||nodeType==Node.CDATA_SECTION_NODE){s+=node.data} else if(deep==true&&(nodeType==Node.ELEMENT_NODE||nodeType==Node.DOCUMENT_NODE||nodeType==Node.DOCUMENT_FRAGMENT_NODE)){s+=Sarissa.getText(node,true)}};return s};if(!window.XMLSerializer&&Sarissa.getDomDocument&&Sarissa.getDomDocument("","foo",null).xml){XMLSerializer=function(){};XMLSerializer.prototype.serializeToString=function(oNode){return oNode.xml}};Sarissa.stripTags=function(s){return s.replace(/<[^>]+>/g,"")};Sarissa.clearChildNodes=function(oNode){while(oNode.firstChild){oNode.removeChild(oNode.firstChild)}};Sarissa.copyChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if(_SARISSA_IS_SAFARI&&nodeTo.nodeType==Node.DOCUMENT_NODE){nodeTo=nodeTo.documentElement}
if((!nodeFrom)||(!nodeTo)){throw "Both source and destination nodes must be provided"};if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo)};var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;var nodes=nodeFrom.childNodes;if(typeof(ownerDoc.importNode)!="undefined"){for(var i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true))}} else{for(var i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true))}}};Sarissa.moveChildNodes=function(nodeFrom,nodeTo,bPreserveExisting){if((!nodeFrom)||(!nodeTo)){throw "Both source and destination nodes must be provided"};if(!bPreserveExisting){Sarissa.clearChildNodes(nodeTo)};var nodes=nodeFrom.childNodes;if(nodeFrom.ownerDocument==nodeTo.ownerDocument){while(nodeFrom.firstChild){nodeTo.appendChild(nodeFrom.firstChild)}} else{var ownerDoc=nodeTo.nodeType==Node.DOCUMENT_NODE?nodeTo:nodeTo.ownerDocument;if(typeof(ownerDoc.importNode)!="undefined"){for(var i=0;i<nodes.length;i++){nodeTo.appendChild(ownerDoc.importNode(nodes[i],true))}}else{for(var i=0;i<nodes.length;i++){nodeTo.appendChild(nodes[i].cloneNode(true))}};Sarissa.clearChildNodes(nodeFrom)}};Sarissa.xmlize=function(anyObject,objectName,indentSpace){indentSpace=indentSpace?indentSpace:'';var s=indentSpace+'<'+objectName+'>';var isLeaf=false;if(!(anyObject instanceof Object)||anyObject instanceof Number||anyObject instanceof String||anyObject instanceof Boolean||anyObject instanceof Date){s+=Sarissa.escape(""+anyObject);isLeaf=true}else{s+="\n";var isArrayItem=anyObject instanceof Array;for(var name in anyObject){s+=Sarissa.xmlize(anyObject[name],(isArrayItem?"array-item key=\""+name+"\"":name),indentSpace+"   ")};s+=indentSpace};return(s+=(objectName.indexOf(' ')!=-1?"</array-item>\n":"</"+objectName+">\n"))};Sarissa.escape=function(sXml){return sXml.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g, "&quot;").replace(/'/g,"&apos;")};Sarissa.unescape=function(sXml){return sXml.replace(/&apos;/g,"'").replace(/&quot;/g,"\"").replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&")};

/* - ++resource++kukit.js - */
kukit=new function(){var ku=this;ku.isDevelMode=false;var _isKineticStylesheet=function(node){var rel=node.rel;if(rel=="kinetic-stylesheet"){return true}
if(rel=="kukit"||rel=="k-stylesheet"){return true}
return false};var _RuleSheetLink=function(href,res_type){this.href=href;this.res_type=res_type};ku.Engine=function(){this.initialize=function(){this.documentRules=new kukit.rd.MethodTable();this._ruleProcessorClasses={};this._ruleProcessorClasses.kss=kukit.kssp.KssRuleProcessor;this._ruleProcessors=[];this.bindScheduler=new kukit.ut.SerializeScheduler();this.stateVariables={};this.requestManager=new kukit.rm.RequestManager(4);this.binderInfoRegistry=new kukit.er.BinderInfoRegistry();this.loadScheduler=new kukit.rd.LoadActions();this.initializedOnDOMLoad=false;this.setupEventsQueue=[];this.setupEventsInProgress=false;this.baseUrl=this.calculateBase()};this.calculateBase=function(){var base='';try{var _dummy=document;_dummy=window} catch(e){return base}
base=kukit.ut.calculateBase(document,window.location.href);return base};this.getRuleSheetLinks=function(){var nodes=document.getElementsByTagName("link");var results=[];for(var i=0;i<nodes.length;i++){if(_isKineticStylesheet(nodes[i])){var res_type=null;if((nodes[i].type=='text/css')||(nodes[i].type=='text/kss')){res_type='kss'}
var newRuleLink=new _RuleSheetLink(nodes[i].href,res_type);results[results.length]=newRuleLink}}
return results};this.createRuleProcessor=function(rulelink){var _RuleProcessorClass=this._ruleProcessorClasses[rulelink.res_type];if(_RuleProcessorClass){var ruleprocessor=new _RuleProcessorClass(rulelink.href);this._ruleProcessors[this._ruleProcessors.length]=ruleprocessor;return ruleprocessor}
return null};this.getRules=function(){var rules=[];var ruleProcessors=this._ruleProcessors;for(var j=0;j<ruleProcessors.length;j++){var ruleProcessor=ruleProcessors[j];for(var i=0;i<ruleProcessor.rules.length;i++){rules.push(ruleProcessor.rules[i])}}
return rules};this.getRuleProcessors=function(){return this._ruleProcessors};this.setupEvents=function(inNodes){if(this.setupEventsInProgress){this.setupEventsQueue=this.setupEventsQueue.concat(inNodes)} else{this.doSetupEvents(inNodes)}};this.beginSetupEventsCollection=function(){this.setupEventsInProgress=true};this.finishSetupEventsCollection=function(){this.setupEventsInProgress=false;var setupEventsQueue=this.setupEventsQueue;this.setupEventsQueue=[];this.doSetupEvents(setupEventsQueue)};this.doSetupEvents=function(inNodes){var self=this;var deferredEventsSetup=function(){self._setupEvents(inNodes)};var found=false;if(!inNodes){found=true} else{for(var i=0;i<inNodes.length;i++){var node=inNodes[i];if(node.nodeType==1){if(!found){found=true}}}}
if(found){var remark='';this.bindScheduler.addPre(deferredEventsSetup,remark)}};this._setupEvents=function(inNodes){var phase;if(typeof(inNodes)=='undefined'){phase=1} else{phase=2}
this.binderInfoRegistry.startBindingPhase();var rules=this.getRules();var ruletable=new kukit.rd.RuleTable(this.loadScheduler);for(var y=0;y<rules.length;y++){rules[y].mergeForSelectedNodes(ruletable,phase,inNodes)}
if(phase==1){this.documentRules.bindall(phase)}
ruletable.bindall(phase);this.binderInfoRegistry.processBindingEvents()};this.initializeRules=function(){if(window.kukitRulesInitializing||window.kukitRulesInitialized){return}
kukit.engine=this;window.kukitRulesInitializing=true;var rulelinks=this.getRuleSheetLinks();for(var i=0;i<rulelinks.length;i++){var rulelink=rulelinks[i];var ruleprocessor=this.createRuleProcessor(rulelink);if(ruleprocessor){ruleprocessor.load();ruleprocessor.parse()}}
this.setupEvents();window.kukitRulesInitializing=false;window.kukitRulesInitialized=true};this.initialize.apply(this,arguments)};ku.initializeRules=function(){kukit.bootstrap()};ku.bootstrap=function(){var engine=new kukit.Engine();engine.initializeRules()};ku.bootstrapFromDOMLoad=function(){var engine=new kukit.Engine();engine.initializedOnDOMLoad=true;engine.initializeRules()}}();if(typeof(kukit)=='undefined'){var kukit={}}
kukit.E='Unknown message (kss optimized for production mode)';try{kukit.HAVE_SAFARI=navigator.vendor&&navigator.vendor.indexOf('Apple')!=-1;kukit.HAVE_IE=eval("_SARISSA_IS_IE")} catch(e){}
kukit.readCookie=function(name){var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)==' ') c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0) return c.substring(nameEQ.length,c.length)}
return null};kukit._null=function(){};kukit._COOKIE_LOGLEVEL='__kss_loglevel';kukit._logger=new function(){this.updateLogLevel=function(){this._setupHandlers()};this._setupHandlers=function(){this.logDebug=kukit._null;this.log=kukit._null;this.logWarning=kukit._null;this.logError=kukit._null;this.logFatal=kukit._null}}();kukit.logDebug=function(message){kukit._logger.logDebug(message)};kukit.log=function(message){kukit._logger.log(message)};kukit.logWarning=function(message){kukit._logger.logWarning(message)};kukit.logError=function(message){kukit._logger.logError(message)};kukit.logFatal=function(message){kukit._logger.logFatal(message)};kukit.setLogLevel=function(level){};kukit._logger.updateLogLevel();kukit.ut=new function(){var ut=this;ut.FifoQueue=function(){this.initialize=function(){this.reset()};this.reset=function(){this.elements=new Array()};this.push=function(obj){this.elements.push(obj)};this.pop=function(){return this.elements.shift()};this.empty=function(){return!this.elements.length};this.size=function(){return this.elements.length};this.front=function(){return this.elements[0]};this.initialize.apply(this,arguments)};ut.SortedQueue=function(){this.initialize=function(comparefunc){if(comparefunc){this.comparefunc=comparefunc}
this.reset()};this.comparefunc=function(a,b){if(a<b){return-1} else if(a>b){return+1} else{return 0}};this.reset=function(){this.elements=new Array()};this.push=function(obj){var i=0;var length=this.elements.length;while(i<length&&this.comparefunc(this.elements[i],obj)==-1){i++}
this.elements.splice(i,0,obj)};this.pop=function(){return this.elements.shift()};this.popn=function(n){return this.elements.splice(0,n)};this.empty=function(){return!this.elements.length};this.size=function(){return this.elements.length};this.get=function(n){return this.elements[n]};this.front=function(){return this.elements[0]};this.initialize.apply(this,arguments)};ut.evalBool=function(value,errname){if(value=='true'||value=='True'||value=='1'){value=true} else if(value=='false'||value=='False'||value=='0'||value==''){value=false}
return value};ut.evalInt=function(value,errname){value=parseInt(value);return value};ut.evalList=function(value,errname){value=value.replace(/^ +/,'');value=value.replace(/ +$/,'');if(value==''){value=[]} else{value=value.split(/ *, */)}
return value};ut.TimerCounter=function(){this.initialize=function(delay,func,restart){this.delay=delay;this.func=func;if(typeof(restart)=='undefined'){restart=false}
this.restart=restart;this.timer=null};this.start=function(){if(this.timer){throw new Error(kukit.E)}
var self=this;var func=function(){self.timeout()};this.timer=setTimeout(func,this.delay)};this.timeout=function(){this.func();if(this.restart){this.timer=null;this.start()}};this.clear=function(){if(this.timer){window.clearTimeout(this.timer);this.timer=null}
this.restart=false};this.initialize.apply(this,arguments)};ut.Scheduler=function(){this.initialize=function(func){this.func=func;this.timer=null;this.nextWake=null};this.setNextWake=function(ts){if(this.nextWake){this.clear()}
if(!ts){return}
var now=(new Date()).valueOf();if(ts>now){this.nextWake=ts;var self=this;var func=function(){self.timeout()};this.timer=setTimeout(func,ts-now)} else{this.func()}};this.setNextWakeAtLeast=function(ts){if(!ts||!this.nextWake||ts<this.nextWake){this.setNextWake(ts)} else{var now=(new Date()).valueOf()}};this.timeout=function(){this.timer=null;this.nextWake=null;this.func()};this.clear=function(){if(this.nextWake){window.clearTimeout(this.timer);this.timer=null;this.nextWake=null}};this.initialize.apply(this,arguments)};ut.SerializeScheduler=function(){this.initialize=function(){this.items=[];this.lock=false};this.addPre=function(func,remark){this.items.push({func:func,remark:remark});this.execute()};this.addPost=function(func,remark){this.items.unshift({func:func,remark:remark});this.execute()};this.execute=function(){if(!this.lock){this.lock=true;while(true){var item=this.items.pop();if(!item){break}
try{item.func()} catch(e){this.lock=false;throw e}}
this.lock=false}};this.initialize.apply(this,arguments)};ut.registerEventListener=function(elem,event,func){if(elem.addEventListener){elem.addEventListener(event,func,false);return true} else if(elem.attachEvent){var result=elem.attachEvent("on"+event,func);return result}
return false};if(typeof(window)!='undefined'){ut.registerEventListener(window,"load",kukit.bootstrap)}
ut.DictCollector=function(){this.initialize=function(){this.result={}};this.add=function(key,value){this.result[key]=value};this.initialize.apply(this,arguments)};ut.TupleCollector=function(){this.initialize=function(){this.result=[]};this.add=function(key,value){this.result.push([key,value])};this.initialize.apply(this,arguments)};ut.calculateBase=function(documentInstance,pageLocation){var base='';var nodes=documentInstance.getElementsByTagName("link");if(nodes.length>0){for(var i=0;i<nodes.length;i++){var link=nodes[i];if(link.rel=='kss-base-url'){var base=link.href;if(!/\/$/.test(base)){base=base+'/'}}}}
if(!base){nodes=documentInstance.getElementsByTagName("base");if(nodes.length!=0){var base=nodes[0].href} else{var base=pageLocation}}
var pieces=base.split('/');pieces.pop();base=pieces.join('/')+'/';return base}}();kukit.err=new function(){var err=this;var ErrorAnnotation=function(){this.constructError=function(e,name,message,kw){this.kw=kw;if(!e){e=new Error(kukit.E)}
e.name=name;e.info=this;return e}};var setErrorInfo=function(e,name,message,kw){return new ErrorAnnotation().constructError(e,name,message,kw)};err.explicitError=function(errorcommand){var kw={'errorcommand':errorcommand};return setErrorInfo(null,'ExplicitError',kukit.E,kw)};err.responseParsingError=function(message){return setErrorInfo(null,'ResponseParsingError',message)};err.parsingError=function(message,cursor){var kw={};return setErrorInfo(null,'ParsingError',message,kw)}}();kukit.op=new function(){var op=this;op.Oper=function(){this.initialize=function(dict){this.node=null;this.parms={};this.eventRule=null;this.binder=null;this.orignode=null;this.action=null;this.browserevent=null;this.clone=function(dict,restricted){var newoper=new kukit.op.Oper(this);newoper.unrestrictedUpdate(dict,restricted);return newoper};this.update=function(dict){this.unrestrictedUpdate(dict,true)};this.unrestrictedUpdate=function(dict,restricted){if(typeof(dict)=='undefined'){return}
for(var key in dict){var value=dict[key];if(typeof(value)!='function'){this[key]=value}}};this.unrestrictedUpdate(dict)};this.clone=function(dict,restricted){var newoper=new kukit.op.Oper(this);newoper.unrestrictedUpdate(dict,restricted);return newoper};this.update=function(dict){this.unrestrictedUpdate(dict,true)};this.unrestrictedUpdate=function(dict,restricted){if(typeof(dict)=='undefined'){return}
for(var key in dict){var value=dict[key];if(typeof(value)!='function'){this[key]=value}}};this.logDebug=function(){};this.executeClientAction=function(name){var nodes=null;for(key in this.kssParms){switch(key){case 'kssSelector':{nodes=this.kssParms[key]} break;default:{throw new Error(kukit.E)} break}}
var executeActions=kukit.actionsGlobalRegistry.get(name);if(nodes!=null){for(var i=0;i<nodes.length;i++){this.node=nodes[i];executeActions(this)}} else{executeActions(this)}};this.executeDefaultAction=function(name,optional){var namespace=this.binder.__eventNamespace__;var kssevent=kukit.eventsGlobalRegistry.get(namespace,name);var methodName=kssevent.defaultActionMethodName;var success=false;if(!methodName){} else{if(typeof(this.defaultParameters)!='undefined'){this.parms=this.defaultParameters} else{this.parms={}}
this.binder.callMethod(namespace,name,this,methodName);success=true}
return success};this.executeServerAction=function(name){for(key in this.kssParms){if(key=='kssSubmitForm'){var formQuery=this.kssParms[key];if(typeof(formQuery)=='string'){var locator=new kukit.fo.NamedFormLocator(formQuery);var collector=new kukit.ut.TupleCollector();formQuery=kukit.fo.getAllFormVars(locator,collector)}}}
var sa=new kukit.sa.ServerAction(name,this)};this.getEventName=function(){return this.eventRule.kssSelector.name};this.getEventNamespace=function(){return this.eventRule.kssSelector.namespace};this.hasExecuteActions=function(){if(this.eventRule){if(this.eventRule.actions.hasActions())
return true;var kssevent=kukit.eventsGlobalRegistry.get(this.getEventNamespace(),this.getEventName());var methodName=kssevent.defaultActionMethodName;return(typeof methodName!='undefined')} else
return false};this.makeExecuteActionsHook=function(filter){if(!this.hasExecuteActions()){return function(){}}
var eventName=this.getEventName();var self=this;var func_to_bind=function(dict){var newoper=self.clone(dict,true);if(filter&&!filter(newoper)) return false;newoper.binder.triggerEvent(eventName,newoper);return true};return func_to_bind};this.evaluateParameters=function(mandatory,defaults,errname,allow_excess){var newParameters={};for(var i=0;i<mandatory.length;i++){var next=mandatory[i];newParameters[next]=this.parms[next]}
for(var key in defaults){var val=this.parms[key];if(typeof(val)=='undefined'){newParameters[key]=defaults[key]} else{newParameters[key]=val}}
for(var key in this.parms){if(typeof(newParameters[key])=='undefined'){newParameters[key]=this.parms[key]}}
this.parms=newParameters};this.completeParms=function(mandatory,defaults,errname,allow_excess){this.evaluateParameters(mandatory,defaults,errname,allow_excess)};this.evalBool=function(key,errname){var value=this.parms[key];this.parms[key]=kukit.ut.evalBool(value,kukit.E)};this.evalInt=function(key,errname){var value=this.parms[key];this.parms[key]=kukit.ut.evalInt(value,kukit.E)};this.evalList=function(key,errname){var value=this.parms[key];this.parms[key]=kukit.ut.evalList(value,kukit.E)};this.initialize.apply(this,arguments)}}();kukit.tk=new function(){var tk=this;tk._TokenBase=function(){this.emitError=function(msg){throw new Error(kukit.E)};this.updateFinished=function(){if(!this.finished&&this.cursor.text.length==this.cursor.pos){if(this.isTopLevelParser){this.finished=true} else{this.emitError(kukit.E)}}}};tk._ParserBase=function(){this.initialize=function(){};this.emitAndReturn=function(token){this.finished=true;return token};this.nextStep=function(){var table=this.table;var cursor=this.cursor;var best_pos=cursor.text.length;var best_symbol=null;for(var symbol in table){var pos=cursor.text.indexOf(symbol,cursor.pos);if(pos!=-1&&pos<best_pos){best_pos=pos;best_symbol=symbol}};if(best_pos>cursor.pos){this.result.push(new tk.Fraction(cursor,best_pos));cursor.pos=best_pos};if(best_symbol){var tokens=table[best_symbol].call(this);if(typeof(tokens)!='undefined'){if(typeof(tokens.length)=='undefined'){tokens=[tokens]};for(var i=0;i<tokens.length;i++){this.result.push(tokens[i])}}}};this.process=function(){this.txt='';for(var i=0;i<this.result.length;i++){this.txt+=this.result[i].txt}};this.expectToken=function(context,token){var i=context.nextTokenIndex;if(token){var symbol=token.prototype.symbol;if(i>=this.result.length){this.emitError(kukit.E)} else if(this.result[i].symbol!=symbol){this.emitError(kukit.E)}} else{if(i>=this.result.length){this.emitError(kukit.E)}}
context.token=this.result[i];context.nextTokenIndex+=1};this.resultIsNullOrNotToken=function(token,currentValue){return(!token||currentValue.symbol!=token.prototype.symbol)};this.notInTokens=function(context,token1,token2,token3,token4){var i=context.nextTokenIndex;var currentValue=this.result[i];return!((i>=this.result.length)||(this.resultIsNullOrNotToken(token1,currentValue)&&this.resultIsNullOrNotToken(token2,currentValue)&&this.resultIsNullOrNotToken(token3,currentValue)&&this.resultIsNullOrNotToken(token4,currentValue)))};this.digestTxt=function(context,token1,token2,token3,token4){this.digestExactTxt(context,token1,token2,token3,token4);context.txt=this.removeWhitespacesAndTrim(context.txt)};this.digestExactTxt=function(context,token1,token2,token3,token4){var result='';while(this.notInTokens(context,token1,token2,token3,token4)){result+=this.result[context.nextTokenIndex].txt;context.nextTokenIndex++}
context.txt=result};this.removeWhitespaces=function(txt){if(txt!=' '){txt=txt.replace(/[\r\n\t ]+/g,' ')}
return txt};this.removeWhitespacesAndTrim=function(txt){txt=this.removeWhitespaces(txt);if(txt&&txt.charAt(0)==' '){txt=txt.substr(1)}
txt=txt.replace(/ $/,'');return txt}};tk._ParserBase.prototype=new tk._TokenBase();tk.Fraction=function(){this.initialize=function(cursor,endpos){this.txt=cursor.text.substring(cursor.pos,endpos);this.startpos=cursor.pos;this.endpos=cursor.pos;this.finished=true};this.initialize.apply(this,arguments)};tk.Fraction.prototype.symbol='fraction';tk.mkToken=function(symbol,txt){f=function(cursor){this.cursor=cursor;this.startpos=cursor.pos;if(cursor.text.substr(cursor.pos,txt.length)!=txt){this.emitError(kukit.E)} else{cursor.pos+=txt.length;this.finished=true}
this.endpos=cursor.pos};f.prototype=new tk._TokenBase();f.prototype.symbol=symbol;f.prototype.txt=txt;return f};tk.mkParser=function(symbol,table,_class){f=function(cursor,tokenClass,isTopLevelParser){this.table=table;this.cursor=cursor;this.startpos=cursor.pos;this.finished=false;this.isTopLevelParser=isTopLevelParser;this.result=[];if(tokenClass){this.result.push(new tokenClass(this.cursor))}
this.updateFinished();while(!this.finished){this.nextStep();this.updateFinished()}
this.endpos=cursor.pos;this.initialize.apply(this,arguments);this.process()};f.prototype=new tk._ParserBase();var _prototype=new _class();for(key in _prototype){f.prototype[key]=_prototype[key]}
f.prototype.symbol=symbol;return f};tk.Cursor=function(){this.initialize=function(txt){this.text=txt;this.pos=0};this.makeMarker=function(pos){var cursor=new tk.Cursor();cursor.text=this.text;cursor.pos=pos;cursor.calcRowCol();return cursor};this.getRowCol=function(pos){if(typeof(pos)=='undefined'){pos=this.pos}
var index=0;var row=1;var next=0;while(true){next=this.text.indexOf('\n',index);if(next==-1||next>=pos){break}
index=next+1;row+=1}
var col=pos-index+1;return{'row':row,'col':col}};this.calcRowCol=function(pos){var rowcol=this.getRowCol();this.row=rowcol.row;this.col=rowcol.col};this.initialize.apply(this,arguments)}}();kukit.pr=new function(){var pr=this;pr.ValueProviderRegistry=function(){this.initialize=function(){this.content={}};this.register=function(name,func,returnType){if(typeof(func)=='undefined'){throw new Error(kukit.E)}
this.content[name]=func;func.prototype.returnType=returnType};this.exists=function(name){var entry=this.content[name];return(typeof(entry)!='undefined')};this.get=function(name){var func=this.content[name];if(!func){throw new Error(kukit.E)}
return func};this.initialize.apply(this,arguments)}}();kukit.dummy=new function(){var _IdentityPP=function(){this.check=function(args){};this.eval=function(args,node){return args[0]}};var _FormVarPP=function(){this.check=function(args){};this.eval=function(args,node){return kukit.fo.getFormVar(new kukit.fo.NamedFormLocator(args[0]),args[1])}};var _CurrentFormVarPP=function(){this.check=function(args){};this.eval=function(args,node){if(args.length==1){return kukit.fo.getFormVar(new kukit.fo.CurrentFormLocator(node),args[0])} else{return kukit.fo.getValueOfFormElement(node)}}};var _CurrentFormVarFromKssAttrPP=function(){this.check=function(args){};this.eval=function(args,node){var argname=args[0];var recurseParents=false;if(args.length==2){recurseParents=kukit.ut.evalBool(args[1],kukit.E)}
var formvarname=kukit.dom.getRecursiveAttribute(node,argname,recurseParents,kukit.dom.getKssAttribute);return kukit.fo.getFormVar(new kukit.fo.CurrentFormLocator(node),formvarname)}};var _NodeAttrPP=function(){this.check=function(args){};this.eval=function(args,node){var argname=args[0]};this.eval=function(args,node){var argname=args[0];var recurseParents=false;if(args.length==2){recurseParents=args[1];recurseParents=kukit.ut.evalBool(recurseParents,kukit.E)}
return kukit.dom.getRecursiveAttribute(node,argname,recurseParents,kukit.dom.getAttribute)}};var _KssAttrPP=function(){this.check=function(args){};this.eval=function(args,node){var argname=args[0];var recurseParents=false};this.eval=function(args,node){var argname=args[0];var recurseParents=false;if(args.length==2){recurseParents=args[1];recurseParents=kukit.ut.evalBool(recurseParents,kukit.E)}
return kukit.dom.getRecursiveAttribute(node,argname,recurseParents,kukit.dom.getKssAttribute)}};var _NodeContentPP=function(){this.check=function(args){};this.eval=function(args,node){var recursive=false;if(args.length==1){recursive=args[0]}
return kukit.dom.textContent(node,recursive)}};var _StateVarPP=function(){this.check=function(args){};this.eval=function(args,node){var key=args[0];var value=kukit.engine.stateVariables[key];if(typeof(value)=='undefined'){throw new Error(kukit.E)}
return value}};var _PassPP=function(){this.check=function(args){};this.eval=function(args,node,defaultParameters){var key=args[0];var value=defaultParameters[key];if(typeof(value)=='undefined'){throw new Error(kukit.E)}
return value}};var _UrlPP=function(){this.check=function(args){}};_UrlPP.prototype=new _IdentityPP();var _AliasPP=function(){this.check=function(args){}};_AliasPP.prototype=new _IdentityPP();kukit.pprovidersGlobalRegistry=new kukit.pr.ValueProviderRegistry();kukit.pprovidersGlobalRegistry.register('',_IdentityPP);kukit.pprovidersGlobalRegistry.register('currentFormVar',_CurrentFormVarPP);kukit.pprovidersGlobalRegistry.register('currentFormVarFromKssAttr',_CurrentFormVarFromKssAttrPP);kukit.pprovidersGlobalRegistry.register('formVar',_FormVarPP);kukit.pprovidersGlobalRegistry.register('kssAttr',_KssAttrPP);kukit.pprovidersGlobalRegistry.register('stateVar',_StateVarPP);kukit.pprovidersGlobalRegistry.register('pass',_PassPP);kukit.pprovidersGlobalRegistry.register('nodeContent',_NodeContentPP);kukit.pprovidersGlobalRegistry.register('nodeAttr',_NodeAttrPP);kukit.pprovidersGlobalRegistry.register('url',_UrlPP,'url');kukit.pprovidersGlobalRegistry.register('alias',_AliasPP,'alias')}();kukit.rd=new function(){var rd=this;rd.KssSelector=function(){this.initialize=function(isEvent,css,name,namespace,id,ppid){this.isEventSelector=isEvent;this.isMethodSelector=!isEvent;this.css=css;this.name=name;this.namespace=namespace;this.className=null;this.id=id;this.ppid=ppid;this.setClassName()};this.setClassName=function(){try{this.className=kukit.eventsGlobalRegistry.get(this.namespace,this.name).className} catch(e){throw kukit.err.parsingError(e.message)}};this.prepareId=function(){if(this.ppid==null){if(this.id==null&&this.ppid==null){this.id=kukit.er.makeId(this.namespace,this.className)}
this.mergeId=kukit.er.makeMergeId(this.id,this.namespace,this.name)}};this.getId=function(node){if(this.id){return this.id} else{var id=this.ppid.pprovider.eval(this.ppid.args,node,{});if(!id){}
return id}};this.getMergeId=function(node){if(this.mergeId){return this.mergeId} else{var id=this.getId(node);this.mergeId=kukit.er.makeMergeId(id,this.namespace,this.name)}};this.initialize.apply(this,arguments)};rd.KssTextValue=function(txt){this.initialize=function(txt){this.txt=txt};this.check=function(registry){this.pprovider=new(kukit.pprovidersGlobalRegistry.get(''))()};this.evaluate=function(node,defaultParameters){return this.pprovider.eval([this.txt],node,defaultParameters)};this.initialize.apply(this,arguments)};rd.KssTextValue.prototype.isMethod=false;rd.KssMethodValue=function(){this.initialize=function(methodName,args){this.methodName=methodName;this.args=args};this.check=function(registry){var f=kukit.pprovidersGlobalRegistry.get(this.methodName);this.pprovider=new f();for(var i=0;i<this.args.length;i++){var arg=this.args[i];if(arg.check){arg.check()}}};this.evaluate=function(node,defaultParameters){var newArgs=[];for(var i=0;i<this.args.length;i++){var arg=this.args[i];if(arg.evaluate){newArgs.push(arg.evaluate(node,defaultParameters))} else{newArgs.push(arg)}}
return this.pprovider.eval(newArgs,node,defaultParameters)};this.initialize.apply(this,arguments)};rd.KssMethodValue.prototype.isMethod=true;rd.KssEventValue=function(methodName,arg){this.methodName=methodName;this.arg=arg;this.check=function(){}};rd.KssEventValue.prototype.isMethod=true;rd.EventRuleNr=0;rd.EventRule=function(){this.initialize=function(kssSelector,parms,actions){if(typeof(parms)=='undefined'){this.kssSelector=kssSelector} else{this.index=rd.EventRuleNr;this.mergedIndex=null;rd.EventRuleNr=this.index+1;this.kssSelector=kssSelector;this.parms=parms;this.actions=actions}};this.getIndex=function(){if(this.mergedIndex){return this.mergedIndex} else{return this.index}};this.mergeForSelectedNodes=function(ruletable,phase,inNodes){if(this.kssSelector.isEventSelector){var nodes=kukit.dom.cssQuery(this.kssSelector.css,inNodes);var counter=0;for(var y=0;y<nodes.length;y++){var node=nodes[y];if(typeof(node._kukitMark)=='undefined'){ruletable.add(node,this);counter+=1}}} else if(typeof(inNodes)=='undefined'){kukit.engine.documentRules.add(this)}};this.getBinderInfo=function(node){var id=this.kssSelector.getId(node);return kukit.engine.binderInfoRegistry.getOrCreateBinderInfo(this.kssSelector.id,this.kssSelector.className,this.kssSelector.namespace)};this.bind=function(node){this.store(node);var oper=new kukit.op.Oper();var binderInfo=this.getBinderInfo(node);oper.node=node;oper.eventRule=this;oper.binder=binderInfo.binder;oper.parms=this.parms;binderInfo.bindOper(oper)};this.store=function(node){if(node==null){return}
if(typeof(node.kukitEventRules)=='undefined'){var rules=[];node.kukitEventRules=rules}
node.kukitEventRules.push(this)};this.isMerged=function(){return(this.mergedIndex!=null)};this.cloneForMerge=function(){var merged=new rd.EventRule(this.kssSelector);merged.actions=new rd.ActionSet();merged.parms={};merged.mergedIndex='X';merged.merge(this);merged.mergedIndex=this.getIndex();return merged};this.merge=function(other){this.mergedIndex=this.mergedIndex+','+other.getIndex();for(var key in other.parms){this.parms[key]=other.parms[key]}
this.actions.merge(other.actions)};this.mergeIntoDict=function(dict,key){var mergedRule=dict[key];if(typeof(mergedRule)=='undefined'){dict[key]=this} else{if(!mergedRule.isMerged()){mergedRule=mergedRule.cloneForMerge();dict[key]=mergedRule}
mergedRule.merge(this)}};this.initialize.apply(this,arguments)};rd.ActionSet=function(){this.initialize=function(){this.content={}};this.hasActions=function(){for(var name in this.content){return true}
return false};this.merge=function(other){for(var key in other.content){var action=this.content[key];var action2=other.content[key];if(typeof(action)=='undefined'){if(action2.type!='X'){action=new _Action();this.content[key]=action} else{throw new Error(kukit.E)}}
if(action2.type!='X'){action.merge(action2)} else{this.deleteAction(key)}}};this.execute=function(oper){for(var key in this.content){var action=this.content[key];if(action.type!='E'){action.execute(oper)}}
if(typeof(this.content['default'])=='undefined'){var name=oper.eventRule.kssSelector.name;oper=oper.clone({'parms':{}});oper.executeDefaultAction(name,true)}};this.getOrCreateAction=function(name,valuesByReturnType){var nameOverride;if(valuesByReturnType.alias){nameOverride=name;name=valuesByReturnType.alias.args[0]}
var action=this.content[name];if(typeof(action)=='undefined'){action=new _Action();action.setName(name,nameOverride);this.content[name]=action}
if(valuesByReturnType.selection){action.parms.kssSelector=valuesByReturnType.selection}
if(valuesByReturnType.formquery){action.parms.kssSubmitForm=valuesByReturnType.formquery}
if(valuesByReturnType.url){action.parms.kssUrl=valuesByReturnType.url}
return action};this.getActionOrNull=function(name){var action=this.content[name];if(typeof(action)=='undefined'){action=null}
return action};this.deleteAction=function(name){var action=this.content[name];delete this.content[name]};this.getDefaultAction=function(){return this.getActionOrNull('default')};this.getErrorActionFor=function(action){return this.getActionOrNull(action.error)};this.initialize.apply(this,arguments)};var _Action=function(){this.initialize=function(){this.name=null;this.error=null;this.parms={};this.type=null;this.nameOverride=null};this.getExecutingName=function getExecutingName(){return this.nameOverride||this.name};this.setName=function(name,nameOverride){if(typeof(nameOverride)=='undefined'||name==nameOverride){nameOverride=null}
this.name=name;if(nameOverride!=null){this.nameOverride=nameOverride}
if(name=='default'){this.setType('D')}};this.setType=function(type){this.type=type};this.setError=function(error){this.error=error};this.merge=function(other){if(other.name!=null){this.setName(other.name,other.nameOverride)}
if(other.type!=null){this.setType(other.type)}
if(other.error!=null){this.setError(other.error)}
for(var key in other.parms){this.parms[key]=other.parms[key]}};var _defaultStringHandling={'kssSelector':'css','kssSubmitForm':'form'};this.makeActionOper=function(oper){var parms={};var kssParms={};if(typeof(oper.defaultParameters)=='undefined'){oper.defaultParameters={}}
for(var key in this.parms){var value=this.parms[key].evaluate(oper.node,oper.defaultParameters);var providerName=_defaultStringHandling[key];if(providerName&&typeof(value)=='string'){var providerClass=kukit.pprovidersGlobalRegistry.get(providerName);var provider=new providerClass();value=provider.eval([value],oper.node,oper.defaultParameters)}
if(key.match(/^kss/)){kssParms[key]=value} else{parms[key]=value}}
var anOper=oper.clone({'parms':parms,'kssParms':kssParms,'action':this});return anOper};this.execute=function(oper){oper=this.makeActionOper(oper);switch(this.type){case 'D':{var name=oper.eventRule.kssSelector.name;oper.executeDefaultAction(name)} break;case 'S':{oper.executeServerAction(this.name)} break;case 'C':{oper.executeClientAction(this.getExecutingName())} break;case 'E':{oper.executeClientAction(this.name)} break}};this.initialize.apply(this,arguments)};rd.LoadActions=function(){this.initialize=function(){this.items=[]};this.empty=function(){return(this.size()==0)};this.size=function(){return this.items.length};this.push=function(f){if(this.items.length>=100){throw('Infinite recursion, stack full')}
this.items.push(f)};this.execute=function(){var f=this.items.shift();if(f){f();return true} else{return false}};this.executeAll=function(){var i=0;while(true){var success=this.execute();if(!success){break}
i++}
return i};this.initialize.apply(this,arguments)};rd.RuleTable=function(){this.initialize=function(loadScheduler){this.loadScheduler=loadScheduler;this.nodes={}};this.add=function(node,eventRule){var nodehash=rd.hashNode(node);var nodeval=this.nodes[nodehash];if(typeof(nodeval)=='undefined'){nodeval={'node':node,'val':{}};this.nodes[nodehash]=nodeval}
eventRule.mergeIntoDict(nodeval.val,eventRule.kssSelector.getMergeId(node))};this.bindall=function(phase){var counter=0;for(var nodehash in this.nodes){var nodeval=this.nodes[nodehash];nodeval.node._kukitMark=phase;for(var id in nodeval.val){var eventRule=nodeval.val[id];eventRule.bind(nodeval.node)}
counter+=1}
var loadactions=this.loadScheduler;if(!loadactions.empty()){var count=loadactions.executeAll()}};this.initialize.apply(this,arguments)};rd.uid=0;rd.hashNode=function(node){if(node==null){return '<<DOCUMENT>>'}
var id=node.uniqueID;if(typeof(id)=='undefined'){id=rd.uid;node.uniqueID=id;rd.uid++}
return id};rd.MethodTable=function(){this.initialize=function(){this.content={};this.content['document']={};this.content['behaviour']={}};this.add=function(eventRule){var category=eventRule.kssSelector.css;var dict=this.content[category];eventRule.mergeIntoDict(dict,eventRule.kssSelector.getMergeId())};this.getMergedRule=function(category,name,binder){var dict=this.content[category];var namespace=binder.__eventNamespace__;var id=binder.__binderId__;var mergeId=kukit.er.makeMergeId(id,namespace,name);var mergedRule=dict[mergeId];if(typeof(mergedRule)=='undefined'){mergedRule=null}
return mergedRule};this.bindall=function(){var documentRules=this.content['document'];var counter=0;for(var mergeId in documentRules){documentRules[mergeId].bind(null);counter+=1}};this.initialize.apply(this,arguments)}}();kukit.kssp=new function(){var kssp=this;kssp.openComment=kukit.tk.mkToken('openComment',"\/\*");kssp.closeComment=kukit.tk.mkToken('closeComment',"\*\/");kssp.openBrace=kukit.tk.mkToken('openBrace',"{");kssp.closeBrace=kukit.tk.mkToken('closeBrace',"}");kssp.openBracket=kukit.tk.mkToken('openBracket',"[");kssp.closeBracket=kukit.tk.mkToken('closeBracket',"]");kssp.openParent=kukit.tk.mkToken('openParent',"(");kssp.closeParent=kukit.tk.mkToken('closeParent',")");kssp.semicolon=kukit.tk.mkToken('semicolon',";");kssp.colon=kukit.tk.mkToken('colon',":");kssp.quote=kukit.tk.mkToken('quote',"'");kssp.dquote=kukit.tk.mkToken('dquote','"');kssp.backslash=kukit.tk.mkToken('backslash','\x5c');kssp.comma=kukit.tk.mkToken('comma',",");kssp.equals=kukit.tk.mkToken('equals',"=");var _emitAndReturn=function(){return this.emitAndReturn()};var _mkEmitAndReturnToken=function(klass){return function(){var token=new klass(this.cursor);return this.emitAndReturn(token)}};var _mkReturnToken=function(klass){return function(){return new klass(this.cursor)}};var _returnComment=function(){return new kssp.Comment(this.cursor,kssp.openComment)};var _returnString=function(){return new kssp.String(this.cursor,kssp.quote)};var _returnString2=function(){return new kssp.String2(this.cursor,kssp.dquote)};var _returnMethodArgs=function(){return new kssp.MethodArgs(this.cursor,kssp.openParent)};var _returnBackslashed=function(){return new kssp.Backslashed(this.cursor,kssp.backslash)};var _Document=function(){this.process=function(){this.eventRules=[];var context={'nextTokenIndex':0};while(context.nextTokenIndex<this.result.length){this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);var key=context.txt;if(!key){break}
this.expectToken(context,kssp.Block);var block=context.token;var rules=block.parseSelectors(key);this.addRules(rules)}
this.result=[];this.txt=''};this.addRules=function(rules){for(var i=0;i<rules.length;i++){this.eventRules.push(rules[i])}}};kssp.Document=kukit.tk.mkParser('document',{"\/\*":_returnComment,"{": function(){return new kssp.Block(this.cursor,kssp.openBrace)}},_Document);var _Comment=function(){this.process=function(){this.result=[];this.txt=' '}};kssp.Comment=kukit.tk.mkParser('comment',{"\*\/":_mkEmitAndReturnToken(kssp.closeComment)},_Comment);var _Block=function(){this.process=function(){this.eventFullNames={};this.actions=new kukit.rd.ActionSet();var context={'nextTokenIndex':1};while(context.nextTokenIndex<this.result.length-1){this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);var key=context.txt;if(!key){break}
this.expectToken(context,kssp.colon);this.expectToken(context,kssp.MultiPropValue);this.addDeclaration(key,context.token.values);if(context.nextTokenIndex==this.result.length-1) break;this.expectToken(context,kssp.semicolon)}
this.result=[];this.txt=''};this.parseSelectors=function(key){var cursor=new kukit.tk.Cursor(key+' ');var parser=new kssp.KssSelectors(cursor,null,true);var results=[];var hasFullNames=false;for(var eventFullName in this.eventFullNames){var hasFullNames=true;var found=false;for(var i=0;i<parser.selectors.length;++i){var fullName='';var kssSelector=parser.selectors[i];if(kssSelector.namespace){fullName=kssSelector.namespace+'-'}
fullName+=kssSelector.name;if(fullName==eventFullName){var eventParameters=this.eventFullNames[fullName];var eventRule;if(typeof(eventParameters)!='undefined'){eventRule=new kukit.rd.EventRule(kssSelector,eventParameters,this.actions)}
else{eventRule=new kukit.rd.EventRule(kssSelector,{},this.actions)}
results.push(eventRule);found=true}}
if(!found){this.emitError(kukit.E)}}
if(!hasFullNames){for(var i=0;i<parser.selectors.length;++i){var kssSelector=parser.selectors[i];eventRule=new kukit.rd.EventRule(kssSelector,{},this.actions);results.push(eventRule)}}
return results};this.addEventDeclaration=function(key,splitkey,values){var eventNamespace;var eventName;var eventKey;var eventFullName;if(splitkey.length==3){eventName=splitkey[1];eventKey=splitkey[2];eventFullName=eventName} else{eventNamespace=splitkey[1];eventName=splitkey[2];eventKey=splitkey[3];eventFullName=eventNamespace+'-'+eventName}
var allowedReturnTypes;var value=this.preprocessValues(values,allowedReturnTypes,kukit.E).string;var eventParameters=this.eventFullNames[eventFullName];if(typeof(eventParameters)=='undefined'){this.eventFullNames[eventFullName]={};eventParameters=this.eventFullNames[eventFullName]}
eventParameters[eventKey]=value.txt};this.addActionDeclaration=function(key,splitkey,values){var atab={'server':'S','client':'C','cancel':'X'};var actionType=atab[splitkey[1]];var allowedReturnTypes;var valuesByReturnType=this.preprocessValues(values,allowedReturnTypes,kukit.E);var value=valuesByReturnType.string;var action=this.actions.getOrCreateAction(value.txt,valuesByReturnType);if(actionType=='X'&&action.type!=null){this.actions.deleteAction(value.txt)} else{action.setType(actionType)}};this.addActionError=function(action,key,values){var allowedReturnTypes;var value=this.preprocessValues(values,allowedReturnTypes,kukit.E).string;action.setError(value.txt);var err_action=this.actions.getOrCreateAction(value.txt,{});err_action.setType('E')};this.addActionParameter=function(action,key,values){var value;if(key.substr(0,3)=='kss'){value=values[0];this.preprocessValues(values,allowedReturnTypes,kukit.E,true)} else{var allowedReturnTypes;var valuesByReturnType=this.preprocessValues(values,allowedReturnTypes,kukit.E);value=valuesByReturnType.string}
action.parms[key]=value};this.addDeclaration=function(key,values){var splitkey=key.split('-');var name=splitkey[0];if(name=='evt'){this.addEventDeclaration(key,splitkey,values)} else if(name=='action'){this.addActionDeclaration(key,splitkey,values)} else{var actionName;var actionKey;if(splitkey.length==2){actionName=splitkey[0];actionKey=splitkey[1]} else{actionName=splitkey[0]+'-'+splitkey[1];actionKey=splitkey[2]}
var action=this.actions.getOrCreateAction(actionName,{});if(actionKey=='error'){this.addActionError(action,key,values)} else{this.addActionParameter(action,actionKey,values)}}};this.preprocessValues=function(values,allowedReturnTypes,errInfo,noStringRequired){var valuesByReturnType={};for(var i=0;i<values.length;i++){var value=values[i];try{value.check()} catch(e){this.emitError(kukit.E)}
var returnType=(typeof(value.pprovider)!='undefined')&&value.pprovider.returnType;if(!returnType){returnType='string'}
valuesByReturnType[returnType]=value}
return valuesByReturnType}};kssp.Block=kukit.tk.mkParser('block',{";":_mkReturnToken(kssp.semicolon),":": function(){return [new kssp.colon(this.cursor),new kssp.MultiPropValue(this.cursor)]},"}":_mkEmitAndReturnToken(kssp.closeBrace)},_Block);var _PropValue=function(){this.process=function(){this.values=[];var context={'nextTokenIndex':0};this.txt='';var txtCarry='';while(context.nextTokenIndex<this.result.length){if(this.notInTokens(context,kukit.kssp.String)){if(txtCarry){this.produceTxt(txtCarry);txtCarry=''}
this.expectToken(context,kukit.kssp.String);this.produceTxt(context.token.txt)} else if(this.notInTokens(context,kukit.kssp.MethodArgs)){if(!txtCarry){this.emitError(kukit.E)}
this.expectToken(context,kukit.kssp.MethodArgs);this.addValue(new kukit.rd.KssMethodValue(txtCarry,context.token.args),txtCarry);txtCarry=''} else{this.digestTxt(context,kukit.tk.Fraction,kukit.kssp.Comment);var words=context.txt.split(' ');if(txtCarry){this.produceTxt(txtCarry);txtCarry=''}
if(words.length>0){for(var i=0;i<words.length-1;i++){this.produceTxt(words[i])}
txtCarry=words[words.length-1]}}}
if(txtCarry){this.produceTxt(txtCarry)}
this.result=[]};this.initialize=function(){this.multiword_allowed=false;this.valueClass=kukit.rd.KssMethodValue};this.produceTxt=function(txt){this.addValue(new kukit.rd.KssTextValue(txt),txt)};this.addValue=function(value,errInfo){if(this.value){this.emitError(kukit.E)}
this.value=value};this.initialize.apply(this,arguments)};kssp.PropValue=kukit.tk.mkParser('propValue',{";":_emitAndReturn,"}":_emitAndReturn,")":_emitAndReturn,"]":_emitAndReturn,",":_emitAndReturn,"'":_returnString,'"':_returnString2,"\/\*":_returnComment,"(":_returnMethodArgs},_PropValue);var _MultiPropValue=function(){this.addValue=function(value,errInfo){this.values.push(value)};this.initialize=function(){this.multiword_allowed=true}};_MultiPropValue.prototype=new _PropValue();kssp.MultiPropValue=kukit.tk.mkParser('multiPropValue',{";":_emitAndReturn,"}":_emitAndReturn,")":_emitAndReturn,",":_emitAndReturn,"'":_returnString,'"':_returnString2,"\/\*":_returnComment,"(":_returnMethodArgs},_MultiPropValue);var _EventValue=function(){this.initialize=function(){this.multiword_allowed=false};this.process=function(){var context={'nextTokenIndex':0};this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);this.txt='';var txt=context.txt;if(this.notInTokens(context,kssp.String)){if(txt){this.emitError(kukit.E)}
this.expectToken(context,kssp.String);this.produceTxt(context.token.txt)} else if(this.notInTokens(context,kssp.openParent)){this.expectToken(context,kssp.openParent);this.expectToken(context,kssp.PropValue);this.value=new kukit.rd.KssEventValue(txt,context.token.value);this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);if(context.txt){this.emitError(kukit.E)}
this.expectToken(context,kssp.closeParent)} else{if(!this.multiword_allowed&&txt.indexOf(' ')!=-1){this.emitError(kukit.E)}
this.produceTxt(txt)}
if(context.nextTokenIndex<this.result.length){this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);if(context.nextTokenIndex<this.result.length||context.txt){this.emitError(kukit.E)}}
this.result=[]};this.produceTxt=function(txt){this.value=new kukit.rd.KssEventValue(txt,null)};this.initialize.apply(this,arguments)};kssp.EventValue=kukit.tk.mkParser('propValue',{"{":_emitAndReturn," ":_emitAndReturn,"\t":_emitAndReturn,"\n":_emitAndReturn,"\r":_emitAndReturn,"\/\*":_emitAndReturn,":":_emitAndReturn,"(": function(){return [new kssp.openParent(this.cursor),new kssp.PropValue(this.cursor)]},")":_mkEmitAndReturnToken(kssp.closeParent)},_EventValue);var _String=function(){this.process=function(){this.txt='';for(var i=1;i<this.result.length-1;i++){this.txt+=this.result[i].txt}}};kssp.String=kukit.tk.mkParser('string',{"'":_mkEmitAndReturnToken(kssp.quote),'\x5c':_returnBackslashed},_String);kssp.String2=kukit.tk.mkParser('string',{'"':_mkEmitAndReturnToken(kssp.dquote),'\x5c':_returnBackslashed},_String);var _StringInSelector=function(){this.process=function(){this.txt='';for(var i=0;i<this.result.length;i++){this.txt+=this.result[i].txt}}};kssp.StringInSelector=kukit.tk.mkParser('string',{"'":_mkEmitAndReturnToken(kssp.quote),'\x5c':_returnBackslashed},_StringInSelector);kssp.String2InSelector=kukit.tk.mkParser('string',{'"':_mkEmitAndReturnToken(kssp.dquote),'\x5c':_returnBackslashed},_StringInSelector);var _Backslashed=function(){this.nextStep=function(table){var cursor=this.cursor;var length=cursor.text.length;if(length<cursor.pos+1){this.emitError(kukit.E)} else{this.result.push(new kukit.tk.Fraction(cursor,cursor.pos+1));this.cursor.pos+=1;this.finished=true}};this.process=function(){this.txt=this.result[1].txt}};kssp.Backslashed=kukit.tk.mkParser('backslashed',{},_Backslashed);var _MethodArgs=function(){this.process=function(){this.args=[];var context={'nextTokenIndex':1};while(context.nextTokenIndex<this.result.length-1){this.digestTxt(context,kukit.tk.Fraction,kssp.Comment);var value=context.txt;if(!value){if(context.nextTokenIndex==this.result.length-1) break;this.expectToken(context,kssp.String);value=context.token.txt} else{if(value.indexOf(' ')!=-1){this.emitError(kukit.E)}}
var valueClass;var args;var providedValue;if(this.notInTokens(context,kssp.MethodArgs)){this.expectToken(context,kssp.MethodArgs);valueClass=kukit.rd.KssMethodValue;args=context.token.args;providedValue=new valueClass(value,args)} else{providedValue=value}
this.args.push(providedValue);if(context.nextTokenIndex==this.result.length-1) break;this.expectToken(context,kssp.comma)}
this.result=[];this.txt=''}};kssp.MethodArgs=kukit.tk.mkParser('methodargs',{"'":_returnString,'"':_returnString2,",":_mkReturnToken(kssp.comma),")":_mkEmitAndReturnToken(kssp.closeParent),"(":_returnMethodArgs,"\/\*":_returnComment},_MethodArgs);var _KssSelectors=function(){this.process=function(){this.selectors=[];var context={'nextTokenIndex':0};while(context.nextTokenIndex<this.result.length){this.digestTxt(context,kukit.tk.Fraction,kssp.Comment,kssp.String,kssp.String2);var cursor=new kukit.tk.Cursor(context.txt+' ');var parser=new kssp.KssSelector(cursor,null,true);this.selectors.push(parser.kssSelector);if(context.nextTokenIndex==this.result.length) break;this.expectToken(context,kssp.comma);if(context.nextTokenIndex==this.result.length){this.emitError(kukit.E)}};this.result=[];this.txt=''}};kssp.KssSelectors=kukit.tk.mkParser('kssselectors',{"'": function(){return new kssp.StringInSelector(this.cursor,kssp.quote)},'"': function(){return new kssp.String2InSelector(this.cursor,kssp.dquote)},",":_mkReturnToken(kssp.comma),"{":_emitAndReturn,"\/\*":_returnComment},_KssSelectors);var _KssSelector=function(){this.process=function(){var name;var namespace=null;var id=null;var tokenIndex=this.result.length-1;var cycle=true;while(cycle&&tokenIndex>=0){var token=this.result[tokenIndex];switch(token.symbol){case kukit.tk.Fraction.prototype.symbol:{if(token.txt.match(/^[\r\n\t ]*$/)!=null){tokenIndex-=1} else{this.emitError(kukit.E)}} break;case kssp.Comment.prototype.symbol:{tokenIndex-=1} break;default:{cycle=false} break}}
tokenIndex-=2;if(tokenIndex<0||(this.result[tokenIndex+2].symbol!=kssp.EventValue.prototype.symbol)||(this.result[tokenIndex+1].symbol!=kssp.colon.prototype.symbol)||(this.result[tokenIndex].symbol!=kukit.tk.Fraction.prototype.symbol)){this.emitError(kukit.E)}
var lasttoken=this.result[tokenIndex];var commatoken=this.result[tokenIndex+1];var pseudotoken=this.result[tokenIndex+2];var txt=lasttoken.txt;if(txt.match(/[\r\n\t ]$/)!=null){this.emitError(kukit.E)}
if(!pseudotoken.value.methodName){this.emitError(kukit.E)}
css=this.cursor.text.substring(this.startpos,commatoken.startpos);var singleword=css.replace(/[\r\n\t ]/g,' ');if(singleword&&singleword.charAt(0)==' '){singleword=singleword.substring(1)}
var isEvent=(singleword!='document'&&singleword!='behaviour');if(!isEvent){css=singleword}
var id=null;var ppid=null;if(pseudotoken.value.arg){if(pseudotoken.value.arg.isMethod){ppid=pseudotoken.value.arg;ppid.check(kukit.pprovidersGlobalRegistry)} else{id=pseudotoken.value.arg.txt}}
var name=pseudotoken.value.methodName;var splitname=name.split('-');var namespace=null;if(splitname.length>2){this.emitError(kukit.E)} else if(splitname.length==2){name=splitname[1];namespace=splitname[0]}
this.kssSelector=new kukit.rd.KssSelector(isEvent,css,name,namespace,id,ppid,kukit.eventsGlobalRegistry);this.txt='';this.result=[]}};kssp.KssSelector=kukit.tk.mkParser('kssselector',{":": function(){return [new kssp.colon(this.cursor),new kssp.EventValue(this.cursor)]},"{":_emitAndReturn,"\/\*":_returnComment},_KssSelector);kssp.KssRuleProcessor=function(href){this.initialize=function(){this.href=href;this.loaded=false;this.rules=[]};this.load=function(){var domDoc=new XMLHttpRequest();domDoc.open("GET",this.href,false);domDoc.send(null);this.txt=domDoc.responseText;this.loaded=true};this.parse=function(){var cursor=new kukit.tk.Cursor(this.txt);var parser=new kssp.Document(cursor,null,true);for(var i=0;i<parser.eventRules.length;i++){var rule=parser.eventRules[i];rule.kssSelector.prepareId();this.rules.push(rule)}};this.initialize.apply(this,arguments)}}();kukit.er=new function(){var er=this;var _eventClassCounter=0;var _EventRegistry=function(){this.initialize=function(){this.content={};this.classes={};this.eventSets=[]};this.registerBinder=function(klass){if(typeof(klass)=='undefined'){throw new Error(kukit.E)}
if(klass.__decorated_for_kss__){return}
var binder_prototype=new _EventBinder();for(var key in binder_prototype){klass.prototype[key]=binder_prototype[key]}
className=''+_eventClassCounter;_eventClassCounter+=1;klass.prototype.__className__=className;this.classes[className]=klass;klass.__decorated_for_kss__=true};this.existsBinder=function(className){var klass=this.classes[className];return(typeof(klass)!='undefined')};this.getBinderClass=function(className){var klass=this.classes[className];if(!klass){throw new Error(kukit.E)}
return klass};this._register=function(namespace,eventName,klass,bindMethodName,defaultActionMethodName,iterName){if(typeof(defaultActionMethodName)=='undefined'){throw new Error(kukit.E)}
this.registerBinder(klass);if(!eventName){throw new Error(kukit.E)}
var key=this._getKey(namespace,eventName);var entry=this.content[key];if(typeof(entry)!='undefined'){if(key[0]=='-'){key=key.substring(1)}
throw new Error(kukit.E)}
if(!er.getBindIterator(iterName)){throw new Error(kukit.E)}
this.content[key]={'className':className,'bindMethodName':bindMethodName,'defaultActionMethodName':defaultActionMethodName,'iterName':iterName}};this._registerEventSet=function(namespace,names,iterName,bindMethodName){this.eventSets.push({'namespace':namespace,'names':names,'iterName':iterName,'bindMethodName':bindMethodName})};this.register=function(namespace,eventName,klass,bindMethodName,defaultActionMethodName){this._register(namespace,eventName,klass,bindMethodName,defaultActionMethodName,'EachLegacy');this._registerEventSet(namespace,[eventName],'EachLegacy',bindMethodName)};this.unregister=function(namespace,eventName){var key=this._getKey(namespace,eventName);delete this.content[key];var found=null;for(var i=0;i<this.eventSets.length;i++){var eventSet=this.eventSets[i];if(eventSet['namespace']==namespace){found=i;break}}
if(found!=null){this.eventSets.splice(found,1)}};this.registerForAllEvents=function(namespace,eventNames,klass,bindMethodName,defaultActionMethodName,iterName){if(typeof(eventNames)=='string'){eventNames=[eventNames]}
for(var i=0;i<eventNames.length;i++){var eventName=eventNames[i];this._register(namespace,eventName,klass,bindMethodName,defaultActionMethodName,iterName)}
this._registerEventSet(namespace,eventNames,iterName,bindMethodName)};this._getKey=function(namespace,eventName){if(namespace==null){namespace=''} else if(namespace.split('-')>1){throw new Error(kukit.E)}
return namespace+'-'+eventName};this.exists=function(namespace,eventName){var key=this._getKey(namespace,eventName);var entry=this.content[key];return(typeof(entry)!='undefined')};this.get=function(namespace,eventName){var key=this._getKey(namespace,eventName);var entry=this.content[key];if(typeof(entry)=='undefined'){throw new Error(kukit.E)}
return entry};this.getBinderClassByEventNamespace=function(namespace,eventName){return this.getBinderClass(this.get(namespace,eventName).className)};this.initialize.apply(this,arguments)};kukit.eventsGlobalRegistry=new _EventRegistry();var _eventRegistry=function(){this.register=function(namespace,eventName,klass,bindMethodName,defaultActionMethodName){kukit.eventsGlobalRegistry.register(namespace,eventName,klass,bindMethodName,defaultActionMethodName)}};var _LateBinder=function(){this.initialize=function(binder,name,node){this.binder=binder;this.name=name;this.node=node;this.boundEvent=null};this.executeActions=function(){if(!this.boundEvent){if(kukit.hasFirebug){kukit.log(this.node)}
var info=kukit.engine.binderInfoRegistry.getBinderInfoById(this.binder.__binderId__);var oper=info.bound.getBoundOperForNode(this.name,this.node);if(oper){oper.parms={};this.boundEvent=function(){this.binder.triggerEvent(this.name,oper)}} else{this.boundEvent=function(){}}}
this.boundEvent()};this.initialize.apply(this,arguments)};var _EventBinder=function(){this.continueEvent=function(name,node,defaultParameters){var oper=new kukit.op.Oper();oper.node=node;if(node){var info=kukit.engine.binderInfoRegistry.getBinderInfoById(this.__binderId__);var newOper=info.bound.getBoundOperForNode(name,node);if(newOper){oper=newOper}} else{oper.eventRule=kukit.engine.documentRules.getMergedRule('document',name,this)}
var behav_eventRule=kukit.engine.documentRules.getMergedRule('behaviour',name,this);if(behav_eventRule){if(!oper.eventRule){oper.eventRule=behav_eventRule} else{}}
if(typeof(defaultParameters)!='undefined'){oper.defaultParameters=defaultParameters} else{oper.defaultParameters={}}
this.triggerEvent(name,oper)};this.__continueEvent__=function(name,node,defaultParameters){this.continueEvent(name,node,defaultParameters)};this.continueEventAllNodes=function(name,defaultParameters){var executed=0;var oper=new kukit.op.Oper();var info=kukit.engine.binderInfoRegistry.getBinderInfoById(this.__binderId__);var opers=info.bound.getBoundOpers(name);for(var i=0;i<opers.length;i++){var oper=opers[i];var newOper=oper.clone();if(typeof(defaultParameters)!='undefined'){newOper.defaultParameters=defaultParameters} else{newOper.defaultParameters={}}
this.triggerEvent(name,newOper);executed+=1}};this.__continueEvent_allNodes__=function(name,defaultParameters){this.continueEventAllNodes(name,defaultParameters)};this.makeFuncToBind=function(name,node){var executor=new er._LateBinder(this,name,node);return function(){executor.executeActions()}};this.__makeFuncToBind__=function(name,node){this.makeFuncToBind(name,node)};this.triggerEvent=function(name,oper){oper.binder=this;if(oper.eventRule){oper.eventRule.actions.execute(oper)} else{var namespace=this.__eventNamespace__;var success=oper.executeDefaultAction(name,true);if(!success){throw new Error(kukit.E)}}};this._EventBinder_triggerEvent=function(name,oper){this.triggerEvent(name,oper)};this.callMethod=function(namespace,name,oper,methodName){var method=this[methodName];if(!method){throw new Error(kukit.E)}
oper.binder=this;method.call(this,name,oper)};this._EventBinder_callMethod=function(namespace,name,oper,methodName){this.callMethod(namespace,name,oper,methodName)}};er.BinderInfoRegistry=function(){this.initialize=function(){this.info={}};this.getOrCreateBinderInfo=function(id,className,namespace){var binderInfo=this.info[id];if(typeof(binderInfo)=='undefined'){var binderClass=kukit.eventsGlobalRegistry.getBinderClass(className);var binder=new binderClass();binderInfo=this.info[id]=new _BinderInfo(binder);binder.__binderId__=id;binder.__binderClassName__=className;binder.__eventNamespace__=namespace} else if(binderInfo.getBinder().__binderClassName__!=className){throw new Error(kukit.E)}
return binderInfo};this.getBinderInfoById=function(id){var binderInfo=this.info[id];if(typeof(binderInfo)=='undefined'){throw new Error(kukit.E)}
return binderInfo};this.getSingletonBinderInfoByName=function(namespace,name){var className=kukit.eventsGlobalRegistry.get(namespace,name).className;var id=er.makeId(namespace,className);var binderInfo=this.info[id];if(typeof(binderInfo)=='undefined'){throw new Error(kukit.E)}
return binderInfo};this.startBindingPhase=function(){for(var id in this.info){var binderInfo=this.info[id];binderInfo.startBindingPhase()}};this.processBindingEvents=function(){for(var id in this.info){var binderInfo=this.info[id];binderInfo.processBindingEvents()}};this.initialize.apply(this,arguments)};var _BinderInfo=function(){this.initialize=function(binder){this.binder=binder;this.bound=new _OperRegistry();this.getBinder=function(){return this.binder};this.startBindingPhase=function(){this.binding=new _OperRegistry()};this.bindOper=function(oper){this.bound.checkOperBindable(oper);this.binding.bindOper(oper)};this.processBindingEvents=function(){this.binding.processBindingEvents(this.binder);this.binding.propagateTo(this.bound);this.binding=null};this.startBindingPhase()};this.getBinder=function(){return this.binder};this.startBindingPhase=function(){this.binding=new _OperRegistry()};this.bindOper=function(oper){this.bound.checkOperBindable(oper);this.binding.bindOper(oper)};this.processBindingEvents=function(){this.binding.processBindingEvents(this.binder);this.binding.propagateTo(this.bound);this.binding=null};this.initialize.apply(this,arguments)};var _iterators={};_iterators['EachLegacy']=function(eventSet,binder){for(var i=0;i<eventSet.names.length;i++){var rulesPerName=this.infoPerName[eventSet.names[i]];if(typeof(rulesPerName)!='undefined'){for(var nodeHash in rulesPerName){var oper=rulesPerName[nodeHash];var eventName=oper.getEventName();var funcToBind=oper.makeExecuteActionsHook();this.callBindMethod(eventSet,binder,eventName,funcToBind,oper)}}}};_iterators['Each']=function(eventSet,binder){for(var i=0;i<eventSet.names.length;i++){var rulesPerName=this.infoPerName[eventSet.names[i]];if(typeof(rulesPerName)!='undefined'){for(var nodeHash in rulesPerName){var oper=rulesPerName[nodeHash];this.callBindMethod(eventSet,binder,oper)}}}};_iterators['Opers']=function(eventSet,binder){var opers=[];for(var i=0;i<eventSet.names.length;i++){var rulesPerName=this.infoPerName[eventSet.names[i]];if(typeof(rulesPerName)!='undefined'){for(var nodeHash in rulesPerName){opers.push(rulesPerName[nodeHash])}}}
this.callBindMethod(eventSet,binder,opers)};_iterators['Node']=function(eventSet,binder){for(var nodeHash in this.infoPerNode){var rulesPerNode=this.infoPerNode[nodeHash];var filteredRules={};var operFound=false;for(var i=0;i<eventSet.names.length;i++){var name=eventSet.names[i];var oper=rulesPerNode[name];if(typeof(oper)!='undefined'){filteredRules[name]=oper;operFound=oper}}
if(operFound){this.callBindMethod(eventSet,binder,filteredRules,operFound.node)}}};_iterators['AllNodes']=function(eventSet,binder){var items=[];var hasResult=false;for(var nodeHash in this.infoPerNode){var rulesPerNode=this.infoPerNode[nodeHash];var filteredRules={};var operFound=false;for(var i=0;i<eventSet.names.length;i++){var name=eventSet.names[i];var oper=rulesPerNode[name];if(typeof(oper)!='undefined'){filteredRules[name]=oper;operFound=oper}}
if(operFound){var item={node:operFound.node,opersByEventName:filteredRules};items.push(item);hasResult=true}}
if(hasResult){this.callBindMethod(eventSet,binder,items)}};er.getBindIterator=function(iterName){var canonical=iterName.substring(0,1).toUpperCase()+iterName.substring(1);if(canonical=='Allnodes'){canonical='AllNodes'}
if(iterName!=canonical){iterName=canonical}
return _iterators[iterName]};var _OperRegistry=function(){this.initialize=function(){this.infoPerName={};this.infoPerNode={}};this.propagateTo=function(newreg){for(var key in this.infoPerName){var rulesPerName=this.infoPerName[key];for(var name in rulesPerName){var oper=rulesPerName[name];newreg.bindOper(oper)}}};this.checkOperBindable=function(oper,name,nodeHash){var info=this.infoPerName;if(typeof(nodeHash)=='undefined'){name=oper.eventRule.kssSelector.name;nodeHash=kukit.rd.hashNode(oper.node)}
var rulesPerName=info[name];if(typeof(rulesPerName)=='undefined'){rulesPerName=info[name]={}} else if(typeof(rulesPerName[nodeHash])!='undefined'){throw new Error(kukit.E)}
return rulesPerName};this.bindOper=function(oper){var name=oper.eventRule.kssSelector.name;var nodeHash=kukit.rd.hashNode(oper.node);var rulesPerName=this.checkOperBindable(oper,name,nodeHash);rulesPerName[nodeHash]=oper;var rulesPerNode=this.infoPerNode[nodeHash];if(typeof(rulesPerNode)=='undefined'){rulesPerNode=this.infoPerNode[nodeHash]={}}
rulesPerNode[name]=oper};this.processBindingEvents=function(binder){var eventRegistry=kukit.eventsGlobalRegistry;for(var i=0;i<eventRegistry.eventSets.length;i++){var eventSet=eventRegistry.eventSets[i];if(eventSet.bindMethodName){if(binder.__eventNamespace__==eventSet.namespace){var iterator=er.getBindIterator(eventSet.iterName);iterator.call(this,eventSet,binder)}}}};this.getBoundOperForNode=function(name,node){var rulesPerName=this.infoPerName[name];if(typeof(rulesPerName)=='undefined'){return null}
var nodeHash=kukit.rd.hashNode(node);var oper=rulesPerName[nodeHash];if(typeof(oper)=='undefined'){return null}
return oper};this.getBoundOpers=function(name){var opers=[];var rulesPerName=this.infoPerName[name];if(typeof(rulesPerName)!='undefined'){for(var nodeHash in rulesPerName){opers.push(rulesPerName[nodeHash])}}
return opers};this.callBindMethod=function(eventSet,binder,p1,p2,p3,p4,p5,p6){var method=binder[eventSet.bindMethodName];method.call(binder,p1,p2,p3,p4,p5,p6)};this.initialize.apply(this,arguments)};er.makeId=function(namespace,name){if(namespace==null){namespace=''}
return '@'+namespace+'@'+name};er.makeMergeId=function(id,namespace,name){if(namespace==null){namespace=''}
return id+'@'+namespace+'@'+name}}();kukit.ar=new function(){var ar=this;var _ActionRegistry=function(){this.initialize=function(){this.content={}};this.register=function(name,func){if(this.content[name]){return}
this.content[name]=func};this.exists=function(name){var entry=this.content[name];return(typeof(entry)!='undefined')};this.get=function(name){var func=this.content[name];if(!func){throw Error(kukit.E)}
return func};this.initialize.apply(this,arguments)};kukit.actionsGlobalRegistry=new _ActionRegistry();ar.actionRegistry=function(){this.register=function(name,func){kukit.actionsGlobalRegistry.register(name,func)}}}();kukit.dom=new function(){var dom=this;dom.getPreviousSiblingTag=function(node){var toNode=node.previousSibling;while((toNode!=null)&&(toNode.nodeType!=1)){toNode=toNode.previousSibling}
return toNode};dom.getNextSiblingTag=function(node){var toNode=node.nextSibling;while((toNode!=null)&&(toNode.nodeType!=1)){toNode=toNode.nextSibling}
return toNode};dom.insertBefore=function(nodes,parentNode,toNode){for(var i=0;i<nodes.length;i++){parentNode.insertBefore(nodes[i],toNode)}};dom.appendChildren=function(nodes,toNode){for(var i=0;i<nodes.length;i++){toNode.appendChild(nodes[i])}};dom.clearChildNodes=function(node){Sarissa.clearChildNodes(node)};dom.parseHTMLNodes=function(txt){var node=document.createElement('div');node.innerHTML=txt;var resultNodes=[];for(var i=0;i<node.childNodes.length;i++){resultNodes.push(node.childNodes.item(i))}
return resultNodes};dom.cssQuery=function(selector,inNodes){if(typeof(inNodes)!='undefined'&&inNodes==null){throw new Error(kukit.E)}
return _cssQuery(selector,inNodes)};var _USE_BASE2=(typeof(base2)!='undefined');if(_USE_BASE2){var _USE_BASE2_LEGACY=(typeof(base2.DOM.Document.querySelectorAll)=='undefined');if(!_USE_BASE2_LEGACY){var _cssQuery=function(selector,inNodes){var results=base2.DOM.Document.querySelectorAll(document,selector);var nodes=[];for(var i=0;i<results.length;i++){nodes.push(results.item(i))}
return nodes}} else{var _cssQuery=function(selector,inNodes){var results=base2.DOM.Document.matchAll(document,selector);var nodes=[];for(var i=0;i<results.length;i++){nodes.push(results.item(i))}
return nodes}}} else{var _cssQuery=function(selector,inNodes){var results=cssQuery(selector);return results}};dom.focus=function(node){tagName=node.tagName.toLowerCase();if((tagName=='input')||(tagName=='select')||(tagName=='textarea')){node.focus()}};dom.blur=function(node){tagName=node.tagName.toLowerCase();if((tagName=='input')||(tagName=='select')||(tagName=='textarea')){node.blur()}};dom.textContent=function(node,recursive){var value=_textContent(node,recursive);value=value.replace(/\r\n/g,' ');value=value.replace(/[\r\n]/g,' ');return value};var _textContent=function(node,recursive){if(typeof(recursive)=='undefined'){recursive=false}
var value='';var childnodes=node.childNodes;for(var i=0;i<childnodes.length;i++){var child=childnodes[i];if(child.nodeType==3){value+=child.nodeValue} else if(recursive&&child.nodeType==1){value+=dom.textContent(child,true)}}
return value};dom.getAttribute=function(node,attrname){if(attrname.toLowerCase()=='style'){throw new Error('Style attribute is not allowed with getAttribute')}
try{var value=node.getAttribute(attrname)}
catch(e){var value=null}
if(!value){if(attrname.toLowerCase()=='class'){value=node.className} else if(attrname.toLowerCase()=='for'){value=node.htmlFor}}
return value};dom.setAttribute=function(node,attrname,value){if(attrname.toLowerCase()=='style'){throw new Error('Style attribute is not allowed with setAttribute')}
else if(attrname.toLowerCase()=='class'){node.className=value} else if(attrname.toLowerCase()=='for'){node.htmlFor=value;node.setAttribute(attrname,value)} else if(attrname.toLowerCase()=='value'){node.value=value} else if(attrname.toLowerCase()=='checked'){value=!(value==''||value=='false'||value=='False');node.checked=value} else{node.setAttribute(attrname,value)}};var _kssAttrNamespace='kssattr';var _kssNamespacePrefix='kss';var _getKssValueFromEncodings=function(encodings,prefix){prefix=prefix+'-';var prefixLength=prefix.length;for(var i=0;i<encodings.length;i++){var encoding=encodings[i];if(encoding.substr(0,prefixLength)==prefix){return encoding.substr(prefixLength)}}
return null};var _getKssClassAttribute=function(node,attrname){var klass=dom.getAttribute(node,'class');if(klass){var splitclass=klass.split(/ +/);return _getKssValueFromEncodings(splitclass,'kssattr-'+attrname)}
return null};dom.getKssAttribute=function(node,attrname){var fullName=_kssAttrNamespace+':'+attrname;var result=dom.getAttribute(node,fullName);if(!result){result=_getKssClassAttribute(node,attrname)}
return result};dom.setKssAttribute=function(node,attrname,value){var fullName=_kssAttrNamespace+':'+attrname;dom.setAttribute(node,fullName,value)};dom.getKssValue=function(node,keyType,key){var namespacedName=_kssNamespacePrefix+'-'+keyType;var attrName=namespacedName+':'+key;var result=node.getAttribute(attrName);if(!result){result=null;var klass=dom.getAttribute(node,'class');var encodings;if(klass){encodings=klass.split(/ +/)} else{encodings=[]}
var id=dom.getAttribute(node,'id');if(id){encodings.unshift(id)}
var prefix=namespacedName+'-'+key;return _getKssValueFromEncodings(encodings,prefix)}
return result};dom.setKssValue=function(node,keyType,key,value){var namespacedName=_kssNamespacePrefix+'-'+keyType;var attrName=namespacedName+':'+key;node.setAttribute(attrName,value)};dom.locateMarkup=function(node,recurseParents,getter,p1,p2,p3,p4,p5){var value=getter(node,p1,p2,p3,p4,p5);var element=node;if(recurseParents){while(!value){element=element.parentNode;if(!element||!element.getAttribute){break}
value=getter(element,p1,p2,p3,p4,p5)}}
if(typeof(value)=='undefined'){value=null}
return{value:value,node:element}};dom.getRecursiveAttribute=function(node,attrname,recurseParents,getter){return dom.locateMarkup(node,recurseParents,getter,attrname).value};var _getIframeDocument=function(framename){var iframe=document.getElementById(framename);var doc=iframe.contentWindow||iframe.contentDocument;if(doc.document){doc=doc.document}
return doc};dom.EmbeddedContentLoadedScheduler=function(){this.initialize=function(framename,func,autodetect){this.framename=framename;this.func=func;this.autodetect=autodetect;var self=this;var f=function(){self.check()};this.counter=new kukit.ut.TimerCounter(250,f,true);this.counter.start()};this.check=function(){var doc=_getIframeDocument(this.framename);if(doc['_'+'embeddedContentLoadedInitDone']){this.counter.restart=false}
if(typeof doc['_'+'kssReadyForLoadEvent']!='undefined'){this.counter.restart=false}
if(this.autodetect&&this.counter.restart){if(doc.location.href=='about:blank'){return}
if(/KHTML|WebKit/i.test(navigator.userAgent)){if(/loaded|complete/.test(doc.readyState)){this.counter.restart=false}} else if(typeof doc.getElementsByTagName!='undefined'&&(doc.getElementsByTagName('body')[0]!=null||doc.body!=null)){this.counter.restart=false}}
if(!this.counter.restart){doc['_'+'embeddedContentLoadedInitDone']=true;this.func()}};this.initialize.apply(this,arguments)};dom.getNsTags=function(dom_obj,tagName){tags=dom_obj.getElementsByTagName(tagName);return tags};var _hasClassName=function(node,class_name){return new RegExp('\\b'+class_name+'\\b').test(node.className)};dom.addClassName=function(node,class_name){if(!node.className){node.className=class_name} else if(!_hasClassName(node,class_name)){var className=node.className+" "+class_name;node.className=className.split(/\s+/).join(' ')}};dom.removeClassName=function(node,class_name){var className=node.className;if(className){className=className.replace(new RegExp('\\b'+class_name+'\\b'),'');className=className.replace(/\s+/g,' ');node.className=className.replace(/\s+$/g,'')}};dom.createCookie=function(name,value,days){if(days){var date=new Date();date.setTime(date.getTime()+(days * 24 * 60 * 60 * 1000));var expires="; expires="+date.toGMTString()}
else var expires="";document.cookie=name+"="+value+expires+"; path=/"};dom.readCookie=kukit.readCookie;dom.eraseCookie=function(name){createCookie(name,"",-1)}}();kukit.cr=new function(){var cr=this;var _CommandRegistry=function(){this.initialize=function(){this.commands={}};this.registerFromAction=function(srcname,factory,name){if(typeof(name)=='undefined'){name=srcname}
var f=kukit.actionsGlobalRegistry.get(srcname);factory(name,f)};this.register=function(name,klass){if(this.commands[name]){return}
this.commands[name]=klass};this.get=function(name){var klass=this.commands[name];return klass};this.initialize.apply(this,arguments)};kukit.commandsGlobalRegistry=new _CommandRegistry();cr.commandRegistry={};cr.commandRegistry.registerFromAction=function(srcname,factory,name){kukit.commandsGlobalRegistry.registerFromAction(srcname,factory,name)};cr.makeCommand=function(selector,name,type,parms,transport){var commandClass=kukit.commandsGlobalRegistry.get(name);var command=new commandClass();command.selector=selector;command.name=name;command.selectorType=type;command.parms=parms;command.transport=transport;return command};var _executeCommand=function(oper){var newoper=oper.clone({'parms':this.parms,'orignode':oper.node,'node':null});this.executeOnScope(newoper)};var _executeCommandOnSelector=function(oper){var selectorType=this.selectorType||kukit.selectorTypesGlobalRegistry.defaultSelectorType;var providerClass=kukit.pprovidersGlobalRegistry.get(selectorType);if(providerClass.prototype.returnType!='selection'){kukit.E='Undefined selector type ['+selectorType+'], ';kukit.E='it exists as provider but it does not return a selection.';throw new Error(kukit.E)}
var provider=new providerClass();var args=[this.selector];var nodes=provider.eval(args,oper.orignode,{});for(var i=0;i<nodes.length;i++){oper.node=nodes[i];this.executeOnSingleNode(oper)}};cr.makeSelectorCommand=function(name,executeOnSingleNode){var commandClass=function(){this.execute=_executeCommand;this.executeOnScope=_executeCommandOnSelector;this.executeOnSingleNode=executeOnSingleNode};kukit.commandsGlobalRegistry.register(name,commandClass)};cr.makeGlobalCommand=function(name,executeOnce){var commandClass=function(){this.execute=_executeCommand;this.executeOnScope=executeOnce;this.executeOnSingleNode=executeOnce};kukit.commandsGlobalRegistry.register(name,commandClass)}}();kukit.sa=new function(){var sa=this;sa.ServerActionBase=function(){this.initialize=function(name,oper){this.oper=oper;this.url=oper.kssParms.kssUrl;if(typeof(this.url)=='undefined'){this.url=name}
this.url=this.calculateAbsoluteURL(this.url);this.notifyServer()};this.calculateAbsoluteURL=function(url){if(url.match(RegExp("/^https?:\/\//"))){return url}
var absoluteMatch=url.match(RegExp(/^(\/)(.*)/));var path=kukit.engine.baseUrl;if(absoluteMatch){var base=path.match(RegExp(/^(.*:\/\/[^\/]*)(\/?)/))[1];url=base+url;return url}
if(!path.match(RegExp("/$"))){path+='/'}
url=path+url;return url};this.notifyServer=function(){var self=this;var sendHook=function(queueItem){self.oper.queueItem=queueItem;self.reallyNotifyServer()};var timeoutHook=function(queueItem){self.oper.queueItem=queueItem;self.processError('timeout')};kukit.engine.requestManager.notifyServer(sendHook,this.url,timeoutHook)};this.reallyNotifyServer=function(){var domDoc=new XMLHttpRequest();var self=this;var notifyServer_done=function(){self.notifyServer_done(domDoc)};var query=new kukit.fo.FormQuery();for(var key in this.oper.parms){query.appendElem(key,this.oper.parms[key])}
var submitForm=this.oper.kssParms.kssSubmitForm;if(submitForm){for(var i=0;i<submitForm.length;i++){var item=submitForm[i];query.appendElem(item[0],item[1])}}
var encoded=query.encode();var ts=new Date().getTime();var tsurl=this.url+"?kukitTimeStamp="+ts;domDoc.open("POST",tsurl,true);domDoc.onreadystatechange=notifyServer_done;domDoc.setRequestHeader("Content-Type","application/x-www-form-urlencoded");domDoc.send(encoded)};this.notifyServer_done=function(domDoc){if(domDoc.readyState==4){var success=this.oper.queueItem.receivedResult();if(success){try{this.processResult(domDoc)} catch(e){if(e.name=='ResponseParsingError'){this.processError(kukit.E)} else if(e.name=='ExplicitError'){this.processError(e.info.kw.errorcommand)} else{throw e}}}}};this.processResult=function(domDoc){var dom;var commandstags=[];if(domDoc.responseXML){dom=domDoc.responseXML;commandstags=kukit.dom.getNsTags(dom,'commands');if(commandstags.length!=1){dom=null}}
if(dom==null){var payload=domDoc.getResponseHeader('X-KSSCOMMANDS');if(payload){try{dom=(new DOMParser()).parseFromString(payload,"text/xml")} catch(e){throw kukit.err.responseParsingError(kukit.E)}
commandstags=kukit.dom.getNsTags(dom,'commands');if(commandstags.length!=1){dom=null}} else{throw kukit.err.responseParsingError(kukit.E)}};if(dom==null){throw kukit.err.responseParsingError(msg)}
var commands=kukit.dom.getNsTags(dom,'command');if(commands.length==0){return}
var command_processor=new kukit.cp.CommandProcessor();command_processor.parseCommands(commands,domDoc);kukit.engine.beginSetupEventsCollection();command_processor.executeCommands(this.oper);kukit.engine.finishSetupEventsCollection()};this.processError=function(errorcommand){var error_action=null;if(this.oper.eventRule){var error_action=this.oper.eventRule.actions.getErrorActionFor(this.oper.action)}
if(error_action){error_action.execute(this.oper)} else{}}};sa.ServerAction=function(){this.initialize.apply(this,arguments)};sa.ServerAction.prototype=new sa.ServerActionBase()}();kukit.rm=new function(){var rm=this;rm._rid=0;var _RequestItem=function(){this.initialize=function(sendHook,url,timeoutHook,timeout,now){if(typeof(now)=='undefined'){now=(new Date()).valueOf()}
this.sent=now;this.expire=now+timeout;this.handled=false;this.sendHook=sendHook;this.url=url;this.timeoutHook=timeoutHook;this.rid=rm._rid;rm._rid++;if(rm._rid>=10000000000){rm._rid=0}};this.callTimeoutHook=function(){if(this.timeoutHook){this.timeoutHook(this)}};this.setReceivedCallback=function(func){this._receivedCallback=func};this.receivedResult=function(now){var result=this._receivedCallback(this,now);this._receivedCallback=null;return result};this.initialize.apply(this,arguments)};rm.TestRequestItem=function(){kukit.logWarning('Use class [rm.TestRequestItem] only in tests !');this.initialize.apply(this,arguments)};rm.TestRequestItem.prototype=new _RequestItem();var _TimerQueue=function(){this.initialize=function(callback){this.callback=callback;this.queue=new kukit.ut.SortedQueue(this._sentSort);this.count=0};this._sentSort=function(a,b){if(a.expire<b.expire) return-1;else if(a.expire>b.expire) return+1;else return 0};this.push=function(item){this.queue.push(item);this.count+=1};this.pop=function(item){if(typeof(item)=='undefined'||item.handled){return false} else{item.handled=true;this.count-=1;return true}};this.handleExpiration=function(now){if(typeof(now)=='undefined'){now=(new Date()).valueOf()}
var to;for(to=0;to<this.queue.size();to++){var item=this.queue.get(to);if(!item.handled){if(item.expire>now){break} else{item.handled=true;this.count-=1;this.callback(item)}}}
this.queue.popn(to);var front=this.queue.front();var next_expire=null;if(front){next_expire=front.expire}
return next_expire};this.initialize.apply(this,arguments)};rm.TestTimerQueue=function(){kukit.logWarning('Use class [rm.TestTimerQueue] only in tests !');this.initialize.apply(this,arguments)};rm.TestTimerQueue.prototype=new _TimerQueue();rm.RequestManager=function(){this.initialize=function(name,maxNr,schedulerClass){this.waitingQueue=new kukit.ut.FifoQueue();this.sentNr=0;var self=this;var timeoutItem=function(item){self.timeoutItem(item)};this.timerQueue=new _TimerQueue(timeoutItem);if(typeof(name)=='undefined'){name=null}
this.name=name;var nameString='';if(name!=null){nameString='['+name+'] '}
this.nameString=nameString;if(typeof(maxNr)=='undefined'||maxNr==null){maxNr=4}
this.maxNr=maxNr;var checkTimeout=function(){self.checkTimeout()};if(typeof(schedulerClass)=='undefined'){schedulerClass=kukit.ut.Scheduler}
this.timeoutScheduler=new schedulerClass(checkTimeout);this.spinnerEvents={'off':[],'on':[]};this.spinnerState=false;this.sendingTimeout=8000};this.setSpinnerState=function(newState){if(this.spinnerState!=newState){this.spinnerState=newState;var events=this.spinnerEvents[newState?'on':'off'];for(var i=0;i<events.length;i++){events[i]()}}};this.pushWaitingRequest=function(item,now){this.waitingQueue.push(item);this.checkTimeout(now)};this.popWaitingRequest=function(){var q=this.waitingQueue;while(!q.empty()&&q.front().handled){q.pop()}
if(!q.empty()){return q.pop()} else{return null}};this.pushSentRequest=function(item,now){this.sentNr+=1;this.setSpinnerState(true);this.checkTimeout(now);var self=this;var func=function(item,now){return self.receiveItem(item,now)};item.setReceivedCallback(func);item.sendHook(item)};this.checkTimeout=function(now){var nextWake=this.timerQueue.handleExpiration(now);if(nextWake){nextWake+=50} else{this.setSpinnerState(false)}
this.timeoutScheduler.setNextWakeAtLeast(nextWake)};this.popSentRequest=function(item){var success=this.timerQueue.pop(item);this.sentNr-=1;return success};this.isSentRequestQueueFull=function(){return(this.sentNr>=this.maxNr)};this.receivedResult=function(item,now){var success=this.popSentRequest(item);var waiting=this.popWaitingRequest();if(waiting!=null){this.pushSentRequest(waiting,now)} else{this.setSpinnerState(false)}
return success};this.receiveItem=function(item,now){var success=this.receivedResult(item,now);return success};this.timeoutItem=function(item){item.callTimeoutHook()};this.notifyServer=function(sendHook,url,timeoutHook,timeout,now){if(typeof(timeout)=='undefined'){timeout=this.sendingTimeout}
var item=new _RequestItem(sendHook,url,timeoutHook,timeout,now);this.timerQueue.push(item);if(!this.isSentRequestQueueFull()){this.pushSentRequest(item,now)} else{this.pushWaitingRequest(item,now)}};this.registerSpinnerEvent=function(func,state){this.spinnerEvents[state?'on':'off'].push(func)};this.initialize.apply(this,arguments)}}();kukit.cp=new function(){var cp=this;cp.CommandProcessor=function(){this.initialize=function(){this.commands=new Array()};this.parseCommands=function(commands,transport){for(var y=0;y<commands.length;y++){var command=commands[y];this.parseCommand(command,transport);var lastcommand=this.commands[this.commands.length-1];if(lastcommand.name=='error'){throw kukit.err.explicitError(lastcommand)}}};this.parseCommand=function(command,transport){var selector="";var params={};var name="";selector=command.getAttribute("selector");name=command.getAttribute("name");type=command.getAttribute("selectorType");if(name==null)
name="";var childNodes=command.childNodes;for(var n=0;n<childNodes.length;n++){var childNode=childNodes[n];if(childNode.nodeType!=1)
continue;if(childNode.localName){if(childNode.localName.toLowerCase()!="param"){throw new Error('Bad payload, expected param')}} else{if(childNode.nodeName.toLowerCase()!="param"){throw new Error('Bad payload, expected param (IE)')}}
var data=childNode.getAttribute('name');if(data!=null){var childCount=childNode.childNodes.length;var result;if(childCount==0){result=''} else{result=childNode.firstChild.nodeValue}
params[data]=result} else{throw new Error('Bad payload, expected attribute "name"')}}
var command=new kukit.cr.makeCommand(selector,name,type,params,transport);this.addCommand(command)};this.addCommand=function(command){this.commands[this.commands.length]=command};this.executeCommands=function(oper){if(typeof(oper)=='undefined'||oper==null){oper=new kukit.op.Oper()}
var commands=this.commands;for(var y=0;y<commands.length;y++){var command=commands[y];command.execute(oper)}};this.initialize.apply(this,arguments)}}();kukit.sr=new function(){var sr=this;sr.pproviderSelRegistry=new kukit.pr.ValueProviderRegistry();var _AnyPP=function(){this.check=function(args){};this.eval=function(args,node,defaultParameters){var f=kukit.selectorTypesGlobalRegistry.get(this.selector_type);return f(args[0],node,defaultParameters,node)}};sr.pproviderSelRegistry.register('',_AnyPP);sr.makeAnyPP=function(selector_type){var pp=function(){};pp.prototype=new _AnyPP();pp.prototype.selector_type=selector_type;return pp};var _PassnodePP=function(){this.check=function(args){};this.eval=function(args,node,defaultParameters){var value=defaultParameters[args[0]];if(typeof(value)=='undefined'){throw new Error(kukit.E)}
nodes=[value];return nodes}};sr.pproviderSelRegistry.register('passnode',_PassnodePP,'selection');var _SelectorTypeRegistry=function(){this.initialize=function(){this.mapping={}};this.register=function(name,func){if(typeof(func)=='undefined'){throw new Error('Func is mandatory.')}
this.mapping[name]=func;var pp=sr.makeAnyPP(name);kukit.pprovidersGlobalRegistry.register(name,pp,'selection')};this.get=function(name){if(!name){name=this.defaultSelectorType}
var result=this.mapping[name];return result};this.initialize.apply(this,arguments)};_SelectorTypeRegistry.prototype.defaultSelectorType='css';kukit.selectorTypesGlobalRegistry=new _SelectorTypeRegistry();kukit.selectorTypesGlobalRegistry.register('htmlid', function(expr,node){var nodes=[];var node=document.getElementById(expr);if(node){nodes.push(node)}
return nodes});kukit.selectorTypesGlobalRegistry.register('css', function(expr,node){var nodes=kukit.dom.cssQuery(expr);return nodes});kukit.selectorTypesGlobalRegistry.register('samenode', function(expr,node){nodes=[node];return nodes});kukit.selectorTypesGlobalRegistry.register('parentnode', function(expr,node){var selectednodes=kukit.dom.cssQuery(expr);var parentnodes=[];var parentnode=node.parentNode;while(parentnode.parentNode){parentnodes.push(parentnode);parentnode=parentnode.parentNode}
var results=[];for(var i=0;i<selectednodes.length;i++){var inchain=false;for(var j=0;j<parentnodes.length;j++){if(selectednodes[i]===parentnodes[j]){inchain=true}}
if(inchain){results.push(selectednodes[i])}}
return results})}();kukit.fo=new function(){var fo=this;var _dictPrefix='';var _dictSeparator='.';var _dictPostfix=':record';var _FormQueryElem=function(){this.initialize=function(name,value){this.name=name;this.value=value};this.encode=function(){return this.name+"="+encodeURIComponent(this.value)};this.initialize.apply(this,arguments)};fo.FormQuery=function(){this.initialize=function(){this.l=[]};this.appendElem=function(name,value){if(value==null){}
else if(typeof(value)=='string'){var elem=new _FormQueryElem(name,value);this.l.push(elem)}
else if(typeof(value)=='object'&&typeof(value.length)=='number'&&typeof(value.pop)=='function'){for(var i=0;i<value.length;i++){var elem=new _FormQueryElem(name,value[i]);this.l.push(elem)}}
else if(typeof(value)=='object'){for(var key in value){var qkey=_dictPrefix+name+_dictSeparator;qkey+=key+_dictPostfix;var elem=new _FormQueryElem(qkey,value[key]);this.l.push(elem)}}};this.encode=function(){var poster=[];for(var i=0;i<this.l.length;i++){poster[poster.length]=this.l[i].encode()}
return poster.join("&")};this.toDict=function(){var d={};for(var i=0;i<this.l.length;i++){var elem=this.l[i];d[elem.name]=elem.value}
return d};this.initialize.apply(this,arguments)};var findContainer=function(node,func){while(node!=null){if(func(node)){return node}
node=node.parentNode}
return null};fo.CurrentFormLocator=function(){this.initialize=function(target){this.target=target};this.queryForm=function(){return findContainer(this.target, function(node){if(!node.nodeName){return false}
if(node.nodeName.toLowerCase()=="form"){return true} else{return false}})};this.getForm=function(){var form=this.queryForm();if(!form){return null}
return form};this.initialize.apply(this,arguments)};fo.NamedFormLocator=function(){this.initialize=function(formname){this.formname=formname};this.queryForm=function(){return document.forms[this.formname]};this.initialize.apply(this,arguments)};fo.NamedFormLocator.prototype=new fo.CurrentFormLocator();fo.getValueOfFormElement=function(element){this.fieldUpdateRegistry.doUpdate(element);if(element.disabled){return null}
if(element.selectedIndex!=undefined){if(!element.multiple){if(element.selectedIndex<0){value=""} else{var option=element.options[element.selectedIndex];value=option.value}} else{var value=[];for(i=0;i<element.options.length;i++){var option=element.options[i];if(option.selected){value.push(option.value)}}}} else if(typeof element.length!='undefined'&&((typeof element[0]!='undefined'&&element[0].type=="radio")||(typeof element.item(0)!='undefined'&&element.item(0).type=="radio"))){var radioList=element;value=null;for(var i=0;i<radioList.length;i++){var radio=radioList[i]||radioList.item(i);if(radio.checked){value=radio.value}}} else if(element.type=="radio"||element.type=="checkbox"){if(element.checked){value=element.value} else{value=null}} else if((element.tagName.toLowerCase()=='textarea')||(element.tagName.toLowerCase()=='input'&&element.type!='submit'&&element.type!='reset')){value=element.value} else{value=null}
return value};fo.getFormVar=function(locator,name){var form=locator.getForm();if(!form)
return null;var value=null;var element=form[name];if(element){var value=fo.getValueOfFormElement(element)}
return value};fo.getAllFormVars=function(locator,collector){var form=locator.getForm();if(!form)
return collector.result;var elements=form.elements;for(var y=0;y<elements.length;y++){var element=elements[y];var value=fo.getValueOfFormElement(element);if(value!=null){collector.add(element.name,value)}}
return collector.result};var _FieldUpdateRegistry=function(){this.initialize=function(){this.editors={}};this.register=function(node,editor){var hash=kukit.rd.hashNode(node);if(typeof(this.editors[hash])!='undefined'){throw new Error(kukit.E)}
this.editors[hash]=editor;editor.doInit()};this.doUpdate=function(node){var hash=kukit.rd.hashNode(node);var editor=this.editors[hash];if(typeof(editor)!='undefined'){editor.doUpdate(node)}};this.initialize.apply(this,arguments)};this.fieldUpdateRegistry=new _FieldUpdateRegistry();var _FormValueProvider=function(){this.check=function(args){};this.eval=function(args,node){var locator=new fo.NamedFormLocator(args[0]);var collector=new kukit.ut.TupleCollector();return fo.getAllFormVars(locator,collector)}};kukit.pprovidersGlobalRegistry.register('form',_FormValueProvider,'formquery');var _CurrentFormValueProvider=function(){this.check=function(args){};this.eval=function(args,node){var locator=new fo.CurrentFormLocator(node);var collector=new kukit.ut.TupleCollector();return fo.getAllFormVars(locator,collector)}};kukit.pprovidersGlobalRegistry.register('currentForm',_CurrentFormValueProvider,'formquery');fo.getCurrentForm=function(target){return new fo.CurrentFormLocator(target).getForm()};fo.getFormVarFromCurrentForm=function(target,name){return fo.getFormVar(new fo.CurrentFormLocator(target),name)};fo.getFormVarFromNamedForm=function(formname,name){return fo.getFormVar(new fo.NamedFormLocator(formname),name)};fo.getAllFormVarsFromCurrentForm=function(target){return fo.getAllFormVars(new fo.CurrentFormLocator(target),new kukit.ut.DictCollector())};fo.getAllFormVarsFromNamedForm=function(formname){return fo.getAllFormVars(new fo.NamedFormLocator(formname),new kukit.ut.DictCollector())}}();kukit.pl=new function(){var pl=this;pl.getTargetForBrowserEvent=function(e){if(!e) var e=window.event;var target=null;if(e.target){target=e.target} else if(e.srcElement){target=e.srcElement}
return target};pl.registerBrowserEvent=function(oper,filter,eventName){var func_to_bind=oper.makeExecuteActionsHook(filter);if(!eventName)
eventName=oper.getEventName();var func=function(e){var target=pl.getTargetForBrowserEvent(e);if(oper.parms.allowbubbling||target==oper.node){var exc;var success;try{success=func_to_bind({'browserevent':e})} catch(exc1){exc=exc1}
if(success||exc){if(oper.parms.preventdefault){if(e.preventDefault)
e.preventDefault();try{e.returnValue=false} catch(exc2){}}
if(oper.parms.preventbubbling){if(!e) var e=window.event;e.cancelBubble=true;if(e.stopPropagation) e.stopPropagation()}}
if(exc!=null){throw exc}}};kukit.ut.registerEventListener(oper.node,eventName,func);if(oper.parms.preventdefault&&kukit.HAVE_SAFARI&&(oper.parms.allowbubbling||eventName=='click'&&oper.node.tagName.toLowerCase()=='a')){oper.node.onclick=function cancelClickSafari(){return false}}};pl.NativeEventBinder=function(){this.__bind__node=function(name,func_to_bind,oper){this.__bind__(name,func_to_bind,oper)};this.__bind__nodeorwindow=function(name,func_to_bind,oper){if(oper.node==null){oper.node=window}
this.__bind__(name,func_to_bind,oper)};this.__bind__window=function(name,func_to_bind,oper){oper.node=window;this.__bind__(name,func_to_bind,oper)};this.__bind__nodeordocument=function(name,func_to_bind,oper){if(oper.node==null){oper.node=document}
this.__bind__(name,func_to_bind,oper)};this.__bind__=function(name,func_to_bind,oper){oper.evaluateParameters([],{'preventdefault':'','allowbubbling':'','preventbubbling':''});oper.evalBool('preventdefault');oper.evalBool('allowbubbling');oper.evalBool('preventbubbling');if(oper.parms.preventdefault){if(name!='click'){throw new Error(kukit.E)}}
pl.registerBrowserEvent(oper,null,name)};this.__bind_key__=function(name,func_to_bind,oper){oper.evaluateParameters([],{'preventdefault':'true','allowbubbling':'','preventbubbling':'','keycodes':''});oper.evalList('keycodes');oper.evalBool('preventdefault');oper.evalBool('allowbubbling');oper.evalBool('preventbubbling');var selected_keycodes_only=false;if(oper.parms.keycodes.length>0){var keycodes={};for(var i=0;i<oper.parms.keycodes.length;i++){var keyCode=oper.parms.keycodes[i];keycodes[keyCode]=true}
selected_keycodes_only=true}
var filter=function(oper){var keyCode=oper.browserevent.keyCode;if(keyCode==0){keyCode=oper.browserevent.charCode} else{if(keyCode>=65&&keyCode<=90&&oper.browserevent.shiftKey==false){keyCode=keyCode+32}}
if(keyCode){keyCode=keyCode.toString()} else{kukit.logWarning(keyCode);keyCode='0'}
kukit.log(keyCode);oper.defaultParameters={keycode:keyCode};if(selected_keycodes_only){if(keyCode=='0'){return false} else{return keycodes[keyCode]}} else{return true}};pl.registerBrowserEvent(oper,filter)}};pl.TimeoutEventBinder=function(){this.initialize=function(){this.counters={}};this.__bind__=function(name,func_to_bind,oper){oper.evaluateParameters(['delay'],{'repeat':'true'});oper.evalBool('repeat');var key=oper.eventRule.getIndex();if(!(oper.parms.repeat&&this.counters[key])){var f=function(){if(oper.node!=null&&!oper.node.parentNode){this.clear()} else{func_to_bind()}};var delay=oper.parms.delay;var repeat=oper.parms.repeat;var counter=new kukit.ut.TimerCounter(delay,f,repeat);this.counters[key]=counter;counter.start()}};this.initialize.apply(this,arguments)};pl.LoadEventBinder=function(){this.processParameters=function(oper,iload){if(!oper){return}
if(iload){oper.evaluateParameters(['autodetect'],{'initial':'true','insert':'true'});oper.evalBool('autodetect')} else{oper.evaluateParameters([],{'initial':'true','insert':'true'})}
oper.evalBool('initial');oper.evalBool('insert');var phase;if(oper.node==null){phase=1} else{phase=oper.node._kukitMark}
if(phase==1&&!oper.parms.initial){return}
if(phase==2&&!oper.parms.insert){return}
return oper};this.__bind__=function(opers_by_eventName){var loadoper=opers_by_eventName.load;var iloadoper=opers_by_eventName.iload;loadoper=this.processParameters(loadoper);iloadoper=this.processParameters(iloadoper,true);var anyoper=loadoper||iloadoper;if(!anyoper){return}
if(anyoper.node!=null&&anyoper.node.tagName.toLowerCase()=='iframe'){if(loadoper&&!iloadoper){iloadoper=loadoper;loadoper=null;iloadoper.parms.autodetect=false}} else{if(iloadoper){throw new Error(kukit.E)}}
if(loadoper){var func_to_bind=loadoper.makeExecuteActionsHook();var remark='';kukit.engine.bindScheduler.addPost(func_to_bind,remark)}
if(iloadoper){var phase=iloadoper.node._kukitMark;if(phase==2||(phase==1&&kukit.engine.initializedOnDOMLoad)){var g=function(){var f=function(){var func_to_bind=iloadoper.makeExecuteActionsHook();var remark='';kukit.engine.bindScheduler.addPost(func_to_bind,remark)};new kukit.dom.EmbeddedContentLoadedScheduler(iloadoper.node.id,f,iloadoper.parms.autodetect)};var remark='';kukit.engine.bindScheduler.addPost(g,remark)} else{var func_to_bind=iloadoper.makeExecuteActionsHook();var remark='';kukit.engine.bindScheduler.addPost(func_to_bind,remark)}}}};pl.SpinnerEventBinder=function(){this.initialize=function(){this.state=false;var self=this;var _timeoutSetState=function(spinnerevent){self.timeoutSetState(spinnerevent)};this.scheduler=new kukit.ut.Scheduler(_timeoutSetState)};this.__bind__=function(name,func_to_bind,oper){oper.evaluateParameters([],{'laziness':0});oper.evalInt('laziness');var state_to_bind=(name=='spinneron');var self=this;var func=function(){self.setState(func_to_bind,state_to_bind,oper.parms.laziness)};kukit.engine.requestManager.registerSpinnerEvent(func,state_to_bind)};this.setState=function(func_to_bind,state,laziness){this.func_to_bind=func_to_bind;this.state=state;var now=(new Date()).valueOf();var wakeUp=now+laziness;this.scheduler.setNextWakeAtLeast(wakeUp)};this.timeoutSetState=function(){var func=this.func_to_bind;func()};this.initialize.apply(this,arguments)}}();kukit.eventsGlobalRegistry.register(null,'blur',kukit.pl.NativeEventBinder,'__bind__nodeorwindow',null);kukit.eventsGlobalRegistry.register(null,'focus',kukit.pl.NativeEventBinder,'__bind__nodeorwindow',null);kukit.eventsGlobalRegistry.register(null,'resize',kukit.pl.NativeEventBinder,'__bind__nodeorwindow',null);kukit.eventsGlobalRegistry.register(null,'click',kukit.pl.NativeEventBinder,'__bind__nodeordocument',null);kukit.eventsGlobalRegistry.register(null,'dblclick',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'mousedown',kukit.pl.NativeEventBinder,'__bind__nodeordocument',null);kukit.eventsGlobalRegistry.register(null,'mouseup',kukit.pl.NativeEventBinder,'__bind__nodeordocument',null);kukit.eventsGlobalRegistry.register(null,'mousemove',kukit.pl.NativeEventBinder,'__bind__nodeordocument',null);kukit.eventsGlobalRegistry.register(null,'mouseover',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'mouseout',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'change',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'reset',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'select',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'submit',kukit.pl.NativeEventBinder,'__bind__node',null);kukit.eventsGlobalRegistry.register(null,'keydown',kukit.pl.NativeEventBinder,'__bind_key__',null);kukit.eventsGlobalRegistry.register(null,'keypress',kukit.pl.NativeEventBinder,'__bind_key__',null);kukit.eventsGlobalRegistry.register(null,'keyup',kukit.pl.NativeEventBinder,'__bind_key__',null);kukit.eventsGlobalRegistry.register(null,'timeout',kukit.pl.TimeoutEventBinder,'__bind__',null);kukit.eventsGlobalRegistry.registerForAllEvents(null,['load','iload'],kukit.pl.LoadEventBinder,'__bind__',null,'Node');kukit.eventsGlobalRegistry.register(null,'spinneron',kukit.pl.SpinnerEventBinder,'__bind__',null);kukit.eventsGlobalRegistry.register(null,'spinneroff',kukit.pl.SpinnerEventBinder,'__bind__',null);kukit.actionsGlobalRegistry.register('error', function(oper){throw new Error('The builtin error action should never execute.')});kukit.commandsGlobalRegistry.registerFromAction('error',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('logDebug', function(oper){var name='[logDebug] action';oper.evaluateParameters([],{'message':'[logDebug] action'},name);var message=oper.parms.message;kukit.logDebug(message)});kukit.commandsGlobalRegistry.registerFromAction('logDebug',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('log', function(oper){oper.evaluateParameters([],{'message':'Log action'},'log action');var message=oper.parms.message;kukit.log(message)});kukit.commandsGlobalRegistry.registerFromAction('log',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('alert', function(oper){oper.evaluateParameters([],{'message':'Alert action'},'alert action');var message=oper.parms.message;alert(message)});kukit.commandsGlobalRegistry.registerFromAction('alert',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('replaceInnerHTML', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var node=oper.node;node.innerHTML=oper.parms.html;var insertedNodes=[];for(var i=0;i<node.childNodes.length;i++){insertedNodes.push(node.childNodes[i])}
if(oper.parms.withKssSetup){kukit.engine.setupEvents(insertedNodes)}});kukit.commandsGlobalRegistry.registerFromAction('replaceInnerHTML',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('replaceHTML', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var node=oper.node;var elements=kukit.dom.parseHTMLNodes(oper.parms.html);var length=elements.length;if(length>0){var parentNode=node.parentNode;var insertedNodes=[];var next=elements[length-1];parentNode.replaceChild(next,node);insertedNodes.push(next);for(var i=length-2;i>=0;i--){var inserted=parentNode.insertBefore(elements[i],next);insertedNodes.push(inserted);next=inserted}
if(oper.parms.withKssSetup){kukit.engine.setupEvents(insertedNodes)}}});kukit.commandsGlobalRegistry.registerFromAction('replaceHTML',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('setAttribute', function(oper){oper.evaluateParameters(['name','value'],{});if(oper.parms.name.toLowerCase()=='style'){throw new Error(kukit.E)}
kukit.dom.setAttribute(oper.node,oper.parms.name,oper.parms.value)});kukit.commandsGlobalRegistry.registerFromAction('setAttribute',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('setKssAttribute', function(oper){oper.evaluateParameters(['name','value'],{});kukit.dom.setKssAttribute(oper.node,oper.parms.name,oper.parms.value)});kukit.commandsGlobalRegistry.registerFromAction('setKssAttribute',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('setStyle', function(oper){oper.evaluateParameters(['name','value'],{});oper.node.style[oper.parms.name]=oper.parms.value});kukit.commandsGlobalRegistry.registerFromAction('setStyle',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('addClass', function(oper){oper.evaluateParameters(['value'],{});kukit.dom.addClassName(oper.node,oper.parms.value)});kukit.commandsGlobalRegistry.registerFromAction('addClass',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('removeClass', function(oper){oper.evaluateParameters(['value'],{});kukit.dom.removeClassName(oper.node,oper.parms.value)});kukit.commandsGlobalRegistry.registerFromAction('removeClass',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('insertHTMLAfter', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var content=kukit.dom.parseHTMLNodes(oper.parms.html);var parentNode=oper.node.parentNode;var toNode=kukit.dom.getNextSiblingTag(oper.node);if(toNode==null){kukit.dom.appendChildren(content,parentNode)} else{kukit.dom.insertBefore(content,parentNode,toNode)}
if(oper.parms.withKssSetup){kukit.engine.setupEvents(content)}});kukit.commandsGlobalRegistry.registerFromAction('insertHTMLAfter',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('insertHTMLBefore', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var content=kukit.dom.parseHTMLNodes(oper.parms.html);var toNode=oper.node;var parentNode=toNode.parentNode;kukit.dom.insertBefore(content,parentNode,toNode);if(oper.parms.withKssSetup){kukit.engine.setupEvents(content)}});kukit.commandsGlobalRegistry.registerFromAction('insertHTMLBefore',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('insertHTMLAsLastChild', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var content=kukit.dom.parseHTMLNodes(oper.parms.html);kukit.dom.appendChildren(content,oper.node);if(oper.parms.withKssSetup){kukit.engine.setupEvents(content)}});kukit.commandsGlobalRegistry.registerFromAction('insertHTMLAsLastChild',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('insertHTMLAsFirstChild', function(oper){oper.evaluateParameters(['html'],{'withKssSetup':true});oper.evalBool('withKssSetup');var content=kukit.dom.parseHTMLNodes(oper.parms.html);var parentNode=oper.node;var toNode=parentNode.firstChild;if(toNode==null){kukit.dom.appendChildren(content,parentNode)} else{kukit.dom.insertBefore(content,parentNode,toNode)}
if(oper.parms.withKssSetup){kukit.engine.setupEvents(content)}});kukit.commandsGlobalRegistry.registerFromAction('insertHTMLAsFirstChild',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('deleteNodeAfter', function(oper){var parentNode=oper.node.parentNode;var toNode=kukit.dom.getNextSiblingTag(oper.node);if(toNode!=null){parentNode.removeChild(toNode)}});kukit.commandsGlobalRegistry.registerFromAction('deleteNodeAfter',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('deleteNodeBefore', function(oper){var parentNode=oper.node.parentNode;var toNode=kukit.dom.getPreviousSiblingTag(oper.node);parentNode.removeChild(toNode)});kukit.commandsGlobalRegistry.registerFromAction('deleteNodeBefore',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('deleteNode', function(oper){var parentNode=oper.node.parentNode;parentNode.removeChild(oper.node)});kukit.commandsGlobalRegistry.registerFromAction('deleteNode',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('clearChildNodes', function(oper){oper.evaluateParameters([],{'none':false});kukit.dom.clearChildNodes(oper.node)});kukit.commandsGlobalRegistry.registerFromAction('clearChildNodes',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('focus', function(oper){oper.evaluateParameters([],{'none':false});kukit.dom.focus(oper.node)});kukit.commandsGlobalRegistry.registerFromAction('focus',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('blur', function(oper){oper.evaluateParameters([],{'none':false});kukit.dom.blur(oper.node)});kukit.commandsGlobalRegistry.registerFromAction('blur',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('moveNodeAfter', function(oper){var node=oper.node;var parentNode=node.parentNode;parentNode.removeChild(node);var toNode=document.getElementById(oper.parms.html_id);var nextNode=kukit.dom.getNextSiblingTag(toNode);if(nextNode==null){toNode.parentNode.appendChild(node)} else{parentNode.insertBefore(node,nextNode)}});kukit.commandsGlobalRegistry.registerFromAction('moveNodeAfter',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('moveNodeBefore', function(oper){var node=oper.node;var toNode=document.getElementById(oper.parms.html_id);var parentNode=toNode.parentNode;parentNode.insertBefore(node,toNode)});kukit.commandsGlobalRegistry.registerFromAction('moveNodeBefore',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('moveNodeAsLastChild', function(oper){var node=oper.node;var parentNode=document.getElementById(oper.parms.html_id);parentNode.appendChild(node)});kukit.commandsGlobalRegistry.registerFromAction('moveNodeAsLastChild',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('copyChildNodesFrom', function(oper){var fromNode=document.getElementById(oper.parms.html_id);Sarissa.copyChildNodes(fromNode,oper.node)});kukit.commandsGlobalRegistry.registerFromAction('copyChildNodesFrom',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('copyChildNodesTo', function(oper){toNode=document.getElementById(oper.parms.html_id);Sarissa.copyChildNodes(oper.node,toNode)});kukit.commandsGlobalRegistry.registerFromAction('copyChildNodesTo',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('setStateVar', function(oper){kukit.engine.stateVariables[oper.parms.varname]=oper.parms.value});kukit.commandsGlobalRegistry.registerFromAction('setStateVar',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('continueEvent', function(oper){oper.evaluateParameters(['name'],{'allnodes':'false'},'',true);oper.evalBool('allnodes','continueEvent');var parms=oper.parms;var binder=oper.binder;var allNodes=parms.allnodes;var actionParameters={};for(var key in parms){if(key!='name'&&key!='allnodes'){actionParameters[key]=parms[key]}}
if(parms.allnodes){binder.continueEventAllNodes(parms.name,actionParameters)} else{binder.continueEvent(parms.name,oper.orignode,actionParameters)}});kukit.commandsGlobalRegistry.registerFromAction('continueEvent',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register('executeCommand', function(oper){oper.evaluateParameters(['name','selector'],{'selectorType':null},'',true);var parms=oper.parms;var actionParameters={};for(var key in parms){if(key!='name'&&key!='selector'&&key!='selectorType'){actionParameters[key]=parms[key]}}
var command=new kukit.cr.makeCommand(parms.selector,parms.name,parms.selectorType,actionParameters);command.execute(oper)});kukit.actionsGlobalRegistry.register('toggleClass', function(oper){kukit.actionsGlobalRegistry.BBB_classParms(oper);var node=oper.node;var className=oper.parms.value;var nodeclass=kukit.dom.getAttribute(node,'class');var classFoundAtIndex=-1;var parts=nodeclass.split(' ');for(var i=0;i<parts.length;i++){if(parts[i]==className){classFoundAtIndex=i}}
if(classFoundAtIndex==-1){parts.push(className)} else{parts.splice(classFoundAtIndex,1)}
kukit.dom.setAttribute(node,'class',parts.join(' '))});kukit.commandsGlobalRegistry.registerFromAction('toggleClass',kukit.cr.makeSelectorCommand);kukit.commandsGlobalRegistry.registerFromAction('replaceInnerHTML',kukit.cr.makeSelectorCommand,'setHtmlAsChild');kukit.commandsGlobalRegistry.registerFromAction('replaceHTML',kukit.cr.makeSelectorCommand,'replaceNode');kukit.commandsGlobalRegistry.registerFromAction('insertHTMLAfter',kukit.cr.makeSelectorCommand,'addAfter');kukit.commandsGlobalRegistry.registerFromAction('deleteNodeAfter',kukit.cr.makeSelectorCommand,'removeNextSibling');kukit.commandsGlobalRegistry.registerFromAction('deleteNodeBefore',kukit.cr.makeSelectorCommand,'removePreviousSibling');kukit.commandsGlobalRegistry.registerFromAction('deleteNode',kukit.cr.makeSelectorCommand,'removeNode');kukit.commandsGlobalRegistry.registerFromAction('clearChildNodes',kukit.cr.makeSelectorCommand,'clearChildren');kukit.commandsGlobalRegistry.registerFromAction('copyChildNodesFrom',kukit.cr.makeSelectorCommand,'copyChildrenFrom');kukit.commandsGlobalRegistry.registerFromAction('copyChildNodesTo',kukit.cr.makeSelectorCommand,'copyChildrenTo');kukit.commandsGlobalRegistry.registerFromAction('setStateVar',kukit.cr.makeGlobalCommand,'setStatevar');kukit.actionsGlobalRegistry.register('addClassName', function(oper){kukit.actionsGlobalRegistry.BBB_classParms(oper);kukit.actionsGlobalRegistry.get('addClass')(oper)});kukit.commandsGlobalRegistry.registerFromAction('addClassName',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register('removeClassName', function(oper){kukit.actionsGlobalRegistry.BBB_classParms(oper);kukit.actionsGlobalRegistry.get('removeClass')(oper)});kukit.commandsGlobalRegistry.registerFromAction('removeClassName',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.BBB_classParms=function(oper){var old;var has_old;if(typeof(oper.parms.className)!='undefined'){old=oper.parms.className;has_old=true}
if(typeof(oper.parms.name)!='undefined'){old=oper.parms.name;has_old=true}
if(has_old){if(typeof(oper.parms.value)=='undefined'){oper.parms={value:old}} else{oper.parms={}}}};(function(){var AlphaBinder=function(){this.counter=[50];this.customBind=function(name,func_to_bind,oper){oper.evaluateParameters([],{},'testbinderclasses event binding');var self=this;var filter=function(oper){oper.defaultParameters={counter:'['+self.counter[0]+']'};self.counter[0]++;return true}
kukit.pl.registerBrowserEvent(oper,filter,'click')};this._prepareExecuteActions=function(oper){}};kukit.eventsGlobalRegistry.register('testbinderclass','alphaone',AlphaBinder,'customBind',null);var BetaBinder=function(name,func_to_bind,oper){this.counter=[100]};BetaBinder.prototype=new AlphaBinder();kukit.eventsGlobalRegistry.register('testbinderclass','betaone',BetaBinder,'customBind',null);kukit.eventsGlobalRegistry.register('testbinderclass','betatwo',BetaBinder,'customBind',null)})();kukit.more_selectors={};kukit.more_selectors.AnnoyClickerEvent=function(){this.__bind_click__=function(name,func_to_bind,oper){oper.evaluateParameters([],{'count':'3'},'annoyClicker event binding');oper.evalInt('count','annoyClicker event binding');if(oper.parms.count<1)
throw 'Parameter count must be > 0, "'+oper.parms.count+'"';this.countsomuch=oper.parms.count;this.count=this.countsomuch;oper.parms={};kukit.pl.registerBrowserEvent(oper,null,'click')};this.__default_click__=function(name,oper){oper.evaluateParameters([],{},'annoyClicker event binding');this.count-=1;if(this.count==0){this.count=this.countsomuch;this.continueEvent('doit',oper.node,{})} else{this.continueEvent('annoy',oper.node,{})}}};kukit.eventsGlobalRegistry.register('annoyclicker','click',kukit.more_selectors.AnnoyClickerEvent,'__bind_click__','__default_click__');kukit.eventsGlobalRegistry.register('annoyclicker','annoy',kukit.more_selectors.AnnoyClickerEvent,null,null);kukit.eventsGlobalRegistry.register('annoyclicker','doit',kukit.more_selectors.AnnoyClickerEvent,null,null);kukit.plone={};if(window.jq){jq(function(){kukit.log('KSS started by jQuery DOMLoad event.');kukit.bootstrapFromDOMLoad()})}
kukit.actionsGlobalRegistry.register("plone-initKupu", function(oper){kukit.logDebug('Enter plone-initKupu');oper.evaluateParameters([],{},'plone-initKupu action');if(oper.node.tagName.toLowerCase()!='iframe'){throw kukit.E}
var divnode=oper.node.parentNode.parentNode.parentNode.parentNode;var id=divnode.id;if(!id){throw kukit.E}
var prefix='#'+id+' ';var textarea=getFromSelector(prefix+'textarea.kupu-editor-textarea');kukit.fo.fieldUpdateRegistry.register(textarea,{editor:null,node:textarea,doInit: function(){kukit.log('Setup Kupu initialization on load event.');var self=this;initKupuOnLoad=function(){kukit.log('Initialize Kupu from onload event.');self.editor=initPloneKupu(id)};this.editor=initPloneKupu(id);jq(window).load(initKupuOnLoad)},doUpdate: function(){this.editor.saveDataToField(this.node.form,this.node);this.editor._initialized=true}});kukit.logDebug('plone-initKupu action done.')});kukit.commandsGlobalRegistry.registerFromAction('plone-initKupu',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-followLink", function(oper){oper.evaluateParameters([],{},'plone-followLink action');var url=oper.node.href;if(url.substr(0,7)=="http://"){window.location.replace(url)} else if(url.substr(0,13)=="javascript://"){eval(url.substr(13))}});kukit.commandsGlobalRegistry.registerFromAction('plone-followLink',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-submitCurrentForm", function(oper){oper.evaluateParameters([],{},'plone-submitCurrentForm action');window.onbeforeunload=null;var form=new kukit.fo.CurrentFormLocator(oper.node).getForm();form.submit()});kukit.commandsGlobalRegistry.registerFromAction('plone-submitCurrentForm',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-initFormTabs", function(oper){oper.evaluateParameters([],{},'plone-initFormTabs action');if(oper.node.tagName.toLowerCase()!='form'){throw kukit.E}
var form=oper.node;ploneFormTabbing.initializeForm(form)});kukit.commandsGlobalRegistry.registerFromAction('plone-initFormTabs',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-initFormProtection", function(oper){oper.evaluateParameters([],{},'plone-initFormProtection action');if(oper.node.tagName.toLowerCase()!='form'){throw kukit.E}
var form=oper.node;if(!window.onbeforeunload){window.onbeforeunload=new BeforeUnloadHandler().execute}
var tool=window.onbeforeunload.tool;tool.addForm(form)});kukit.commandsGlobalRegistry.registerFromAction('plone-initFormProtection',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-formProtectionCheck",
function(oper){oper.evaluateParameters([],{},'plone-formProtectionCheck action');var binderInfo=kukit.engine.binderInfoRegistry.getSingletonBinderInfoByName('plone','formProtectionChecked');var binderInstance=binderInfo.getBinderInstance();var message;if(window.onbeforeunload){var tool=window.onbeforeunload.tool;message=tool.execute()}
var result=true;if(message){var confirmMsg='Are you sure you want to navigate away from this';confirmMsg+=' page?\n\n'+message+'\n\nPress OK to continue,';confirmMsg+=' or Cancel to stay on the current page.';result=confirm(confirmMsg)}
if(result){var action='formProtectionChecked'} else{var action='formProtectionFailed'}
binderInstance.__continueEvent__(action,oper.node,{})});kukit.commandsGlobalRegistry.registerFromAction('plone-formProtectionCheck',kukit.cr.makeSelectorCommand);kukit.plone.FormProtectionCheckedEvents=function(){};kukit.plone.FormProtectionCheckedEvents.prototype.__default_failed__=function(name,oper){};kukit.eventsGlobalRegistry.register('plone','formProtectionChecked',kukit.plone.FormProtectionCheckedEvents,null,null);kukit.eventsGlobalRegistry.register('plone','formProtectionFailed',kukit.plone.FormProtectionCheckedEvents,null,'__default_failed__');kukit.actionsGlobalRegistry.register("plone-initLockingProtection",
function(oper){oper.evaluateParameters([],{},'plone-initLockingProtection action');if(oper.node.tagName.toLowerCase()!='form'){throw kukit.E}
plone.UnlockHandler.init()});kukit.commandsGlobalRegistry.registerFromAction('plone-initLockingProtection',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-removeLockProtection",
function(oper){oper.evaluateParameters([],{},'plone-removeLockProtection action');plone.UnlockHandler.cleanup()});kukit.commandsGlobalRegistry.registerFromAction('plone-removeLockProtection',kukit.cr.makeGlobalCommand);kukit.actionsGlobalRegistry.register("plone-initShiftDetection",
function(oper){oper.evaluateParameters([],{},'plone-initShiftDetection action');kukit.engine.stateVariables['plone-shiftdown']=false;jq(document).keydown(function(e){if(e.keyCode==16)
kukit.engine.stateVariables['plone-shiftdown']=true});jq(document).keyup(function(e){if(e.keyCode==16)
kukit.engine.stateVariables['plone-shiftdown']=false})});kukit.commandsGlobalRegistry.registerFromAction('plone-initShiftDetection',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-initCheckBoxSelection",
function(oper){oper.evaluateParameters([],{},'plone-initCheckBoxSelection action');kukit.engine.stateVariables['plone-foldercontents-firstcheckeditem']=null});kukit.commandsGlobalRegistry.registerFromAction('plone-initCheckBoxSelection',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-createCheckBoxSelection",
function(oper){var actionMsg='plone-createCheckBoxSelection action';oper.evaluateParameters(['group'],{},actionMsg);var node=oper.node;var firstItemVarName='plone-foldercontents-firstcheckeditem';var firstItem=kukit.engine.stateVariables[firstItemVarName];if(firstItem&&kukit.engine.stateVariables['plone-shiftdown']){var group=oper.parms.group;var allNodes=jq(group);var start=allNodes.index(firstItem);var end=allNodes.index(firstItem);if(start>end){var temp=start;start=end;end=temp}
allNodes.slice(start,end).attr('checked',firstItem.checked)}
else{kukit.engine.stateVariables[firstItemVarName]=node}});kukit.commandsGlobalRegistry.registerFromAction('plone-createCheckBoxSelection',kukit.cr.makeSelectorCommand);kukit.actionsGlobalRegistry.register("plone-initDragAndDrop",
function(oper){oper.evaluateParameters(['table'],{},'plone-initDragAndDrop action');var table=oper.parms.table;ploneDnDReorder.table=jq(table);if(!ploneDnDReorder.table.length)
return;ploneDnDReorder.rows=jq(table+" > tr,"+table+" > tbody > tr");jq(table+" > tr > td.draggable,"+table+" > tbody > tr > td.draggable").not('.notDraggable').mousedown(ploneDnDReorder.doDown).mouseup(ploneDnDReorder.doUp).addClass("draggingHook").html('::')});kukit.commandsGlobalRegistry.registerFromAction('plone-initDragAndDrop',kukit.cr.makeSelectorCommand);if(typeof(Effect)!="undefined"){kukit.HASEFFECTS=1} else{kukit.HASEFFECTS=0}
if(kukit.HASEFFECTS&&typeof(Effect.Transitions)!="undefined"){kukit.actionsGlobalRegistry.register("effect", function(oper){oper.evaluateParameters([],{'type':'fade'},'scriptaculous effect');var node=oper.node;if(oper.parms.type=='fade'){new Effect.Fade(node)} else if(oper.parms.type=='appear'){new Effect.Appear(node)} else if(oper.parms.type=='puff'){new Effect.Puff(node)} else if(oper.parms.type=='blinddown'){new Effect.BlindDown(node)} else if(oper.parms.type=='blindup'){new Effect.BlindUp(node)}});kukit.commandsGlobalRegistry.registerFromAction('effect',kukit.cr.makeSelectorCommand);this.$=function $(){var results=[],element;for(var i=0;i<arguments.length;i++){element=arguments[i];if(typeof element=='string')
element=document.getElementById(element);results.push(Element.extend(element))}
return results.length<2?results[0]:results}}
kukit.actionsGlobalRegistry.register("bindActionMenus", function(oper){initializeMenus();kukit.logDebug('Plone menus initialized')});kukit.log('Plone legacy [initializeMenus] action registered.');kukit.plonelegacy={};if(typeof(scanforlinks)=='undefined'){kukit.plonelegacy.bindExternalLinks=function(){}}
else{kukit.plonelegacy.bindExternalLinks=function(){scanforlinks()}}
kukit.actionsGlobalRegistry.register("bindExternalLinks", function(oper){kukit.plonelegacy.bindExternalLinks();kukit.logDebug('Plone external links bound.')});kukit.log('Plone legacy [bindExternalLinks] action registered.');kukit.actionsGlobalRegistry.register("initializeCollapsible", function(oper){activateCollapsibles()});kukit.log('Plone legacy [initializeCollapsible] action registered.');kukit.actionsGlobalRegistry.register("createTableOfContents", function(oper){createTableOfContents()});kukit.commandsGlobalRegistry.registerFromAction('createTableOfContents',kukit.cr.makeGlobalCommand);kukit.log('Plone [createTableOfContents] action registered.');kukit.actionsGlobalRegistry.register("plone-initFCKeditor", function(oper){oper.evaluateParameters([],{},'plone-initFCKeditor action');kukit.log('start the kss treatment');var fckContainer=oper.node;FCKeditor_OnComplete=function(editorInstance){kukit.log('attach events on standard base_edit form submit');editorInstance.Events.AttachEvent('OnAfterLinkedFieldUpdate',finalizePublication) ;var oField=editorInstance.LinkedField;oField.setAttribute('class','fcklinkedField');kukit.fo.fieldUpdateRegistry.register(oField,{editor:null,node:oField,doInit: function(){var self=this;Submit_inline=function(){oForm=new kukit.fo.CurrentFormLocator(self.node).getForm();Save_inline(oField.name,oForm,editorInstance)}
kukit.log('redefine the Save command to save content inline');editorInstance.Commands.GetCommand('Save').Execute=Submit_inline },doUpdate: function(){finalizePublication(editorInstance);kukit.log('update field when clicking on submit or saving inline')}})}
var fckContainerId=fckContainer.getAttribute('id');var inputname=fckContainerId.replace("_fckContainer","");kukit.logDebug('launch FCKEditor for field '+inputname);FCKeditor_Plone_start_instance(fckContainer,inputname);kukit.logDebug('plone-initFCKeditor action done.')});kukit.commandsGlobalRegistry.registerFromAction('plone-initFCKeditor',kukit.cr.makeSelectorCommand);

/* - fckeditor.js - */
// http://www.duwe-3d.eu/portal_javascripts/fckeditor.js?original=1
var FCKeditor=function(instanceName,width,height,toolbarSet,value){this.InstanceName=instanceName ;this.Width=width||'100%' ;this.Height=height||'200' ;this.ToolbarSet=toolbarSet||'Default' ;this.Value=value||'' ;this.BasePath=FCKeditor.BasePath ;this.CheckBrowser=true ;this.DisplayErrors=true ;this.Config=new Object() ;this.OnError=null }
FCKeditor.BasePath='/fckeditor/' ;FCKeditor.MinHeight=200 ;FCKeditor.MinWidth=750 ;FCKeditor.prototype.Version='2.6.3' ;FCKeditor.prototype.VersionBuild='19836' ;FCKeditor.prototype.Create=function(){document.write(this.CreateHtml()) }
FCKeditor.prototype.CreateHtml=function(){if(!this.InstanceName||this.InstanceName.length==0){this._ThrowError(701,'You must specify an instance name.') ;return '' }
var sHtml='' ;if(!this.CheckBrowser||this._IsCompatibleBrowser()){sHtml+='<input type="hidden" id="'+this.InstanceName+'" name="'+this.InstanceName+'" value="'+this._HTMLEncode(this.Value)+'" style="display:none" />' ;sHtml+=this._GetConfigHtml() ;sHtml+=this._GetIFrameHtml() }
else{var sWidth=this.Width.toString().indexOf('%')>0?this.Width:this.Width+'px' ;var sHeight=this.Height.toString().indexOf('%')>0?this.Height:this.Height+'px' ;sHtml+='<textarea name="'+this.InstanceName+'" rows="4" cols="40" style="width:'+sWidth+';height:'+sHeight ;if(this.TabIndex)
sHtml+='" tabindex="'+this.TabIndex ;sHtml+='">'+this._HTMLEncode(this.Value)+'<\/textarea>' }
return sHtml }
FCKeditor.prototype.ReplaceTextarea=function(){if(!this.CheckBrowser||this._IsCompatibleBrowser()){var oTextarea=document.getElementById(this.InstanceName) ;var colElementsByName=document.getElementsByName(this.InstanceName) ;var i=0;while(oTextarea||i==0){if(oTextarea&&oTextarea.tagName.toLowerCase()=='textarea')
break ;oTextarea=colElementsByName[i++] }
if(!oTextarea){alert('Error: The TEXTAREA with id or name set to "'+this.InstanceName+'" was not found') ;return }
oTextarea.style.display='none' ;if(oTextarea.tabIndex)
this.TabIndex=oTextarea.tabIndex ;this._InsertHtmlBefore(this._GetConfigHtml(),oTextarea) ;this._InsertHtmlBefore(this._GetIFrameHtml(),oTextarea) }}
FCKeditor.prototype._InsertHtmlBefore=function(html,element){if(element.insertAdjacentHTML)
element.insertAdjacentHTML('beforeBegin',html) ;else{var oRange=document.createRange() ;oRange.setStartBefore(element) ;var oFragment=oRange.createContextualFragment(html);element.parentNode.insertBefore(oFragment,element) }}
FCKeditor.prototype._GetConfigHtml=function(){var sConfig='' ;for(var o in this.Config){if(sConfig.length>0) sConfig+='&amp;' ;sConfig+=encodeURIComponent(o)+'='+encodeURIComponent(this.Config[o]) }
return '<input type="hidden" id="'+this.InstanceName+'___Config" value="'+sConfig+'" style="display:none" />' }
FCKeditor.prototype._GetIFrameHtml=function(){var sFile='fckeditor.html' ;try{if((/fcksource=true/i).test(window.top.location.search))
sFile='fckeditor.original.html' }
catch(e){}
var sLink=this.BasePath+'editor/'+sFile+'?InstanceName='+encodeURIComponent(this.InstanceName) ;if(this.ToolbarSet)
sLink+='&amp;Toolbar='+this.ToolbarSet ;html='<iframe id="'+this.InstanceName+'___Frame" src="'+sLink+'" width="'+this.Width+'" height="'+this.Height ;if(this.TabIndex)
html+='" tabindex="'+this.TabIndex ;html+='" frameborder="0" scrolling="no"></iframe>' ;return html }
FCKeditor.prototype._IsCompatibleBrowser=function(){return FCKeditor_IsCompatibleBrowser() }
FCKeditor.prototype._ThrowError=function(errorNumber,errorDescription){this.ErrorNumber=errorNumber ;this.ErrorDescription=errorDescription ;if(this.DisplayErrors){document.write('<div style="COLOR: #ff0000">') ;document.write('[ FCKeditor Error '+this.ErrorNumber+': '+this.ErrorDescription+' ]') ;document.write('</div>') }
if(typeof(this.OnError)=='function')
this.OnError(this,errorNumber,errorDescription) }
FCKeditor.prototype._HTMLEncode=function(text){if(typeof(text)!="string")
text=text.toString() ;text=text.replace(/&/g,"&amp;").replace(/"/g, "&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;") ;return text }
;(function(){var textareaToEditor=function(textarea){var editor=new FCKeditor(textarea.name) ;editor.Width=Math.max(textarea.offsetWidth,FCKeditor.MinWidth) ;editor.Height=Math.max(textarea.offsetHeight,FCKeditor.MinHeight) ;return editor }
FCKeditor.ReplaceAllTextareas=function(){var textareas=document.getElementsByTagName('textarea') ;for(var i=0 ;i<textareas.length ;i++){var editor=null ;var textarea=textareas[i] ;var name=textarea.name ;if(!name||name.length==0)
continue ;if(typeof arguments[0]=='string'){var classRegex=new RegExp('(?:^| )'+arguments[0]+'(?:$| )') ;if(!classRegex.test(textarea.className))
continue }
else if(typeof arguments[0]=='function'){editor=textareaToEditor(textarea) ;if(arguments[0](textarea,editor)===false)
continue }
if(!editor)
editor=textareaToEditor(textarea) ;editor.ReplaceTextarea() }}})() ;
function FCKeditor_IsCompatibleBrowser(){var sAgent=navigator.userAgent.toLowerCase() ;if(/*@cc_on!@*/false&&sAgent.indexOf("mac")==-1){var sBrowserVersion=navigator.appVersion.match(/MSIE (.\..)/)[1] ;return(sBrowserVersion>=5.5) }
if(navigator.product=="Gecko"&&navigator.productSub>=20030210&&!(typeof(opera)=='object'&&opera.postError))
return true ;if(window.opera&&window.opera.version&&parseFloat(window.opera.version())>=9.5)
return true ;if(sAgent.indexOf(' adobeair/')!=-1)
return(sAgent.match(/ adobeair\/(\d+)/ )[1] >= 1 ) ;	// Build must be at least v1
if(sAgent.indexOf(' applewebkit/')!=-1)
return(sAgent.match(/ applewebkit\/(\d+)/ )[1] >= 522 ) ;	// Build must be at least 522(v3)
return false }


/* - fck_plone.js - */
// http://www.duwe-3d.eu/portal_javascripts/fck_plone.js?original=1
var FCKBaseHref={};makeLinksRelative=function(basehref,contents){var base=basehref.replace('http://www.duwe-3d.eu','');var href=base.replace(/\/[^\/]*$/,'/');var hrefparts=href.split('/');return contents.replace(/(<[^>]* (?:src|href)=")([^"]*)"/g,
function(str,tag,url,offset,contents){url=url.replace('http://www.duwe-3d.eu','');if(url.substring(0,1)=='#'){str=tag+url+'"'}
else{var urlparts=url.split('#');var anchor=urlparts[1]||'';url=urlparts[0];var urlparts=url.split('/');var common=0;while(common<urlparts.length&&common<hrefparts.length&&urlparts[common]==hrefparts[common])
common++;var last=urlparts[common];if(common+1==urlparts.length&&last=='emptypage'){urlparts[common]=''}
if(common>0){var path=new Array();var i=0;for(;i+common<hrefparts.length-1;i++){path[i]='..'};while(common<urlparts.length){path[i++]=urlparts[common++]};if(i==0){path[i++]='.'}
str=path.join('/');if(anchor){str=[str,anchor].join('#')}
str=tag+str+'"'}}
return str})};finalizePublication=function(editorInstance){var oField=editorInstance.LinkedField;var fieldName=oField.name;var baseHref=FCKBaseHref[fieldName];if(baseHref){relativeLinksHtml=makeLinksRelative(FCKBaseHref[fieldName],editorInstance.GetXHTML());oField.value=relativeLinksHtml}}
getParamValue=function(id){value=document.getElementById(id).value;if(value=='true') return true;if(value=='false') return false;return value}
FCKeditor_Plone_start_instance=function(fckContainer,inputname){var inputContainer=document.getElementById(inputname+'_'+'cleaninput');if(inputContainer){var fckParams=['path_user','base_path','fck_basehref','links_basehref','input_url','allow_server_browsing','browser_root','allow_file_upload','allow_image_upload','allow_flash_upload','fck_skin_path','lang','fck_default_r2l','force_paste_as_text','allow_latin_entities','spellchecker','keyboard_entermode','keyboard_shiftentermode','fck_toolbar','editor_width','editor_height'];var fckValues={};for(var i=0;i<fckParams.length;i++){var id=inputname+'_'+fckParams [i];fckValues [fckParams [i]]=getParamValue(id)}
var oFck=new FCKeditor(inputname);var pathUser=fckValues ['path_user']+'/';oFck.BasePath=fckValues ['base_path']+'/';oFck.Config['CustomConfigurationsPath']=fckValues ['input_url']+'/fckconfigPlone.js?field_name='+inputname;oFck.BaseHref=fckValues ['fck_basehref'];FCKBaseHref[inputname]=fckValues ['links_basehref'];if(inputContainer.innerText!=undefined) oFck.Value=inputContainer.innerText;else oFck.Value=inputContainer.textContent;oFck.Config['LinkBrowser']=fckValues ['allow_server_browsing'];oFck.Config['LinkBrowserURL']=fckValues ['base_path']+'/fckbrowser/browser.html?field_name='+inputname+'&Connector='+fckValues ['input_url']+'/connectorPlone&ServerPath='+fckValues ['browser_root']+'&CurrentPath='+pathUser ;oFck.Config['LinkUpload']=fckValues ['allow_file_upload'] ;oFck.Config['LinkUploadURL']=fckValues ['input_url']+'/uploadPlone?field_name='+inputname+'&CurrentPath='+pathUser;oFck.Config['ImageBrowser']=fckValues ['allow_server_browsing'];oFck.Config['ImageBrowserURL']=fckValues ['base_path']+'/fckbrowser/browser.html?field_name='+inputname+'&Type=Image&Connector='+fckValues ['input_url']+'/connectorPlone&ServerPath='+fckValues ['browser_root']+'&CurrentPath='+pathUser ;oFck.Config['ImageUpload']=fckValues ['allow_image_upload'] ;oFck.Config['ImageUploadURL']=fckValues ['input_url']+'/uploadPlone?field_name='+inputname+'&CurrentPath='+pathUser;oFck.Config['FlashBrowser']=fckValues ['allow_server_browsing'];oFck.Config['FlashBrowserURL']=fckValues ['base_path']+'/fckbrowser/browser.html?field_name='+inputname+'&Type=Flash&Connector='+fckValues ['input_url']+'/connectorPlone&ServerPath='+fckValues ['browser_root']+'&CurrentPath='+pathUser ;oFck.Config['FlashUpload']=fckValues ['allow_flash_upload'] ;oFck.Config['FlashUploadURL']=fckValues ['input_url']+'/uploadPlone?field_name='+inputname+'&CurrentPath='+pathUser;oFck.Config['MediaBrowser']=fckValues ['allow_server_browsing'];oFck.Config['MediaBrowserURL']=fckValues ['base_path']+'/fckbrowser/browser.html?field_name='+inputname+'&Type=Media&Connector='+fckValues ['input_url']+'/connectorPlone&ServerPath='+fckValues ['browser_root']+'&CurrentPath='+pathUser ;oFck.Config['SkinPath']=fckValues ['base_path']+'/editor/'+fckValues ['fck_skin_path'];oFck.Config['AutoDetectLanguage']=false;oFck.Config['DefaultLanguage']=fckValues ['lang'];oFck.Config['ForcePasteAsPlainText']=fckValues ['force_paste_as_text'];oFck.Config['IncludeLatinEntities']=fckValues ['allow_latin_entities'];oFck.Config['SpellChecker']=fckValues ['spellchecker'];oFck.Config['EnterMode']=fckValues ['keyboard_entermode'];oFck.Config['ShiftEnterMode']=fckValues ['keyboard_shiftentermode'];oFck.ToolbarSet=fckValues ['fck_toolbar'];oFck.Width=fckValues ['editor_width'];oFck.Height=fckValues ['editor_height'];try{fckContainer.innerHTML=oFck.CreateHtml();document.getElementById(inputname+'_fckLoading').style.display='none'}
catch(e){document.getElementById(inputname+'_fckLoading').style.display='none';document.getElementById(inputname+'_fckError').style.display='block'}}}
Save_inline=function(fieldname,form,editorInstance){if(editorInstance.Commands.GetCommand('FitWindow').GetState()){kukit.log('Full screen mode must be disabled before saving inline');editorInstance.Commands.GetCommand('FitWindow').Execute()} ;saveField=document.getElementById(fieldname+'_fckSaveField');if(saveField){kukit.log('Fire the savekupu server event = save inline without submitting');saveField.style.visibility='visible';if(saveField.fireEvent){saveField.fireEvent('onChange')}
else{var evt=document.createEvent("HTMLEvents");evt.initEvent("change",true,true);saveField.dispatchEvent(evt)}
comp=(setTimeout("saveField.style.visibility='hidden'",2000));return false}
else{kukit.log('Try to submit the form in portal_factory');window.onbeforeunload=null;form.submit()}}


/* - ++resource++prototype/prototype.js - */
/*  Prototype JavaScript framework, version 1.6.1
 *  (c) 2005-2009 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.6.1',

  Browser: (function(){
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
    }
  })(),

  BrowserFeatures: {
    XPath: !!document.evaluate,
    SelectorsAPI: !!document.querySelector,
    ElementExtensions: (function() {
      var constructor = window.Element || window.HTMLElement;
      return !!(constructor && constructor.prototype);
    })(),
    SpecificElementExtensions: (function() {
      if (typeof window.HTMLDivElement !== 'undefined')
        return true;

      var div = document.createElement('div');
      var form = document.createElement('form');
      var isSupported = false;

      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
        isSupported = true;
      }

      div = form = null;

      return isSupported;
    })()
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
};

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;


var Abstract = { };


var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

/* Based on Alex Arnell's inheritance implementation. */

var Class = (function() {
  function subclass() {};
  function create() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

    function klass() {
      this.initialize.apply(this, arguments);
    }

    Object.extend(klass, Class.Methods);
    klass.superclass = parent;
    klass.subclasses = [];

    if (parent) {
      subclass.prototype = parent.prototype;
      klass.prototype = new subclass;
      parent.subclasses.push(klass);
    }

    for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);

    if (!klass.prototype.initialize)
      klass.prototype.initialize = Prototype.emptyFunction;

    klass.prototype.constructor = klass;
    return klass;
  }

  function addMethods(source) {
    var ancestor   = this.superclass && this.superclass.prototype;
    var properties = Object.keys(source);

    if (!Object.keys({ toString: true }).length) {
      if (source.toString != Object.prototype.toString)
        properties.push("toString");
      if (source.valueOf != Object.prototype.valueOf)
        properties.push("valueOf");
    }

    for (var i = 0, length = properties.length; i < length; i++) {
      var property = properties[i], value = source[property];
      if (ancestor && Object.isFunction(value) &&
          value.argumentNames().first() == "$super") {
        var method = value;
        value = (function(m) {
          return function() { return ancestor[m].apply(this, arguments); };
        })(property).wrap(method);

        value.valueOf = method.valueOf.bind(method);
        value.toString = method.toString.bind(method);
      }
      this.prototype[property] = value;
    }

    return this;
  }

  return {
    create: create,
    Methods: {
      addMethods: addMethods
    }
  };
})();
(function() {

  var _toString = Object.prototype.toString;

  function extend(destination, source) {
    for (var property in source)
      destination[property] = source[property];
    return destination;
  }

  function inspect(object) {
    try {
      if (isUndefined(object)) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : String(object);
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  }

  function toJSON(object) {
    var type = typeof object;
    switch (type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }

    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (isElement(object)) return;

    var results = [];
    for (var property in object) {
      var value = toJSON(object[property]);
      if (!isUndefined(value))
        results.push(property.toJSON() + ': ' + value);
    }

    return '{' + results.join(', ') + '}';
  }

  function toQueryString(object) {
    return $H(object).toQueryString();
  }

  function toHTML(object) {
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
  }

  function keys(object) {
    var results = [];
    for (var property in object)
      results.push(property);
    return results;
  }

  function values(object) {
    var results = [];
    for (var property in object)
      results.push(object[property]);
    return results;
  }

  function clone(object) {
    return extend({ }, object);
  }

  function isElement(object) {
    return !!(object && object.nodeType == 1);
  }

  function isArray(object) {
    return _toString.call(object) == "[object Array]";
  }


  function isHash(object) {
    return object instanceof Hash;
  }

  function isFunction(object) {
    return typeof object === "function";
  }

  function isString(object) {
    return _toString.call(object) == "[object String]";
  }

  function isNumber(object) {
    return _toString.call(object) == "[object Number]";
  }

  function isUndefined(object) {
    return typeof object === "undefined";
  }

  extend(Object, {
    extend:        extend,
    inspect:       inspect,
    toJSON:        toJSON,
    toQueryString: toQueryString,
    toHTML:        toHTML,
    keys:          keys,
    values:        values,
    clone:         clone,
    isElement:     isElement,
    isArray:       isArray,
    isHash:        isHash,
    isFunction:    isFunction,
    isString:      isString,
    isNumber:      isNumber,
    isUndefined:   isUndefined
  });
})();
Object.extend(Function.prototype, (function() {
  var slice = Array.prototype.slice;

  function update(array, args) {
    var arrayLength = array.length, length = args.length;
    while (length--) array[arrayLength + length] = args[length];
    return array;
  }

  function merge(array, args) {
    array = slice.call(array, 0);
    return update(array, args);
  }

  function argumentNames() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
      .replace(/\s+/g, '').split(',');
    return names.length == 1 && !names[0] ? [] : names;
  }

  function bind(context) {
    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
    var __method = this, args = slice.call(arguments, 1);
    return function() {
      var a = merge(args, arguments);
      return __method.apply(context, a);
    }
  }

  function bindAsEventListener(context) {
    var __method = this, args = slice.call(arguments, 1);
    return function(event) {
      var a = update([event || window.event], args);
      return __method.apply(context, a);
    }
  }

  function curry() {
    if (!arguments.length) return this;
    var __method = this, args = slice.call(arguments, 0);
    return function() {
      var a = merge(args, arguments);
      return __method.apply(this, a);
    }
  }

  function delay(timeout) {
    var __method = this, args = slice.call(arguments, 1);
    timeout = timeout * 1000
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  }

  function defer() {
    var args = update([0.01], arguments);
    return this.delay.apply(this, args);
  }

  function wrap(wrapper) {
    var __method = this;
    return function() {
      var a = update([__method.bind(this)], arguments);
      return wrapper.apply(this, a);
    }
  }

  function methodize() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      var a = update([this], arguments);
      return __method.apply(null, a);
    };
  }

  return {
    argumentNames:       argumentNames,
    bind:                bind,
    bindAsEventListener: bindAsEventListener,
    curry:               curry,
    delay:               delay,
    defer:               defer,
    wrap:                wrap,
    methodize:           methodize
  }
})());


Date.prototype.toJSON = function() {
  return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};


RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};
var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  execute: function() {
    this.callback(this);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
        this.currentlyExecuting = false;
      } catch(e) {
        this.currentlyExecuting = false;
        throw e;
      }
    }
  }
});
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, (function() {

  function prepareReplacement(replacement) {
    if (Object.isFunction(replacement)) return replacement;
    var template = new Template(replacement);
    return function(match) { return template.evaluate(match) };
  }

  function gsub(pattern, replacement) {
    var result = '', source = this, match;
    replacement = prepareReplacement(replacement);

    if (Object.isString(pattern))
      pattern = RegExp.escape(pattern);

    if (!(pattern.length || pattern.source)) {
      replacement = replacement('');
      return replacement + source.split('').join(replacement) + replacement;
    }

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  }

  function sub(pattern, replacement, count) {
    replacement = prepareReplacement(replacement);
    count = Object.isUndefined(count) ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  }

  function scan(pattern, iterator) {
    this.gsub(pattern, iterator);
    return String(this);
  }

  function truncate(length, truncation) {
    length = length || 30;
    truncation = Object.isUndefined(truncation) ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(this);
  }

  function strip() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  }

  function stripTags() {
    return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
  }

  function stripScripts() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  }

  function extractScripts() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }

  function evalScripts() {
    return this.extractScripts().map(function(script) { return eval(script) });
  }

  function escapeHTML() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  }

  function unescapeHTML() {
    return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
  }


  function toQueryParams(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return { };

    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  }

  function toArray() {
    return this.split('');
  }

  function succ() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  }

  function times(count) {
    return count < 1 ? '' : new Array(count + 1).join(this);
  }

  function camelize() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  }

  function capitalize() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  }

  function underscore() {
    return this.replace(/::/g, '/')
               .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
               .replace(/([a-z\d])([A-Z])/g, '$1_$2')
               .replace(/-/g, '_')
               .toLowerCase();
  }

  function dasherize() {
    return this.replace(/_/g, '-');
  }

  function inspect(useDoubleQuotes) {
    var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
      if (character in String.specialChar) {
        return String.specialChar[character];
      }
      return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  }

  function toJSON() {
    return this.inspect(true);
  }

  function unfilterJSON(filter) {
    return this.replace(filter || Prototype.JSONFilter, '$1');
  }

  function isJSON() {
    var str = this;
    if (str.blank()) return false;
    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
  }

  function evalJSON(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  }

  function include(pattern) {
    return this.indexOf(pattern) > -1;
  }

  function startsWith(pattern) {
    return this.indexOf(pattern) === 0;
  }

  function endsWith(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  }

  function empty() {
    return this == '';
  }

  function blank() {
    return /^\s*$/.test(this);
  }

  function interpolate(object, pattern) {
    return new Template(this, pattern).evaluate(object);
  }

  return {
    gsub:           gsub,
    sub:            sub,
    scan:           scan,
    truncate:       truncate,
    strip:          String.prototype.trim ? String.prototype.trim : strip,
    stripTags:      stripTags,
    stripScripts:   stripScripts,
    extractScripts: extractScripts,
    evalScripts:    evalScripts,
    escapeHTML:     escapeHTML,
    unescapeHTML:   unescapeHTML,
    toQueryParams:  toQueryParams,
    parseQuery:     toQueryParams,
    toArray:        toArray,
    succ:           succ,
    times:          times,
    camelize:       camelize,
    capitalize:     capitalize,
    underscore:     underscore,
    dasherize:      dasherize,
    inspect:        inspect,
    toJSON:         toJSON,
    unfilterJSON:   unfilterJSON,
    isJSON:         isJSON,
    evalJSON:       evalJSON,
    include:        include,
    startsWith:     startsWith,
    endsWith:       endsWith,
    empty:          empty,
    blank:          blank,
    interpolate:    interpolate
  };
})());

var Template = Class.create({
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    if (object && Object.isFunction(object.toTemplateReplacements))
      object = object.toTemplateReplacements();

    return this.template.gsub(this.pattern, function(match) {
      if (object == null) return (match[1] + '');

      var before = match[1] || '';
      if (before == '\\') return match[2];

      var ctx = object, expr = match[3];
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
      match = pattern.exec(expr);
      if (match == null) return before;

      while (match != null) {
        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
        ctx = ctx[comp];
        if (null == ctx || '' == match[3]) break;
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
        match = pattern.exec(expr);
      }

      return before + String.interpret(ctx);
    });
  }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

var Enumerable = (function() {
  function each(iterator, context) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator.call(context, value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  }

  function eachSlice(number, iterator, context) {
    var index = -number, slices = [], array = this.toArray();
    if (number < 1) return array;
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.collect(iterator, context);
  }

  function all(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = true;
    this.each(function(value, index) {
      result = result && !!iterator.call(context, value, index);
      if (!result) throw $break;
    });
    return result;
  }

  function any(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator.call(context, value, index))
        throw $break;
    });
    return result;
  }

  function collect(iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];
    this.each(function(value, index) {
      results.push(iterator.call(context, value, index));
    });
    return results;
  }

  function detect(iterator, context) {
    var result;
    this.each(function(value, index) {
      if (iterator.call(context, value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  }

  function findAll(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  }

  function grep(filter, iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];

    if (Object.isString(filter))
      filter = new RegExp(RegExp.escape(filter));

    this.each(function(value, index) {
      if (filter.match(value))
        results.push(iterator.call(context, value, index));
    });
    return results;
  }

  function include(object) {
    if (Object.isFunction(this.indexOf))
      if (this.indexOf(object) != -1) return true;

    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  }

  function inGroupsOf(number, fillWith) {
    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  }

  function inject(memo, iterator, context) {
    this.each(function(value, index) {
      memo = iterator.call(context, memo, value, index);
    });
    return memo;
  }

  function invoke(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  }

  function max(iterator, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value >= result)
        result = value;
    });
    return result;
  }

  function min(iterator, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value < result)
        result = value;
    });
    return result;
  }

  function partition(iterator, context) {
    iterator = iterator || Prototype.K;
    var trues = [], falses = [];
    this.each(function(value, index) {
      (iterator.call(context, value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  }

  function pluck(property) {
    var results = [];
    this.each(function(value) {
      results.push(value[property]);
    });
    return results;
  }

  function reject(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  }

  function sortBy(iterator, context) {
    return this.map(function(value, index) {
      return {
        value: value,
        criteria: iterator.call(context, value, index)
      };
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  }

  function toArray() {
    return this.map();
  }

  function zip() {
    var iterator = Prototype.K, args = $A(arguments);
    if (Object.isFunction(args.last()))
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  }

  function size() {
    return this.toArray().length;
  }

  function inspect() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }









  return {
    each:       each,
    eachSlice:  eachSlice,
    all:        all,
    every:      all,
    any:        any,
    some:       any,
    collect:    collect,
    map:        collect,
    detect:     detect,
    findAll:    findAll,
    select:     findAll,
    filter:     findAll,
    grep:       grep,
    include:    include,
    member:     include,
    inGroupsOf: inGroupsOf,
    inject:     inject,
    invoke:     invoke,
    max:        max,
    min:        min,
    partition:  partition,
    pluck:      pluck,
    reject:     reject,
    sortBy:     sortBy,
    toArray:    toArray,
    entries:    toArray,
    zip:        zip,
    size:       size,
    inspect:    inspect,
    find:       detect
  };
})();
function $A(iterable) {
  if (!iterable) return [];
  if ('toArray' in Object(iterable)) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

function $w(string) {
  if (!Object.isString(string)) return [];
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

Array.from = $A;


(function() {
  var arrayProto = Array.prototype,
      slice = arrayProto.slice,
      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available

  function each(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  }
  if (!_each) _each = each;

  function clear() {
    this.length = 0;
    return this;
  }

  function first() {
    return this[0];
  }

  function last() {
    return this[this.length - 1];
  }

  function compact() {
    return this.select(function(value) {
      return value != null;
    });
  }

  function flatten() {
    return this.inject([], function(array, value) {
      if (Object.isArray(value))
        return array.concat(value.flatten());
      array.push(value);
      return array;
    });
  }

  function without() {
    var values = slice.call(arguments, 0);
    return this.select(function(value) {
      return !values.include(value);
    });
  }

  function reverse(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  }

  function uniq(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  }

  function intersect(array) {
    return this.uniq().findAll(function(item) {
      return array.detect(function(value) { return item === value });
    });
  }


  function clone() {
    return slice.call(this, 0);
  }

  function size() {
    return this.length;
  }

  function inspect() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  }

  function toJSON() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (!Object.isUndefined(value)) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }

  function indexOf(item, i) {
    i || (i = 0);
    var length = this.length;
    if (i < 0) i = length + i;
    for (; i < length; i++)
      if (this[i] === item) return i;
    return -1;
  }

  function lastIndexOf(item, i) {
    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
    var n = this.slice(0, i).reverse().indexOf(item);
    return (n < 0) ? n : i - n - 1;
  }

  function concat() {
    var array = slice.call(this, 0), item;
    for (var i = 0, length = arguments.length; i < length; i++) {
      item = arguments[i];
      if (Object.isArray(item) && !('callee' in item)) {
        for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
          array.push(item[j]);
      } else {
        array.push(item);
      }
    }
    return array;
  }

  Object.extend(arrayProto, Enumerable);

  if (!arrayProto._reverse)
    arrayProto._reverse = arrayProto.reverse;

  Object.extend(arrayProto, {
    _each:     _each,
    clear:     clear,
    first:     first,
    last:      last,
    compact:   compact,
    flatten:   flatten,
    without:   without,
    reverse:   reverse,
    uniq:      uniq,
    intersect: intersect,
    clone:     clone,
    toArray:   clone,
    size:      size,
    inspect:   inspect,
    toJSON:    toJSON
  });

  var CONCAT_ARGUMENTS_BUGGY = (function() {
    return [].concat(arguments)[0][0] !== 1;
  })(1,2)

  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;

  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
})();
function $H(object) {
  return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {
  function initialize(object) {
    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
  }

  function _each(iterator) {
    for (var key in this._object) {
      var value = this._object[key], pair = [key, value];
      pair.key = key;
      pair.value = value;
      iterator(pair);
    }
  }

  function set(key, value) {
    return this._object[key] = value;
  }

  function get(key) {
    if (this._object[key] !== Object.prototype[key])
      return this._object[key];
  }

  function unset(key) {
    var value = this._object[key];
    delete this._object[key];
    return value;
  }

  function toObject() {
    return Object.clone(this._object);
  }

  function keys() {
    return this.pluck('key');
  }

  function values() {
    return this.pluck('value');
  }

  function index(value) {
    var match = this.detect(function(pair) {
      return pair.value === value;
    });
    return match && match.key;
  }

  function merge(object) {
    return this.clone().update(object);
  }

  function update(object) {
    return new Hash(object).inject(this, function(result, pair) {
      result.set(pair.key, pair.value);
      return result;
    });
  }

  function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

  function toQueryString() {
    return this.inject([], function(results, pair) {
      var key = encodeURIComponent(pair.key), values = pair.value;

      if (values && typeof values == 'object') {
        if (Object.isArray(values))
          return results.concat(values.map(toQueryPair.curry(key)));
      } else results.push(toQueryPair(key, values));
      return results;
    }).join('&');
  }

  function inspect() {
    return '#<Hash:{' + this.map(function(pair) {
      return pair.map(Object.inspect).join(': ');
    }).join(', ') + '}>';
  }

  function toJSON() {
    return Object.toJSON(this.toObject());
  }

  function clone() {
    return new Hash(this);
  }

  return {
    initialize:             initialize,
    _each:                  _each,
    set:                    set,
    get:                    get,
    unset:                  unset,
    toObject:               toObject,
    toTemplateReplacements: toObject,
    keys:                   keys,
    values:                 values,
    index:                  index,
    merge:                  merge,
    update:                 update,
    toQueryString:          toQueryString,
    inspect:                inspect,
    toJSON:                 toJSON,
    clone:                  clone
  };
})());

Hash.from = $H;
Object.extend(Number.prototype, (function() {
  function toColorPart() {
    return this.toPaddedString(2, 16);
  }

  function succ() {
    return this + 1;
  }

  function times(iterator, context) {
    $R(0, this, true).each(iterator, context);
    return this;
  }

  function toPaddedString(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  }

  function toJSON() {
    return isFinite(this) ? this.toString() : 'null';
  }

  function abs() {
    return Math.abs(this);
  }

  function round() {
    return Math.round(this);
  }

  function ceil() {
    return Math.ceil(this);
  }

  function floor() {
    return Math.floor(this);
  }

  return {
    toColorPart:    toColorPart,
    succ:           succ,
    times:          times,
    toPaddedString: toPaddedString,
    toJSON:         toJSON,
    abs:            abs,
    round:          round,
    ceil:           ceil,
    floor:          floor
  };
})());

function $R(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
}

var ObjectRange = Class.create(Enumerable, (function() {
  function initialize(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  }

  function _each(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  }

  function include(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }

  return {
    initialize: initialize,
    _each:      _each,
    include:    include
  };
})());



var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
};

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (Object.isFunction(responder[callback])) {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) { }
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate:   function() { Ajax.activeRequestCount++ },
  onComplete: function() { Ajax.activeRequestCount-- }
});
Ajax.Base = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();

    if (Object.isString(this.options.parameters))
      this.options.parameters = this.options.parameters.toQueryParams();
    else if (Object.isHash(this.options.parameters))
      this.options.parameters = this.options.parameters.toObject();
  }
});
Ajax.Request = Class.create(Ajax.Base, {
  _complete: false,

  initialize: function($super, url, options) {
    $super(options);
    this.transport = Ajax.getTransport();
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Object.toQueryString(params)) {
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      var response = new Ajax.Response(this);
      if (this.options.onCreate) this.options.onCreate(response);
      Ajax.Responders.dispatch('onCreate', this, response);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (Object.isFunction(extras.push))
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + response.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(response, response.headerJSON);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = response.getHeader('Content-type');
      if (this.options.evalJS == 'force'
          || (this.options.evalJS && this.isSameOrigin() && contentType
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
        this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  isSameOrigin: function() {
    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
      protocol: location.protocol,
      domain: document.domain,
      port: location.port ? ':' + location.port : ''
    }));
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name) || null;
    } catch (e) { return null; }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];








Ajax.Response = Class.create({
  initialize: function(request){
    this.request = request;
    var transport  = this.transport  = request.transport,
        readyState = this.readyState = transport.readyState;

    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }

    if(readyState == 4) {
      var xml = transport.responseXML;
      this.responseXML  = Object.isUndefined(xml) ? null : xml;
      this.responseJSON = this._getResponseJSON();
    }
  },

  status:      0,

  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

  getStatusText: function() {
    try {
      return this.transport.statusText || '';
    } catch (e) { return '' }
  },

  getHeader: Ajax.Request.prototype.getHeader,

  getAllHeaders: function() {
    try {
      return this.getAllResponseHeaders();
    } catch (e) { return null }
  },

  getResponseHeader: function(name) {
    return this.transport.getResponseHeader(name);
  },

  getAllResponseHeaders: function() {
    return this.transport.getAllResponseHeaders();
  },

  _getHeaderJSON: function() {
    var json = this.getHeader('X-JSON');
    if (!json) return null;
    json = decodeURIComponent(escape(json));
    try {
      return json.evalJSON(this.request.options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  },

  _getResponseJSON: function() {
    var options = this.request.options;
    if (!options.evalJSON || (options.evalJSON != 'force' &&
      !(this.getHeader('Content-type') || '').include('application/json')) ||
        this.responseText.blank())
          return null;
    try {
      return this.responseText.evalJSON(options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  }
});

Ajax.Updater = Class.create(Ajax.Request, {
  initialize: function($super, container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    };

    options = Object.clone(options);
    var onComplete = options.onComplete;
    options.onComplete = (function(response, json) {
      this.updateContent(response.responseText);
      if (Object.isFunction(onComplete)) onComplete(response, json);
    }).bind(this);

    $super(url, options);
  },

  updateContent: function(responseText) {
    var receiver = this.container[this.success() ? 'success' : 'failure'],
        options = this.options;

    if (!options.evalScripts) responseText = responseText.stripScripts();

    if (receiver = $(receiver)) {
      if (options.insertion) {
        if (Object.isString(options.insertion)) {
          var insertion = { }; insertion[options.insertion] = responseText;
          receiver.insert(insertion);
        }
        else options.insertion(receiver, responseText);
      }
      else receiver.update(responseText);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});



function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

/*--------------------------------------------------------------------------*/

if (!window.Node) var Node = { };

if (!Node.ELEMENT_NODE) {
  Object.extend(Node, {
    ELEMENT_NODE: 1,
    ATTRIBUTE_NODE: 2,
    TEXT_NODE: 3,
    CDATA_SECTION_NODE: 4,
    ENTITY_REFERENCE_NODE: 5,
    ENTITY_NODE: 6,
    PROCESSING_INSTRUCTION_NODE: 7,
    COMMENT_NODE: 8,
    DOCUMENT_NODE: 9,
    DOCUMENT_TYPE_NODE: 10,
    DOCUMENT_FRAGMENT_NODE: 11,
    NOTATION_NODE: 12
  });
}


(function(global) {

  var SETATTRIBUTE_IGNORES_NAME = (function(){
    var elForm = document.createElement("form");
    var elInput = document.createElement("input");
    var root = document.documentElement;
    elInput.setAttribute("name", "test");
    elForm.appendChild(elInput);
    root.appendChild(elForm);
    var isBuggy = elForm.elements
      ? (typeof elForm.elements.test == "undefined")
      : null;
    root.removeChild(elForm);
    elForm = elInput = null;
    return isBuggy;
  })();

  var element = global.Element;
  global.Element = function(tagName, attributes) {
    attributes = attributes || { };
    tagName = tagName.toLowerCase();
    var cache = Element.cache;
    if (SETATTRIBUTE_IGNORES_NAME && attributes.name) {
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
      delete attributes.name;
      return Element.writeAttribute(document.createElement(tagName), attributes);
    }
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
  };
  Object.extend(global.Element, element || { });
  if (element) global.Element.prototype = element.prototype;
})(this);

Element.cache = { };
Element.idCounter = 1;

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },


  hide: function(element) {
    element = $(element);
    element.style.display = 'none';
    return element;
  },

  show: function(element) {
    element = $(element);
    element.style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: (function(){

    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
      var el = document.createElement("select"),
          isBuggy = true;
      el.innerHTML = "<option value=\"test\">test</option>";
      if (el.options && el.options[0]) {
        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
      }
      el = null;
      return isBuggy;
    })();

    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
      try {
        var el = document.createElement("table");
        if (el && el.tBodies) {
          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
          var isBuggy = typeof el.tBodies[0] == "undefined";
          el = null;
          return isBuggy;
        }
      } catch (e) {
        return true;
      }
    })();

    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
      var s = document.createElement("script"),
          isBuggy = false;
      try {
        s.appendChild(document.createTextNode(""));
        isBuggy = !s.firstChild ||
          s.firstChild && s.firstChild.nodeType !== 3;
      } catch (e) {
        isBuggy = true;
      }
      s = null;
      return isBuggy;
    })();

    function update(element, content) {
      element = $(element);

      if (content && content.toElement)
        content = content.toElement();

      if (Object.isElement(content))
        return element.update().insert(content);

      content = Object.toHTML(content);

      var tagName = element.tagName.toUpperCase();

      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
        element.text = content;
        return element;
      }

      if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) {
        if (tagName in Element._insertionTranslations.tags) {
          while (element.firstChild) {
            element.removeChild(element.firstChild);
          }
          Element._getContentFromAnonymousElement(tagName, content.stripScripts())
            .each(function(node) {
              element.appendChild(node)
            });
        }
        else {
          element.innerHTML = content.stripScripts();
        }
      }
      else {
        element.innerHTML = content.stripScripts();
      }

      content.evalScripts.bind(content).defer();
      return element;
    }

    return update;
  })(),

  replace: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    else if (!Object.isElement(content)) {
      content = Object.toHTML(content);
      var range = element.ownerDocument.createRange();
      range.selectNode(element);
      content.evalScripts.bind(content).defer();
      content = range.createContextualFragment(content.stripScripts());
    }
    element.parentNode.replaceChild(content, element);
    return element;
  },

  insert: function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = {bottom:insertions};

    var content, insert, tagName, childNodes;

    for (var position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      insert = Element._insertionTranslations[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        insert(element, content);
        continue;
      }

      content = Object.toHTML(content);

      tagName = ((position == 'before' || position == 'after')
        ? element.parentNode : element).tagName.toUpperCase();

      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());

      if (position == 'top' || position == 'after') childNodes.reverse();
      childNodes.each(insert.curry(element));

      content.evalScripts.bind(content).defer();
    }

    return element;
  },

  wrap: function(element, wrapper, attributes) {
    element = $(element);
    if (Object.isElement(wrapper))
      $(wrapper).writeAttribute(attributes || { });
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
    else wrapper = new Element('div', wrapper);
    if (element.parentNode)
      element.parentNode.replaceChild(wrapper, element);
    wrapper.appendChild(element);
    return wrapper;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return Element.recursivelyCollect(element, 'parentNode');
  },

  descendants: function(element) {
    return Element.select(element, "*");
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return Element.recursivelyCollect(element, 'previousSibling');
  },

  nextSiblings: function(element) {
    return Element.recursivelyCollect(element, 'nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return Element.previousSiblings(element).reverse()
      .concat(Element.nextSiblings(element));
  },

  match: function(element, selector) {
    if (Object.isString(selector))
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = Element.ancestors(element);
    return Object.isNumber(expression) ? ancestors[expression] :
      Selector.findElement(ancestors, expression, index);
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return Element.firstDescendant(element);
    return Object.isNumber(expression) ? Element.descendants(element)[expression] :
      Element.select(element, expression)[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = Element.previousSiblings(element);
    return Object.isNumber(expression) ? previousSiblings[expression] :
      Selector.findElement(previousSiblings, expression, index);
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = Element.nextSiblings(element);
    return Object.isNumber(expression) ? nextSiblings[expression] :
      Selector.findElement(nextSiblings, expression, index);
  },


  select: function(element) {
    var args = Array.prototype.slice.call(arguments, 1);
    return Selector.findChildElements(element, args);
  },

  adjacent: function(element) {
    var args = Array.prototype.slice.call(arguments, 1);
    return Selector.findChildElements(element.parentNode, args).without(element);
  },

  identify: function(element) {
    element = $(element);
    var id = Element.readAttribute(element, 'id');
    if (id) return id;
    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
    Element.writeAttribute(element, 'id', id);
    return id;
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      var t = Element._attributeTranslations.read;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name]) name = t.names[name];
      if (name.include(':')) {
        return (!element.attributes || !element.attributes[name]) ? null :
         element.attributes[name].value;
      }
    }
    return element.getAttribute(name);
  },

  writeAttribute: function(element, name, value) {
    element = $(element);
    var attributes = { }, t = Element._attributeTranslations.write;

    if (typeof name == 'object') attributes = name;
    else attributes[name] = Object.isUndefined(value) ? true : value;

    for (var attr in attributes) {
      name = t.names[attr] || attr;
      value = attributes[attr];
      if (t.values[attr]) name = t.values[attr](element, value);
      if (value === false || value === null)
        element.removeAttribute(name);
      else if (value === true)
        element.setAttribute(name, name);
      else element.setAttribute(name, value);
    }
    return element;
  },

  getHeight: function(element) {
    return Element.getDimensions(element).height;
  },

  getWidth: function(element) {
    return Element.getDimensions(element).width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!Element.hasClassName(element, className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    return Element[Element.hasClassName(element, className) ?
      'removeClassName' : 'addClassName'](element, className);
  },

  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);

    if (element.compareDocumentPosition)
      return (element.compareDocumentPosition(ancestor) & 8) === 8;

    if (ancestor.contains)
      return ancestor.contains(element) && ancestor !== element;

    while (element = element.parentNode)
      if (element == ancestor) return true;

    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = Element.cumulativeOffset(element);
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value || value == 'auto') {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
            property] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = Element.getStyle(element, 'display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari
      els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      if (Prototype.Browser.Opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if (element.tagName.toUpperCase() == 'BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p !== 'static') break;
      }
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  absolutize: function(element) {
    element = $(element);
    if (Element.getStyle(element, 'position') == 'absolute') return element;

    var offsets = Element.positionedOffset(element);
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
    return element;
  },

  relativize: function(element) {
    element = $(element);
    if (Element.getStyle(element, 'position') == 'relative') return element;

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
    return element;
  },

  cumulativeScrollOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  getOffsetParent: function(element) {
    if (element.offsetParent) return $(element.offsetParent);
    if (element == document.body) return $(element);

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return $(element);

    return $(document.body);
  },

  viewportOffset: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      if (element.offsetParent == document.body &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return Element._returnOffset(valueL, valueT);
  },

  clonePosition: function(element, source) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || { });

    source = $(source);
    var p = Element.viewportOffset(source);

    element = $(element);
    var delta = [0, 0];
    var parent = null;
    if (Element.getStyle(element, 'position') == 'absolute') {
      parent = Element.getOffsetParent(element);
      delta = Element.viewportOffset(parent);
    }

    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Object.extend(Element.Methods, {
  getElementsBySelector: Element.Methods.select,

  childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
  write: {
    names: {
      className: 'class',
      htmlFor:   'for'
    },
    values: { }
  }
};

if (Prototype.Browser.Opera) {
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
    function(proceed, element, style) {
      switch (style) {
        case 'left': case 'top': case 'right': case 'bottom':
          if (proceed(element, 'position') === 'static') return null;
        case 'height': case 'width':
          if (!Element.visible(element)) return null;

          var dim = parseInt(proceed(element, style), 10);

          if (dim !== element['offset' + style.capitalize()])
            return dim + 'px';

          var properties;
          if (style === 'height') {
            properties = ['border-top-width', 'padding-top',
             'padding-bottom', 'border-bottom-width'];
          }
          else {
            properties = ['border-left-width', 'padding-left',
             'padding-right', 'border-right-width'];
          }
          return properties.inject(dim, function(memo, property) {
            var val = proceed(element, property);
            return val === null ? memo : memo - parseInt(val, 10);
          }) + 'px';
        default: return proceed(element, style);
      }
    }
  );

  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
    function(proceed, element, attribute) {
      if (attribute === 'title') return element.title;
      return proceed(element, attribute);
    }
  );
}

else if (Prototype.Browser.IE) {
  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
    function(proceed, element) {
      element = $(element);
      try { element.offsetParent }
      catch(e) { return $(document.body) }
      var position = element.getStyle('position');
      if (position !== 'static') return proceed(element);
      element.setStyle({ position: 'relative' });
      var value = proceed(element);
      element.setStyle({ position: position });
      return value;
    }
  );

  $w('positionedOffset viewportOffset').each(function(method) {
    Element.Methods[method] = Element.Methods[method].wrap(
      function(proceed, element) {
        element = $(element);
        try { element.offsetParent }
        catch(e) { return Element._returnOffset(0,0) }
        var position = element.getStyle('position');
        if (position !== 'static') return proceed(element);
        var offsetParent = element.getOffsetParent();
        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
          offsetParent.setStyle({ zoom: 1 });
        element.setStyle({ position: 'relative' });
        var value = proceed(element);
        element.setStyle({ position: position });
        return value;
      }
    );
  });

  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
    function(proceed, element) {
      try { element.offsetParent }
      catch(e) { return Element._returnOffset(0,0) }
      return proceed(element);
    }
  );

  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset' + style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    function stripAlpha(filter){
      return filter.replace(/alpha\([^\)]*\)/gi,'');
    }
    element = $(element);
    var currentStyle = element.currentStyle;
    if ((currentStyle && !currentStyle.hasLayout) ||
      (!currentStyle && element.style.zoom == 'normal'))
        element.style.zoom = 1;

    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      (filter = stripAlpha(filter)) ?
        style.filter = filter : style.removeAttribute('filter');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = stripAlpha(filter) +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  Element._attributeTranslations = (function(){

    var classProp = 'className';
    var forProp = 'for';

    var el = document.createElement('div');

    el.setAttribute(classProp, 'x');

    if (el.className !== 'x') {
      el.setAttribute('class', 'x');
      if (el.className === 'x') {
        classProp = 'class';
      }
    }
    el = null;

    el = document.createElement('label');
    el.setAttribute(forProp, 'x');
    if (el.htmlFor !== 'x') {
      el.setAttribute('htmlFor', 'x');
      if (el.htmlFor === 'x') {
        forProp = 'htmlFor';
      }
    }
    el = null;

    return {
      read: {
        names: {
          'class':      classProp,
          'className':  classProp,
          'for':        forProp,
          'htmlFor':    forProp
        },
        values: {
          _getAttr: function(element, attribute) {
            return element.getAttribute(attribute);
          },
          _getAttr2: function(element, attribute) {
            return element.getAttribute(attribute, 2);
          },
          _getAttrNode: function(element, attribute) {
            var node = element.getAttributeNode(attribute);
            return node ? node.value : "";
          },
          _getEv: (function(){

            var el = document.createElement('div');
            el.onclick = Prototype.emptyFunction;
            var value = el.getAttribute('onclick');
            var f;

            if (String(value).indexOf('{') > -1) {
              f = function(element, attribute) {
                attribute = element.getAttribute(attribute);
                if (!attribute) return null;
                attribute = attribute.toString();
                attribute = attribute.split('{')[1];
                attribute = attribute.split('}')[0];
                return attribute.strip();
              };
            }
            else if (value === '') {
              f = function(element, attribute) {
                attribute = element.getAttribute(attribute);
                if (!attribute) return null;
                return attribute.strip();
              };
            }
            el = null;
            return f;
          })(),
          _flag: function(element, attribute) {
            return $(element).hasAttribute(attribute) ? attribute : null;
          },
          style: function(element) {
            return element.style.cssText.toLowerCase();
          },
          title: function(element) {
            return element.title;
          }
        }
      }
    }
  })();

  Element._attributeTranslations.write = {
    names: Object.extend({
      cellpadding: 'cellPadding',
      cellspacing: 'cellSpacing'
    }, Element._attributeTranslations.read.names),
    values: {
      checked: function(element, value) {
        element.checked = !!value;
      },

      style: function(element, value) {
        element.style.cssText = value ? value : '';
      }
    }
  };

  Element._attributeTranslations.has = {};

  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
  });

  (function(v) {
    Object.extend(v, {
      href:        v._getAttr2,
      src:         v._getAttr2,
      type:        v._getAttr,
      action:      v._getAttrNode,
      disabled:    v._flag,
      checked:     v._flag,
      readonly:    v._flag,
      multiple:    v._flag,
      onload:      v._getEv,
      onunload:    v._getEv,
      onclick:     v._getEv,
      ondblclick:  v._getEv,
      onmousedown: v._getEv,
      onmouseup:   v._getEv,
      onmouseover: v._getEv,
      onmousemove: v._getEv,
      onmouseout:  v._getEv,
      onfocus:     v._getEv,
      onblur:      v._getEv,
      onkeypress:  v._getEv,
      onkeydown:   v._getEv,
      onkeyup:     v._getEv,
      onsubmit:    v._getEv,
      onreset:     v._getEv,
      onselect:    v._getEv,
      onchange:    v._getEv
    });
  })(Element._attributeTranslations.read.values);

  if (Prototype.BrowserFeatures.ElementExtensions) {
    (function() {
      function _descendants(element) {
        var nodes = element.getElementsByTagName('*'), results = [];
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName !== "!") // Filter out comment nodes.
            results.push(node);
        return results;
      }

      Element.Methods.down = function(element, expression, index) {
        element = $(element);
        if (arguments.length == 1) return element.firstDescendant();
        return Object.isNumber(expression) ? _descendants(element)[expression] :
          Element.select(element, expression)[index || 0];
      }
    })();
  }

}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

else if (Prototype.Browser.WebKit) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;

    if (value == 1)
      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
        element.width++; element.width--;
      } else try {
        var n = document.createTextNode(' ');
        element.appendChild(n);
        element.removeChild(n);
      } catch (e) { }

    return element;
  };

  Element.Methods.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return Element._returnOffset(valueL, valueT);
  };
}

if ('outerHTML' in document.documentElement) {
  Element.Methods.replace = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) {
      element.parentNode.replaceChild(content, element);
      return element;
    }

    content = Object.toHTML(content);
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

    if (Element._insertionTranslations.tags[tagName]) {
      var nextSibling = element.next();
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
      parent.removeChild(element);
      if (nextSibling)
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
      else
        fragments.each(function(node) { parent.appendChild(node) });
    }
    else element.outerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

Element._returnOffset = function(l, t) {
  var result = [l, t];
  result.left = l;
  result.top = t;
  return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
  if (t) {
    div.innerHTML = t[0] + html + t[1];
    t[2].times(function() { div = div.firstChild });
  } else div.innerHTML = html;
  return $A(div.childNodes);
};

Element._insertionTranslations = {
  before: function(element, node) {
    element.parentNode.insertBefore(node, element);
  },
  top: function(element, node) {
    element.insertBefore(node, element.firstChild);
  },
  bottom: function(element, node) {
    element.appendChild(node);
  },
  after: function(element, node) {
    element.parentNode.insertBefore(node, element.nextSibling);
  },
  tags: {
    TABLE:  ['<table>',                '</table>',                   1],
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
    SELECT: ['<select>',               '</select>',                  1]
  }
};

(function() {
  var tags = Element._insertionTranslations.tags;
  Object.extend(tags, {
    THEAD: tags.TBODY,
    TFOOT: tags.TBODY,
    TH:    tags.TD
  });
})();

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    attribute = Element._attributeTranslations.has[attribute] || attribute;
    var node = $(element).getAttributeNode(attribute);
    return !!(node && node.specified);
  }
};

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

(function(div) {

  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
    window.HTMLElement = { };
    window.HTMLElement.prototype = div['__proto__'];
    Prototype.BrowserFeatures.ElementExtensions = true;
  }

  div = null;

})(document.createElement('div'))

Element.extend = (function() {

  function checkDeficiency(tagName) {
    if (typeof window.Element != 'undefined') {
      var proto = window.Element.prototype;
      if (proto) {
        var id = '_' + (Math.random()+'').slice(2);
        var el = document.createElement(tagName);
        proto[id] = 'x';
        var isBuggy = (el[id] !== 'x');
        delete proto[id];
        el = null;
        return isBuggy;
      }
    }
    return false;
  }

  function extendElementWith(element, methods) {
    for (var property in methods) {
      var value = methods[property];
      if (Object.isFunction(value) && !(property in element))
        element[property] = value.methodize();
    }
  }

  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');

  if (Prototype.BrowserFeatures.SpecificElementExtensions) {
    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
      return function(element) {
        if (element && typeof element._extendedByPrototype == 'undefined') {
          var t = element.tagName;
          if (t && (/^(?:object|applet|embed)$/i.test(t))) {
            extendElementWith(element, Element.Methods);
            extendElementWith(element, Element.Methods.Simulated);
            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
          }
        }
        return element;
      }
    }
    return Prototype.K;
  }

  var Methods = { }, ByTag = Element.Methods.ByTag;

  var extend = Object.extend(function(element) {
    if (!element || typeof element._extendedByPrototype != 'undefined' ||
        element.nodeType != 1 || element == window) return element;

    var methods = Object.clone(Methods),
        tagName = element.tagName.toUpperCase();

    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);

    extendElementWith(element, methods);

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

  }, {
    refresh: function() {
      if (!Prototype.BrowserFeatures.ElementExtensions) {
        Object.extend(Methods, Element.Methods);
        Object.extend(Methods, Element.Methods.Simulated);
      }
    }
  });

  extend.refresh();
  return extend;
})();

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || { });
  else {
    if (Object.isArray(tagName)) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = { };
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    for (var property in methods) {
      var value = methods[property];
      if (!Object.isFunction(value)) continue;
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = value.methodize();
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    var element = document.createElement(tagName);
    var proto = element['__proto__'] || element.constructor.prototype;
    element = null;
    return proto;
  }

  var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
   Element.prototype;

  if (F.ElementExtensions) {
    copy(Element.Methods, elementPrototype);
    copy(Element.Methods.Simulated, elementPrototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (Object.isUndefined(klass)) continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;

  if (Element.extend.refresh) Element.extend.refresh();
  Element.cache = { };
};


document.viewport = {

  getDimensions: function() {
    return { width: this.getWidth(), height: this.getHeight() };
  },

  getScrollOffsets: function() {
    return Element._returnOffset(
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
      window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop);
  }
};

(function(viewport) {
  var B = Prototype.Browser, doc = document, element, property = {};

  function getRootElement() {
    if (B.WebKit && !doc.evaluate)
      return document;

    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
      return document.body;

    return document.documentElement;
  }

  function define(D) {
    if (!element) element = getRootElement();

    property[D] = 'client' + D;

    viewport['get' + D] = function() { return element[property[D]] };
    return viewport['get' + D]();
  }

  viewport.getWidth  = define.curry('Width');

  viewport.getHeight = define.curry('Height');
})(document.viewport);


Element.Storage = {
  UID: 1
};

Element.addMethods({
  getStorage: function(element) {
    if (!(element = $(element))) return;

    var uid;
    if (element === window) {
      uid = 0;
    } else {
      if (typeof element._prototypeUID === "undefined")
        element._prototypeUID = [Element.Storage.UID++];
      uid = element._prototypeUID[0];
    }

    if (!Element.Storage[uid])
      Element.Storage[uid] = $H();

    return Element.Storage[uid];
  },

  store: function(element, key, value) {
    if (!(element = $(element))) return;

    if (arguments.length === 2) {
      Element.getStorage(element).update(key);
    } else {
      Element.getStorage(element).set(key, value);
    }

    return element;
  },

  retrieve: function(element, key, defaultValue) {
    if (!(element = $(element))) return;
    var hash = Element.getStorage(element), value = hash.get(key);

    if (Object.isUndefined(value)) {
      hash.set(key, defaultValue);
      value = defaultValue;
    }

    return value;
  },

  clone: function(element, deep) {
    if (!(element = $(element))) return;
    var clone = element.cloneNode(deep);
    clone._prototypeUID = void 0;
    if (deep) {
      var descendants = Element.select(clone, '*'),
          i = descendants.length;
      while (i--) {
        descendants[i]._prototypeUID = void 0;
      }
    }
    return Element.extend(clone);
  }
});
/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create({
  initialize: function(expression) {
    this.expression = expression.strip();

    if (this.shouldUseSelectorsAPI()) {
      this.mode = 'selectorsAPI';
    } else if (this.shouldUseXPath()) {
      this.mode = 'xpath';
      this.compileXPathMatcher();
    } else {
      this.mode = "normal";
      this.compileMatcher();
    }

  },

  shouldUseXPath: (function() {

    var IS_DESCENDANT_SELECTOR_BUGGY = (function(){
      var isBuggy = false;
      if (document.evaluate && window.XPathResult) {
        var el = document.createElement('div');
        el.innerHTML = '<ul><li></li></ul><div><ul><li></li></ul></div>';

        var xpath = ".//*[local-name()='ul' or local-name()='UL']" +
          "//*[local-name()='li' or local-name()='LI']";

        var result = document.evaluate(xpath, el, null,
          XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

        isBuggy = (result.snapshotLength !== 2);
        el = null;
      }
      return isBuggy;
    })();

    return function() {
      if (!Prototype.BrowserFeatures.XPath) return false;

      var e = this.expression;

      if (Prototype.Browser.WebKit &&
       (e.include("-of-type") || e.include(":empty")))
        return false;

      if ((/(\[[\w-]*?:|:checked)/).test(e))
        return false;

      if (IS_DESCENDANT_SELECTOR_BUGGY) return false;

      return true;
    }

  })(),

  shouldUseSelectorsAPI: function() {
    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;

    if (Selector.CASE_INSENSITIVE_CLASS_NAMES) return false;

    if (!Selector._div) Selector._div = new Element('div');

    try {
      Selector._div.querySelector(this.expression);
    } catch(e) {
      return false;
    }

    return true;
  },

  compileMatcher: function() {
    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m, len = ps.length, name;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e];
      return;
    }

    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i = 0; i<len; i++) {
        p = ps[i].re;
        name = ps[i].name;
        if (m = e.match(p)) {
          this.matcher.push(Object.isFunction(c[name]) ? c[name](m) :
            new Template(c[name]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le, m, len = ps.length, name;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i = 0; i<len; i++) {
        name = ps[i].name;
        if (m = e.match(ps[i].re)) {
          this.matcher.push(Object.isFunction(x[name]) ? x[name](m) :
            new Template(x[name]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    var e = this.expression, results;

    switch (this.mode) {
      case 'selectorsAPI':
        if (root !== document) {
          var oldId = root.id, id = $(root).identify();
          id = id.replace(/([\.:])/g, "\\$1");
          e = "#" + id + " " + e;
        }

        results = $A(root.querySelectorAll(e)).map(Element.extend);
        root.id = oldId;

        return results;
      case 'xpath':
        return document._getElementsByXPath(this.xpath, root);
      default:
       return this.matcher(root);
    }
  },

  match: function(element) {
    this.tokens = [];

    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
    var le, p, m, len = ps.length, name;

    while (e && le !== e && (/\S/).test(e)) {
      le = e;
      for (var i = 0; i<len; i++) {
        p = ps[i].re;
        name = ps[i].name;
        if (m = e.match(p)) {
          if (as[name]) {
            this.tokens.push([name, Object.clone(m)]);
            e = e.replace(m[0], '');
          } else {
            return this.findElements(document).include(element);
          }
        }
      }
    }

    var match = true, name, matches;
    for (var i = 0, token; token = this.tokens[i]; i++) {
      name = token[0], matches = token[1];
      if (!Selector.assertions[name](element, matches)) {
        match = false; break;
      }
    }

    return match;
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
});

if (Prototype.BrowserFeatures.SelectorsAPI &&
 document.compatMode === 'BackCompat') {
  Selector.CASE_INSENSITIVE_CLASS_NAMES = (function(){
    var div = document.createElement('div'),
     span = document.createElement('span');

    div.id = "prototype_test_id";
    span.className = 'Test';
    div.appendChild(span);
    var isIgnored = (div.querySelector('#prototype_test_id .test') !== null);
    div = span = null;
    return isIgnored;
  })();
}

Object.extend(Selector, {
  _cache: { },

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: function(m) {
      m[1] = m[1].toLowerCase();
      return new Template("[@#{1}]").evaluate(m);
    },
    attr: function(m) {
      m[1] = m[1].toLowerCase();
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (Object.isFunction(h)) return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
      'checked':     "[@checked]",
      'disabled':    "[(@disabled) and (@type!='hidden')]",
      'enabled':     "[not(@disabled) and (@type!='hidden')]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, v, len = p.length, name;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i = 0; i<len; i++) {
            name = p[i].name
            if (m = e.match(p[i].re)) {
              v = Object.isFunction(x[name]) ? x[name](m) : new Template(x[name]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
    },
    pseudo: function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: [
    { name: 'laterSibling', re: /^\s*~\s*/ },
    { name: 'child',        re: /^\s*>\s*/ },
    { name: 'adjacent',     re: /^\s*\+\s*/ },
    { name: 'descendant',   re: /^\s/ },

    { name: 'tagName',      re: /^\s*(\*|[\w\-]+)(\b|$)?/ },
    { name: 'id',           re: /^#([\w\-\*]+)(\b|$)/ },
    { name: 'className',    re: /^\.([\w\-\*]+)(\b|$)/ },
    { name: 'pseudo',       re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ },
    { name: 'attrPresence', re: /^\[((?:[\w-]+:)?[\w-]+)\]/ },
    { name: 'attr',         re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ }
  ],

  assertions: {
    tagName: function(element, matches) {
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
    },

    className: function(element, matches) {
      return Element.hasClassName(element, matches[1]);
    },

    id: function(element, matches) {
      return element.id === matches[1];
    },

    attrPresence: function(element, matches) {
      return Element.hasAttribute(element, matches[1]);
    },

    attr: function(element, matches) {
      var nodeValue = Element.readAttribute(element, matches[1]);
      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
    }
  },

  handlers: {
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    mark: function(nodes) {
      var _true = Prototype.emptyFunction;
      for (var i = 0, node; node = nodes[i]; i++)
        node._countedByPrototype = _true;
      return nodes;
    },

    unmark: (function(){

      var PROPERTIES_ATTRIBUTES_MAP = (function(){
        var el = document.createElement('div'),
            isBuggy = false,
            propName = '_countedByPrototype',
            value = 'x'
        el[propName] = value;
        isBuggy = (el.getAttribute(propName) === value);
        el = null;
        return isBuggy;
      })();

      return PROPERTIES_ATTRIBUTES_MAP ?
        function(nodes) {
          for (var i = 0, node; node = nodes[i]; i++)
            node.removeAttribute('_countedByPrototype');
          return nodes;
        } :
        function(nodes) {
          for (var i = 0, node; node = nodes[i]; i++)
            node._countedByPrototype = void 0;
          return nodes;
        }
    })(),

    index: function(parentNode, reverse, ofType) {
      parentNode._countedByPrototype = Prototype.emptyFunction;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          var node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
      }
    },

    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (typeof (n = nodes[i])._countedByPrototype == 'undefined') {
          n._countedByPrototype = Prototype.emptyFunction;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    tagName: function(nodes, root, tagName, combinator) {
      var uTagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() === uTagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;

      if (root == document) {
        if (!targetNode) return [];
        if (!nodes) return [targetNode];
      } else {
        if (!root.sourceIndex || root.sourceIndex < 1) {
          var nodes = root.getElementsByTagName('*');
          for (var j = 0, node; node = nodes[j]; j++) {
            if (node.id === id) return [node];
          }
        }
      }

      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._countedByPrototype) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (node.tagName == '!' || node.firstChild) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._countedByPrototype) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled && (!node.type || node.type !== 'hidden'))
          results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
     '-').include('-' + (v || "").toUpperCase() + '-'); }
  },

  split: function(expression) {
    var expressions = [];
    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    return expressions;
  },

  matchElements: function(elements, expression) {
    var matches = $$(expression), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._countedByPrototype) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (Object.isNumber(expression)) {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    expressions = Selector.split(expressions.join(','));
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

if (Prototype.Browser.IE) {
  Object.extend(Selector.handlers, {
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        if (node.tagName !== "!") a.push(node);
      return a;
    }
  });
}

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}

var Form = {
  reset: function(form) {
    form = $(form);
    form.reset();
    return form;
  },

  serializeElements: function(elements, options) {
    if (typeof options != 'object') options = { hash: !!options };
    else if (Object.isUndefined(options.hash)) options.hash = true;
    var key, value, submitted = false, submit = options.submit;

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return options.hash ? data : Object.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, options) {
    return Form.serializeElements(Form.getElements(form), options);
  },

  getElements: function(form) {
    var elements = $(form).getElementsByTagName('*'),
        element,
        arr = [ ],
        serializers = Form.Element.Serializers;
    for (var i = 0; element = elements[i]; i++) {
      arr.push(element);
    }
    return arr.inject([], function(elements, child) {
      if (serializers[child.tagName.toLowerCase()])
        elements.push(Element.extend(child));
      return elements;
    })
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    var elements = $(form).getElements().findAll(function(element) {
      return 'hidden' != element.type && !element.disabled;
    });
    var firstByIndex = elements.findAll(function(element) {
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
    }).sortBy(function(element) { return element.tabIndex }).first();

    return firstByIndex ? firstByIndex : elements.find(function(element) {
      return /^(?:input|select|textarea)$/i.test(element.tagName);
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || { });

    var params = options.parameters, action = form.readAttribute('action') || '';
    if (action.blank()) action = window.location.href;
    options.parameters = form.serialize(true);

    if (params) {
      if (Object.isString(params)) params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(action, options);
  }
};

/*--------------------------------------------------------------------------*/


Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
};

Form.Element.Methods = {

  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = { };
        pair[element.name] = value;
        return Object.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  setValue: function(element, value) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    Form.Element.Serializers[method](element, value);
    return element;
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
          !(/^(?:button|reset|submit)$/i.test(element.type))))
        element.select();
    } catch (e) { }
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
};

/*--------------------------------------------------------------------------*/

var Field = Form.Element;

var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element, value);
      default:
        return Form.Element.Serializers.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (Object.isUndefined(value)) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (Object.isUndefined(value)) return element.value;
    else element.value = value;
  },

  select: function(element, value) {
    if (Object.isUndefined(value))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, currentValue, single = !Object.isArray(value);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        currentValue = this.optionValue(opt);
        if (single) {
          if (currentValue == value) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = value.include(currentValue);
      }
    }
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
};

/*--------------------------------------------------------------------------*/


Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  initialize: function($super, element, frequency, callback) {
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },

  execute: function() {
    var value = this.getValue();
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
});

Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = Class.create({
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback, this);
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
});

Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
(function() {

  var Event = {
    KEY_BACKSPACE: 8,
    KEY_TAB:       9,
    KEY_RETURN:   13,
    KEY_ESC:      27,
    KEY_LEFT:     37,
    KEY_UP:       38,
    KEY_RIGHT:    39,
    KEY_DOWN:     40,
    KEY_DELETE:   46,
    KEY_HOME:     36,
    KEY_END:      35,
    KEY_PAGEUP:   33,
    KEY_PAGEDOWN: 34,
    KEY_INSERT:   45,

    cache: {}
  };

  var docEl = document.documentElement;
  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
    && 'onmouseleave' in docEl;

  var _isButton;
  if (Prototype.Browser.IE) {
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
    _isButton = function(event, code) {
      return event.button === buttonMap[code];
    };
  } else if (Prototype.Browser.WebKit) {
    _isButton = function(event, code) {
      switch (code) {
        case 0: return event.which == 1 && !event.metaKey;
        case 1: return event.which == 1 && event.metaKey;
        default: return false;
      }
    };
  } else {
    _isButton = function(event, code) {
      return event.which ? (event.which === code + 1) : (event.button === code);
    };
  }

  function isLeftClick(event)   { return _isButton(event, 0) }

  function isMiddleClick(event) { return _isButton(event, 1) }

  function isRightClick(event)  { return _isButton(event, 2) }

  function element(event) {
    event = Event.extend(event);

    var node = event.target, type = event.type,
     currentTarget = event.currentTarget;

    if (currentTarget && currentTarget.tagName) {
      if (type === 'load' || type === 'error' ||
        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
          && currentTarget.type === 'radio'))
            node = currentTarget;
    }

    if (node.nodeType == Node.TEXT_NODE)
      node = node.parentNode;

    return Element.extend(node);
  }

  function findElement(event, expression) {
    var element = Event.element(event);
    if (!expression) return element;
    var elements = [element].concat(element.ancestors());
    return Selector.findElement(elements, expression, 0);
  }

  function pointer(event) {
    return { x: pointerX(event), y: pointerY(event) };
  }

  function pointerX(event) {
    var docElement = document.documentElement,
     body = document.body || { scrollLeft: 0 };

    return event.pageX || (event.clientX +
      (docElement.scrollLeft || body.scrollLeft) -
      (docElement.clientLeft || 0));
  }

  function pointerY(event) {
    var docElement = document.documentElement,
     body = document.body || { scrollTop: 0 };

    return  event.pageY || (event.clientY +
       (docElement.scrollTop || body.scrollTop) -
       (docElement.clientTop || 0));
  }


  function stop(event) {
    Event.extend(event);
    event.preventDefault();
    event.stopPropagation();

    event.stopped = true;
  }

  Event.Methods = {
    isLeftClick: isLeftClick,
    isMiddleClick: isMiddleClick,
    isRightClick: isRightClick,

    element: element,
    findElement: findElement,

    pointer: pointer,
    pointerX: pointerX,
    pointerY: pointerY,

    stop: stop
  };


  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
    m[name] = Event.Methods[name].methodize();
    return m;
  });

  if (Prototype.Browser.IE) {
    function _relatedTarget(event) {
      var element;
      switch (event.type) {
        case 'mouseover': element = event.fromElement; break;
        case 'mouseout':  element = event.toElement;   break;
        default: return null;
      }
      return Element.extend(element);
    }

    Object.extend(methods, {
      stopPropagation: function() { this.cancelBubble = true },
      preventDefault:  function() { this.returnValue = false },
      inspect: function() { return '[object Event]' }
    });

    Event.extend = function(event, element) {
      if (!event) return false;
      if (event._extendedByPrototype) return event;

      event._extendedByPrototype = Prototype.emptyFunction;
      var pointer = Event.pointer(event);

      Object.extend(event, {
        target: event.srcElement || element,
        relatedTarget: _relatedTarget(event),
        pageX:  pointer.x,
        pageY:  pointer.y
      });

      return Object.extend(event, methods);
    };
  } else {
    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
    Object.extend(Event.prototype, methods);
    Event.extend = Prototype.K;
  }

  function _createResponder(element, eventName, handler) {
    var registry = Element.retrieve(element, 'prototype_event_registry');

    if (Object.isUndefined(registry)) {
      CACHE.push(element);
      registry = Element.retrieve(element, 'prototype_event_registry', $H());
    }

    var respondersForEvent = registry.get(eventName);
    if (Object.isUndefined(respondersForEvent)) {
      respondersForEvent = [];
      registry.set(eventName, respondersForEvent);
    }

    if (respondersForEvent.pluck('handler').include(handler)) return false;

    var responder;
    if (eventName.include(":")) {
      responder = function(event) {
        if (Object.isUndefined(event.eventName))
          return false;

        if (event.eventName !== eventName)
          return false;

        Event.extend(event, element);
        handler.call(element, event);
      };
    } else {
      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
       (eventName === "mouseenter" || eventName === "mouseleave")) {
        if (eventName === "mouseenter" || eventName === "mouseleave") {
          responder = function(event) {
            Event.extend(event, element);

            var parent = event.relatedTarget;
            while (parent && parent !== element) {
              try { parent = parent.parentNode; }
              catch(e) { parent = element; }
            }

            if (parent === element) return;

            handler.call(element, event);
          };
        }
      } else {
        responder = function(event) {
          Event.extend(event, element);
          handler.call(element, event);
        };
      }
    }

    responder.handler = handler;
    respondersForEvent.push(responder);
    return responder;
  }

  function _destroyCache() {
    for (var i = 0, length = CACHE.length; i < length; i++) {
      Event.stopObserving(CACHE[i]);
      CACHE[i] = null;
    }
  }

  var CACHE = [];

  if (Prototype.Browser.IE)
    window.attachEvent('onunload', _destroyCache);

  if (Prototype.Browser.WebKit)
    window.addEventListener('unload', Prototype.emptyFunction, false);


  var _getDOMEventName = Prototype.K;

  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
    _getDOMEventName = function(eventName) {
      var translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
      return eventName in translations ? translations[eventName] : eventName;
    };
  }

  function observe(element, eventName, handler) {
    element = $(element);

    var responder = _createResponder(element, eventName, handler);

    if (!responder) return element;

    if (eventName.include(':')) {
      if (element.addEventListener)
        element.addEventListener("dataavailable", responder, false);
      else {
        element.attachEvent("ondataavailable", responder);
        element.attachEvent("onfilterchange", responder);
      }
    } else {
      var actualEventName = _getDOMEventName(eventName);

      if (element.addEventListener)
        element.addEventListener(actualEventName, responder, false);
      else
        element.attachEvent("on" + actualEventName, responder);
    }

    return element;
  }

  function stopObserving(element, eventName, handler) {
    element = $(element);

    var registry = Element.retrieve(element, 'prototype_event_registry');

    if (Object.isUndefined(registry)) return element;

    if (eventName && !handler) {
      var responders = registry.get(eventName);

      if (Object.isUndefined(responders)) return element;

      responders.each( function(r) {
        Element.stopObserving(element, eventName, r.handler);
      });
      return element;
    } else if (!eventName) {
      registry.each( function(pair) {
        var eventName = pair.key, responders = pair.value;

        responders.each( function(r) {
          Element.stopObserving(element, eventName, r.handler);
        });
      });
      return element;
    }

    var responders = registry.get(eventName);

    if (!responders) return;

    var responder = responders.find( function(r) { return r.handler === handler; });
    if (!responder) return element;

    var actualEventName = _getDOMEventName(eventName);

    if (eventName.include(':')) {
      if (element.removeEventListener)
        element.removeEventListener("dataavailable", responder, false);
      else {
        element.detachEvent("ondataavailable", responder);
        element.detachEvent("onfilterchange",  responder);
      }
    } else {
      if (element.removeEventListener)
        element.removeEventListener(actualEventName, responder, false);
      else
        element.detachEvent('on' + actualEventName, responder);
    }

    registry.set(eventName, responders.without(responder));

    return element;
  }

  function fire(element, eventName, memo, bubble) {
    element = $(element);

    if (Object.isUndefined(bubble))
      bubble = true;

    if (element == document && document.createEvent && !element.dispatchEvent)
      element = document.documentElement;

    var event;
    if (document.createEvent) {
      event = document.createEvent('HTMLEvents');
      event.initEvent('dataavailable', true, true);
    } else {
      event = document.createEventObject();
      event.eventType = bubble ? 'ondataavailable' : 'onfilterchange';
    }

    event.eventName = eventName;
    event.memo = memo || { };

    if (document.createEvent)
      element.dispatchEvent(event);
    else
      element.fireEvent(event.eventType, event);

    return Event.extend(event);
  }


  Object.extend(Event, Event.Methods);

  Object.extend(Event, {
    fire:          fire,
    observe:       observe,
    stopObserving: stopObserving
  });

  Element.addMethods({
    fire:          fire,

    observe:       observe,

    stopObserving: stopObserving
  });

  Object.extend(document, {
    fire:          fire.methodize(),

    observe:       observe.methodize(),

    stopObserving: stopObserving.methodize(),

    loaded:        false
  });

  if (window.Event) Object.extend(window.Event, Event);
  else window.Event = Event;
})();

(function() {
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */

  var timer;

  function fireContentLoadedEvent() {
    if (document.loaded) return;
    if (timer) window.clearTimeout(timer);
    document.loaded = true;
    document.fire('dom:loaded');
  }

  function checkReadyState() {
    if (document.readyState === 'complete') {
      document.stopObserving('readystatechange', checkReadyState);
      fireContentLoadedEvent();
    }
  }

  function pollDoScroll() {
    try { document.documentElement.doScroll('left'); }
    catch(e) {
      timer = pollDoScroll.defer();
      return;
    }
    fireContentLoadedEvent();
  }

  if (document.addEventListener) {
    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
  } else {
    document.observe('readystatechange', checkReadyState);
    if (window == top)
      timer = pollDoScroll.defer();
  }

  Event.observe(window, 'load', fireContentLoadedEvent);
})();

Element.addMethods();

/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
  Before: function(element, content) {
    return Element.insert(element, {before:content});
  },

  Top: function(element, content) {
    return Element.insert(element, {top:content});
  },

  Bottom: function(element, content) {
    return Element.insert(element, {bottom:content});
  },

  After: function(element, content) {
    return Element.insert(element, {after:content});
  }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

var Position = {
  includeScrollOffsets: false,

  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = Element.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = Element.cumulativeScrollOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = Element.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },


  cumulativeOffset: Element.Methods.cumulativeOffset,

  positionedOffset: Element.Methods.positionedOffset,

  absolutize: function(element) {
    Position.prepare();
    return Element.absolutize(element);
  },

  relativize: function(element) {
    Position.prepare();
    return Element.relativize(element);
  },

  realOffset: Element.Methods.cumulativeScrollOffset,

  offsetParent: Element.Methods.getOffsetParent,

  page: Element.Methods.viewportOffset,

  clone: function(source, target, options) {
    options = options || { };
    return Element.clonePosition(target, source, options);
  }
};

/*--------------------------------------------------------------------------*/

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  function iter(name) {
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
  }

  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  function(element, className) {
    className = className.toString().strip();
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  } : function(element, className) {
    className = className.toString().strip();
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
    if (!classNames && !className) return elements;

    var nodes = $(element).getElementsByTagName('*');
    className = ' ' + className + ' ';

    for (var i = 0, child, cn; child = nodes[i]; i++) {
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
          (classNames && classNames.all(function(name) {
            return !name.toString().blank() && cn.include(' ' + name + ' ');
          }))))
        elements.push(Element.extend(child));
    }
    return elements;
  };

  return function(className, parentElement) {
    return $(parentElement || document.body).getElementsByClassName(className);
  };
}(Element.Methods);

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);

/*--------------------------------------------------------------------------*/

/* - ++resource++scriptaculous/scriptaculous.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/scriptaculous.js?original=1
var Scriptaculous={Version:'1.8.3',require: function(libraryName){try{document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>')} catch(e){var script=document.createElement('script');script.type='text/javascript';script.src=libraryName;document.getElementsByTagName('head')[0].appendChild(script)}},REQUIRED_PROTOTYPE:'1.6.0.3',load: function(){
function convertVersionString(versionString){var v=versionString.replace(/_.*|\./g,'');v=parseInt(v+'0'.times(4-v.length));return versionString.indexOf('_')>-1?v-1:v}
if((typeof Prototype=='undefined')||(typeof Element=='undefined')||(typeof Element.Methods=='undefined')||(convertVersionString(Prototype.Version)<convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
throw("script.aculo.us requires the Prototype JavaScript framework >= "+Scriptaculous.REQUIRED_PROTOTYPE);var js=/scriptaculous\.js(\?.*)?$/;$$('head script[src]').findAll(function(s){return s.src.match(js)}).each(function(s){var path=s.src.replace(js,''),includes=s.src.match(/\?.*load=([a-z,]*)/);(includes?includes[1]:'builder,effects,dragdrop,controls,slider,sound').split(',').each(
function(include){Scriptaculous.require(path+include+'.js')})})}};Scriptaculous.load();

/* - ++resource++scriptaculous/builder.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/builder.js?original=1
var Builder={NODEMAP:{AREA:'map',CAPTION:'table',COL:'table',COLGROUP:'table',LEGEND:'fieldset',OPTGROUP:'select',OPTION:'select',PARAM:'object',TBODY:'table',TD:'table',TFOOT:'table',TH:'table',THEAD:'table',TR:'table'},node: function(elementName){elementName=elementName.toUpperCase();var parentTag=this.NODEMAP[elementName]||'div';var parentElement=document.createElement(parentTag);try{parentElement.innerHTML="<"+elementName+"></"+elementName+">"} catch(e){}
var element=parentElement.firstChild||null;if(element&&(element.tagName.toUpperCase()!=elementName))
element=element.getElementsByTagName(elementName)[0];if(!element) element=document.createElement(elementName);if(!element) return;if(arguments[1])
if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)||arguments[1].tagName){this._children(element,arguments[1])} else{var attrs=this._attributes(arguments[1]);if(attrs.length){try{parentElement.innerHTML="<"+elementName+" "+attrs+"></"+elementName+">"} catch(e){}
element=parentElement.firstChild||null;if(!element){element=document.createElement(elementName);for(attr in arguments[1])
element[attr=='class'?'className':attr]=arguments[1][attr]}
if(element.tagName.toUpperCase()!=elementName)
element=parentElement.getElementsByTagName(elementName)[0]}}
if(arguments[2])
this._children(element,arguments[2]);return $(element)},_text: function(text){return document.createTextNode(text)},ATTR_MAP:{'className':'class','htmlFor':'for'},_attributes: function(attributes){var attrs=[];for(attribute in attributes)
attrs.push((attribute in this.ATTR_MAP?this.ATTR_MAP[attribute]:attribute)+'="'+attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');return attrs.join(" ")},_children: function(element,children){if(children.tagName){element.appendChild(children);return}
if(typeof children=='object'){children.flatten().each( function(e){if(typeof e=='object')
element.appendChild(e);else
if(Builder._isStringOrNumber(e))
element.appendChild(Builder._text(e))})} else
if(Builder._isStringOrNumber(children))
element.appendChild(Builder._text(children))},_isStringOrNumber: function(param){return(typeof param=='string'||typeof param=='number')},build: function(html){var element=this.node('div');$(element).update(html.strip());return element.down()},dump: function(scope){if(typeof scope!='object'&&typeof scope!='function') scope=window;var tags=("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY "+"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET "+"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);tags.each( function(tag){scope[tag]=function(){return Builder.node.apply(Builder,[tag].concat($A(arguments)))}})}};

/* - ++resource++scriptaculous/effects.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/effects.js?original=1
String.prototype.parseColor=function(){var color='#';if(this.slice(0,4)=='rgb('){var cols=this.slice(4,this.length-1).split(',');var i=0;do{color+=parseInt(cols[i]).toColorPart()} while(++i<3)} else{if(this.slice(0,1)=='#'){if(this.length==4) for(var i=1;i<4;i++) color+=(this.charAt(i)+this.charAt(i)).toLowerCase();if(this.length==7) color=this.toLowerCase()}}
return(color.length==7?color:(arguments[0]||this))};Element.collectTextNodes=function(element){return $A($(element).childNodes).collect( function(node){return(node.nodeType==3?node.nodeValue:(node.hasChildNodes()?Element.collectTextNodes(node):''))}).flatten().join('')};Element.collectTextNodesIgnoreClass=function(element,className){return $A($(element).childNodes).collect( function(node){return(node.nodeType==3?node.nodeValue:((node.hasChildNodes()&&!Element.hasClassName(node,className))?Element.collectTextNodesIgnoreClass(node,className):''))}).flatten().join('')};Element.setContentZoom=function(element,percent){element=$(element);element.setStyle({fontSize:(percent/100)+'em'});if(Prototype.Browser.WebKit) window.scrollBy(0,0);return element};Element.getInlineOpacity=function(element){return $(element).style.opacity||''};Element.forceRerendering=function(element){try{element=$(element);var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n)} catch(e){}};var Effect={_elementDoesNotExistError:{name:'ElementDoesNotExistError',message:'The specified DOM element does not exist, but is required for this effect to operate'},Transitions:{linear:Prototype.K,sinoidal: function(pos){return(-Math.cos(pos*Math.PI)/2)+.5},reverse: function(pos){return 1-pos},flicker: function(pos){var pos=((-Math.cos(pos*Math.PI)/4)+.75)+Math.random()/4;return pos>1?1:pos},wobble: function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+.5},pulse: function(pos,pulses){return(-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2)+.5},spring: function(pos){return 1-(Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6))},none: function(pos){return 0},full: function(pos){return 1}},DefaultOptions:{duration:1.0,fps:100,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'},tagifyText: function(element){var tagifyStyle='position:relative';if(Prototype.Browser.IE) tagifyStyle+=';zoom:1';element=$(element);$A(element.childNodes).each( function(child){if(child.nodeType==3){child.nodeValue.toArray().each( function(character){element.insertBefore(new Element('span',{style:tagifyStyle}).update(character==' '?String.fromCharCode(160):character),child)});Element.remove(child)}})},multiple: function(element,effect){var elements;if(((typeof element=='object')||Object.isFunction(element))&&(element.length))
elements=element;else
elements=$(element).childNodes;var options=Object.extend({speed:0.1,delay:0.0},arguments[2]||{});var masterDelay=options.delay;$A(elements).each( function(element,index){new effect(element,Object.extend(options,{delay:index * options.speed+masterDelay}))})},PAIRS:{'slide':['SlideDown','SlideUp'],'blind':['BlindDown','BlindUp'],'appear':['Appear','Fade']},toggle: function(element,effect,options){element=$(element);effect=(effect||'appear').toLowerCase();return Effect[Effect.PAIRS[effect][element.visible()?1:0]](element,Object.extend({queue:{position:'end',scope:(element.id||'global'),limit:1}},options||{}))}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize: function(){this.effects=[];this.interval=null},_each: function(iterator){this.effects._each(iterator)},add: function(effect){var timestamp=new Date().getTime();var position=Object.isString(effect.options.queue)?effect.options.queue:effect.options.queue.position;switch(position){case 'front':this.effects.findAll(function(e){return e.state=='idle'}).each( function(e){e.startOn+=effect.finishOn;e.finishOn+=effect.finishOn});break;case 'with-last':timestamp=this.effects.pluck('startOn').max()||timestamp;break;case 'end':timestamp=this.effects.pluck('finishOn').max()||timestamp;break}
effect.startOn+=timestamp;effect.finishOn+=timestamp;if(!effect.options.queue.limit||(this.effects.length<effect.options.queue.limit))
this.effects.push(effect);if(!this.interval)
this.interval=setInterval(this.loop.bind(this),15)},remove: function(effect){this.effects=this.effects.reject(function(e){return e==effect});if(this.effects.length==0){clearInterval(this.interval);this.interval=null}},loop: function(){var timePos=new Date().getTime();for(var i=0,len=this.effects.length;i<len;i++)
this.effects[i]&&this.effects[i].loop(timePos)}});Effect.Queues={instances:$H(),get: function(queueName){if(!Object.isString(queueName)) return queueName;return this.instances.get(queueName)||this.instances.set(queueName,new Effect.ScopedQueue())}};Effect.Queue=Effect.Queues.get('global');Effect.Base=Class.create({position:null,start: function(options){if(options&&options.transition===false) options.transition=Effect.Transitions.linear;this.options=Object.extend(Object.extend({},Effect.DefaultOptions),options||{});this.currentFrame=0;this.state='idle';this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.fromToDelta=this.options.to-this.options.from;this.totalTime=this.finishOn-this.startOn;this.totalFrames=this.options.fps*this.options.duration;this.render=(function(){
function dispatch(effect,eventName){if(effect.options[eventName+'Internal'])
effect.options[eventName+'Internal'](effect);if(effect.options[eventName])
effect.options[eventName](effect)}
return function(pos){if(this.state==="idle"){this.state="running";dispatch(this,'beforeSetup');if(this.setup) this.setup();dispatch(this,'afterSetup')}
if(this.state==="running"){pos=(this.options.transition(pos) * this.fromToDelta)+this.options.from;this.position=pos;dispatch(this,'beforeUpdate');if(this.update) this.update(pos);dispatch(this,'afterUpdate')}}})();this.event('beforeStart');if(!this.options.sync)
Effect.Queues.get(Object.isString(this.options.queue)?'global':this.options.queue.scope).add(this)},loop: function(timePos){if(timePos>=this.startOn){if(timePos>=this.finishOn){this.render(1.0);this.cancel();this.event('beforeFinish');if(this.finish) this.finish();this.event('afterFinish');return}
var pos=(timePos-this.startOn)/this.totalTime,frame=(pos * this.totalFrames).round();if(frame>this.currentFrame){this.render(pos);this.currentFrame=frame}}},cancel: function(){if(!this.options.sync)
Effect.Queues.get(Object.isString(this.options.queue)?'global':this.options.queue.scope).remove(this);this.state='finished'},event: function(eventName){if(this.options[eventName+'Internal']) this.options[eventName+'Internal'](this);if(this.options[eventName]) this.options[eventName](this)},inspect: function(){var data=$H();for(property in this)
if(!Object.isFunction(this[property])) data.set(property,this[property]);return '#<Effect:'+data.inspect()+',options:'+$H(this.options).inspect()+'>'}});Effect.Parallel=Class.create(Effect.Base,{initialize: function(effects){this.effects=effects||[];this.start(arguments[1])},update: function(position){this.effects.invoke('render',position)},finish: function(position){this.effects.each( function(effect){effect.render(1.0);effect.cancel();effect.event('beforeFinish');if(effect.finish) effect.finish(position);effect.event('afterFinish')})}});Effect.Tween=Class.create(Effect.Base,{initialize: function(object,from,to){object=Object.isString(object)?$(object):object;var args=$A(arguments),method=args.last(),options=args.length==5?args[3]:null;this.method=Object.isFunction(method)?method.bind(object):Object.isFunction(object[method])?object[method].bind(object):
function(value){object[method]=value};this.start(Object.extend({from:from,to:to},options||{}))},update: function(position){this.method(position)}});Effect.Event=Class.create(Effect.Base,{initialize: function(){this.start(Object.extend({duration:0},arguments[0]||{}))},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize: function(element){this.element=$(element);if(!this.element) throw(Effect._elementDoesNotExistError);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout))
this.element.setStyle({zoom:1});var options=Object.extend({from:this.element.getOpacity()||0.0,to:1.0},arguments[1]||{});this.start(options)},update: function(position){this.element.setOpacity(position)}});Effect.Move=Class.create(Effect.Base,{initialize: function(element){this.element=$(element);if(!this.element) throw(Effect._elementDoesNotExistError);var options=Object.extend({x:0,y:0,mode:'relative'},arguments[1]||{});this.start(options)},setup: function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle('left')||'0');this.originalTop=parseFloat(this.element.getStyle('top')||'0');if(this.options.mode=='absolute'){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop}},update: function(position){this.element.setStyle({left:(this.options.x * position+this.originalLeft).round()+'px',top:(this.options.y * position+this.originalTop).round()+'px'})}});Effect.MoveBy=function(element,toTop,toLeft){return new Effect.Move(element,Object.extend({x:toLeft,y:toTop},arguments[3]||{}))};Effect.Scale=Class.create(Effect.Base,{initialize: function(element,percent){this.element=$(element);if(!this.element) throw(Effect._elementDoesNotExistError);var options=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:'box',scaleFrom:100.0,scaleTo:percent},arguments[2]||{});this.start(options)},setup: function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle('position');this.originalStyle={};['top','left','width','height','fontSize'].each( function(k){this.originalStyle[k]=this.element.style[k]}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var fontSize=this.element.getStyle('font-size')||'100%';['em','px','%','pt'].each( function(fontSizeType){if(fontSize.indexOf(fontSizeType)>0){this.fontSize=parseFloat(fontSize);this.fontSizeType=fontSizeType}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=='box')
this.dims=[this.element.offsetHeight,this.element.offsetWidth];if (/^content/.test(this.options.scaleMode))
this.dims=[this.element.scrollHeight,this.element.scrollWidth];if(!this.dims)
this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]},update: function(position){var currentScale=(this.options.scaleFrom/100.0)+(this.factor * position);if(this.options.scaleContent&&this.fontSize)
this.element.setStyle({fontSize:this.fontSize * currentScale+this.fontSizeType});this.setDimensions(this.dims[0] * currentScale,this.dims[1] * currentScale)},finish: function(position){if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle)},setDimensions: function(height,width){var d={};if(this.options.scaleX) d.width=width.round()+'px';if(this.options.scaleY) d.height=height.round()+'px';if(this.options.scaleFromCenter){var topd=(height-this.dims[0])/2;var leftd=(width-this.dims[1])/2;if(this.elementPositioning=='absolute'){if(this.options.scaleY) d.top=this.originalTop-topd+'px';if(this.options.scaleX) d.left=this.originalLeft-leftd+'px'} else{if(this.options.scaleY) d.top=-topd+'px';if(this.options.scaleX) d.left=-leftd+'px'}}
this.element.setStyle(d)}});Effect.Highlight=Class.create(Effect.Base,{initialize: function(element){this.element=$(element);if(!this.element) throw(Effect._elementDoesNotExistError);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options)},setup: function(){if(this.element.getStyle('display')=='none'){this.cancel();return}
this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle('background-image');this.element.setStyle({backgroundImage:'none'})}
if(!this.options.endcolor)
this.options.endcolor=this.element.getStyle('background-color').parseColor('#ffffff');if(!this.options.restorecolor)
this.options.restorecolor=this.element.getStyle('background-color');this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]}.bind(this))},update: function(position){this.element.setStyle({backgroundColor:$R(0,2).inject('#',function(m,v,i){return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart())}.bind(this))})},finish: function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}))}});Effect.ScrollTo=function(element){var options=arguments[1]||{},scrollOffsets=document.viewport.getScrollOffsets(),elementOffsets=$(element).cumulativeOffset();if(options.offset) elementOffsets[1]+=options.offset;return new Effect.Tween(null,scrollOffsets.top,elementOffsets[1],options,
function(p){scrollTo(scrollOffsets.left,p.round())})};Effect.Fade=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();var options=Object.extend({from:element.getOpacity()||1.0,to:0.0,afterFinishInternal: function(effect){if(effect.options.to!=0) return;effect.element.hide().setStyle({opacity:oldOpacity})}},arguments[1]||{});return new Effect.Opacity(element,options)};Effect.Appear=function(element){element=$(element);var options=Object.extend({from:(element.getStyle('display')=='none'?0.0:element.getOpacity()||0.0),to:1.0,afterFinishInternal: function(effect){effect.element.forceRerendering()},beforeSetup: function(effect){effect.element.setOpacity(effect.options.from).show()}},arguments[1]||{});return new Effect.Opacity(element,options)};Effect.Puff=function(element){element=$(element);var oldStyle={opacity:element.getInlineOpacity(),position:element.getStyle('position'),top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};return new Effect.Parallel([new Effect.Scale(element,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:1.0,beforeSetupInternal: function(effect){Position.absolutize(effect.effects[0].element)},afterFinishInternal: function(effect){effect.effects[0].element.hide().setStyle(oldStyle)}},arguments[1]||{}))};Effect.BlindUp=function(element){element=$(element);element.makeClipping();return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal: function(effect){effect.element.hide().undoClipping()}},arguments[1]||{}))};Effect.BlindDown=function(element){element=$(element);var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup: function(effect){effect.element.makeClipping().setStyle({height:'0px'}).show()},afterFinishInternal: function(effect){effect.element.undoClipping()}},arguments[1]||{}))};Effect.SwitchOff=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();return new Effect.Appear(element,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal: function(effect){new Effect.Scale(effect.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup: function(effect){effect.element.makePositioned().makeClipping()},afterFinishInternal: function(effect){effect.element.hide().undoClipping().undoPositioned().setStyle({opacity:oldOpacity})}})}},arguments[1]||{}))};Effect.DropOut=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left'),opacity:element.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(element,{x:0,y:100,sync:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:0.5,beforeSetup: function(effect){effect.effects[0].element.makePositioned()},afterFinishInternal: function(effect){effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle)}},arguments[1]||{}))};Effect.Shake=function(element){element=$(element);var options=Object.extend({distance:20,duration:0.5},arguments[1]||{});var distance=parseFloat(options.distance);var split=parseFloat(options.duration)/10.0;var oldStyle={top:element.getStyle('top'),left:element.getStyle('left')};return new Effect.Move(element,{x:distance,y:0,duration:split,afterFinishInternal: function(effect){new Effect.Move(effect.element,{x:-distance*2,y:0,duration:split*2,afterFinishInternal: function(effect){new Effect.Move(effect.element,{x:distance*2,y:0,duration:split*2,afterFinishInternal: function(effect){new Effect.Move(effect.element,{x:-distance*2,y:0,duration:split*2,afterFinishInternal: function(effect){new Effect.Move(effect.element,{x:distance*2,y:0,duration:split*2,afterFinishInternal: function(effect){new Effect.Move(effect.element,{x:-distance,y:0,duration:split,afterFinishInternal: function(effect){effect.element.undoPositioned().setStyle(oldStyle)}})}})}})}})}})}})};Effect.SlideDown=function(element){element=$(element).cleanWhitespace();var oldInnerBottom=element.down().getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup: function(effect){effect.element.makePositioned();effect.element.down().makePositioned();if(window.opera) effect.element.setStyle({top:''});effect.element.makeClipping().setStyle({height:'0px'}).show()},afterUpdateInternal: function(effect){effect.element.down().setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'})},afterFinishInternal: function(effect){effect.element.undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom})}},arguments[1]||{}))};Effect.SlideUp=function(element){element=$(element).cleanWhitespace();var oldInnerBottom=element.down().getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup: function(effect){effect.element.makePositioned();effect.element.down().makePositioned();if(window.opera) effect.element.setStyle({top:''});effect.element.makeClipping().show()},afterUpdateInternal: function(effect){effect.element.down().setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'})},afterFinishInternal: function(effect){effect.element.hide().undoClipping().undoPositioned();effect.element.down().undoPositioned().setStyle({bottom:oldInnerBottom})}},arguments[1]||{}))};Effect.Squish=function(element){return new Effect.Scale(element,window.opera?1:0,{restoreAfterFinish:true,beforeSetup: function(effect){effect.element.makeClipping()},afterFinishInternal: function(effect){effect.element.hide().undoClipping()}})};Effect.Grow=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var initialMoveX,initialMoveY;var moveX,moveY;switch(options.direction){case 'top-left':initialMoveX=initialMoveY=moveX=moveY=0;break;case 'top-right':initialMoveX=dims.width;initialMoveY=moveY=0;moveX=-dims.width;break;case 'bottom-left':initialMoveX=moveX=0;initialMoveY=dims.height;moveY=-dims.height;break;case 'bottom-right':initialMoveX=dims.width;initialMoveY=dims.height;moveX=-dims.width;moveY=-dims.height;break;case 'center':initialMoveX=dims.width/2;initialMoveY=dims.height/2;moveX=-dims.width/2;moveY=-dims.height/2;break}
return new Effect.Move(element,{x:initialMoveX,y:initialMoveY,duration:0.01,beforeSetup: function(effect){effect.element.hide().makeClipping().makePositioned()},afterFinishInternal: function(effect){new Effect.Parallel([new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}),new Effect.Move(effect.element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}),new Effect.Scale(effect.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:options.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup: function(effect){effect.effects[0].element.setStyle({height:'0px'}).show()},afterFinishInternal: function(effect){effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle)}},options))}})};Effect.Shrink=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var moveX,moveY;switch(options.direction){case 'top-left':moveX=moveY=0;break;case 'top-right':moveX=dims.width;moveY=0;break;case 'bottom-left':moveX=0;moveY=dims.height;break;case 'bottom-right':moveX=dims.width;moveY=dims.height;break;case 'center':moveX=dims.width/2;moveY=dims.height/2;break}
return new Effect.Parallel([new Effect.Opacity(element,{sync:true,to:0.0,from:1.0,transition:options.opacityTransition}),new Effect.Scale(element,window.opera?1:0,{sync:true,transition:options.scaleTransition,restoreAfterFinish:true}),new Effect.Move(element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition})],Object.extend({beforeStartInternal: function(effect){effect.effects[0].element.makePositioned().makeClipping()},afterFinishInternal: function(effect){effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle)}},options))};Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{},oldOpacity=element.getInlineOpacity(),transition=options.transition||Effect.Transitions.linear,reverser=function(pos){return 1-transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2)+.5)};return new Effect.Opacity(element,Object.extend(Object.extend({duration:2.0,from:0,afterFinishInternal: function(effect){effect.element.setStyle({opacity:oldOpacity})}},options),{transition:reverser}))};Effect.Fold=function(element){element=$(element);var oldStyle={top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};element.makeClipping();return new Effect.Scale(element,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal: function(effect){new Effect.Scale(element,1,{scaleContent:false,scaleY:false,afterFinishInternal: function(effect){effect.element.hide().undoClipping().setStyle(oldStyle)}})}},arguments[1]||{}))};Effect.Morph=Class.create(Effect.Base,{initialize: function(element){this.element=$(element);if(!this.element) throw(Effect._elementDoesNotExistError);var options=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(options.style)) this.style=$H(options.style);else{if(options.style.include(':'))
this.style=options.style.parseStyle();else{this.element.addClassName(options.style);this.style=$H(this.element.getStyles());this.element.removeClassName(options.style);var css=this.element.getStyles();this.style=this.style.reject(function(style){return style.value==css[style.key]});options.afterFinishInternal=function(effect){effect.element.addClassName(effect.options.style);effect.transforms.each(function(transform){effect.element.style[transform.style]=''})}}}
this.start(options)},setup: function(){
function parseColor(color){if(!color||['rgba(0, 0, 0, 0)','transparent'].include(color)) color='#ffffff';color=color.parseColor();return $R(0,2).map(function(i){return parseInt(color.slice(i*2+1,i*2+3),16)})}
this.transforms=this.style.map(function(pair){var property=pair[0],value=pair[1],unit=null;if(value.parseColor('#zzzzzz')!='#zzzzzz'){value=value.parseColor();unit='color'} else if(property=='opacity'){value=parseFloat(value);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout))
this.element.setStyle({zoom:1})} else if(Element.CSS_LENGTH.test(value)){var components=value.match(/^([\+\-]?[0-9\.]+)(.*)$/);value=parseFloat(components[1]);unit=(components.length==3)?components[2]:null}
var originalValue=this.element.getStyle(property);return{style:property.camelize(),originalValue:unit=='color'?parseColor(originalValue):parseFloat(originalValue||0),targetValue:unit=='color'?parseColor(value):value,unit:unit}}.bind(this)).reject(function(transform){return((transform.originalValue==transform.targetValue)||(transform.unit!='color'&&(isNaN(transform.originalValue)||isNaN(transform.targetValue))))})},update: function(position){var style={},transform,i=this.transforms.length;while(i--)
style[(transform=this.transforms[i]).style]=transform.unit=='color'?'#'+(Math.round(transform.originalValue[0]+(transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart()+(Math.round(transform.originalValue[1]+(transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart()+(Math.round(transform.originalValue[2]+(transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart():(transform.originalValue+(transform.targetValue-transform.originalValue) * position).toFixed(3)+(transform.unit===null?'':transform.unit);this.element.setStyle(style,true)}});Effect.Transform=Class.create({initialize: function(tracks){this.tracks=[];this.options=arguments[1]||{};this.addTracks(tracks)},addTracks: function(tracks){tracks.each(function(track){track=$H(track);var data=track.values().first();this.tracks.push($H({ids:track.keys().first(),effect:Effect.Morph,options:{style:data}}))}.bind(this));return this},play: function(){return new Effect.Parallel(this.tracks.map(function(track){var ids=track.get('ids'),effect=track.get('effect'),options=track.get('options');var elements=[$(ids)||$$(ids)].flatten();return elements.map(function(e){return new effect(e,Object.extend({sync:true},options))})}).flatten(),this.options)}});Element.CSS_PROPERTIES=$w('backgroundColor backgroundPosition borderBottomColor borderBottomStyle '+'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth '+'borderRightColor borderRightStyle borderRightWidth borderSpacing '+'borderTopColor borderTopStyle borderTopWidth bottom clip color '+'fontSize fontWeight height left letterSpacing lineHeight '+'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+'maxWidth minHeight minWidth opacity outlineColor outlineOffset '+'outlineWidth paddingBottom paddingLeft paddingRight paddingTop '+'right textIndent top width wordSpacing zIndex');Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement('div');String.prototype.parseStyle=function(){var style,styleRules=$H();if(Prototype.Browser.WebKit)
style=new Element('div',{style:this}).style;else{String.__parseStyleElement.innerHTML='<div style="'+this+'"></div>';style=String.__parseStyleElement.childNodes[0].style}
Element.CSS_PROPERTIES.each(function(property){if(style[property]) styleRules.set(property,style[property])});if(Prototype.Browser.IE&&this.include('opacity'))
styleRules.set('opacity',this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);return styleRules};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(element){var css=document.defaultView.getComputedStyle($(element),null);return Element.CSS_PROPERTIES.inject({}, function(styles,property){styles[property]=css[property];return styles})}} else{Element.getStyles=function(element){element=$(element);var css=element.currentStyle,styles;styles=Element.CSS_PROPERTIES.inject({}, function(results,property){results[property]=css[property];return results});if(!styles.opacity) styles.opacity=element.getOpacity();return styles}}
Effect.Methods={morph: function(element,style){element=$(element);new Effect.Morph(element,Object.extend({style:style},arguments[2]||{}));return element},visualEffect: function(element,effect,options){element=$(element);var s=effect.dasherize().camelize(),klass=s.charAt(0).toUpperCase()+s.substring(1);new Effect[klass](element,options);return element},highlight: function(element,options){element=$(element);new Effect.Highlight(element,options);return element}};$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+'pulsate shake puff squish switchOff dropOut').each(
function(effect){Effect.Methods[effect]=function(element,options){element=$(element);Effect[effect.charAt(0).toUpperCase()+effect.substring(1)](element,options);return element}});$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
function(f){Effect.Methods[f]=Element[f]});Element.addMethods(Effect.Methods);

/* - ++resource++scriptaculous/controls.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/controls.js?original=1
if(typeof Effect=='undefined')
throw("controls.js requires including script.aculo.us' effects.js library");var Autocompleter={};Autocompleter.Base=Class.create({baseInitialize: function(element,update,options){element=$(element);this.element=element;this.update=$(update);this.hasFocus=false;this.changed=false;this.active=false;this.index=0;this.entryCount=0;this.oldElementValue=this.element.value;if(this.setOptions)
this.setOptions(options);else
this.options=options||{};this.options.paramName=this.options.paramName||this.element.name;this.options.tokens=this.options.tokens||[];this.options.frequency=this.options.frequency||0.4;this.options.minChars=this.options.minChars||1;this.options.onShow=this.options.onShow||
function(element,update){if(!update.style.position||update.style.position=='absolute'){update.style.position='absolute';Position.clone(element,update,{setHeight:false,offsetTop:element.offsetHeight})}
Effect.Appear(update,{duration:0.15})};this.options.onHide=this.options.onHide||
function(element,update){new Effect.Fade(update,{duration:0.15})};if(typeof(this.options.tokens)=='string')
this.options.tokens=new Array(this.options.tokens);if(!this.options.tokens.include('\n'))
this.options.tokens.push('\n');this.observer=null;this.element.setAttribute('autocomplete','off');Element.hide(this.update);Event.observe(this.element,'blur',this.onBlur.bindAsEventListener(this));Event.observe(this.element,'keydown',this.onKeyPress.bindAsEventListener(this))},show: function(){if(Element.getStyle(this.update,'display')=='none') this.options.onShow(this.element,this.update);if(!this.iefix&&(Prototype.Browser.IE)&&(Element.getStyle(this.update,'position')=='absolute')){new Insertion.After(this.update,'<iframe id="'+this.update.id+'_iefix" '+'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" '+'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');this.iefix=$(this.update.id+'_iefix')}
if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this),50)},fixIEOverlapping: function(){Position.clone(this.update,this.iefix,{setTop:(!this.update.style.height)});this.iefix.style.zIndex=1;this.update.style.zIndex=2;Element.show(this.iefix)},hide: function(){this.stopIndicator();if(Element.getStyle(this.update,'display')!='none') this.options.onHide(this.element,this.update);if(this.iefix) Element.hide(this.iefix)},startIndicator: function(){if(this.options.indicator) Element.show(this.options.indicator)},stopIndicator: function(){if(this.options.indicator) Element.hide(this.options.indicator)},onKeyPress: function(event){if(this.active)
switch(event.keyCode){case Event.KEY_TAB:case Event.KEY_RETURN:this.selectEntry();Event.stop(event);case Event.KEY_ESC:this.hide();this.active=false;Event.stop(event);return;case Event.KEY_LEFT:case Event.KEY_RIGHT:return;case Event.KEY_UP:this.markPrevious();this.render();Event.stop(event);return;case Event.KEY_DOWN:this.markNext();this.render();Event.stop(event);return}
else
if(event.keyCode==Event.KEY_TAB||event.keyCode==Event.KEY_RETURN||(Prototype.Browser.WebKit>0&&event.keyCode==0)) return;this.changed=true;this.hasFocus=true;if(this.observer) clearTimeout(this.observer);this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000)},activate: function(){this.changed=false;this.hasFocus=true;this.getUpdatedChoices()},onHover: function(event){var element=Event.findElement(event,'LI');if(this.index!=element.autocompleteIndex){this.index=element.autocompleteIndex;this.render()}
Event.stop(event)},onClick: function(event){var element=Event.findElement(event,'LI');this.index=element.autocompleteIndex;this.selectEntry();this.hide()},onBlur: function(event){setTimeout(this.hide.bind(this),250);this.hasFocus=false;this.active=false},render: function(){if(this.entryCount>0){for(var i=0;i<this.entryCount;i++)
this.index==i?Element.addClassName(this.getEntry(i),"selected"):Element.removeClassName(this.getEntry(i),"selected");if(this.hasFocus){this.show();this.active=true}} else{this.active=false;this.hide()}},markPrevious: function(){if(this.index>0) this.index--;else this.index=this.entryCount-1;this.getEntry(this.index).scrollIntoView(true)},markNext: function(){if(this.index<this.entryCount-1) this.index++;else this.index=0;this.getEntry(this.index).scrollIntoView(false)},getEntry: function(index){return this.update.firstChild.childNodes[index]},getCurrentEntry: function(){return this.getEntry(this.index)},selectEntry: function(){this.active=false;this.updateElement(this.getCurrentEntry())},updateElement: function(selectedElement){if(this.options.updateElement){this.options.updateElement(selectedElement);return}
var value='';if(this.options.select){var nodes=$(selectedElement).select('.'+this.options.select)||[];if(nodes.length>0) value=Element.collectTextNodes(nodes[0],this.options.select)} else
value=Element.collectTextNodesIgnoreClass(selectedElement,'informal');var bounds=this.getTokenBounds();if(bounds[0]!=-1){var newValue=this.element.value.substr(0,bounds[0]);var whitespace=this.element.value.substr(bounds[0]).match(/^\s+/);if(whitespace)
newValue+=whitespace[0];this.element.value=newValue+value+this.element.value.substr(bounds[1])} else{this.element.value=value}
this.oldElementValue=this.element.value;this.element.focus();if(this.options.afterUpdateElement)
this.options.afterUpdateElement(this.element,selectedElement)},updateChoices: function(choices){if(!this.changed&&this.hasFocus){this.update.innerHTML=choices;Element.cleanWhitespace(this.update);Element.cleanWhitespace(this.update.down());if(this.update.firstChild&&this.update.down().childNodes){this.entryCount=this.update.down().childNodes.length;for(var i=0;i<this.entryCount;i++){var entry=this.getEntry(i);entry.autocompleteIndex=i;this.addObservers(entry)}} else{this.entryCount=0}
this.stopIndicator();this.index=0;if(this.entryCount==1&&this.options.autoSelect){this.selectEntry();this.hide()} else{this.render()}}},addObservers: function(element){Event.observe(element,"mouseover",this.onHover.bindAsEventListener(this));Event.observe(element,"click",this.onClick.bindAsEventListener(this))},onObserverEvent: function(){this.changed=false;this.tokenBounds=null;if(this.getToken().length>=this.options.minChars){this.getUpdatedChoices()} else{this.active=false;this.hide()}
this.oldElementValue=this.element.value},getToken: function(){var bounds=this.getTokenBounds();return this.element.value.substring(bounds[0],bounds[1]).strip()},getTokenBounds: function(){if(null!=this.tokenBounds) return this.tokenBounds;var value=this.element.value;if(value.strip().empty()) return [-1,0];var diff=arguments.callee.getFirstDifferencePos(value,this.oldElementValue);var offset=(diff==this.oldElementValue.length?1:0);var prevTokenPos=-1,nextTokenPos=value.length;var tp;for(var index=0,l=this.options.tokens.length;index<l;++index){tp=value.lastIndexOf(this.options.tokens[index],diff+offset-1);if(tp>prevTokenPos) prevTokenPos=tp;tp=value.indexOf(this.options.tokens[index],diff+offset);if(-1!=tp&&tp<nextTokenPos) nextTokenPos=tp}
return(this.tokenBounds=[prevTokenPos+1,nextTokenPos])}});Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos=function(newS,oldS){var boundary=Math.min(newS.length,oldS.length);for(var index=0;index<boundary;++index)
if(newS[index]!=oldS[index])
return index;return boundary};Ajax.Autocompleter=Class.create(Autocompleter.Base,{initialize: function(element,update,url,options){this.baseInitialize(element,update,options);this.options.asynchronous=true;this.options.onComplete=this.onComplete.bind(this);this.options.defaultParams=this.options.parameters||null;this.url=url},getUpdatedChoices: function(){this.startIndicator();var entry=encodeURIComponent(this.options.paramName)+'='+encodeURIComponent(this.getToken());this.options.parameters=this.options.callback?this.options.callback(this.element,entry):entry;if(this.options.defaultParams)
this.options.parameters+='&'+this.options.defaultParams;new Ajax.Request(this.url,this.options)},onComplete: function(request){this.updateChoices(request.responseText)}});Autocompleter.Local=Class.create(Autocompleter.Base,{initialize: function(element,update,array,options){this.baseInitialize(element,update,options);this.options.array=array},getUpdatedChoices: function(){this.updateChoices(this.options.selector(this))},setOptions: function(options){this.options=Object.extend({choices:10,partialSearch:true,partialChars:2,ignoreCase:true,fullSearch:false,selector: function(instance){var ret=[];var partial=[];var entry=instance.getToken();var count=0;for(var i=0;i<instance.options.array.length&&ret.length<instance.options.choices ;i++){var elem=instance.options.array[i];var foundPos=instance.options.ignoreCase?elem.toLowerCase().indexOf(entry.toLowerCase()):elem.indexOf(entry);while(foundPos!=-1){if(foundPos==0&&elem.length!=entry.length){ret.push("<li><strong>"+elem.substr(0,entry.length)+"</strong>"+elem.substr(entry.length)+"</li>");break} else if(entry.length>=instance.options.partialChars&&instance.options.partialSearch&&foundPos!=-1){if(instance.options.fullSearch||/\s/.test(elem.substr(foundPos-1,1))){partial.push("<li>"+elem.substr(0,foundPos)+"<strong>"+elem.substr(foundPos,entry.length)+"</strong>"+elem.substr(foundPos+entry.length)+"</li>");break}}
foundPos=instance.options.ignoreCase?elem.toLowerCase().indexOf(entry.toLowerCase(),foundPos+1):elem.indexOf(entry,foundPos+1)}}
if(partial.length)
ret=ret.concat(partial.slice(0,instance.options.choices-ret.length));return "<ul>"+ret.join('')+"</ul>"}},options||{})}});Field.scrollFreeActivate=function(field){setTimeout(function(){Field.activate(field)},1)};Ajax.InPlaceEditor=Class.create({initialize: function(element,url,options){this.url=url;this.element=element=$(element);this.prepareOptions();this._controls={};arguments.callee.dealWithDeprecatedOptions(options);Object.extend(this.options,options||{});if(!this.options.formId&&this.element.id){this.options.formId=this.element.id+'-inplaceeditor';if($(this.options.formId))
this.options.formId=''}
if(this.options.externalControl)
this.options.externalControl=$(this.options.externalControl);if(!this.options.externalControl)
this.options.externalControlOnly=false;this._originalBackground=this.element.getStyle('background-color')||'transparent';this.element.title=this.options.clickToEditText;this._boundCancelHandler=this.handleFormCancellation.bind(this);this._boundComplete=(this.options.onComplete||Prototype.emptyFunction).bind(this);this._boundFailureHandler=this.handleAJAXFailure.bind(this);this._boundSubmitHandler=this.handleFormSubmission.bind(this);this._boundWrapperHandler=this.wrapUp.bind(this);this.registerListeners()},checkForEscapeOrReturn: function(e){if(!this._editing||e.ctrlKey||e.altKey||e.shiftKey) return;if(Event.KEY_ESC==e.keyCode)
this.handleFormCancellation(e);else if(Event.KEY_RETURN==e.keyCode)
this.handleFormSubmission(e)},createControl: function(mode,handler,extraClasses){var control=this.options[mode+'Control'];var text=this.options[mode+'Text'];if('button'==control){var btn=document.createElement('input');btn.type='submit';btn.value=text;btn.className='editor_'+mode+'_button';if('cancel'==mode)
btn.onclick=this._boundCancelHandler;this._form.appendChild(btn);this._controls[mode]=btn} else if('link'==control){var link=document.createElement('a');link.href='#';link.appendChild(document.createTextNode(text));link.onclick='cancel'==mode?this._boundCancelHandler:this._boundSubmitHandler;link.className='editor_'+mode+'_link';if(extraClasses)
link.className+=' '+extraClasses;this._form.appendChild(link);this._controls[mode]=link}},createEditField: function(){var text=(this.options.loadTextURL?this.options.loadingText:this.getText());var fld;if(1>=this.options.rows&&!/\r|\n/.test(this.getText())){fld=document.createElement('input');fld.type='text';var size=this.options.size||this.options.cols||0;if(0<size) fld.size=size} else{fld=document.createElement('textarea');fld.rows=(1>=this.options.rows?this.options.autoRows:this.options.rows);fld.cols=this.options.cols||40}
fld.name=this.options.paramName;fld.value=text;fld.className='editor_field';if(this.options.submitOnBlur)
fld.onblur=this._boundSubmitHandler;this._controls.editor=fld;if(this.options.loadTextURL)
this.loadExternalText();this._form.appendChild(this._controls.editor)},createForm: function(){var ipe=this;
function addText(mode,condition){var text=ipe.options['text'+mode+'Controls'];if(!text||condition===false) return;ipe._form.appendChild(document.createTextNode(text))};this._form=$(document.createElement('form'));this._form.id=this.options.formId;this._form.addClassName(this.options.formClassName);this._form.onsubmit=this._boundSubmitHandler;this.createEditField();if('textarea'==this._controls.editor.tagName.toLowerCase())
this._form.appendChild(document.createElement('br'));if(this.options.onFormCustomization)
this.options.onFormCustomization(this,this._form);addText('Before',this.options.okControl||this.options.cancelControl);this.createControl('ok',this._boundSubmitHandler);addText('Between',this.options.okControl&&this.options.cancelControl);this.createControl('cancel',this._boundCancelHandler,'editor_cancel');addText('After',this.options.okControl||this.options.cancelControl)},destroy: function(){if(this._oldInnerHTML)
this.element.innerHTML=this._oldInnerHTML;this.leaveEditMode();this.unregisterListeners()},enterEditMode: function(e){if(this._saving||this._editing) return;this._editing=true;this.triggerCallback('onEnterEditMode');if(this.options.externalControl)
this.options.externalControl.hide();this.element.hide();this.createForm();this.element.parentNode.insertBefore(this._form,this.element);if(!this.options.loadTextURL)
this.postProcessEditField();if(e) Event.stop(e)},enterHover: function(e){if(this.options.hoverClassName)
this.element.addClassName(this.options.hoverClassName);if(this._saving) return;this.triggerCallback('onEnterHover')},getText: function(){return this.element.innerHTML.unescapeHTML()},handleAJAXFailure: function(transport){this.triggerCallback('onFailure',transport);if(this._oldInnerHTML){this.element.innerHTML=this._oldInnerHTML;this._oldInnerHTML=null}},handleFormCancellation: function(e){this.wrapUp();if(e) Event.stop(e)},handleFormSubmission: function(e){var form=this._form;var value=$F(this._controls.editor);this.prepareSubmission();var params=this.options.callback(form,value)||'';if(Object.isString(params))
params=params.toQueryParams();params.editorId=this.element.id;if(this.options.htmlResponse){var options=Object.extend({evalScripts:true},this.options.ajaxOptions);Object.extend(options,{parameters:params,onComplete:this._boundWrapperHandler,onFailure:this._boundFailureHandler});new Ajax.Updater({success:this.element},this.url,options)} else{var options=Object.extend({method:'get'},this.options.ajaxOptions);Object.extend(options,{parameters:params,onComplete:this._boundWrapperHandler,onFailure:this._boundFailureHandler});new Ajax.Request(this.url,options)}
if(e) Event.stop(e)},leaveEditMode: function(){this.element.removeClassName(this.options.savingClassName);this.removeForm();this.leaveHover();this.element.style.backgroundColor=this._originalBackground;this.element.show();if(this.options.externalControl)
this.options.externalControl.show();this._saving=false;this._editing=false;this._oldInnerHTML=null;this.triggerCallback('onLeaveEditMode')},leaveHover: function(e){if(this.options.hoverClassName)
this.element.removeClassName(this.options.hoverClassName);if(this._saving) return;this.triggerCallback('onLeaveHover')},loadExternalText: function(){this._form.addClassName(this.options.loadingClassName);this._controls.editor.disabled=true;var options=Object.extend({method:'get'},this.options.ajaxOptions);Object.extend(options,{parameters:'editorId='+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess: function(transport){this._form.removeClassName(this.options.loadingClassName);var text=transport.responseText;if(this.options.stripLoadedTextTags)
text=text.stripTags();this._controls.editor.value=text;this._controls.editor.disabled=false;this.postProcessEditField()}.bind(this),onFailure:this._boundFailureHandler});new Ajax.Request(this.options.loadTextURL,options)},postProcessEditField: function(){var fpc=this.options.fieldPostCreation;if(fpc)
$(this._controls.editor)['focus'==fpc?'focus':'activate']()},prepareOptions: function(){this.options=Object.clone(Ajax.InPlaceEditor.DefaultOptions);Object.extend(this.options,Ajax.InPlaceEditor.DefaultCallbacks);[this._extraDefaultOptions].flatten().compact().each(function(defs){Object.extend(this.options,defs)}.bind(this))},prepareSubmission: function(){this._saving=true;this.removeForm();this.leaveHover();this.showSaving()},registerListeners: function(){this._listeners={};var listener;$H(Ajax.InPlaceEditor.Listeners).each(function(pair){listener=this[pair.value].bind(this);this._listeners[pair.key]=listener;if(!this.options.externalControlOnly)
this.element.observe(pair.key,listener);if(this.options.externalControl)
this.options.externalControl.observe(pair.key,listener)}.bind(this))},removeForm: function(){if(!this._form) return;this._form.remove();this._form=null;this._controls={}},showSaving: function(){this._oldInnerHTML=this.element.innerHTML;this.element.innerHTML=this.options.savingText;this.element.addClassName(this.options.savingClassName);this.element.style.backgroundColor=this._originalBackground;this.element.show()},triggerCallback: function(cbName,arg){if('function'==typeof this.options[cbName]){this.options[cbName](this,arg)}},unregisterListeners: function(){$H(this._listeners).each(function(pair){if(!this.options.externalControlOnly)
this.element.stopObserving(pair.key,pair.value);if(this.options.externalControl)
this.options.externalControl.stopObserving(pair.key,pair.value)}.bind(this))},wrapUp: function(transport){this.leaveEditMode();this._boundComplete(transport,this.element)}});Object.extend(Ajax.InPlaceEditor.prototype,{dispose:Ajax.InPlaceEditor.prototype.destroy});Ajax.InPlaceCollectionEditor=Class.create(Ajax.InPlaceEditor,{initialize: function($super,element,url,options){this._extraDefaultOptions=Ajax.InPlaceCollectionEditor.DefaultOptions;$super(element,url,options)},createEditField: function(){var list=document.createElement('select');list.name=this.options.paramName;list.size=1;this._controls.editor=list;this._collection=this.options.collection||[];if(this.options.loadCollectionURL)
this.loadCollection();else
this.checkForExternalText();this._form.appendChild(this._controls.editor)},loadCollection: function(){this._form.addClassName(this.options.loadingClassName);this.showLoadingText(this.options.loadingCollectionText);var options=Object.extend({method:'get'},this.options.ajaxOptions);Object.extend(options,{parameters:'editorId='+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess: function(transport){var js=transport.responseText.strip();if(!/^\[.*\]$/.test(js)) // TODO:improve sanity check
throw('Server returned an invalid collection representation.');this._collection=eval(js);this.checkForExternalText()}.bind(this),onFailure:this.onFailure});new Ajax.Request(this.options.loadCollectionURL,options)},showLoadingText: function(text){this._controls.editor.disabled=true;var tempOption=this._controls.editor.firstChild;if(!tempOption){tempOption=document.createElement('option');tempOption.value='';this._controls.editor.appendChild(tempOption);tempOption.selected=true}
tempOption.update((text||'').stripScripts().stripTags())},checkForExternalText: function(){this._text=this.getText();if(this.options.loadTextURL)
this.loadExternalText();else
this.buildOptionList()},loadExternalText: function(){this.showLoadingText(this.options.loadingText);var options=Object.extend({method:'get'},this.options.ajaxOptions);Object.extend(options,{parameters:'editorId='+encodeURIComponent(this.element.id),onComplete:Prototype.emptyFunction,onSuccess: function(transport){this._text=transport.responseText.strip();this.buildOptionList()}.bind(this),onFailure:this.onFailure});new Ajax.Request(this.options.loadTextURL,options)},buildOptionList: function(){this._form.removeClassName(this.options.loadingClassName);this._collection=this._collection.map(function(entry){return 2===entry.length?entry:[entry,entry].flatten()});var marker=('value' in this.options)?this.options.value:this._text;var textFound=this._collection.any(function(entry){return entry[0]==marker}.bind(this));this._controls.editor.update('');var option;this._collection.each(function(entry,index){option=document.createElement('option');option.value=entry[0];option.selected=textFound?entry[0]==marker:0==index;option.appendChild(document.createTextNode(entry[1]));this._controls.editor.appendChild(option)}.bind(this));this._controls.editor.disabled=false;Field.scrollFreeActivate(this._controls.editor)}});Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions=function(options){if(!options) return;
function fallback(name,expr){if(name in options||expr===undefined) return;options[name]=expr};fallback('cancelControl',(options.cancelLink?'link':(options.cancelButton?'button':options.cancelLink==options.cancelButton==false?false:undefined)));fallback('okControl',(options.okLink?'link':(options.okButton?'button':options.okLink==options.okButton==false?false:undefined)));fallback('highlightColor',options.highlightcolor);fallback('highlightEndColor',options.highlightendcolor)};Object.extend(Ajax.InPlaceEditor,{DefaultOptions:{ajaxOptions:{},autoRows:3,cancelControl:'link',cancelText:'cancel',clickToEditText:'Click to edit',externalControl:null,externalControlOnly:false,fieldPostCreation:'activate',formClassName:'inplaceeditor-form',formId:null,highlightColor:'#ffff99',highlightEndColor:'#ffffff',hoverClassName:'',htmlResponse:true,loadingClassName:'inplaceeditor-loading',loadingText:'Loading...',okControl:'button',okText:'ok',paramName:'value',rows:1,savingClassName:'inplaceeditor-saving',savingText:'Saving...',size:0,stripLoadedTextTags:false,submitOnBlur:false,textAfterControls:'',textBeforeControls:'',textBetweenControls:''},DefaultCallbacks:{callback: function(form){return Form.serialize(form)},onComplete: function(transport,element){new Effect.Highlight(element,{startcolor:this.options.highlightColor,keepBackgroundImage:true})},onEnterEditMode:null,onEnterHover: function(ipe){ipe.element.style.backgroundColor=ipe.options.highlightColor;if(ipe._effect)
ipe._effect.cancel()},onFailure: function(transport,ipe){alert('Error communication with the server: '+transport.responseText.stripTags())},onFormCustomization:null,onLeaveEditMode:null,onLeaveHover: function(ipe){ipe._effect=new Effect.Highlight(ipe.element,{startcolor:ipe.options.highlightColor,endcolor:ipe.options.highlightEndColor,restorecolor:ipe._originalBackground,keepBackgroundImage:true})}},Listeners:{click:'enterEditMode',keydown:'checkForEscapeOrReturn',mouseover:'enterHover',mouseout:'leaveHover'}});Ajax.InPlaceCollectionEditor.DefaultOptions={loadingCollectionText:'Loading options...'};Form.Element.DelayedObserver=Class.create({initialize: function(element,delay,callback){this.delay=delay||0.5;this.element=$(element);this.callback=callback;this.timer=null;this.lastValue=$F(this.element);Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this))},delayedListener: function(event){if(this.lastValue==$F(this.element)) return;if(this.timer) clearTimeout(this.timer);this.timer=setTimeout(this.onTimerEvent.bind(this),this.delay * 1000);this.lastValue=$F(this.element)},onTimerEvent: function(){this.timer=null;this.callback(this.element,$F(this.element))}});

/* - ++resource++scriptaculous/dragdrop.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/dragdrop.js?original=1
if(Object.isUndefined(Effect))
throw("dragdrop.js requires including script.aculo.us' effects.js library");var Droppables={drops:[],remove: function(element){this.drops=this.drops.reject(function(d){return d.element==$(element)})},add: function(element){element=$(element);var options=Object.extend({greedy:true,hoverclass:null,tree:false},arguments[1]||{});if(options.containment){options._containers=[];var containment=options.containment;if(Object.isArray(containment)){containment.each( function(c){options._containers.push($(c))})} else{options._containers.push($(containment))}}
if(options.accept) options.accept=[options.accept].flatten();Element.makePositioned(element);options.element=element;this.drops.push(options)},findDeepestChild: function(drops){deepest=drops[0];for(i=1;i<drops.length;++i)
if(Element.isParent(drops[i].element,deepest.element))
deepest=drops[i];return deepest},isContained: function(element,drop){var containmentNode;if(drop.tree){containmentNode=element.treeNode} else{containmentNode=element.parentNode}
return drop._containers.detect(function(c){return containmentNode==c})},isAffected: function(point,element,drop){return((drop.element!=element)&&((!drop._containers)||this.isContained(element,drop))&&((!drop.accept)||(Element.classNames(element).detect(
function(v){return drop.accept.include(v)})))&&Position.within(drop.element,point[0],point[1]))},deactivate: function(drop){if(drop.hoverclass)
Element.removeClassName(drop.element,drop.hoverclass);this.last_active=null},activate: function(drop){if(drop.hoverclass)
Element.addClassName(drop.element,drop.hoverclass);this.last_active=drop},show: function(point,element){if(!this.drops.length) return;var drop,affected=[];this.drops.each( function(drop){if(Droppables.isAffected(point,element,drop))
affected.push(drop)});if(affected.length>0)
drop=Droppables.findDeepestChild(affected);if(this.last_active&&this.last_active!=drop) this.deactivate(this.last_active);if(drop){Position.within(drop.element,point[0],point[1]);if(drop.onHover)
drop.onHover(element,drop.element,Position.overlap(drop.overlap,drop.element));if(drop!=this.last_active) Droppables.activate(drop)}},fire: function(event,element){if(!this.last_active) return;Position.prepare();if(this.isAffected([Event.pointerX(event),Event.pointerY(event)],element,this.last_active))
if(this.last_active.onDrop){this.last_active.onDrop(element,this.last_active.element,event);return true}},reset: function(){if(this.last_active)
this.deactivate(this.last_active)}};var Draggables={drags:[],observers:[],register: function(draggable){if(this.drags.length==0){this.eventMouseUp=this.endDrag.bindAsEventListener(this);this.eventMouseMove=this.updateDrag.bindAsEventListener(this);this.eventKeypress=this.keyPress.bindAsEventListener(this);Event.observe(document,"mouseup",this.eventMouseUp);Event.observe(document,"mousemove",this.eventMouseMove);Event.observe(document,"keypress",this.eventKeypress)}
this.drags.push(draggable)},unregister: function(draggable){this.drags=this.drags.reject(function(d){return d==draggable});if(this.drags.length==0){Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);Event.stopObserving(document,"keypress",this.eventKeypress)}},activate: function(draggable){if(draggable.options.delay){this._timeout=setTimeout(function(){Draggables._timeout=null;window.focus();Draggables.activeDraggable=draggable}.bind(this),draggable.options.delay)} else{window.focus();this.activeDraggable=draggable}},deactivate: function(){this.activeDraggable=null},updateDrag: function(event){if(!this.activeDraggable) return;var pointer=[Event.pointerX(event),Event.pointerY(event)];if(this._lastPointer&&(this._lastPointer.inspect()==pointer.inspect())) return;this._lastPointer=pointer;this.activeDraggable.updateDrag(event,pointer)},endDrag: function(event){if(this._timeout){clearTimeout(this._timeout);this._timeout=null}
if(!this.activeDraggable) return;this._lastPointer=null;this.activeDraggable.endDrag(event);this.activeDraggable=null},keyPress: function(event){if(this.activeDraggable)
this.activeDraggable.keyPress(event)},addObserver: function(observer){this.observers.push(observer);this._cacheObserverCallbacks()},removeObserver: function(element){this.observers=this.observers.reject( function(o){return o.element==element});this._cacheObserverCallbacks()},notify: function(eventName,draggable,event){if(this[eventName+'Count']>0)
this.observers.each( function(o){if(o[eventName]) o[eventName](eventName,draggable,event)});if(draggable.options[eventName]) draggable.options[eventName](draggable,event)},_cacheObserverCallbacks: function(){['onStart','onEnd','onDrag'].each( function(eventName){Draggables[eventName+'Count']=Draggables.observers.select(
function(o){return o[eventName]}).length})}};var Draggable=Class.create({initialize: function(element){var defaults={handle:false,reverteffect: function(element,top_offset,left_offset){var dur=Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;new Effect.Move(element,{x:-left_offset,y:-top_offset,duration:dur,queue:{scope:'_draggable',position:'end'}})},endeffect: function(element){var toOpacity=Object.isNumber(element._opacity)?element._opacity:1.0;new Effect.Opacity(element,{duration:0.2,from:0.7,to:toOpacity,queue:{scope:'_draggable',position:'end'},afterFinish: function(){Draggable._dragging[element]=false}})},zindex:1000,revert:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,snap:false,delay:0};if(!arguments[1]||Object.isUndefined(arguments[1].endeffect))
Object.extend(defaults,{starteffect: function(element){element._opacity=Element.getOpacity(element);Draggable._dragging[element]=true;new Effect.Opacity(element,{duration:0.2,from:element._opacity,to:0.7})}});var options=Object.extend(defaults,arguments[1]||{});this.element=$(element);if(options.handle&&Object.isString(options.handle))
this.handle=this.element.down('.'+options.handle,0);if(!this.handle) this.handle=$(options.handle);if(!this.handle) this.handle=this.element;if(options.scroll&&!options.scroll.scrollTo&&!options.scroll.outerHTML){options.scroll=$(options.scroll);this._isScrollChild=Element.childOf(this.element,options.scroll)}
Element.makePositioned(this.element);this.options=options;this.dragging=false;this.eventMouseDown=this.initDrag.bindAsEventListener(this);Event.observe(this.handle,"mousedown",this.eventMouseDown);Draggables.register(this)},destroy: function(){Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);Draggables.unregister(this)},currentDelta: function(){return([parseInt(Element.getStyle(this.element,'left')||'0'),parseInt(Element.getStyle(this.element,'top')||'0')])},initDrag: function(event){if(!Object.isUndefined(Draggable._dragging[this.element])&&Draggable._dragging[this.element]) return;if(Event.isLeftClick(event)){var src=Event.element(event);if((tag_name=src.tagName.toUpperCase())&&(tag_name=='INPUT'||tag_name=='SELECT'||tag_name=='OPTION'||tag_name=='BUTTON'||tag_name=='TEXTAREA')) return;var pointer=[Event.pointerX(event),Event.pointerY(event)];var pos=this.element.cumulativeOffset();this.offset=[0,1].map( function(i){return(pointer[i]-pos[i])});Draggables.activate(this);Event.stop(event)}},startDrag: function(event){this.dragging=true;if(!this.delta)
this.delta=this.currentDelta();if(this.options.zindex){this.originalZ=parseInt(Element.getStyle(this.element,'z-index')||0);this.element.style.zIndex=this.options.zindex}
if(this.options.ghosting){this._clone=this.element.cloneNode(true);this._originallyAbsolute=(this.element.getStyle('position')=='absolute');if(!this._originallyAbsolute)
Position.absolutize(this.element);this.element.parentNode.insertBefore(this._clone,this.element)}
if(this.options.scroll){if(this.options.scroll==window){var where=this._getWindowScroll(this.options.scroll);this.originalScrollLeft=where.left;this.originalScrollTop=where.top} else{this.originalScrollLeft=this.options.scroll.scrollLeft;this.originalScrollTop=this.options.scroll.scrollTop}}
Draggables.notify('onStart',this,event);if(this.options.starteffect) this.options.starteffect(this.element)},updateDrag: function(event,pointer){if(!this.dragging) this.startDrag(event);if(!this.options.quiet){Position.prepare();Droppables.show(pointer,this.element)}
Draggables.notify('onDrag',this,event);this.draw(pointer);if(this.options.change) this.options.change(this);if(this.options.scroll){this.stopScrolling();var p;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){p=[left,top,left+width,top+height]}} else{p=Position.page(this.options.scroll);p[0]+=this.options.scroll.scrollLeft+Position.deltaX;p[1]+=this.options.scroll.scrollTop+Position.deltaY;p.push(p[0]+this.options.scroll.offsetWidth);p.push(p[1]+this.options.scroll.offsetHeight)}
var speed=[0,0];if(pointer[0]<(p[0]+this.options.scrollSensitivity)) speed[0]=pointer[0]-(p[0]+this.options.scrollSensitivity);if(pointer[1]<(p[1]+this.options.scrollSensitivity)) speed[1]=pointer[1]-(p[1]+this.options.scrollSensitivity);if(pointer[0]>(p[2]-this.options.scrollSensitivity)) speed[0]=pointer[0]-(p[2]-this.options.scrollSensitivity);if(pointer[1]>(p[3]-this.options.scrollSensitivity)) speed[1]=pointer[1]-(p[3]-this.options.scrollSensitivity);this.startScrolling(speed)}
if(Prototype.Browser.WebKit) window.scrollBy(0,0);Event.stop(event)},finishDrag: function(event,success){this.dragging=false;if(this.options.quiet){Position.prepare();var pointer=[Event.pointerX(event),Event.pointerY(event)];Droppables.show(pointer,this.element)}
if(this.options.ghosting){if(!this._originallyAbsolute)
Position.relativize(this.element);delete this._originallyAbsolute;Element.remove(this._clone);this._clone=null}
var dropped=false;if(success){dropped=Droppables.fire(event,this.element);if(!dropped) dropped=false}
if(dropped&&this.options.onDropped) this.options.onDropped(this.element);Draggables.notify('onEnd',this,event);var revert=this.options.revert;if(revert&&Object.isFunction(revert)) revert=revert(this.element);var d=this.currentDelta();if(revert&&this.options.reverteffect){if(dropped==0||revert!='failure')
this.options.reverteffect(this.element,d[1]-this.delta[1],d[0]-this.delta[0])} else{this.delta=d}
if(this.options.zindex)
this.element.style.zIndex=this.originalZ;if(this.options.endeffect)
this.options.endeffect(this.element);Draggables.deactivate(this);Droppables.reset()},keyPress: function(event){if(event.keyCode!=Event.KEY_ESC) return;this.finishDrag(event,false);Event.stop(event)},endDrag: function(event){if(!this.dragging) return;this.stopScrolling();this.finishDrag(event,true);Event.stop(event)},draw: function(point){var pos=this.element.cumulativeOffset();if(this.options.ghosting){var r=Position.realOffset(this.element);pos[0]+=r[0]-Position.deltaX;pos[1]+=r[1]-Position.deltaY}
var d=this.currentDelta();pos[0]-=d[0];pos[1]-=d[1];if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){pos[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft;pos[1]-=this.options.scroll.scrollTop-this.originalScrollTop}
var p=[0,1].map(function(i){return(point[i]-pos[i]-this.offset[i])}.bind(this));if(this.options.snap){if(Object.isFunction(this.options.snap)){p=this.options.snap(p[0],p[1],this)} else{if(Object.isArray(this.options.snap)){p=p.map( function(v,i){return(v/this.options.snap[i]).round()*this.options.snap[i]}.bind(this))} else{p=p.map( function(v){return(v/this.options.snap).round()*this.options.snap}.bind(this))}}}
var style=this.element.style;if((!this.options.constraint)||(this.options.constraint=='horizontal'))
style.left=p[0]+"px";if((!this.options.constraint)||(this.options.constraint=='vertical'))
style.top=p[1]+"px";if(style.visibility=="hidden") style.visibility=""},stopScrolling: function(){if(this.scrollInterval){clearInterval(this.scrollInterval);this.scrollInterval=null;Draggables._lastScrollPointer=null}},startScrolling: function(speed){if(!(speed[0]||speed[1])) return;this.scrollSpeed=[speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];this.lastScrolled=new Date();this.scrollInterval=setInterval(this.scroll.bind(this),10)},scroll: function(){var current=new Date();var delta=current-this.lastScrolled;this.lastScrolled=current;if(this.options.scroll==window){with(this._getWindowScroll(this.options.scroll)){if(this.scrollSpeed[0]||this.scrollSpeed[1]){var d=delta/1000;this.options.scroll.scrollTo(left+d*this.scrollSpeed[0],top+d*this.scrollSpeed[1])}}} else{this.options.scroll.scrollLeft+=this.scrollSpeed[0] * delta/1000;this.options.scroll.scrollTop+=this.scrollSpeed[1] * delta/1000}
Position.prepare();Droppables.show(Draggables._lastPointer,this.element);Draggables.notify('onDrag',this);if(this._isScrollChild){Draggables._lastScrollPointer=Draggables._lastScrollPointer||$A(Draggables._lastPointer);Draggables._lastScrollPointer[0]+=this.scrollSpeed[0] * delta/1000;Draggables._lastScrollPointer[1]+=this.scrollSpeed[1] * delta/1000;if(Draggables._lastScrollPointer[0]<0)
Draggables._lastScrollPointer[0]=0;if(Draggables._lastScrollPointer[1]<0)
Draggables._lastScrollPointer[1]=0;this.draw(Draggables._lastScrollPointer)}
if(this.options.change) this.options.change(this)},_getWindowScroll: function(w){var T,L,W,H;with(w.document){if(w.document.documentElement&&documentElement.scrollTop){T=documentElement.scrollTop;L=documentElement.scrollLeft} else if(w.document.body){T=body.scrollTop;L=body.scrollLeft}
if(w.innerWidth){W=w.innerWidth;H=w.innerHeight} else if(w.document.documentElement&&documentElement.clientWidth){W=documentElement.clientWidth;H=documentElement.clientHeight} else{W=body.offsetWidth;H=body.offsetHeight}}
return{top:T,left:L,width:W,height:H}}});Draggable._dragging={};var SortableObserver=Class.create({initialize: function(element,observer){this.element=$(element);this.observer=observer;this.lastValue=Sortable.serialize(this.element)},onStart: function(){this.lastValue=Sortable.serialize(this.element)},onEnd: function(){Sortable.unmark();if(this.lastValue!=Sortable.serialize(this.element))
this.observer(this.element)}});var Sortable={SERIALIZE_RULE:/^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,sortables:{},_findRootElement: function(element){while(element.tagName.toUpperCase()!="BODY"){if(element.id&&Sortable.sortables[element.id]) return element;element=element.parentNode}},options: function(element){element=Sortable._findRootElement($(element));if(!element) return;return Sortable.sortables[element.id]},destroy: function(element){element=$(element);var s=Sortable.sortables[element.id];if(s){Draggables.removeObserver(s.element);s.droppables.each(function(d){Droppables.remove(d)});s.draggables.invoke('destroy');delete Sortable.sortables[s.element.id]}},create: function(element){element=$(element);var options=Object.extend({element:element,tag:'li',dropOnEmpty:false,tree:false,treeTag:'ul',overlap:'vertical',constraint:'vertical',containment:element,handle:false,only:false,delay:0,hoverclass:null,ghosting:false,quiet:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,format:this.SERIALIZE_RULE,elements:false,handles:false,onChange:Prototype.emptyFunction,onUpdate:Prototype.emptyFunction},arguments[1]||{});this.destroy(element);var options_for_draggable={revert:true,quiet:options.quiet,scroll:options.scroll,scrollSpeed:options.scrollSpeed,scrollSensitivity:options.scrollSensitivity,delay:options.delay,ghosting:options.ghosting,constraint:options.constraint,handle:options.handle};if(options.starteffect)
options_for_draggable.starteffect=options.starteffect;if(options.reverteffect)
options_for_draggable.reverteffect=options.reverteffect;else
if(options.ghosting) options_for_draggable.reverteffect=function(element){element.style.top=0;element.style.left=0};if(options.endeffect)
options_for_draggable.endeffect=options.endeffect;if(options.zindex)
options_for_draggable.zindex=options.zindex;var options_for_droppable={overlap:options.overlap,containment:options.containment,tree:options.tree,hoverclass:options.hoverclass,onHover:Sortable.onHover};var options_for_tree={onHover:Sortable.onEmptyHover,overlap:options.overlap,containment:options.containment,hoverclass:options.hoverclass};Element.cleanWhitespace(element);options.draggables=[];options.droppables=[];if(options.dropOnEmpty||options.tree){Droppables.add(element,options_for_tree);options.droppables.push(element)}(options.elements||this.findElements(element,options)||[]).each( function(e,i){var handle=options.handles?$(options.handles[i]):(options.handle?$(e).select('.'+options.handle)[0]:e);options.draggables.push(new Draggable(e,Object.extend(options_for_draggable,{handle:handle})));Droppables.add(e,options_for_droppable);if(options.tree) e.treeNode=element;options.droppables.push(e)});if(options.tree){(Sortable.findTreeElements(element,options)||[]).each( function(e){Droppables.add(e,options_for_tree);e.treeNode=element;options.droppables.push(e)})}
this.sortables[element.identify()]=options;Draggables.addObserver(new SortableObserver(element,options.onUpdate))},findElements: function(element,options){return Element.findChildren(element,options.only,options.tree?true:false,options.tag)},findTreeElements: function(element,options){return Element.findChildren(element,options.only,options.tree?true:false,options.treeTag)},onHover: function(element,dropon,overlap){if(Element.isParent(dropon,element)) return;if(overlap>.33&&overlap<.66&&Sortable.options(dropon).tree){return} else if(overlap>0.5){Sortable.mark(dropon,'before');if(dropon.previousSibling!=element){var oldParentNode=element.parentNode;element.style.visibility="hidden";dropon.parentNode.insertBefore(element,dropon);if(dropon.parentNode!=oldParentNode)
Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element)}} else{Sortable.mark(dropon,'after');var nextElement=dropon.nextSibling||null;if(nextElement!=element){var oldParentNode=element.parentNode;element.style.visibility="hidden";dropon.parentNode.insertBefore(element,nextElement);if(dropon.parentNode!=oldParentNode)
Sortable.options(oldParentNode).onChange(element);Sortable.options(dropon.parentNode).onChange(element)}}},onEmptyHover: function(element,dropon,overlap){var oldParentNode=element.parentNode;var droponOptions=Sortable.options(dropon);if(!Element.isParent(dropon,element)){var index;var children=Sortable.findElements(dropon,{tag:droponOptions.tag,only:droponOptions.only});var child=null;if(children){var offset=Element.offsetSize(dropon,droponOptions.overlap) *(1.0-overlap);for(index=0;index<children.length;index+=1){if(offset-Element.offsetSize(children[index],droponOptions.overlap)>=0){offset-=Element.offsetSize(children[index],droponOptions.overlap)} else if(offset-(Element.offsetSize(children[index],droponOptions.overlap)/2)>=0){child=index+1<children.length?children[index+1]:null;break} else{child=children[index];break}}}
dropon.insertBefore(element,child);Sortable.options(oldParentNode).onChange(element);droponOptions.onChange(element)}},unmark: function(){if(Sortable._marker) Sortable._marker.hide()},mark: function(dropon,position){var sortable=Sortable.options(dropon.parentNode);if(sortable&&!sortable.ghosting) return;if(!Sortable._marker){Sortable._marker=($('dropmarker')||Element.extend(document.createElement('DIV'))).
hide().addClassName('dropmarker').setStyle({position:'absolute'});document.getElementsByTagName("body").item(0).appendChild(Sortable._marker)}
var offsets=dropon.cumulativeOffset();Sortable._marker.setStyle({left:offsets[0]+'px',top:offsets[1]+'px'});if(position=='after')
if(sortable.overlap=='horizontal')
Sortable._marker.setStyle({left:(offsets[0]+dropon.clientWidth)+'px'});else
Sortable._marker.setStyle({top:(offsets[1]+dropon.clientHeight)+'px'});Sortable._marker.show()},_tree: function(element,options,parent){var children=Sortable.findElements(element,options)||[];for(var i=0;i<children.length;++i){var match=children[i].id.match(options.format);if(!match) continue;var child={id:encodeURIComponent(match?match[1]:null),element:element,parent:parent,children:[],position:parent.children.length,container:$(children[i]).down(options.treeTag)};if(child.container)
this._tree(child.container,options,child);parent.children.push(child)}
return parent},tree: function(element){element=$(element);var sortableOptions=this.options(element);var options=Object.extend({tag:sortableOptions.tag,treeTag:sortableOptions.treeTag,only:sortableOptions.only,name:element.id,format:sortableOptions.format},arguments[1]||{});var root={id:null,parent:null,children:[],container:element,position:0};return Sortable._tree(element,options,root)},_constructIndex: function(node){var index='';do{if(node.id) index='['+node.position+']'+index} while((node=node.parent)!=null);return index},sequence: function(element){element=$(element);var options=Object.extend(this.options(element),arguments[1]||{});return $(this.findElements(element,options)||[]).map( function(item){return item.id.match(options.format)?item.id.match(options.format)[1]:''})},setSequence: function(element,new_sequence){element=$(element);var options=Object.extend(this.options(element),arguments[2]||{});var nodeMap={};this.findElements(element,options).each( function(n){if(n.id.match(options.format))
nodeMap[n.id.match(options.format)[1]]=[n,n.parentNode];n.parentNode.removeChild(n)});new_sequence.each(function(ident){var n=nodeMap[ident];if(n){n[1].appendChild(n[0]);delete nodeMap[ident]}})},serialize: function(element){element=$(element);var options=Object.extend(Sortable.options(element),arguments[1]||{});var name=encodeURIComponent((arguments[1]&&arguments[1].name)?arguments[1].name:element.id);if(options.tree){return Sortable.tree(element,arguments[1]).children.map( function(item){return [name+Sortable._constructIndex(item)+"[id]="+encodeURIComponent(item.id)].concat(item.children.map(arguments.callee))}).flatten().join('&')} else{return Sortable.sequence(element,arguments[1]).map( function(item){return name+"[]="+encodeURIComponent(item)}).join('&')}}};Element.isParent=function(child,element){if(!child.parentNode||child==element) return false;if(child.parentNode==element) return true;return Element.isParent(child.parentNode,element)};Element.findChildren=function(element,only,recursive,tagName){if(!element.hasChildNodes()) return null;tagName=tagName.toUpperCase();if(only) only=[only].flatten();var elements=[];$A(element.childNodes).each( function(e){if(e.tagName&&e.tagName.toUpperCase()==tagName&&(!only||(Element.classNames(e).detect(function(v){return only.include(v)}))))
elements.push(e);if(recursive){var grandchildren=Element.findChildren(e,only,recursive,tagName);if(grandchildren) elements.push(grandchildren)}});return(elements.length>0?elements.flatten():[])};Element.offsetSize=function(element,type){return element['offset'+((type=='vertical'||type=='height')?'Height':'Width')]};

/* - ++resource++scriptaculous/slider.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/slider.js?original=1
if(!Control) var Control={};Control.Slider=Class.create({initialize: function(handle,track,options){var slider=this;if(Object.isArray(handle)){this.handles=handle.collect( function(e){return $(e)})} else{this.handles=[$(handle)]}
this.track=$(track);this.options=options||{};this.axis=this.options.axis||'horizontal';this.increment=this.options.increment||1;this.step=parseInt(this.options.step||'1');this.range=this.options.range||$R(0,1);this.value=0;this.values=this.handles.map( function(){return 0});this.spans=this.options.spans?this.options.spans.map(function(s){return $(s)}):false;this.options.startSpan=$(this.options.startSpan||null);this.options.endSpan=$(this.options.endSpan||null);this.restricted=this.options.restricted||false;this.maximum=this.options.maximum||this.range.end;this.minimum=this.options.minimum||this.range.start;this.alignX=parseInt(this.options.alignX||'0');this.alignY=parseInt(this.options.alignY||'0');this.trackLength=this.maximumOffset()-this.minimumOffset();this.handleLength=this.isVertical()?(this.handles[0].offsetHeight!=0?this.handles[0].offsetHeight:this.handles[0].style.height.replace(/px$/,"")):(this.handles[0].offsetWidth!=0?this.handles[0].offsetWidth:this.handles[0].style.width.replace(/px$/,""));this.active=false;this.dragging=false;this.disabled=false;if(this.options.disabled) this.setDisabled();this.allowedValues=this.options.values?this.options.values.sortBy(Prototype.K):false;if(this.allowedValues){this.minimum=this.allowedValues.min();this.maximum=this.allowedValues.max()}
this.eventMouseDown=this.startDrag.bindAsEventListener(this);this.eventMouseUp=this.endDrag.bindAsEventListener(this);this.eventMouseMove=this.update.bindAsEventListener(this);this.handles.each( function(h,i){i=slider.handles.length-1-i;slider.setValue(parseFloat((Object.isArray(slider.options.sliderValue)?slider.options.sliderValue[i]:slider.options.sliderValue)||slider.range.start),i);h.makePositioned().observe("mousedown",slider.eventMouseDown)});this.track.observe("mousedown",this.eventMouseDown);document.observe("mouseup",this.eventMouseUp);document.observe("mousemove",this.eventMouseMove);this.initialized=true},dispose: function(){var slider=this;Event.stopObserving(this.track,"mousedown",this.eventMouseDown);Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);this.handles.each( function(h){Event.stopObserving(h,"mousedown",slider.eventMouseDown)})},setDisabled: function(){this.disabled=true},setEnabled: function(){this.disabled=false},getNearestValue: function(value){if(this.allowedValues){if(value>=this.allowedValues.max()) return(this.allowedValues.max());if(value<=this.allowedValues.min()) return(this.allowedValues.min());var offset=Math.abs(this.allowedValues[0]-value);var newValue=this.allowedValues[0];this.allowedValues.each( function(v){var currentOffset=Math.abs(v-value);if(currentOffset<=offset){newValue=v;offset=currentOffset}});return newValue}
if(value>this.range.end) return this.range.end;if(value<this.range.start) return this.range.start;return value},setValue: function(sliderValue,handleIdx){if(!this.active){this.activeHandleIdx=handleIdx||0;this.activeHandle=this.handles[this.activeHandleIdx];this.updateStyles()}
handleIdx=handleIdx||this.activeHandleIdx||0;if(this.initialized&&this.restricted){if((handleIdx>0)&&(sliderValue<this.values[handleIdx-1]))
sliderValue=this.values[handleIdx-1];if((handleIdx<(this.handles.length-1))&&(sliderValue>this.values[handleIdx+1]))
sliderValue=this.values[handleIdx+1]}
sliderValue=this.getNearestValue(sliderValue);this.values[handleIdx]=sliderValue;this.value=this.values[0];this.handles[handleIdx].style[this.isVertical()?'top':'left']=this.translateToPx(sliderValue);this.drawSpans();if(!this.dragging||!this.event) this.updateFinished()},setValueBy: function(delta,handleIdx){this.setValue(this.values[handleIdx||this.activeHandleIdx||0]+delta,handleIdx||this.activeHandleIdx||0)},translateToPx: function(value){return Math.round(((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *(value-this.range.start))+"px"},translateToValue: function(offset){return((offset/(this.trackLength-this.handleLength) *(this.range.end-this.range.start))+this.range.start)},getRange: function(range){var v=this.values.sortBy(Prototype.K);range=range||0;return $R(v[range],v[range+1])},minimumOffset: function(){return(this.isVertical()?this.alignY:this.alignX)},maximumOffset: function(){return(this.isVertical()?(this.track.offsetHeight!=0?this.track.offsetHeight:this.track.style.height.replace(/px$/,""))-this.alignY:(this.track.offsetWidth!=0?this.track.offsetWidth:this.track.style.width.replace(/px$/,""))-this.alignX)},isVertical: function(){return(this.axis=='vertical')},drawSpans: function(){var slider=this;if(this.spans)
$R(0,this.spans.length-1).each(function(r){slider.setSpan(slider.spans[r],slider.getRange(r))});if(this.options.startSpan)
this.setSpan(this.options.startSpan,$R(0,this.values.length>1?this.getRange(0).min():this.value));if(this.options.endSpan)
this.setSpan(this.options.endSpan,$R(this.values.length>1?this.getRange(this.spans.length-1).max():this.value,this.maximum))},setSpan: function(span,range){if(this.isVertical()){span.style.top=this.translateToPx(range.start);span.style.height=this.translateToPx(range.end-range.start+this.range.start)} else{span.style.left=this.translateToPx(range.start);span.style.width=this.translateToPx(range.end-range.start+this.range.start)}},updateStyles: function(){this.handles.each( function(h){Element.removeClassName(h,'selected')});Element.addClassName(this.activeHandle,'selected')},startDrag: function(event){if(Event.isLeftClick(event)){if(!this.disabled){this.active=true;var handle=Event.element(event);var pointer=[Event.pointerX(event),Event.pointerY(event)];var track=handle;if(track==this.track){var offsets=this.track.cumulativeOffset();this.event=event;this.setValue(this.translateToValue((this.isVertical()?pointer[1]-offsets[1]:pointer[0]-offsets[0])-(this.handleLength/2)));var offsets=this.activeHandle.cumulativeOffset();this.offsetX=(pointer[0]-offsets[0]);this.offsetY=(pointer[1]-offsets[1])} else{while((this.handles.indexOf(handle)==-1)&&handle.parentNode)
handle=handle.parentNode;if(this.handles.indexOf(handle)!=-1){this.activeHandle=handle;this.activeHandleIdx=this.handles.indexOf(this.activeHandle);this.updateStyles();var offsets=this.activeHandle.cumulativeOffset();this.offsetX=(pointer[0]-offsets[0]);this.offsetY=(pointer[1]-offsets[1])}}}
Event.stop(event)}},update: function(event){if(this.active){if(!this.dragging) this.dragging=true;this.draw(event);if(Prototype.Browser.WebKit) window.scrollBy(0,0);Event.stop(event)}},draw: function(event){var pointer=[Event.pointerX(event),Event.pointerY(event)];var offsets=this.track.cumulativeOffset();pointer[0]-=this.offsetX+offsets[0];pointer[1]-=this.offsetY+offsets[1];this.event=event;this.setValue(this.translateToValue(this.isVertical()?pointer[1]:pointer[0]));if(this.initialized&&this.options.onSlide)
this.options.onSlide(this.values.length>1?this.values:this.value,this)},endDrag: function(event){if(this.active&&this.dragging){this.finishDrag(event,true);Event.stop(event)}
this.active=false;this.dragging=false},finishDrag: function(event,success){this.active=false;this.dragging=false;this.updateFinished()},updateFinished: function(){if(this.initialized&&this.options.onChange)
this.options.onChange(this.values.length>1?this.values:this.value,this);this.event=null}});

/* - ++resource++scriptaculous/sound.js - */
// http://www.duwe-3d.eu/portal_javascripts/++resource++scriptaculous/sound.js?original=1
Sound={tracks:{},_enabled:true,template:new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),enable: function(){Sound._enabled=true},disable: function(){Sound._enabled=false},play: function(url){if(!Sound._enabled) return;var options=Object.extend({track:'global',url:url,replace:false},arguments[1]||{});if(options.replace&&this.tracks[options.track]){$R(0,this.tracks[options.track].id).each(function(id){var sound=$('sound_'+options.track+'_'+id);sound.Stop&&sound.Stop();sound.remove()});this.tracks[options.track]=null}
if(!this.tracks[options.track])
this.tracks[options.track]={id:0};else
this.tracks[options.track].id++;options.id=this.tracks[options.track].id;$$('body')[0].insert(Prototype.Browser.IE?new Element('bgsound',{id:'sound_'+options.track+'_'+options.id,src:options.url,loop:1,autostart:true}):Sound.template.evaluate(options))}};if(Prototype.Browser.Gecko&&navigator.userAgent.indexOf("Win")>0){if(navigator.plugins&&$A(navigator.plugins).detect(function(p){return p.name.indexOf('QuickTime')!=-1}))
Sound.template=new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');else if(navigator.plugins&&$A(navigator.plugins).detect(function(p){return p.name.indexOf('Windows Media')!=-1}))
Sound.template=new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>');else if(navigator.plugins&&$A(navigator.plugins).detect(function(p){return p.name.indexOf('RealPlayer')!=-1}))
Sound.template=new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>');else
Sound.play=function(){}}

/* - swfobject.js - */
// http://www.duwe-3d.eu/portal_javascripts/swfobject.js?original=1
var swfobject=function(){var b="undefined",Q="object",n="Shockwave Flash",p="ShockwaveFlash.ShockwaveFlash",P="application/x-shockwave-flash",m="SWFObjectExprInst",j=window,K=document,T=navigator,o=[],N=[],i=[],d=[],J,Z=null,M=null,l=null,e=false,A=false;var h=function(){var v=typeof K.getElementById!=b&&typeof K.getElementsByTagName!=b&&typeof K.createElement!=b,AC=[0,0,0],x=null;if(typeof T.plugins!=b&&typeof T.plugins[n]==Q){x=T.plugins[n].description;if(x&&!(typeof T.mimeTypes!=b&&T.mimeTypes[P]&&!T.mimeTypes[P].enabledPlugin)){x=x.replace(/^.*\s+(\S+\s+\S+$)/,"$1");AC[0]=parseInt(x.replace(/^(.*)\..*$/,"$1"),10);AC[1]=parseInt(x.replace(/^.*\.(.*)\s.*$/,"$1"),10);AC[2]=/r/.test(x)?parseInt(x.replace(/^.*r(.*)$/,"$1"),10):0}}else{if(typeof j.ActiveXObject!=b){var y=null,AB=false;try{y=new ActiveXObject(p+".7")}catch(t){try{y=new ActiveXObject(p+".6");AC=[6,0,21];y.AllowScriptAccess="always"}catch(t){if(AC[0]==6){AB=true}}if(!AB){try{y=new ActiveXObject(p)}catch(t){}}}if(!AB&&y){try{x=y.GetVariable("$version");if(x){x=x.split(" ")[1].split(",");AC=[parseInt(x[0],10),parseInt(x[1],10),parseInt(x[2],10)]}}catch(t){}}}}var AD=T.userAgent.toLowerCase(),r=T.platform.toLowerCase(),AA=/webkit/.test(AD)?parseFloat(AD.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,q=false,z=r?/win/.test(r):/win/.test(AD),w=r?/mac/.test(r):/mac/.test(AD);/*@cc_on q=true;@if(@_win32)z=true;@elif(@_mac)w=true;@end@*/return{w3cdom:v,pv:AC,webkit:AA,ie:q,win:z,mac:w}}();var L=function(){if(!h.w3cdom){return }f(H);if(h.ie&&h.win){try{K.write("<script id=__ie_ondomload defer=true src=//:><\/script>");J=C("__ie_ondomload");if(J){I(J,"onreadystatechange",S)}}catch(q){}}if(h.webkit&&typeof K.readyState!=b){Z=setInterval(function(){if(/loaded|complete/.test(K.readyState)){E()}},10)}if(typeof K.addEventListener!=b){K.addEventListener("DOMContentLoaded",E,null)}R(E)}();function S(){if(J.readyState=="complete"){J.parentNode.removeChild(J);E()}}function E(){if(e){return }if(h.ie&&h.win){var v=a("span");try{var u=K.getElementsByTagName("body")[0].appendChild(v);u.parentNode.removeChild(u)}catch(w){return }}e=true;if(Z){clearInterval(Z);Z=null}var q=o.length;for(var r=0;r<q;r++){o[r]()}}function f(q){if(e){q()}else{o[o.length]=q}}function R(r){if(typeof j.addEventListener!=b){j.addEventListener("load",r,false)}else{if(typeof K.addEventListener!=b){K.addEventListener("load",r,false)}else{if(typeof j.attachEvent!=b){I(j,"onload",r)}else{if(typeof j.onload=="function"){var q=j.onload;j.onload=function(){q();r()}}else{j.onload=r}}}}}function H(){var t=N.length;for(var q=0;q<t;q++){var u=N[q].id;if(h.pv[0]>0){var r=C(u);if(r){N[q].width=r.getAttribute("width")?r.getAttribute("width"):"0";N[q].height=r.getAttribute("height")?r.getAttribute("height"):"0";if(c(N[q].swfVersion)){if(h.webkit&&h.webkit<312){Y(r)}W(u,true)}else{if(N[q].expressInstall&&!A&&c("6.0.65")&&(h.win||h.mac)){k(N[q])}else{O(r)}}}}else{W(u,true)}}}function Y(t){var q=t.getElementsByTagName(Q)[0];if(q){var w=a("embed"),y=q.attributes;if(y){var v=y.length;for(var u=0;u<v;u++){if(y[u].nodeName=="DATA"){w.setAttribute("src",y[u].nodeValue)}else{w.setAttribute(y[u].nodeName,y[u].nodeValue)}}}var x=q.childNodes;if(x){var z=x.length;for(var r=0;r<z;r++){if(x[r].nodeType==1&&x[r].nodeName=="PARAM"){w.setAttribute(x[r].getAttribute("name"),x[r].getAttribute("value"))}}}t.parentNode.replaceChild(w,t)}}function k(w){A=true;var u=C(w.id);if(u){if(w.altContentId){var y=C(w.altContentId);if(y){M=y;l=w.altContentId}}else{M=G(u)}if(!(/%$/.test(w.width))&&parseInt(w.width,10)<310){w.width="310"}if(!(/%$/.test(w.height))&&parseInt(w.height,10)<137){w.height="137"}K.title=K.title.slice(0,47)+" - Flash Player Installation";var z=h.ie&&h.win?"ActiveX":"PlugIn",q=K.title,r="MMredirectURL="+j.location+"&MMplayerType="+z+"&MMdoctitle="+q,x=w.id;if(h.ie&&h.win&&u.readyState!=4){var t=a("div");x+="SWFObjectNew";t.setAttribute("id",x);u.parentNode.insertBefore(t,u);u.style.display="none";var v=function(){u.parentNode.removeChild(u)};I(j,"onload",v)}U({data:w.expressInstall,id:m,width:w.width,height:w.height},{flashvars:r},x)}}function O(t){if(h.ie&&h.win&&t.readyState!=4){var r=a("div");t.parentNode.insertBefore(r,t);r.parentNode.replaceChild(G(t),r);t.style.display="none";var q=function(){t.parentNode.removeChild(t)};I(j,"onload",q)}else{t.parentNode.replaceChild(G(t),t)}}function G(v){var u=a("div");if(h.win&&h.ie){u.innerHTML=v.innerHTML}else{var r=v.getElementsByTagName(Q)[0];if(r){var w=r.childNodes;if(w){var q=w.length;for(var t=0;t<q;t++){if(!(w[t].nodeType==1&&w[t].nodeName=="PARAM")&&!(w[t].nodeType==8)){u.appendChild(w[t].cloneNode(true))}}}}}return u}function U(AG,AE,t){var q,v=C(t);if(v){if(typeof AG.id==b){AG.id=t}if(h.ie&&h.win){var AF="";for(var AB in AG){if(AG[AB]!=Object.prototype[AB]){if(AB.toLowerCase()=="data"){AE.movie=AG[AB]}else{if(AB.toLowerCase()=="styleclass"){AF+=' class="'+AG[AB]+'"'}else{if(AB.toLowerCase()!="classid"){AF+=" "+AB+'="'+AG[AB]+'"'}}}}}var AD="";for(var AA in AE){if(AE[AA]!=Object.prototype[AA]){AD+='<param name="'+AA+'" value="'+AE[AA]+'" />'}}v.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+AF+">"+AD+"</object>";i[i.length]=AG.id;q=C(AG.id)}else{if(h.webkit&&h.webkit<312){var AC=a("embed");AC.setAttribute("type",P);for(var z in AG){if(AG[z]!=Object.prototype[z]){if(z.toLowerCase()=="data"){AC.setAttribute("src",AG[z])}else{if(z.toLowerCase()=="styleclass"){AC.setAttribute("class",AG[z])}else{if(z.toLowerCase()!="classid"){AC.setAttribute(z,AG[z])}}}}}for(var y in AE){if(AE[y]!=Object.prototype[y]){if(y.toLowerCase()!="movie"){AC.setAttribute(y,AE[y])}}}v.parentNode.replaceChild(AC,v);q=AC}else{var u=a(Q);u.setAttribute("type",P);for(var x in AG){if(AG[x]!=Object.prototype[x]){if(x.toLowerCase()=="styleclass"){u.setAttribute("class",AG[x])}else{if(x.toLowerCase()!="classid"){u.setAttribute(x,AG[x])}}}}for(var w in AE){if(AE[w]!=Object.prototype[w]&&w.toLowerCase()!="movie"){F(u,w,AE[w])}}v.parentNode.replaceChild(u,v);q=u}}}return q}function F(t,q,r){var u=a("param");u.setAttribute("name",q);u.setAttribute("value",r);t.appendChild(u)}function X(r){var q=C(r);if(q&&(q.nodeName=="OBJECT"||q.nodeName=="EMBED")){if(h.ie&&h.win){if(q.readyState==4){B(r)}else{j.attachEvent("onload",function(){B(r)})}}else{q.parentNode.removeChild(q)}}}function B(t){var r=C(t);if(r){for(var q in r){if(typeof r[q]=="function"){r[q]=null}}r.parentNode.removeChild(r)}}function C(t){var q=null;try{q=K.getElementById(t)}catch(r){}return q}function a(q){return K.createElement(q)}function I(t,q,r){t.attachEvent(q,r);d[d.length]=[t,q,r]}function c(t){var r=h.pv,q=t.split(".");q[0]=parseInt(q[0],10);q[1]=parseInt(q[1],10)||0;q[2]=parseInt(q[2],10)||0;return(r[0]>q[0]||(r[0]==q[0]&&r[1]>q[1])||(r[0]==q[0]&&r[1]==q[1]&&r[2]>=q[2]))?true:false}function V(v,r){if(h.ie&&h.mac){return }var u=K.getElementsByTagName("head")[0],t=a("style");t.setAttribute("type","text/css");t.setAttribute("media","screen");if(!(h.ie&&h.win)&&typeof K.createTextNode!=b){t.appendChild(K.createTextNode(v+" {"+r+"}"))}u.appendChild(t);if(h.ie&&h.win&&typeof K.styleSheets!=b&&K.styleSheets.length>0){var q=K.styleSheets[K.styleSheets.length-1];if(typeof q.addRule==Q){q.addRule(v,r)}}}function W(t,q){var r=q?"visible":"hidden";if(e&&C(t)){C(t).style.visibility=r}else{V("#"+t,"visibility:"+r)}}function g(s){var r=/[\\\"<>\.;]/;var q=r.exec(s)!=null;return q?encodeURIComponent(s):s}var D=function(){if(h.ie&&h.win){window.attachEvent("onunload",function(){var w=d.length;for(var v=0;v<w;v++){d[v][0].detachEvent(d[v][1],d[v][2])}var t=i.length;for(var u=0;u<t;u++){X(i[u])}for(var r in h){h[r]=null}h=null;for(var q in swfobject){swfobject[q]=null}swfobject=null})}}();return{registerObject:function(u,q,t){if(!h.w3cdom||!u||!q){return }var r={};r.id=u;r.swfVersion=q;r.expressInstall=t?t:false;N[N.length]=r;W(u,false)},getObjectById:function(v){var q=null;if(h.w3cdom){var t=C(v);if(t){var u=t.getElementsByTagName(Q)[0];if(!u||(u&&typeof t.SetVariable!=b)){q=t}else{if(typeof u.SetVariable!=b){q=u}}}}return q},embedSWF:function(x,AE,AB,AD,q,w,r,z,AC){if(!h.w3cdom||!x||!AE||!AB||!AD||!q){return }AB+="";AD+="";if(c(q)){W(AE,false);var AA={};if(AC&&typeof AC===Q){for(var v in AC){if(AC[v]!=Object.prototype[v]){AA[v]=AC[v]}}}AA.data=x;AA.width=AB;AA.height=AD;var y={};if(z&&typeof z===Q){for(var u in z){if(z[u]!=Object.prototype[u]){y[u]=z[u]}}}if(r&&typeof r===Q){for(var t in r){if(r[t]!=Object.prototype[t]){if(typeof y.flashvars!=b){y.flashvars+="&"+t+"="+r[t]}else{y.flashvars=t+"="+r[t]}}}}f(function(){U(AA,y,AE);if(AA.id==AE){W(AE,true)}})}else{if(w&&!A&&c("6.0.65")&&(h.win||h.mac)){A=true;W(AE,false);f(function(){var AF={};AF.id=AF.altContentId=AE;AF.width=AB;AF.height=AD;AF.expressInstall=w;k(AF)})}}},getFlashPlayerVersion:function(){return{major:h.pv[0],minor:h.pv[1],release:h.pv[2]}},hasFlashPlayerVersion:c,createSWF:function(t,r,q){if(h.w3cdom){return U(t,r,q)}else{return undefined}},removeSWF:function(q){if(h.w3cdom){X(q)}},createCSS:function(r,q){if(h.w3cdom){V(r,q)}},addDomLoadEvent:f,addLoadEvent:R,getQueryParamValue:function(v){var u=K.location.search||K.location.hash;if(v==null){return g(u)}if(u){var t=u.substring(1).split("&");for(var r=0;r<t.length;r++){if(t[r].substring(0,t[r].indexOf("="))==v){return g(t[r].substring((t[r].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(A&&M){var q=C(m);if(q){q.parentNode.replaceChild(M,q);if(l){W(l,true);if(h.ie&&h.win){M.style.display="block"}}M=null;l=null;A=false}}}}}();

/* - lightbox.js - */
// http://www.duwe-3d.eu/portal_javascripts/lightbox.js?original=1
LightboxOptions=Object.extend({fileLoadingImage:'++resource++lightbox/loading.gif',fileBottomNavCloseImage:'++resource++lightbox/close.gif',overlayOpacity:0.8,animate:true,resizeSpeed:7,borderSize:10,labelImage:"",labelOf:"/"},window.LightboxOptions||{});var Lightbox=Class.create();Lightbox.prototype={imageArray:[],activeImage:undefined,initialize: function(){this.updateImageList();this.keyboardAction=this.keyboardAction.bindAsEventListener(this);if(LightboxOptions.resizeSpeed>10) LightboxOptions.resizeSpeed=10;if(LightboxOptions.resizeSpeed<1) LightboxOptions.resizeSpeed=1;this.resizeDuration=LightboxOptions.animate?((11-LightboxOptions.resizeSpeed) * 0.15):0;this.overlayDuration=LightboxOptions.animate?0.2:0;var size=(LightboxOptions.animate?250:1)+'px';var objBody=$$('body')[0];objBody.appendChild(Builder.node('div',{id:'overlay'}));objBody.appendChild(Builder.node('div',{id:'lightbox'},[Builder.node('div',{id:'outerImageContainer'},Builder.node('div',{id:'imageContainer'},[Builder.node('img',{id:'lightboxImage'}),Builder.node('div',{id:'hoverNav'},[Builder.node('a',{id:'prevLink',href:'#'}),Builder.node('a',{id:'nextLink',href:'#'})]),Builder.node('div',{id:'loading'},Builder.node('a',{id:'loadingLink',href:'#'},Builder.node('img',{src:LightboxOptions.fileLoadingImage})))])),Builder.node('div',{id:'imageDataContainer'},Builder.node('div',{id:'imageData'},[Builder.node('div',{id:'imageDetails'},[Builder.node('span',{id:'caption'}),Builder.node('span',{id:'numberDisplay'})]),Builder.node('div',{id:'bottomNav'},Builder.node('a',{id:'bottomNavClose',href:'#'},Builder.node('img',{src:LightboxOptions.fileBottomNavCloseImage})))]))]));$('overlay').hide().observe('click',(function(){this.end()}).bind(this));$('lightbox').hide().observe('click',(function(event){if(event.element().id=='lightbox') this.end()}).bind(this));$('outerImageContainer').setStyle({width:size,height:size});$('prevLink').observe('click',(function(event){event.stop();this.changeImage(this.activeImage-1)}).bindAsEventListener(this));$('nextLink').observe('click',(function(event){event.stop();this.changeImage(this.activeImage+1)}).bindAsEventListener(this));$('loadingLink').observe('click',(function(event){event.stop();this.end()}).bind(this));$('bottomNavClose').observe('click',(function(event){event.stop();this.end()}).bind(this));var th=this;(function(){var ids='overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink '+'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';$w(ids).each(function(id){th[id]=$(id)})}).defer()},updateImageList: function(){this.updateImageList=Prototype.emptyFunction;document.observe('click',(function(event){var target=event.findElement('a[rel^=lightbox]')||event.findElement('area[rel^=lightbox]')||event.findElement('img[rel^=lightbox]');if(target){event.stop();this.start(target)}}).bind(this))},start: function(imageLink){$$('select','object','embed').each(function(node){node.style.visibility='hidden'});var arrayPageSize=this.getPageSize();$('overlay').setStyle({width:arrayPageSize[0]+'px',height:arrayPageSize[1]+'px'});new Effect.Appear(this.overlay,{duration:this.overlayDuration,from:0.0,to:LightboxOptions.overlayOpacity});this.imageArray=[];var imageNum=0;if((imageLink.rel=='lightbox')){var myhref=imageLink.src;myhref=myhref.replace('/image_thumb','');myhref=myhref.replace('/image_preview','');myhref=myhref.replace('/image_mini','');var title=imageLink.getAttribute('alt','');this.imageArray.push([myhref,title])}
else{var ref_rel=imageLink.getAttribute('rel');var ref_src=imageLink.src.replace('/image_thumb','');ref_src=ref_src.replace('/image_preview','');ref_src=ref_src.replace('/image_mini','');this.imageArray=$$('[rel="'+ref_rel+'"]').
collect(function(e){var myhref=e.src;myhref=myhref.replace('/image_thumb','');myhref=myhref.replace('/image_preview','');myhref=myhref.replace('/image_mini','');var title=e.getAttribute('alt','');return [myhref,title]}).uniq();while(this.imageArray[imageNum][0]!=ref_src){imageNum++}}
var arrayPageScroll=document.viewport.getScrollOffsets();var lightboxTop=arrayPageScroll[1]+(document.viewport.getHeight()/10);var lightboxLeft=arrayPageScroll[0];this.lightbox.setStyle({top:lightboxTop+'px',left:lightboxLeft+'px'}).show();this.changeImage(imageNum)},changeImage: function(imageNum){this.activeImage=imageNum;if(LightboxOptions.animate) this.loading.show();this.lightboxImage.hide();this.hoverNav.hide();this.prevLink.hide();this.nextLink.hide();this.imageDataContainer.setStyle({opacity:.0001});this.numberDisplay.hide();var imgPreloader=new Image();imgPreloader.onload=(function(){this.lightboxImage.src=this.imageArray[this.activeImage][0];this.resizeImageContainer(imgPreloader.width,imgPreloader.height)}).bind(this);imgPreloader.src=this.imageArray[this.activeImage][0]},resizeImageContainer: function(imgWidth,imgHeight){var widthCurrent=this.outerImageContainer.getWidth();var heightCurrent=this.outerImageContainer.getHeight();var widthNew=(imgWidth+LightboxOptions.borderSize * 2);var heightNew=(imgHeight+LightboxOptions.borderSize * 2);var xScale=(widthNew/widthCurrent) * 100;var yScale=(heightNew/heightCurrent) * 100;var wDiff=widthCurrent-widthNew;var hDiff=heightCurrent-heightNew;if(hDiff!=0) new Effect.Scale(this.outerImageContainer,yScale,{scaleX:false,duration:this.resizeDuration,queue:'front'});if(wDiff!=0) new Effect.Scale(this.outerImageContainer,xScale,{scaleY:false,duration:this.resizeDuration,delay:this.resizeDuration});var timeout=0;if((hDiff==0)&&(wDiff==0)){timeout=100;if(Prototype.Browser.IE) timeout=250}(function(){this.prevLink.setStyle({height:imgHeight+'px'});this.nextLink.setStyle({height:imgHeight+'px'});this.imageDataContainer.setStyle({width:widthNew+'px'});this.showImage()}).bind(this).delay(timeout/1000)},showImage: function(){this.loading.hide();new Effect.Appear(this.lightboxImage,{duration:this.resizeDuration,queue:'end',afterFinish:(function(){this.updateDetails()}).bind(this)});this.preloadNeighborImages()},updateDetails: function(){if(this.imageArray[this.activeImage][1]!=""){this.caption.update(this.imageArray[this.activeImage][1]).show()}
else{this.caption.update('').show()}
if(this.imageArray.length>1){this.numberDisplay.update(LightboxOptions.labelImage+' '+(this.activeImage+1)+' '+LightboxOptions.labelOf+'  '+this.imageArray.length).show()}
new Effect.Parallel([new Effect.SlideDown(this.imageDataContainer,{sync:true,duration:this.resizeDuration,from:0.0,to:1.0}),new Effect.Appear(this.imageDataContainer,{sync:true,duration:this.resizeDuration})],{duration:this.resizeDuration,afterFinish:(function(){var arrayPageSize=this.getPageSize();this.overlay.setStyle({height:arrayPageSize[1]+'px'});this.updateNav()}).bind(this)})},updateNav: function(){this.hoverNav.show();if(this.activeImage>0) this.prevLink.show();if(this.activeImage<(this.imageArray.length-1)) this.nextLink.show();this.enableKeyboardNav()},enableKeyboardNav: function(){document.observe('keydown',this.keyboardAction)},disableKeyboardNav: function(){document.stopObserving('keydown',this.keyboardAction)},keyboardAction: function(event){var keycode=event.keyCode;var escapeKey;if(event.DOM_VK_ESCAPE){escapeKey=event.DOM_VK_ESCAPE}
else{escapeKey=27}
var key=String.fromCharCode(keycode).toLowerCase();if(key.match(/x|o|c/)||(keycode==escapeKey)){this.end()}
else if((key=='p')||(keycode==37)){if(this.activeImage!=0){this.disableKeyboardNav();this.changeImage(this.activeImage-1)}}
else if((key=='n')||(keycode==39)){if(this.activeImage!=(this.imageArray.length-1)){this.disableKeyboardNav();this.changeImage(this.activeImage+1)}}},preloadNeighborImages: function(){var preloadNextImage,preloadPrevImage;if(this.imageArray.length>this.activeImage+1){preloadNextImage=new Image();preloadNextImage.src=this.imageArray[this.activeImage+1][0]}
if(this.activeImage>0){preloadPrevImage=new Image();preloadPrevImage.src=this.imageArray[this.activeImage-1][0]}},end: function(){this.disableKeyboardNav();this.lightbox.hide();new Effect.Fade(this.overlay,{duration:this.overlayDuration});$$('select','object','embed').each(function(node){node.style.visibility='visible'})},getPageSize: function(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY}
else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight}
else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight}
var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth}
else{windowWidth=self.innerWidth}
windowHeight=self.innerHeight}
else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight}
else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight}
if(yScroll<windowHeight){pageHeight=windowHeight}
else{pageHeight=yScroll}
if(xScroll<windowWidth){pageWidth=xScroll}
else{pageWidth=windowWidth}
return [pageWidth,pageHeight]}}
Event.observe(window,'load', function(){$$('.lb-group').each(function(e){var group_name=e.className.replace(' lb-group','');var loop_group='.'+group_name+' img';$$(loop_group).each(function(e2){var rel_name='lightbox['+group_name+']';e2.setAttribute('rel',rel_name)})});$$('.lb-single').each(function(e){var rel_name='lightbox';e.setAttribute('rel',rel_name)});new Lightbox()});

/* - jquery.validate.min.js - */
// http://www.duwe-3d.eu/portal_javascripts/jquery.validate.min.js?original=1
(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){this.find("input, button").filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&this.find("input, button").filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("<input type='hidden'/>").attr("name",b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form();else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name];return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a,b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:[],ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)},onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).addClass(b).removeClass(d):c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).removeClass(b).addClass(d):c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults,a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."),minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator");e="on"+e.type.replace(/^validate/,"");f.settings[e]&&f.settings[e].call(f,this[0])}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate(":text, :password, :file, select, textarea","focusin focusout keyup",a).validateDelegate(":radio, :checkbox, select, option","click",a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement=a=this.clean(a);this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,function(d){return!(d.name in a)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()==0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.clean(a);if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+a.id+", check the '"+f.method+"' method",h);throw h}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==undefined)return arguments[a]},defaultMessage:function(a,b){return this.findDefined(this.customMessage(a.name,b),this.customMetaMessage(a,b),!this.settings.ignoreTitle&&a.title||undefined,c.validator.messages[b],"<strong>Warning: No message defined for "+a.name+"</strong>")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]=d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass().addClass(this.settings.errorClass);d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this,c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings,a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e=a.attr(d);if(e)b[d]=e}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(a)},url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9-]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>=0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery);(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery);(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a,b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery);

/* - jquery.tablesorter.js - */
// http://www.duwe-3d.eu/portal_javascripts/jquery.tablesorter.js?original=1
(function($){$.extend({tablesorter:new
function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};
function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}
this.benchmark=benchmark;
function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)} else{alert(s)}}
function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}
if(table.tBodies.length==0) return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter)} else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter)}
if(!p){p=detectParserForColumn(table,rows,-1,i)}
if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n"}
list.push(p)}}
if(table.config.debug){log(parsersDebug)}
return list};
function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex)}} else{keepLooking=false}}
for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i]}}
return parsers[0]}
function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex]}
function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node))}
function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i]}}
return false}
function buildCache(table){if(table.config.debug){var cacheTime=new Date()}
var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue}
cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]))}
cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime)}
return cache};
function getElementText(config,node){var text="";if(!node) return "";if(!config.supportsTextContent) config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent} else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML} else{text=node.innerHTML}}} else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node)} else{text=$(node).text()}}
return text}
function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}
var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j])}}}
if(table.config.appender){table.config.appender(table,rows)}
rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime)}
applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd")},0)};
function buildHeaders(table){if(table.config.debug){var time=new Date()}
var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index)) this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index)) this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader) table.config.onRenderHeader.apply($th)}
table.config.headerList[index]=this});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders)}
return $tableHeaders};
function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1
var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[]}
for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break}}
lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[]}
var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x"}}}}
return lookup}
function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))} else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}
return arr};
function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true};return false}
function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true};return false}
function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder;return false}
function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table)}}
function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i]}}};
function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0} else{return(v==1)?1:0}}
function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true}}
return false}
function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this)}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]])}}
function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()))});$(table).prepend(colgroup)}}
function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++}}
function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date()}
var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { "}
var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; "}
dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date())}
eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime)}
return cache};
function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return "("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));"} else if(type=='text'&&direction=='desc'){return "("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));"} else if(type=='numeric'&&direction=='asc'){return "("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));"} else if(type=='numeric'&&direction=='desc'){return "("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));"}};
function makeSortText(i){return "((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));"};
function makeSortTextDesc(i){return "((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));"};
function makeSortNumeric(i){return "a["+i+"]-b["+i+"];"};
function makeSortNumericDesc(i){return "b["+i+"]-a["+i+"];"};
function sortText(a,b){if(table.config.sortLocaleCompare) return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0))};
function sortTextDesc(a,b){if(table.config.sortLocaleCompare) return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0))};
function sortNumeric(a,b){return a-b};
function sortNumericDesc(a,b){return b-a};
function getCachedSortType(parsers,i){return parsers[i].type};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies) return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(
function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder) this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j])}}}
config.sortList.push([i,this.order])} else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2}}} else{config.sortList.push([i,this.order])}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache))},1);return false}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false}});$this.bind("update", function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me)},1)}).bind("updateCell", function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell)}).bind("sorton", function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache))}).bind("appendCache", function(){appendToTable(this,cache)}).bind("applyWidgetId", function(e,id){getWidgetById(id).format(this)}).bind("applyWidgets", function(){applyWidget(this)});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist}
if(config.sortList.length>0){$this.trigger("sorton",[config.sortList])}
applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false}}
if(a){parsers.push(parser)}};this.addWidget=function(widget){widgets.push(widget)};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, '')))};this.clearTableBody=function(table){if($.browser.msie){
function empty(){while(this.firstChild)
this.removeChild(this.firstChild)}
empty.apply(table.tBodies[0])} else{table.tBodies[0].innerHTML=""}}}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is: function(s){return true},format: function(s){return $.trim(s.toLocaleLowerCase())},type:"text"});ts.addParser({id:"digit",is: function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c)},format: function(s){return $.tablesorter.formatFloat(s)},type:"numeric"});ts.addParser({id:"currency",is: function(s){return/^[£$€?.]/.test(s)},format: function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""))},type:"numeric"});ts.addParser({id:"ipAddress",is: function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s)},format: function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item} else{r+=item}}
return $.tablesorter.formatFloat(r)},type:"numeric"});ts.addParser({id:"url",is: function(s){return/^(https?|ftp|file):\/\/$/.test(s)},format: function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''))},type:"text"});ts.addParser({id:"isoDate",is: function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s)},format: function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0")},type:"numeric"});ts.addParser({id:"percent",is: function(s){return/\%$/.test($.trim(s))},format: function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""))},type:"numeric"});ts.addParser({id:"usLongDate",is: function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/))},format: function(s){return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"shortDate",is: function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s)},format: function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2")} else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1")} else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3")}
return $.tablesorter.formatFloat(new Date(s).getTime())},type:"numeric"});ts.addParser({id:"time",is: function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s)},format: function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime())},type:"numeric"});ts.addParser({id:"metadata",is: function(s){return false},format: function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p]},type:"numeric"});ts.addWidget({id:"zebra",format: function(table){if(table.config.debug){var time=new Date()}
var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow)) row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time)}}})})(jQuery);

