var Prototype={Version:'1.5.0_pre1',ScriptFragment:'(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',emptyFunction:function(){},K:function(x){return x}}
var Class={create:function(){return function(){this.initialize.apply(this,arguments);}}}
var Abstract=new Object();Object.extend=function(destination,source){for(property in source){destination[property]=source[property];}
return destination;}
Object.inspect=function(object){try{if(object==undefined)return'undefined';if(object==null)return'null';return object.inspect?object.inspect():object.toString();}catch(e){if(e instanceof RangeError)return'...';throw e;}}
Function.prototype.bind=function(){var __method=this,args=$A(arguments),object=args.shift();return function(){return __method.apply(object,args.concat($A(arguments)));}}
Function.prototype.bindAsEventListener=function(object){var __method=this;return function(event){return __method.call(object,event||window.event);}}
Object.extend(Number.prototype,{toColorPart:function(){var digits=this.toString(16);if(this<16)return'0'+digits;return digits;},succ:function(){return this+1;},times:function(iterator){$R(0,this,true).each(iterator);return this;}});var Try={these:function(){var returnValue;for(var i=0;i<arguments.length;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
return returnValue;}}
var PeriodicalExecuter=Class.create();PeriodicalExecuter.prototype={initialize:function(callback,frequency){this.callback=callback;this.frequency=frequency;this.currentlyExecuting=false;this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.callback();}finally{this.currentlyExecuting=false;}}}}
Object.extend(String.prototype,{gsub:function(pattern,replacement){var result='',source=this,match;replacement=arguments.callee.prepareReplacement(replacement);while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=(replacement(match)||'').toString();source=source.slice(match.index+match[0].length);}else{result+=source,source='';}}
return result;},sub:function(pattern,replacement,count){replacement=this.gsub.prepareReplacement(replacement);count=count===undefined?1:count;return this.gsub(pattern,function(match){if(--count<0)return match[0];return replacement(match);});},scan:function(pattern,iterator){this.gsub(pattern,iterator);return this;},truncate:function(length,truncation){length=length||30;truncation=truncation===undefined?'...':truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:this;},strip:function(){return this.replace(/^\s+/,'').replace(/\s+$/,'');},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,'');},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,'img'),'');},extractScripts:function(){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];});},evalScripts:function(){return this.extractScripts().map(eval);},escapeHTML:function(){var div=document.createElement('div');var text=document.createTextNode(this);div.appendChild(text);return div.innerHTML;},unescapeHTML:function(){var div=document.createElement('div');div.innerHTML=this.stripTags();return div.childNodes[0]?div.childNodes[0].nodeValue:'';},toQueryParams:function(){var pairs=this.match(/^\??(.*)$/)[1].split('&');return pairs.inject({},function(params,pairString){var pair=pairString.split('=');params[pair[0]]=pair[1];return params;});},toArray:function(){return this.split('');},camelize:function(){var oStringList=this.split('-');if(oStringList.length==1)return oStringList[0];var camelizedString=this.indexOf('-')==0?oStringList[0].charAt(0).toUpperCase()+oStringList[0].substring(1):oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
return camelizedString;},inspect:function(){return"'"+this.replace(/\\/g,'\\\\').replace(/'/g,'\\\'')+"'";}});String.prototype.gsub.prepareReplacement=function(replacement){if(typeof replacement=='function')return replacement;var template=new Template(replacement);return function(match){return template.evaluate(match)};}
String.prototype.parseQuery=String.prototype.toQueryParams;var Template=Class.create();Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;Template.prototype={initialize:function(template,pattern){this.template=template.toString();this.pattern=pattern||Template.Pattern;},evaluate:function(object){return this.template.gsub(this.pattern,function(match){var before=match[1];if(before=='\\')return match[2];return before+(object[match[3]]||'').toString();});}}
var $break=new Object();var $continue=new Object();var Enumerable={each:function(iterator){var index=0;try{this._each(function(value){try{iterator(value,index++);}catch(e){if(e!=$continue)throw e;}});}catch(e){if(e!=$break)throw e;}},all:function(iterator){var result=true;this.each(function(value,index){result=result&&!!(iterator||Prototype.K)(value,index);if(!result)throw $break;});return result;},any:function(iterator){var result=true;this.each(function(value,index){if(result=!!(iterator||Prototype.K)(value,index))
throw $break;});return result;},collect:function(iterator){var results=[];this.each(function(value,index){results.push(iterator(value,index));});return results;},detect:function(iterator){var result;this.each(function(value,index){if(iterator(value,index)){result=value;throw $break;}});return result;},findAll:function(iterator){var results=[];this.each(function(value,index){if(iterator(value,index))
results.push(value);});return results;},grep:function(pattern,iterator){var results=[];this.each(function(value,index){var stringValue=value.toString();if(stringValue.match(pattern))
results.push((iterator||Prototype.K)(value,index));})
return results;},include:function(object){var found=false;this.each(function(value){if(value==object){found=true;throw $break;}});return found;},inject:function(memo,iterator){this.each(function(value,index){memo=iterator(memo,value,index);});return memo;},invoke:function(method){var args=$A(arguments).slice(1);return this.collect(function(value){return value[method].apply(value,args);});},max:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(value>=(result||value))
result=value;});return result;},min:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(value<=(result||value))
result=value;});return result;},partition:function(iterator){var trues=[],falses=[];this.each(function(value,index){((iterator||Prototype.K)(value,index)?trues:falses).push(value);});return[trues,falses];},pluck:function(property){var results=[];this.each(function(value,index){results.push(value[property]);});return results;},reject:function(iterator){var results=[];this.each(function(value,index){if(!iterator(value,index))
results.push(value);});return results;},sortBy:function(iterator){return this.collect(function(value,index){return{value:value,criteria:iterator(value,index)};}).sort(function(left,right){var a=left.criteria,b=right.criteria;return a<b?-1:a>b?1:0;}).pluck('value');},toArray:function(){return this.collect(Prototype.K);},zip:function(){var iterator=Prototype.K,args=$A(arguments);if(typeof args.last()=='function')
iterator=args.pop();var collections=[this].concat(args).map($A);return this.map(function(value,index){return iterator(collections.pluck(index));});},inspect:function(){return'#<Enumerable:'+this.toArray().inspect()+'>';}}
Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray});var $A=Array.from=function(iterable){if(!iterable)return[];if(iterable.toArray){return iterable.toArray();}else{var results=[];for(var i=0;i<iterable.length;i++)
results.push(iterable[i]);return results;}}
Object.extend(Array.prototype,Enumerable);Array.prototype._reverse=Array.prototype.reverse;Object.extend(Array.prototype,{_each:function(iterator){for(var i=0;i<this.length;i++)
iterator(this[i]);},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(value){return value!=undefined||value!=null;});},flatten:function(){return this.inject([],function(array,value){return array.concat(value.constructor==Array?value.flatten():[value]);});},without:function(){var values=$A(arguments);return this.select(function(value){return!values.include(value);});},indexOf:function(object){for(var i=0;i<this.length;i++)
if(this[i]==object)return i;return-1;},reverse:function(inline){return(inline!==false?this:this.toArray())._reverse();},shift:function(){var result=this[0];for(var i=0;i<this.length-1;i++)
this[i]=this[i+1];this.length--;return result;},inspect:function(){return'['+this.map(Object.inspect).join(', ')+']';}});var Hash={_each:function(iterator){for(key in this){var value=this[key];if(typeof value=='function')continue;var pair=[key,value];pair.key=key;pair.value=value;iterator(pair);}},keys:function(){return this.pluck('key');},values:function(){return this.pluck('value');},merge:function(hash){return $H(hash).inject($H(this),function(mergedHash,pair){mergedHash[pair.key]=pair.value;return mergedHash;});},toQueryString:function(){return this.map(function(pair){return pair.map(encodeURIComponent).join('=');}).join('&');},inspect:function(){return'#<Hash:{'+this.map(function(pair){return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';}}
function $H(object){var hash=Object.extend({},object||{});Object.extend(hash,Enumerable);Object.extend(hash,Hash);return hash;}
ObjectRange=Class.create();Object.extend(ObjectRange.prototype,Enumerable);Object.extend(ObjectRange.prototype,{initialize:function(start,end,exclusive){this.start=start;this.end=end;this.exclusive=exclusive;},_each:function(iterator){var value=this.start;do{iterator(value);value=value.succ();}while(this.include(value));},include:function(value){if(value<this.start)
return false;if(this.exclusive)
return value<this.end;return value<=this.end;}});var $R=function(start,end,exclusive){return new ObjectRange(start,end,exclusive);}
var Ajax={getTransport:function(){return Try.these(function(){return new ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')},function(){return new XMLHttpRequest()})||false;},activeRequestCount:0}
Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responderToAdd){if(!this.include(responderToAdd))
this.responders.push(responderToAdd);},unregister:function(responderToRemove){this.responders=this.responders.without(responderToRemove);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(responder[callback]&&typeof responder[callback]=='function'){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=function(){};Ajax.Base.prototype={setOptions:function(options){this.options={method:'post',asynchronous:true,parameters:''}
Object.extend(this.options,options||{});},responseIsSuccess:function(){return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);},responseIsFailure:function(){return!this.responseIsSuccess();}}
Ajax.Request=Class.create();Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Request.prototype=Object.extend(new Ajax.Base(),{initialize:function(url,options){this.transport=Ajax.getTransport();this.setOptions(options);this.request(url);},request:function(url){var parameters=this.options.parameters||'';if(parameters.length>0)parameters+='&_=';try{this.url=url;if(this.options.method=='get'&&parameters.length>0)
this.url+=(this.url.match(/\?/)?'&':'?')+parameters;Ajax.Responders.dispatch('onCreate',this,this.transport);this.transport.open(this.options.method,this.url,this.options.asynchronous);if(this.options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);setTimeout((function(){this.respondToReadyState(1)}).bind(this),10);}
this.setRequestHeaders();var body=this.options.postBody?this.options.postBody:parameters;this.transport.send(this.options.method=='post'?body:null);}catch(e){this.dispatchException(e);}},setRequestHeaders:function(){var requestHeaders=['X-Requested-With','XMLHttpRequest','X-Prototype-Version',Prototype.Version,'Accept','text/javascript, text/html, application/xml, text/xml, */*'];if(this.options.method=='post'){requestHeaders.push('Content-type','application/x-www-form-urlencoded');if(this.transport.overrideMimeType)
requestHeaders.push('Connection','close');}
if(this.options.requestHeaders)
requestHeaders.push.apply(requestHeaders,this.options.requestHeaders);for(var i=0;i<requestHeaders.length;i+=2)
this.transport.setRequestHeader(requestHeaders[i],requestHeaders[i+1]);},onStateChange:function(){var readyState=this.transport.readyState;if(readyState!=1)
this.respondToReadyState(this.transport.readyState);},header:function(name){try{return this.transport.getResponseHeader(name);}catch(e){}},evalJSON:function(){try{return eval(this.header('X-JSON'));}catch(e){}},evalResponse:function(){try{return eval(this.transport.responseText);}catch(e){this.dispatchException(e);}},respondToReadyState:function(readyState){var event=Ajax.Request.Events[readyState];var transport=this.transport,json=this.evalJSON();if(event=='Complete'){try{(this.options['on'+this.transport.status]||this.options['on'+(this.responseIsSuccess()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){this.dispatchException(e);}
if((this.header('Content-type')||'').match(/^text\/javascript/i))
this.evalResponse();}
try{(this.options['on'+event]||Prototype.emptyFunction)(transport,json);Ajax.Responders.dispatch('on'+event,this,transport,json);}catch(e){this.dispatchException(e);}
if(event=='Complete')
this.transport.onreadystatechange=Prototype.emptyFunction;},dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);Ajax.Responders.dispatch('onException',this,exception);}});Ajax.Updater=Class.create();Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{initialize:function(container,url,options){this.containers={success:container.success?$(container.success):$(container),failure:container.failure?$(container.failure):(container.success?null:$(container))}
this.transport=Ajax.getTransport();this.setOptions(options);var onComplete=this.options.onComplete||Prototype.emptyFunction;this.options.onComplete=(function(transport,object){this.updateContent();onComplete(transport,object);}).bind(this);this.request(url);},updateContent:function(){var receiver=this.responseIsSuccess()?this.containers.success:this.containers.failure;var response=this.transport.responseText;if(!this.options.evalScripts)
response=response.stripScripts();if(receiver){if(this.options.insertion){new this.options.insertion(receiver,response);}else{Element.update(receiver,response);}}
if(this.responseIsSuccess()){if(this.onComplete)
setTimeout(this.onComplete.bind(this),10);}}});Ajax.PeriodicalUpdater=Class.create();Ajax.PeriodicalUpdater.prototype=Object.extend(new Ajax.Base(),{initialize:function(container,url,options){this.setOptions(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.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(request){if(this.options.decay){this.decay=(request.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=request.responseText;}
this.timer=setTimeout(this.onTimerEvent.bind(this),this.decay*this.frequency*1000);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});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;}
document.getElementsByClassName=function(className,parentElement){var children=($(parentElement)||document.body).getElementsByTagName('*');return $A(children).inject([],function(elements,child){if(child.className.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))
elements.push(Element.extend(child));return elements;});}
if(!window.Element)
var Element=new Object();Element.extend=function(element){if(!element)return;if(!element._extended&&element.tagName&&element!=window){var methods=Element.Methods;for(property in methods){var value=methods[property];if(typeof value=='function')
element[property]=value.bind(null,element);}}
element._extended=true;return element;}
Element.Methods={visible:function(element){return $(element).style.display!='none';},toggle:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);Element[Element.visible(element)?'hide':'show'](element);}},hide:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='none';}},show:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='';}},remove:function(element){element=$(element);element.parentNode.removeChild(element);},update:function(element,html){$(element).innerHTML=html.stripScripts();setTimeout(function(){html.evalScripts()},10);},replace:function(element,html){element=$(element);if(element.outerHTML){element.outerHTML=html.stripScripts();}else{var range=element.ownerDocument.createRange();range.selectNodeContents(element);element.parentNode.replaceChild(range.createContextualFragment(html.stripScripts()),element);}
setTimeout(function(){html.evalScripts()},10);},getHeight:function(element){element=$(element);return element.offsetHeight;},classNames:function(element){return new Element.ClassNames(element);},hasClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).include(className);},addClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).add(className);},removeClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).remove(className);},cleanWhitespace:function(element){element=$(element);for(var i=0;i<element.childNodes.length;i++){var node=element.childNodes[i];if(node.nodeType==3&&!/\S/.test(node.nodeValue))
Element.remove(node);}},empty:function(element){return $(element).innerHTML.match(/^\s*$/);},childOf:function(element,ancestor){element=$(element),ancestor=$(ancestor);while(element=element.parentNode)
if(element==ancestor)return true;return false;},scrollTo:function(element){element=$(element);var x=element.x?element.x:element.offsetLeft,y=element.y?element.y:element.offsetTop;window.scrollTo(x,y);},getStyle:function(element,style){element=$(element);var value=element.style[style.camelize()];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[style.camelize()];}}
if(window.opera&&['left','top','right','bottom'].include(style))
if(Element.getStyle(element,'position')=='static')value='auto';return value=='auto'?null:value;},setStyle:function(element,style){element=$(element);for(name in style)
element.style[name.camelize()]=style[name];},getDimensions:function(element){element=$(element);if(Element.getStyle(element,'display')!='none')
return{width:element.offsetWidth,height:element.offsetHeight};var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display='none';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(window.opera){element.style.top=0;element.style.left=0;}}},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='';}},makeClipping:function(element){element=$(element);if(element._overflow)return;element._overflow=element.style.overflow;if((Element.getStyle(element,'overflow')||'visible')!='hidden')
element.style.overflow='hidden';},undoClipping:function(element){element=$(element);if(element._overflow)return;element.style.overflow=element._overflow;element._overflow=undefined;}}
Object.extend(Element,Element.Methods);var Toggle=new Object();Toggle.display=Element.toggle;Abstract.Insertion=function(adjacency){this.adjacency=adjacency;}
Abstract.Insertion.prototype={initialize:function(element,content){this.element=$(element);this.content=content.stripScripts();if(this.adjacency&&this.element.insertAdjacentHTML){try{this.element.insertAdjacentHTML(this.adjacency,this.content);}catch(e){if(this.element.tagName.toLowerCase()=='tbody'){this.insertContent(this.contentFromAnonymousTable());}else{throw e;}}}else{this.range=this.element.ownerDocument.createRange();if(this.initializeRange)this.initializeRange();this.insertContent([this.range.createContextualFragment(this.content)]);}
setTimeout(function(){content.evalScripts()},10);},contentFromAnonymousTable:function(){var div=document.createElement('div');div.innerHTML='<table><tbody>'+this.content+'</tbody></table>';return $A(div.childNodes[0].childNodes[0].childNodes);}}
var Insertion=new Object();Insertion.Before=Class.create();Insertion.Before.prototype=Object.extend(new Abstract.Insertion('beforeBegin'),{initializeRange:function(){this.range.setStartBefore(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element);}).bind(this));}});Insertion.Top=Class.create();Insertion.Top.prototype=Object.extend(new Abstract.Insertion('afterBegin'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(true);},insertContent:function(fragments){fragments.reverse(false).each((function(fragment){this.element.insertBefore(fragment,this.element.firstChild);}).bind(this));}});Insertion.Bottom=Class.create();Insertion.Bottom.prototype=Object.extend(new Abstract.Insertion('beforeEnd'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.appendChild(fragment);}).bind(this));}});Insertion.After=Class.create();Insertion.After.prototype=Object.extend(new Abstract.Insertion('afterEnd'),{initializeRange:function(){this.range.setStartAfter(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element.nextSibling);}).bind(this));}});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(this.toArray().concat(classNameToAdd).join(' '));},remove:function(classNameToRemove){if(!this.include(classNameToRemove))return;this.set(this.select(function(className){return className!=classNameToRemove;}).join(' '));},toString:function(){return this.toArray().join(' ');}}
Object.extend(Element.ClassNames.prototype,Enumerable);var Selector=Class.create();Selector.prototype={initialize:function(expression){this.params={classNames:[]};this.expression=expression.toString().strip();this.parseExpression();this.compileMatcher();},parseExpression:function(){function abort(message){throw'Parse error in selector: '+message;}
if(this.expression=='')abort('empty expression');var params=this.params,expr=this.expression,match,modifier,clause,rest;while(match=expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)){params.attributes=params.attributes||[];params.attributes.push({name:match[2],operator:match[3],value:match[4]||match[5]||''});expr=match[1];}
if(expr=='*')return this.params.wildcard=true;while(match=expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)){modifier=match[1],clause=match[2],rest=match[3];switch(modifier){case'#':params.id=clause;break;case'.':params.classNames.push(clause);break;case'':case undefined:params.tagName=clause.toUpperCase();break;default:abort(expr.inspect());}
expr=rest;}
if(expr.length>0)abort(expr.inspect());},buildMatchExpression:function(){var params=this.params,conditions=[],clause;if(params.wildcard)
conditions.push('true');if(clause=params.id)
conditions.push('element.id == '+clause.inspect());if(clause=params.tagName)
conditions.push('element.tagName.toUpperCase() == '+clause.inspect());if((clause=params.classNames).length>0)
for(var i=0;i<clause.length;i++)
conditions.push('Element.hasClassName(element, '+clause[i].inspect()+')');if(clause=params.attributes){clause.each(function(attribute){var value='element.getAttribute('+attribute.name.inspect()+')';var splitValueBy=function(delimiter){return value+' && '+value+'.split('+delimiter.inspect()+')';}
switch(attribute.operator){case'=':conditions.push(value+' == '+attribute.value.inspect());break;case'~=':conditions.push(splitValueBy(' ')+'.include('+attribute.value.inspect()+')');break;case'|=':conditions.push(splitValueBy('-')+'.first().toUpperCase() == '+attribute.value.toUpperCase().inspect());break;case'!=':conditions.push(value+' != '+attribute.value.inspect());break;case'':case undefined:conditions.push(value+' != null');break;default:throw'Unknown operator '+attribute.operator+' in selector';}});}
return conditions.join(' && ');},compileMatcher:function(){this.match=new Function('element','if (!element.tagName) return false; \
      return '+this.buildMatchExpression());},findElements:function(scope){var element;if(element=$(this.params.id))
if(this.match(element))
if(!scope||Element.childOf(element,scope))
return[element];scope=(scope||document).getElementsByTagName(this.params.tagName||'*');var results=[];for(var i=0;i<scope.length;i++)
if(this.match(element=scope[i]))
results.push(Element.extend(element));return results;},toString:function(){return this.expression;}}
function $$(){return $A(arguments).map(function(expression){return expression.strip().split(/\s+/).inject([null],function(results,expr){var selector=new Selector(expr);return results.map(selector.findElements.bind(selector)).flatten();});}).flatten();}
var Field={clear:function(){for(var i=0;i<arguments.length;i++)
$(arguments[i]).value='';},focus:function(element){$(element).focus();},present:function(){for(var i=0;i<arguments.length;i++)
if($(arguments[i]).value=='')return false;return true;},select:function(element){$(element).select();},activate:function(element){element=$(element);element.focus();if(element.select)
element.select();}}
var Form={serialize:function(form){var elements=Form.getElements($(form));var queryComponents=new Array();for(var i=0;i<elements.length;i++){var queryComponent=Form.Element.serialize(elements[i]);if(queryComponent)
queryComponents.push(queryComponent);}
return queryComponents.join('&');},getElements:function(form){form=$(form);var elements=new Array();for(tagName in Form.Element.Serializers){var tagElements=form.getElementsByTagName(tagName);for(var j=0;j<tagElements.length;j++)
elements.push(tagElements[j]);}
return elements;},getInputs:function(form,typeName,name){form=$(form);var inputs=form.getElementsByTagName('input');if(!typeName&&!name)
return inputs;var matchingInputs=new Array();for(var i=0;i<inputs.length;i++){var input=inputs[i];if((typeName&&input.type!=typeName)||(name&&input.name!=name))
continue;matchingInputs.push(input);}
return matchingInputs;},disable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.blur();element.disabled='true';}},enable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.disabled='';}},findFirstElement:function(form){return Form.getElements(form).find(function(element){return element.type!='hidden'&&!element.disabled&&['input','select','textarea'].include(element.tagName.toLowerCase());});},focusFirstElement:function(form){Field.activate(Form.findFirstElement(form));},reset:function(form){$(form).reset();}}
Form.Element={serialize:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter){var key=encodeURIComponent(parameter[0]);if(key.length==0)return;if(parameter[1].constructor!=Array)
parameter[1]=[parameter[1]];return parameter[1].map(function(value){return key+'='+encodeURIComponent(value);}).join('&');}},getValue:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter)
return parameter[1];}}
Form.Element.Serializers={input:function(element){switch(element.type.toLowerCase()){case'submit':case'hidden':case'password':case'text':return Form.Element.Serializers.textarea(element);case'checkbox':case'radio':return Form.Element.Serializers.inputSelector(element);}
return false;},inputSelector:function(element){if(element.checked)
return[element.name,element.value];},textarea:function(element){return[element.name,element.value];},select:function(element){return Form.Element.Serializers[element.type=='select-one'?'selectOne':'selectMany'](element);},selectOne:function(element){var value='',opt,index=element.selectedIndex;if(index>=0){opt=element.options[index];value=opt.value;if(!value&&!('value'in opt))
value=opt.text;}
return[element.name,value];},selectMany:function(element){var value=new Array();for(var i=0;i<element.length;i++){var opt=element.options[i];if(opt.selected){var optValue=opt.value;if(!optValue&&!('value'in opt))
optValue=opt.text;value.push(optValue);}}
return[element.name,value];}}
var $F=Form.Element.getValue;Abstract.TimedObserver=function(){}
Abstract.TimedObserver.prototype={initialize:function(element,frequency,callback){this.frequency=frequency;this.element=$(element);this.callback=callback;this.lastValue=this.getValue();this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}}}
Form.Element.Observer=Class.create();Form.Element.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.Observer=Class.create();Form.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.serialize(this.element);}});Abstract.EventObserver=function(){}
Abstract.EventObserver.prototype={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(){var elements=Form.getElements(this.element);for(var i=0;i<elements.length;i++)
this.registerCallback(elements[i]);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;case'password':case'text':case'textarea':case'select-one':case'select-multiple':Event.observe(element,'change',this.onElementEvent.bind(this));break;}}}}
Form.Element.EventObserver=Class.create();Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create();Form.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.serialize(this.element);}});if(!window.Event){var Event=new Object();}
Object.extend(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,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},pointerX:function(event){return event.pageX||(event.clientX+
(document.documentElement.scrollLeft||document.body.scrollLeft));},pointerY:function(event){return event.pageY||(event.clientY+
(document.documentElement.scrollTop||document.body.scrollTop));},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}},findElement:function(event,tagName){var element=Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))
element=element.parentNode;return element;},observers:false,_observeAndCache:function(element,name,observer,useCapture){if(!this.observers)this.observers=[];if(element.addEventListener){this.observers.push([element,name,observer,useCapture]);element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){this.observers.push([element,name,observer,useCapture]);element.attachEvent('on'+name,observer);}},unloadCache:function(){if(!Event.observers)return;for(var i=0;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null;}
Event.observers=false;},observe:function(element,name,observer,useCapture){var element=$(element);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
name='keydown';this._observeAndCache(element,name,observer,useCapture);},stopObserving:function(element,name,observer,useCapture){var element=$(element);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))
name='keydown';if(element.removeEventListener){element.removeEventListener(name,observer,useCapture);}else if(element.detachEvent){element.detachEvent('on'+name,observer);}}});Event.observe(window,'unload',Event.unloadCache,false);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;},realOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.scrollTop||0;valueL+=element.scrollLeft||0;element=element.parentNode;}while(element);return[valueL,valueT];},cumulativeOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;}while(element);return[valueL,valueT];},positionedOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;if(element){p=Element.getStyle(element,'position');if(p=='relative'||p=='absolute')break;}}while(element);return[valueL,valueT];},offsetParent: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;},within:function(element,x,y){if(this.includeScrollOffsets)
return this.withinIncludingScrolloffsets(element,x,y);this.xcomp=x;this.ycomp=y;this.offset=this.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=this.realOffset(element);this.xcomp=x+offsetcache[0]-this.deltaX;this.ycomp=y+offsetcache[1]-this.deltaY;this.offset=this.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;},clone:function(source,target){source=$(source);target=$(target);target.style.position='absolute';var offsets=this.cumulativeOffset(source);target.style.top=offsets[1]+'px';target.style.left=offsets[0]+'px';target.style.width=source.offsetWidth+'px';target.style.height=source.offsetHeight+'px';},page:function(forElement){var valueT=0,valueL=0;var element=forElement;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
if(Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);element=forElement;do{valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;}while(element=element.parentNode);return[valueL,valueT];},clone:function(source,target){var options=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{})
source=$(source);var p=Position.page(source);target=$(target);var delta=[0,0];var parent=null;if(Element.getStyle(target,'position')=='absolute'){parent=Position.offsetParent(target);delta=Position.page(parent);}
if(parent==document.body){delta[0]-=document.body.offsetLeft;delta[1]-=document.body.offsetTop;}
if(options.setLeft)target.style.left=(p[0]-delta[0]+options.offsetLeft)+'px';if(options.setTop)target.style.top=(p[1]-delta[1]+options.offsetTop)+'px';if(options.setWidth)target.style.width=source.offsetWidth+'px';if(options.setHeight)target.style.height=source.offsetHeight+'px';},absolutize:function(element){element=$(element);if(element.style.position=='absolute')return;Position.prepare();var offsets=Position.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';;},relativize:function(element){element=$(element);if(element.style.position=='relative')return;Position.prepare();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;}}
if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){Position.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[valueL,valueT];}}
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(element,{fontSize:(percent/100)+'em'});if(navigator.appVersion.indexOf('AppleWebKit')>0)window.scrollBy(0,0);}
Element.getOpacity=function(element){var opacity;if(opacity=Element.getStyle(element,'opacity'))
return parseFloat(opacity);if(opacity=(Element.getStyle(element,'filter')||'').match(/alpha\(opacity=(.*)\)/))
if(opacity[1])return parseFloat(opacity[1])/100;return 1.0;}
Element.setOpacity=function(element,value){element=$(element);if(value==1){Element.setStyle(element,{opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?0.999999:null});if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});}else{if(value<0.00001)value=0;Element.setStyle(element,{opacity:value});if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')+'alpha(opacity='+value*100+')'});}}
Element.getInlineOpacity=function(element){return $(element).style.opacity||'';}
Element.childrenWithClassName=function(element,className,findFirst){return[$A($(element).getElementsByTagName('*'))[findFirst?'detect':'select'](function(c){return c.className?Element.hasClassName(c,className):false;})].flatten();}
Element.forceRerendering=function(element){try{element=$(element);var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n);}catch(e){}};['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom','collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(function(f){Element.Methods[f]=Element[f];});Array.prototype.call=function(){var args=arguments;this.each(function(f){f.apply(this,args)});}
var Effect={tagifyText:function(element){var tagifyStyle='position:relative';if(/MSIE/.test(navigator.userAgent))tagifyStyle+=';zoom:1';element=$(element);$A(element.childNodes).each(function(child){if(child.nodeType==3){child.nodeValue.toArray().each(function(character){element.insertBefore(Builder.node('span',{style:tagifyStyle},character==' '?String.fromCharCode(160):character),child);});Element.remove(child);}});},multiple:function(element,effect){var elements;if(((typeof element=='object')||(typeof element=='function'))&&(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){element=$(element);effect=(effect||'appear').toLowerCase();var options=Object.extend({queue:{position:'end',scope:(element.id||'global'),limit:1}},arguments[2]||{});Effect[element.visible()?Effect.PAIRS[effect][1]:Effect.PAIRS[effect][0]](element,options);}};var Effect2=Effect;Effect.Transitions={}
Effect.Transitions.linear=function(pos){return pos;}
Effect.Transitions.sinoidal=function(pos){return(-Math.cos(pos*Math.PI)/2)+0.5;}
Effect.Transitions.reverse=function(pos){return 1-pos;}
Effect.Transitions.flicker=function(pos){return((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;}
Effect.Transitions.wobble=function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;}
Effect.Transitions.pulse=function(pos){return(Math.floor(pos*10)%2==0?(pos*10-Math.floor(pos*10)):1-(pos*10-Math.floor(pos*10)));}
Effect.Transitions.none=function(pos){return 0;}
Effect.Transitions.full=function(pos){return 1;}
Effect.ScopedQueue=Class.create();Object.extend(Object.extend(Effect.ScopedQueue.prototype,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=(typeof effect.options.queue=='string')?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'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),40);},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();this.effects.invoke('loop',timePos);}});Effect.Queues={instances:$H(),get:function(queueName){if(typeof queueName!='string')return queueName;if(!this.instances[queueName])
this.instances[queueName]=new Effect.ScopedQueue();return this.instances[queueName];}}
Effect.Queue=Effect.Queues.get('global');Effect.DefaultOptions={transition:Effect.Transitions.sinoidal,duration:1.0,fps:25.0,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'}
Effect.Base=function(){};Effect.Base.prototype={position:null,start:function(options){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.event('beforeStart');if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue=='string'?'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.finishOn-this.startOn);var frame=Math.round(pos*this.options.fps*this.options.duration);if(frame>this.currentFrame){this.render(pos);this.currentFrame=frame;}}},render:function(pos){if(this.state=='idle'){this.state='running';this.event('beforeSetup');if(this.setup)this.setup();this.event('afterSetup');}
if(this.state=='running'){if(this.options.transition)pos=this.options.transition(pos);pos*=(this.options.to-this.options.from);pos+=this.options.from;this.position=pos;this.event('beforeUpdate');if(this.update)this.update(pos);this.event('afterUpdate');}},cancel:function(){if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue=='string'?'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(){return'#<Effect:'+$H(this).inspect()+',options:'+$H(this.options).inspect()+'>';}}
Effect.Parallel=Class.create();Object.extend(Object.extend(Effect.Parallel.prototype,Effect.Base.prototype),{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.Opacity=Class.create();Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);if(/MSIE/.test(navigator.userAgent)&&(!this.element.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();Object.extend(Object.extend(Effect.Move.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);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+'px',top:this.options.y*position+this.originalTop+'px'});}});Effect.MoveBy=function(element,toTop,toLeft){return new Effect.Move(element,Object.extend({x:toLeft,y:toTop},arguments[3]||{}));};Effect.Scale=Class.create();Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{initialize:function(element,percent){this.element=$(element)
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','%'].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+'px';if(this.options.scaleY)d.height=height+'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();Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options);},setup:function(){if(this.element.getStyle('display')=='none'){this.cancel();return;}
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+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart());}.bind(this))});},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));}});Effect.ScrollTo=Class.create();Object.extend(Object.extend(Effect.ScrollTo.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);this.start(arguments[1]||{});},setup:function(){Position.prepare();var offsets=Position.cumulativeOffset(this.element);if(this.options.offset)offsets[1]+=this.options.offset;var max=window.innerHeight?window.height-window.innerHeight:document.body.scrollHeight-
(document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight);this.scrollStart=Position.deltaY;this.delta=(offsets[1]>max?max:offsets[1])-this.scrollStart;},update:function(position){Position.prepare();window.scrollTo(Position.deltaX,this.scrollStart+(position*this.delta));}});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();effect.element.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);effect.element.show();}},arguments[1]||{});return new Effect.Opacity(element,options);}
Effect.Puff=function(element){element=$(element);var oldStyle={opacity:element.getInlineOpacity(),position:element.getStyle('position')};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){effect.effects[0].element.setStyle({position:'absolute'});},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.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();effect.element.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();effect.element.setStyle({height:'0px'});effect.element.show();},afterFinishInternal:function(effect){effect.element.undoClipping();}},arguments[1]||{}));}
Effect.SwitchOff=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();return new Effect.Appear(element,{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();effect.element.makeClipping();},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.undoPositioned();effect.element.setStyle({opacity:oldOpacity});}})}});}
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();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},arguments[1]||{}));}
Effect.Shake=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left')};return new Effect.Move(element,{x:20,y:0,duration:0.05,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-20,y:0,duration:0.05,afterFinishInternal:function(effect){effect.element.undoPositioned();effect.element.setStyle(oldStyle);}})}})}})}})}})}});}
Effect.SlideDown=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');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.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.setStyle({height:'0px'});effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.undoClipping();if(/MSIE/.test(navigator.userAgent)){effect.element.undoPositioned();effect.element.firstChild.undoPositioned();}else{effect.element.firstChild.undoPositioned();effect.element.undoPositioned();}
effect.element.firstChild.setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));}
Effect.SlideUp=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(effect){effect.element.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.firstChild.undoPositioned();effect.element.undoPositioned();effect.element.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(effect.element);},afterFinishInternal:function(effect){effect.element.hide(effect.element);effect.element.undoClipping(effect.element);}});}
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();effect.element.makeClipping();effect.element.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'});effect.effects[0].element.show();},afterFinishInternal:function(effect){effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.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();effect.effects[0].element.makeClipping();},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},options));}
Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{};var oldOpacity=element.getInlineOpacity();var transition=options.transition||Effect.Transitions.sinoidal;var reverser=function(pos){return transition(1-Effect.Transitions.pulse(pos))};reverser.bind(transition);return new Effect.Opacity(element,Object.extend(Object.extend({duration:3.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(element);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();effect.element.undoClipping();effect.element.setStyle(oldStyle);}});}},arguments[1]||{}));}
Element.Methods.visualEffect=function(element,effect,options){s=effect.gsub(/_/,'-').camelize();effect_class=s.charAt(0).toUpperCase()+s.substring(1);new Effect[effect_class](element,options);return $(element);};Object.extend(Element,{eachChild:function(obj,iterator){iterator(obj);for(obj=obj.firstChild;obj;obj=obj.nextSibling)
Element.eachChild(obj,iterator);}});Object.extend(Event,{KEY_SHIFT:16,KEY_CONTROL:17,KEY_ALT:18});var userSettings;var puzzleState;var undoHistory;var display;var timer;var suEvents;var allCells;var infoLevel=0;var startDate,startTime,endDate,endTime;function prof(str)
{if(startDate)
{endDate=new Date();endTime=endDate.getTime();debug(str+": "+(endTime-startTime));}
startDate=new Date();startTime=startDate.getTime();}
function init(noTimer)
{var preloads=$('image_preloads');if(preloads)
{Element.hide(preloads);}
document.onselectstart=new Function('return false');userSettings=new UserSettings();puzzleState=new PuzzleState();undoHistory=new UndoHistory();display=new Display();timer=new Timer();suEvents=new SuEvents();new MainEventDispenser();if(!readCookie("visited")&&$('help_div'))
{display.togglePane($('helpButton'),'help');}
createCookie("visited","indeed",3650);if(!noTimer)
{timer.toggleTimer();}}
function createCookie(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=/";}
function readCookie(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;}
function fixHexStr(str)
{str=str.replace(/\..*/,'');if(str.length==1)
str="0"+str;return str;}
function infoMsg(str,level)
{if(level<=infoLevel)
{var dbgObj=$("dbg");if(dbgObj)
dbgObj.innerHTML=str+'<br>'+dbgObj.innerHTML;}}
function debug(str,overwrite)
{var dbgObj=$("dbg");if(dbgObj)
dbgObj.innerHTML=str+'<br>'+dbgObj.innerHTML;}
Display=Class.create();Display.prototype={initialize:function()
{},flashLockedCell:function(cell)
{cell=(cell||puzzleState.selectedCell);if(puzzleState.isCellLocked(cell)&&!Element.hasClassName(puzzleState.selectedCell,"lockedFlashingState"))
{Element.addClassName(puzzleState.selectedCell,"lockedFlashingState");setTimeout("Element.removeClassName($('"+puzzleState.selectedCell.id+"'), 'lockedFlashingState')",300);}},flashText:function(nodeId)
{var node=$(nodeId);if(!node)
return;Element.addClassName(node,"textFlashingState");setTimeout("Element.removeClassName($('"+nodeId+"'), 'textFlashingState')",300);},flashBackground:function(from,to,objs)
{if(!userSettings.effects)
return;objs=$A(objs);var frames=16;var increment=[(to[0]-from[0])/frames,(to[1]-from[1])/frames,(to[2]-from[2])/frames];var cur=[from[0],from[1],from[2]];var firstPass=true;objs=objs.inject($A([]),function(ar,o)
{if(!Element.hasClassName(o,"flashingCell"))
{Element.addClassName(o,"flashingCell");ar.push(o);}
return ar;});var func=function()
{cur[0]+=increment[0];cur[1]+=increment[1];cur[2]+=increment[2];str0=fixHexStr(cur[0].toString(16));str1=fixHexStr(cur[1].toString(16));str2=fixHexStr(cur[2].toString(16));objs.each(function(o)
{o.style.backgroundColor="#"+str0+str1+str2;});if(Math.abs(cur[0]-to[0])>0.01||Math.abs(cur[1]-to[1])>0.01||Math.abs(cur[2]-to[2])>0.01)
{setTimeout(func,5);}
else if(firstPass)
{firstPass=false;increment[0]=-increment[0];increment[1]=-increment[1];increment[2]=-increment[2];to=from;setTimeout(func,10);}
else
{objs.each(function(o)
{o.style.backgroundColor="";Element.removeClassName(o,"flashingCell");});}}
setTimeout(func,10);},togglePane:function(button,paneStr,noEffect)
{var pane=paneStr+"_div";if($(pane).getStyle("display")=="none")
{this.showPane(button,paneStr,noEffect);}
else
{this.hidePane(button,paneStr,noEffect);}},hidePane:function(button,paneStr,noEffect)
{var pane=paneStr+"_div";this.hideNode(pane,noEffect);if(button)
button.innerHTML=paneStr;},showPane:function(button,paneStr,noEffect)
{var pane=paneStr+"_div";this.showNode(pane,noEffect);if(button)
button.innerHTML="hide "+paneStr;},toggleNode:function(nodeToToggle,noEffect)
{if($(nodeToToggle).getStyle("display")=="none")
{this.showNode(nodeToToggle,noEffect);}
else
{this.hideNode(nodeToToggle,noEffect);}},hideNode:function(nodeToHide,noEffect)
{if(userSettings.effects&&(!noEffect||noEffect=='showing'))
new Effect.Fade(nodeToHide,{duration:0.25});else
Element.hide(nodeToHide);},showNode:function(nodeToShow,noEffect)
{if(userSettings.effects&&(!noEffect||noEffect=='hiding'))
new Effect.Appear(nodeToShow,{duration:0.25});else
Element.show(nodeToShow);},scrollToBottom:function()
{var scrolledX=0;if(self.pageYOffset)
{scrolledX=self.pageXOffset;}
else if(document.documentElement&&document.documentElement.scrollTop)
{scrolledX=document.documentElement.scrollLeft;}
else if(document.body)
{scrolledX=document.body.scrollLeft;}
var test1=document.body.scrollHeight;var test2=document.body.offsetHeight;if(test1>test2)
{scrollTo(scrolledX,document.body.scrollHeight);}
else
{scrollTo(scrolledX,document.body.offsetHeight);}},togglePausedPuzzle:function()
{Element.toggle($('puzzle_table'));Element.toggle($('empty_puzzle_table'));}}
PuzzleState=Class.create();PuzzleState.prototype={initialize:function()
{infoMsg("PuzzleState.initialize",1);this.selectedCell=null;this.highlightedCell=null;this.singleValuedCells=gStatics;this.cellClicked=false;this.eventPhaseCapturing=true;this.dontBlur=false;this.rowValid=$A(gRowValid);this.colValid=$A(gColValid);this.regionValid=$A(gRegValid);var tbl=$('puzzle_table');if(tbl)
{this.allCells=$A(tbl.firstChild.childNodes[0].childNodes);this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[1].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[2].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[3].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[4].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[5].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[6].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[7].childNodes));this.allCells=this.allCells.concat($A(tbl.firstChild.childNodes[8].childNodes));}},cellClick:function(cell)
{this.cellClicked=true;this.selectCell(cell);suEvents.fireEvent(SuEventTypes.CellClicked,{"cell":cell});},selectCell:function(cell,noEvents)
{if(this.selectedCell||this.highlightedCell)
this.deselectCell();if(this.isStaticCell(cell))
{Element.addClassName(cell,"staticHighlightedState");this.highlightedCell=cell;}
else
{Element.addClassName(cell,"selectedState");this.selectedCell=cell;}
if(!noEvents)
{suEvents.fireEvent(SuEventTypes.CellSelected,{"cell":cell});}},deselectCell:function(noEvents)
{var cell;if(this.highlightedCell)
{Element.removeClassName(this.highlightedCell,"staticHighlightedState");cell=this.highlightedCell;this.highlightedCell=null;}
else if(this.selectedCell)
{Element.removeClassName(this.selectedCell,"selectedState");cell=this.selectedCell;this.selectedCell=null;}
if(cell&&!noEvents)
{suEvents.fireEvent(SuEventTypes.CellDeselected,{"cell":cell});}},getEntryValDiv:function(cell)
{cell=(cell||this.selectedCell);return cell.childNodes[0];},getPencilValsDiv:function(cell)
{cell=(cell||this.selectedCell);return cell.childNodes[1];},hasPencilMarks:function(cell)
{cell=(cell||this.selectedCell);if(this.getPencilValsDiv(cell).style.display!="none")
return true;else
return false;},isStaticCell:function(cell)
{cell=(cell||this.selectedCell);return(Element.hasClassName(cell,"staticCell"))},toggleCellPencilMarks:function(cell)
{cell=(cell||this.selectedCell);if(this.hasPencilMarks(cell))
{var newValue=" ";for(i=0;i<9;++i)
{if(Element.visible(this.getPencilValsDiv(cell).firstChild.firstChild.childNodes[parseInt(i/3)].childNodes[i%3].firstChild))
{newValue=i+1;break;}}
this.getEntryValDiv(cell).innerHTML=newValue;Element.hide(this.getPencilValsDiv(cell));Element.show(this.getEntryValDiv(cell));if(cell==this.selectedCell)
this.selectCell(this.selectedCell);}
else
{var zVal=parseInt(this.getEntryValDiv(cell).innerHTML)-1;var tbl=this.getPencilValsDiv(cell).firstChild.firstChild;for(i=0;i<9;++i)
{if(i==zVal)
{Element.show(tbl.childNodes[parseInt(i/3)].childNodes[i%3].firstChild);}
else
{Element.hide(tbl.childNodes[parseInt(i/3)].childNodes[i%3].firstChild);}}
Element.hide(this.getEntryValDiv(cell));Element.show(this.getPencilValsDiv(cell));}},toggleCellValue:function(value,cell,noEvents)
{cell=(cell||this.selectedCell);var zVal;if(!this.isStaticCell(cell))
{var valueCount=this.getCellValues(cell).length;if(userSettings.pencilMarks)
{if(valueCount==0)
{this.getEntryValDiv(cell).innerHTML=value;this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}
else if(valueCount==1&&this.getEntryValDiv(cell).innerHTML!=value)
{zVal=value-1;this.toggleCellPencilMarks(cell);this.singleValuedCells-=1;Element.toggle(this.getPencilValsDiv(cell).firstChild.firstChild.childNodes[parseInt(zVal/3)].childNodes[zVal%3].firstChild);if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasPencilMarks,{"cell":cell});}
this.setIncomplete(cell);}
else if(valueCount==1)
{this.getEntryValDiv(cell).innerHTML="";this.singleValuedCells-=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasNoValues,{"cell":cell});}
this.setIncomplete(cell);}
else
{zVal=value-1;Element.toggle(this.getPencilValsDiv(cell).firstChild.firstChild.childNodes[parseInt(zVal/3)].childNodes[zVal%3].firstChild);if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});}
if(this.getCellValues(cell).length==1)
{this.toggleCellPencilMarks(cell);this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}}}
else
{if(valueCount==0)
{this.getEntryValDiv(cell).innerHTML=value;this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}
else if(valueCount==1&&this.getEntryValDiv(cell).innerHTML!=value)
{this.getEntryValDiv(cell).innerHTML=value;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}
else if(valueCount==1)
{this.getEntryValDiv(cell).innerHTML="";this.singleValuedCells-=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasNoValues,{"cell":cell});}
this.setIncomplete(cell);}
else
{this.toggleCellPencilMarks(cell);this.getEntryValDiv(cell).innerHTML=value;this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueToggled,{"cell":cell,"value":value});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}}}},setCellValue:function(value,cell,noEvents)
{cell=(cell||this.selectedCell);var valuesRemoved=new Array();if(!this.isStaticCell(cell))
{var curValues=this.getCellValues(cell);if(curValues.length==0)
{this.getEntryValDiv(cell).innerHTML=value;this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueSet,{"cell":cell,"value":value,"oldValues":valuesRemoved});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}
else if(curValues.length==1&&this.getEntryValDiv(cell).innerHTML!=value)
{valuesRemoved.push(this.getEntryValDiv(cell).innerHTML);this.getEntryValDiv(cell).innerHTML=value;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueSet,{"cell":cell,"value":value,"oldValues":valuesRemoved});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}
else if(curValues.length==1)
{}
else
{valuesRemoved=curValues;this.toggleCellPencilMarks(cell);this.getEntryValDiv(cell).innerHTML=value;this.singleValuedCells+=1;if(!noEvents)
{suEvents.fireEvent(SuEventTypes.ValueSet,{"cell":cell,"value":value,"oldValues":valuesRemoved});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellHasOneValue,{"cell":cell});}
this.updateCompleteness(cell);this.checkCompleteness();}}
return valuesRemoved;},clearCellValues:function(cell,noEvents)
{cell=(cell||this.selectedCell);var values=this.getCellValues(cell);if(this.hasPencilMarks(cell))
{this.toggleCellPencilMarks(cell);}
else
{this.singleValuedCells-=1;}
this.getEntryValDiv(cell).innerHTML="";if(!noEvents)
{suEvents.fireEvent(SuEventTypes.CellHasNoValues,{"cell":cell});suEvents.fireEvent(SuEventTypes.CellCleared,{"cell":cell,"values":values});suEvents.fireEvent(SuEventTypes.ValuesChanged,{"cell":cell});}},getCellValues:function(cell)
{cell=(cell||this.selectedCell);var values=new Array();if(this.isStaticCell(cell))
{values.push(parseInt(cell.firstChild.innerHTML));}
else if(!this.hasPencilMarks(cell))
{var val=parseInt(this.getEntryValDiv(cell).innerHTML);if(val>=1&&val<=9)
values.push(val);}
else
{Element.eachChild(this.getPencilValsDiv(cell).firstChild,function(c)
{if(c.tagName&&c.tagName=="DIV"&&Element.visible(c))
{values.push(parseInt(c.innerHTML));}});}
return values;},hasCellValue:function(value,cell)
{cell=(cell||this.selectedCell);var vals=$A(this.getCellValues(cell));return vals.include(value);},checkCompleteness:function()
{if(this.isComplete())
{this.deselectCell();suEvents.fireEvent(SuEventTypes.PuzzleValidated,null);suEvents.fireEvent(SuEventTypes.PuzzleCompleted,null);timer.stopTimer();timer.disableTimer();display.flashBackground([0xff,0xff,0xff],[0xff,0xff,0x7f],this.allCells);display.hidePane(null,"incorrect_message",true);display.showPane(null,"solved_message");}
else if(this.singleValuedCells==81)
{display.hidePane(null,"solved_message",true);display.showPane(null,"incorrect_message");}
else
{display.hidePane(null,"solved_message");display.hidePane(null,"incorrect_message");}},setIncomplete:function(cell)
{cell=(cell||this.selectedCell);var c=cell.id.charAt(1);var r=cell.id.charAt(2);var reg=this.getRegionNum(c,r);this.colValid[c]=false;this.rowValid[r]=false;this.regionValid[reg]=false;suEvents.fireEvent(SuEventTypes.RowInvalidated,{"row":r});suEvents.fireEvent(SuEventTypes.ColumnInvalidated,{"col":c});suEvents.fireEvent(SuEventTypes.RegionInvalidated,{"reg":reg});},updateCompleteness:function(cell)
{cell=(cell||this.selectedCell);var c=cell.id.charAt(1);var r=cell.id.charAt(2);var reg=this.getRegionNum(c,r);var valSum=0;var curVal;var oldColComplete=this.colValid[c];var oldRowComplete=this.rowValid[c];var oldRegComplete=this.regionValid[c];for(i=0;i<9;++i)
{curVal=this.getCellValues($('c'+c+i));if(curVal.length!=1)
{valSum=0;break;}
else
{valSum+=1<<(parseInt(curVal[0])-1);}}
this.colValid[c]=(valSum==0x1FF);if(this.colValid[c])
{suEvents.fireEvent(SuEventTypes.ColumnValidated,{"col":c});}
else if(oldColComplete)
{suEvents.fireEvent(SuEventTypes.ColumnInvalidated,{"col":c});}
valSum=0;for(var i=0;i<9;++i)
{curVal=this.getCellValues($('c'+i+r));if(curVal.length!=1)
{valSum=0;break;}
else
{valSum+=1<<(parseInt(curVal[0])-1);}}
this.rowValid[r]=(valSum==0x1FF);if(this.rowValid[r])
{suEvents.fireEvent(SuEventTypes.RowValidated,{"row":r});}
else if(oldRowComplete)
{suEvents.fireEvent(SuEventTypes.RowInvalidated,{"row":r});}
valSum=0;for(var j=parseInt(reg/3)*3;j<parseInt(reg/3)*3+3;++j)
{for(var i=(reg%3)*3;i<(reg%3)*3+3;++i)
{curVal=this.getCellValues($('c'+i+j));if(curVal.length!=1)
{valSum=0;break;}
else
{valSum+=1<<(parseInt(curVal[0])-1);}}
if(valSum==0)
{break;}}
this.regionValid[reg]=(valSum==0x1FF);if(this.regionValid[reg])
{suEvents.fireEvent(SuEventTypes.RegionValidated,{"reg":reg});}
else if(oldRegComplete)
{suEvents.fireEvent(SuEventTypes.RegionInvalidated,{"reg":reg});}},isComplete:function()
{var allDone=function(c){return c;};return(this.rowValid.all(allDone)&&this.colValid.all(allDone)&&this.regionValid.all(allDone));},getRegionNum:function(col,row)
{return parseInt(col/3)+parseInt(row/3)*3},toggleCellLock:function(cell)
{cell=(cell||this.selectedCell);if(this.isCellLocked(cell))
{Element.removeClassName(cell,"lockedState");suEvents.fireEvent(SuEventTypes.CellUnlocked,{"cell":cell});}
else
{Element.addClassName(cell,"lockedState");suEvents.fireEvent(SuEventTypes.CellLocked,{"cell":cell});}},isCellLocked:function(cell)
{cell=(cell||this.selectedCell);return(Element.hasClassName(cell,"lockedState"));}}
UserSettings=Class.create();UserSettings.prototype={initialize:function()
{infoMsg("UserSettings.initialize",1);this.timer=(readCookie("timer")!="false");this.pencilMarks=(readCookie("pencil_marks")!="false");this.entryColor=this.readEntryColorCookie();this.effects=(readCookie("effects")!="false");if(!this.timer)
{if(this.effects)
Effect.Fade($('timer_div'));else
Element.hide($('timer_div'));}},readEntryColorCookie:function()
{return readCookie("entry_color")||"#5555ff";},setTimer:function(newVal)
{this.timer=newVal;if(this.timer)
{display.showPane(null,'timer');}
else
{display.hidePane(null,'timer');}},setPencilMarks:function(newVal)
{this.pencilMarks=newVal;},setEntryColor:function(newVal)
{this.entryColor=newVal;if(!document.styleSheets)
return;var theRules=new Array();if(document.styleSheets[0].cssRules)
theRules=document.styleSheets[0].cssRules
else if(document.styleSheets[0].rules)
theRules=document.styleSheets[0].rules
else return;if(String(newVal).substr(0,3)=="%23")
newVal="#"+newVal.substr(3,newVal.length-3);theRules[theRules.length-1].style.color=newVal;theRules[theRules.length-2].style.color=newVal;},setEffects:function(newVal)
{this.effects=newVal;},restoreOldSettings:function()
{this.setTimer(readCookie("timer")!="false");$('timer_opt').checked=this.timer;this.setPencilMarks(readCookie("pencil_marks")!="false");$('pencil_marks_opt').checked=this.pencilMarks;this.setEntryColor(this.readEntryColorCookie());var colorSelect=$('entry_color_opt');for(i=0;i<colorSelect.options.length;++i)
{if(colorSelect.options[i].value==this.entryColor)
{colorSelect.selectedIndex=i;break;}}
this.setEffects(readCookie("effects")!="false");$('effects_opt').checked=this.effects;}}
var KeyModifiers={Alt:1,Ctrl:2,Shift:4};MainEventDispenser=Class.create();MainEventDispenser.prototype={initialize:function()
{infoMsg("MainEventDispenser.initialize",1);this.stopEvent=false;document.onkeypress=this.onKeyPress.bindAsEventListener(this);document.onkeydown=this.onKeyDown.bindAsEventListener(this);document.onkeyup=this.onKeyUp.bindAsEventListener(this);document.onmousedown=this.onMouseDown.bindAsEventListener(this);document.onclick=this.onClick.bindAsEventListener(this);document.onblur=this.onBlur.bindAsEventListener(this);document.onunload=this.onUnload.bindAsEventListener(this);if(document.captureEvents)
document.captureEvents(Event.MOUSEDOWN|Event.CLICK);},onBlur:function(event)
{if(puzzleState.dontBlur)
{puzzleState.dontBlur=false;}
else
{puzzleState.deselectCell();suEvents.fireEvent(SuEventTypes.PuzzleDeselected,null);}},onUnload:function(event)
{timer.stopTimer();},onKeyDown:function(event)
{infoMsg("onKeyDown",1);var key=event.which;if(!key)
key=event.keyCode;infoMsg("onKeyDown key: "+key,1);if(this.isCtrlPressed(event))
{var value=String.fromCharCode(this.numpadToNormal(key));if(value.toLowerCase()!='z'&&value.toLowerCase()!='y'&&value.toLowerCase()!='r'&&(value<'1'||value>'9'))
{return;}}
else if(this.isAltPressed(event))
{var value=String.fromCharCode(this.numpadToNormal(key));if(value<'1'||value>'9')
{return;}}
if(puzzleState.selectedCell&&!puzzleState.highlightedCell)
{if(key==Event.KEY_DELETE||key==Event.KEY_BACKSPACE)
{if(!puzzleState.isCellLocked())
{var vals=puzzleState.getCellValues();puzzleState.clearCellValues();undoHistory.pushUndoAction(vals);}
else
{display.flashLockedCell();suEvents.fireEvent(SuEventTypes.ChangePrevented,null);}}
else
{var value=String.fromCharCode(this.numpadToNormal(key));if(value.toLowerCase()=='l'||value=="*"||(value=="8"&&this.isShiftPressed(event)))
{puzzleState.toggleCellLock();}
else if(value>='1'&&value<='9'&&!this.isShiftPressed(event))
{if(!puzzleState.isCellLocked())
{if(this.isCtrlPressed(event))
{var valuesRemoved=$A(puzzleState.setCellValue(value));undoHistory.pushUndoAction(valuesRemoved.concat([value]));}
else if(this.isAltPressed(event))
{if(puzzleState.hasCellValue(value))
{puzzleState.toggleCellValue(value);undoHistory.pushUndoAction([value]);}}
else
{puzzleState.toggleCellValue(value);undoHistory.pushUndoAction([value]);}}
else
{display.flashLockedCell();suEvents.fireEvent(SuEventTypes.ChangePrevented,null);}}}
this.stopEvent=true;Event.stop(event);}
if(puzzleState.highlightedCell||puzzleState.selectedCell)
{var aCell=puzzleState.highlightedCell||puzzleState.selectedCell;var i=0;var newCellStr="";if(key==Event.KEY_ESC)
{suEvents.fireEvent(SuEventTypes.EscPressed,null);puzzleState.deselectCell();}
else if(key==Event.KEY_LEFT)
{puzzleState.selectCell($(this.moveHoriz(aCell.id,false)));suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Left});}
else if(key==Event.KEY_RIGHT)
{puzzleState.selectCell($(this.moveHoriz(aCell.id,true)));suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Right});}
else if(key==Event.KEY_UP)
{puzzleState.selectCell($(this.moveVert(aCell.id,false)));suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Up});}
else if(key==Event.KEY_DOWN)
{puzzleState.selectCell($(this.moveVert(aCell.id,true)));suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Down});}
else if(key==Event.KEY_TAB)
{infoMsg("Tab pressed",2);var newCellCol=parseInt(aCell.id.charAt(1));var newCellRow=parseInt(aCell.id.charAt(2));if(this.isShiftPressed(event))
{newCellCol-=1;if(newCellCol==-1)
{newCellCol=8;newCellRow-=1
if(newCellRow==-1)
newCellRow=8;}}
else
{newCellCol+=1;if(newCellCol==9)
{newCellCol=0;newCellRow+=1
if(newCellRow==9)
newCellRow=0;}}
newCellStr="c"+newCellCol+newCellRow;puzzleState.selectCell($(newCellStr));if(this.isShiftPressed(event))
{suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Prev});}
else
{suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":aCell,"direction":CursorDirections.Next});}}
this.stopEvent=true;Event.stop(event);}
if(!puzzleState.highlightedCell&&!puzzleState.selectedCell)
{if(key==Event.KEY_LEFT||key==Event.KEY_RIGHT||key==Event.KEY_UP||key==Event.KEY_DOWN)
{puzzleState.selectCell($('c00'));var direction;if(key==Event.KEY_LEFT)
direction=CursorDirections.Left;else if(key==Event.KEY_RIGHT)
direction=CursorDirections.Right;else if(key==Event.KEY_UP)
direction=CursorDirections.Up;else if(key==Event.KEY_DOWN)
direction=CursorDirections.Down;else
direction=null;suEvents.fireEvent(SuEventTypes.MovedCursor,{"cell":null,"direction":direction});}}
var value=String.fromCharCode(key);if(value.toLowerCase()=='z'&&this.isCtrlPressed(event))
{undoHistory.popUndoAction();suEvents.fireEvent(SuEventTypes.UndoPressed,null);}
else if(value.toLowerCase()=='y'&&this.isCtrlPressed(event))
{undoHistory.popRedoAction();suEvents.fireEvent(SuEventTypes.RedoPressed,null);}
else if(value==' ')
{timer.toggleTimer(this);display.togglePausedPuzzle();}},onKeyUp:function(event)
{infoMsg("onKeyUp",5);var key=event.which;if(!key)
key=event.keyCode;},onKeyPress:function(event)
{infoMsg("onKeyPress",5);if(this.stopEvent)
{Event.stop(event);this.stopEvent=false;}},onMouseDown:function(event)
{infoMsg("onMouseDown ("+event.currentTarget+")",1);var wasClicked=puzzleState.cellClicked;if(!puzzleState.cellClicked&&(!event.eventPhase||!puzzleState.eventPhaseCapturing))
{puzzleState.deselectCell();suEvents.fireEvent(SuEventTypes.PuzzleDeselected,null)}
if(event.eventPhase)
{puzzleState.eventPhaseCapturing=!puzzleState.eventPhaseCapturing;}
puzzleState.cellClicked=false;return true;},onClick:function(event)
{infoMsg("onClick ("+event.currentTarget+")",1);puzzleState.dontBlur=true;},moveHoriz:function(cellId,moveRight)
{var newCellCol=parseInt(cellId.charAt(1));var newCellStr;var offset=moveRight?1:-1;var limit=moveRight?9:-1;newCellCol+=offset;if(newCellCol==limit)
newCellCol-=offset*9;newCellStr="c"+newCellCol+cellId.charAt(2);return newCellStr;},moveVert:function(cellId,moveDown)
{var newCellRow=parseInt(cellId.charAt(2));var newCellStr;var offset=moveDown?1:-1;var limit=moveDown?9:-1;newCellRow+=offset;if(newCellRow==limit)
newCellRow-=offset*9;newCellStr="c"+cellId.charAt(1)+newCellRow;return newCellStr;},numpadToNormal:function(key)
{if(key>=97&&key<=105)
key=key-48;else if(key==106)
key=76;return key;},isCtrlPressed:function(event)
{return event.ctrlKey||(event.modifiers&&event.modifiers&2);},isShiftPressed:function(event)
{return event.shiftKey||(event.modifiers&&event.modifiers&4);},isAltPressed:function(event)
{return event.altKey||(event.modifiers&&event.modifiers&1);},getModifierBitmask:function(event)
{return(this.isAltPressed(event)?KeyModifiers.Alt:0|this.isCtrlPressed(event)?KeyModifiers.Ctrl:0|this.isShiftPressed(event)?KeyModifiers.Shift:0);},getEventSrc:function(event)
{if(!event)
event=window.event;return event.originalTarget?event.originalTarget:event.srcElement;}}
HistoryAction=Class.create();HistoryAction.prototype={initialize:function(values,cell)
{this.values=values;this.cell=cell;}}
UndoHistory=Class.create();UndoHistory.prototype={initialize:function()
{this.undoHistory=new Array();this.redoHistory=new Array();},pushUndoAction:function(values,cell)
{cell=(cell||puzzleState.selectedCell);infoMsg("Pushing "+values,3);this.undoHistory.push(new HistoryAction(values,cell));this.redoHistory=new Array();},popUndoAction:function()
{var action=this.undoHistory.pop();if(action)
{this.redoHistory.push(action);puzzleState.selectCell(action.cell);$A(action.values).each(function(val){infoMsg("Toggling "+val,3);puzzleState.toggleCellValue(val);});;}},pushRedoAction:function(values,cell)
{cell=(cell||puzzleState.selectedCell);infoMsg("Pushing "+values,3);this.redoHistory.push(new HistoryAction(values,cell));},popRedoAction:function()
{var action=this.redoHistory.pop();if(action)
{this.undoHistory.push(action);puzzleState.selectCell(action.cell);$A(action.values).each(function(val){infoMsg("Toggling "+val,3);puzzleState.toggleCellValue(val);});;}}}
Timer=Class.create();Timer.prototype={initialize:function()
{this.ZERO_DATE=new Date(0);this.timePassed=this.ZERO_DATE;},startTimer:function()
{var stateObj=this;var timerVal=$('timer_value');$('timer_button').src="/images/pause.png";this.periodStart=new Date();timerVal.innerHTML=stateObj.getTimerString();var timerFunc=function()
{stateObj.timer=setTimeout(timerFunc,1000);timerVal.innerHTML=stateObj.getTimerString();}
return setTimeout(timerFunc,1000);},stopTimer:function()
{clearTimeout(this.timer);$('timer_button').src="/images/resume.png";this.timePassed=this.getTotalTimePassed();this.periodStart=null;return null;},toggleTimer:function(button)
{if(!this.disabled)
{if(this.timer)
{this.timer=this.stopTimer();}
else
{this.timer=this.startTimer();}}},disableTimer:function()
{this.disabled=true;},getTimerString:function()
{var timeSpan=this.getTotalTimePassed();var str="";var msec=timeSpan.getTime();var hours=parseInt(msec/3600000);if(hours>0)
str+=hours+":";if(timeSpan.getMinutes()<10)
str+="0";str+=timeSpan.getMinutes()+":";if(timeSpan.getSeconds()<10)
str+="0";str+=timeSpan.getSeconds();return str;},getTotalTimePassed:function()
{var curPeriod=this.periodStart?(new Date()-this.periodStart):0;return new Date(curPeriod+this.timePassed.getTime());}}
var CursorDirections={Left:0,Right:1,Up:2,Down:3,Next:4,Prev:5};var SuEventTypes={PuzzleSelected:0,CellSelected:1,PuzzleDeselected:2,CellDeselected:3,CellClicked:4,ValueSet:5,ValueToggled:6,CellCleared:7,CellLocked:8,CellUnlocked:9,CellHasOneValue:10,CellHasPencilMarks:11,CellHasNoValues:12,MovedCursor:13,RowValidated:14,RowInvalidated:15,ColumnValidated:16,ColumnInvalidated:17,RegionValidated:18,RegionInvalidated:19,RowCompleted:20,RowIncompleted:21,ColumnCompleted:22,ColumnIncompleted:23,RegionCompleted:24,RegionIncompleted:25,PuzzleValidated:26,PuzzleInvalidated:27,PuzzleCompleted:28,PuzzleIncompleted:29,EscPressed:30,ChangePrevented:31,ValuesChanged:32,UndoPressed:33,RedoPressed:34,TypeCount:35}
SuEvents=Class.create();SuEvents.prototype={initialize:function()
{this.listeners=new Array(SuEventTypes.TypeCount);for(i=0;i<this.listeners.length;++i)
{this.listeners[i]=new Array();this.listeners[i]=$A(this.listeners[i]);}},addEventListener:function(eventType,listener)
{this.listeners[eventType].push(listener);return listener;},remEventListener:function(eventType,listener)
{this.listeners[eventType]=this.listeners[eventType].without(listener);},clearEventListeners:function()
{for(i=0;i<this.listeners.length;++i)
{this.listeners[i]=new Array();this.listeners[i]=$A(this.listeners[i]);}},fireEvent:function(eventType,paramHash)
{this.listeners[eventType].each(function(listener)
{listener(paramHash);});}}