var Autocompleter={}
Autocompleter.Base=function(){};Autocompleter.Base.prototype={baseInitialize:function(I,l,i){var o=this;o.element=$(I);o.update=$(l);o.hasFocus=false;o.changed=false;o.active=false;o.index=0;o.entryCount=0;if(o.setOptions)o.setOptions(i);else
o.options=i||{};o.options.paramName=o.options.paramName||o.element.name;o.options.tokens=o.options.tokens||[];o.options.frequency=o.options.frequency||0.4;o.options.minChars=o.options.minChars||1;o.options.onShow=o.options.onShow||function(I,i){if(!i.style.position||i.style.position=='absolute'){i.style.position='absolute';Position.clone(I,i,{setHeight:false,offsetTop:I.offsetHeight})}
new Effect.Appear(i,{duration:0.15})};o.options.onHide=o.options.onHide||function(I,i){new Effect.Fade(i,{duration:0.15})};if(typeof(o.options.tokens)=='string')o.options.tokens=new Array(o.options.tokens);o.observer=null;o.element.setAttribute('autocomplete','off');Element.hide(o.update);Event.observe(o.element,"blur",o.onBlur.bindAsEventListener(o));Event.observe(o.element,"keypress",o.onKeyPress.bindAsEventListener(o))},show:function(){var i=this;if(Element.getStyle(i.update,'display')=='none')i.options.onShow(i.element,i.update);if(!i.iefix&&(navigator.appVersion.indexOf('MSIE')>0)&&(Element.getStyle(i.update,'position')=='absolute')){new Insertion.After(i.update,'<iframe id="'+i.update.id+'_iefix" '+'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" '+'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');i.iefix=$(i.update.id+'_iefix')}
if(i.iefix){Position.clone(i.update,i.iefix);i.iefix.style.zIndex=1;i.update.style.zIndex=2;Element.show(i.iefix)}},hide:function(){var i=this;if(Element.getStyle(i.update,'display')!='none')i.options.onHide(i.element,i.update);if(i.iefix)Element.hide(i.iefix)},startIndicator:function(){var i=this;if(i.options.indicator)Element.show(i.options.indicator)},stopIndicator:function(){var i=this;if(i.options.indicator)Element.hide(i.options.indicator)},onKeyPress:function(event){if(this.active)switch(event.keyCode){case Event.KEY_TAB:case Event.KEY_RETURN:this.selectEntry();Event.stop(event);case Event.KEY_ESC:this.hide();this.active=false;Event.stop(event);return;case Event.KEY_LEFT:case Event.KEY_RIGHT:return;case Event.KEY_UP:this.markPrevious();this.render();if(navigator.appVersion.indexOf('AppleWebKit')>0)Event.stop(event);return;case Event.KEY_DOWN:this.markNext();this.render();if(navigator.appVersion.indexOf('AppleWebKit')>0)Event.stop(event);return}else
if(event.keyCode==Event.KEY_TAB||event.keyCode==Event.KEY_RETURN)return;this.changed=true;this.hasFocus=true;if(this.observer)clearTimeout(this.observer);this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000)},onHover:function(I){var l=this,i=Event.findElement(I,'LI');if(l.index!=i.autocompleteIndex){l.index=i.autocompleteIndex;l.render()}
Event.stop(I)},onClick:function(I){var l=this,i=Event.findElement(I,'LI');l.index=i.autocompleteIndex;l.selectEntry();l.hide()},onBlur:function(event){setTimeout(this.hide.bind(this),250);this.hasFocus=false;this.active=false},render:function(){var i=this;if(i.entryCount>0){for(var I=0;I<i.entryCount;I++)i.index==I?Element.addClassName(i.getEntry(I),"selected"):Element.removeClassName(i.getEntry(I),"selected");if(i.hasFocus){i.show();i.active=true}}else i.hide()},markPrevious:function(){var i=this;if(i.index>0)i.index--
else i.index=i.entryCcount-1},markNext:function(){var i=this;if(i.index<i.entryCount-1)i.index++
else i.index=0},getEntry:function(i){return this.update.firstChild.childNodes[i]},getCurrentEntry:function(){var i=this;return i.getEntry(i.index)},selectEntry:function(){var i=this;i.active=false;i.updateElement(i.getCurrentEntry())},updateElement:function(i){var c=this;if(c.options.updateElement){c.options.updateElement(i);return}
var O=Element.collectTextNodesIgnoreClass(i,'informal'),I=c.findLastToken();if(I!=-1){var o=c.element.value.substr(0,I+1),l=c.element.value.substr(I+1).match(/^\s+/);if(l)o+=l[0];c.element.value=o+O}else{c.element.value=O}
c.element.focus()},updateChoices:function(i){var o=this;if(!o.changed&&o.hasFocus){o.update.innerHTML=i;Element.cleanWhitespace(o.update);Element.cleanWhitespace(o.update.firstChild);if(o.update.firstChild&&o.update.firstChild.childNodes){o.entryCount=o.update.firstChild.childNodes.length;for(var l=0;l<o.entryCount;l++){var I=o.getEntry(l);I.autocompleteIndex=l;o.addObservers(I)}}else{o.entryCount=0}
o.stopIndicator();o.index=0;o.render()}},addObservers:function(i){var I=this;Event.observe(i,"mouseover",I.onHover.bindAsEventListener(I));Event.observe(i,"click",I.onClick.bindAsEventListener(I))},onObserverEvent:function(){var i=this;i.changed=false;if(i.getToken().length>=i.options.minChars){i.startIndicator();i.getUpdatedChoices()}else{i.active=false;i.hide()}},getToken:function(){var l=this;var i=l.findLastToken();if(i!=-1)var I=l.element.value.substr(i+1).replace(/^\s+/,'').replace(/\s+$/,'');else
var I=l.element.value;return/\n/.test(I)?'':I},findLastToken:function(){var o=this,i=-1;for(var l=0;l<o.options.tokens.length;l++){var I=o.element.value.lastIndexOf(o.options.tokens[l]);if(I>i)i=I}
return i}}
Ajax.Autocompleter=Class.create();Object.extend(Object.extend(Ajax.Autocompleter.prototype,Autocompleter.Base.prototype),{initialize:function(I,l,o,i){var O=this;O.baseInitialize(I,l,i);O.options.asynchronous=true;O.options.onComplete=O.onComplete.bind(O);O.options.defaultParams=O.options.parameters||null;O.url=o},getUpdatedChoices:function(){var i=this;entry=encodeURIComponent(i.options.paramName)+'='+encodeURIComponent(i.getToken());i.options.parameters=i.options.callback?i.options.callback(i.element,entry):entry;if(i.options.defaultParams)i.options.parameters+='&'+i.options.defaultParams;new Ajax.Request(i.url,i.options)},onComplete:function(i){this.updateChoices(i.responseText)}});Autocompleter.Local=Class.create();Autocompleter.Local.prototype=Object.extend(new Autocompleter.Base(),{initialize:function(I,l,o,i){var O=this;O.baseInitialize(I,l,i);O.options.array=o},getUpdatedChoices:function(){var i=this;i.updateChoices(i.options.selector(i))},setOptions:function(i){this.options=Object.extend({choices:10,partialSearch:true,partialChars:2,ignoreCase:true,fullSearch:false,selector:function(i){var c=[],O=[],l=i.getToken(),C=0;for(var v=0;v<i.options.array.length&&c.length<i.options.choices;v++){var o=i.options.array[v],I=i.options.ignoreCase?o.toLowerCase().indexOf(l.toLowerCase()):o.indexOf(l);while(I!=-1){if(I==0&&o.length!=l.length){c.push("<li><strong>"+o.substr(0,l.length)+"</strong>"+o.substr(l.length)+"</li>");break}else if(l.length>=i.options.partialChars&&i.options.partialSearch&&I!=-1){if(i.options.fullSearch||/\s/.test(o.substr(I-1,1))){O.push("<li>"+o.substr(0,I)+"<strong>"+o.substr(I,l.length)+"</strong>"+o.substr(I+l.length)+"</li>");break}}
I=i.options.ignoreCase?o.toLowerCase().indexOf(l.toLowerCase(),I+1):o.indexOf(l,I+1)}}
if(O.length)c=c.concat(O.slice(0,i.options.choices-c.length))
return "<ul>"+c.join('')+"</ul>"}},i||{})}});Ajax.InPlaceEditor=Class.create();Ajax.InPlaceEditor.defaultHighlightColor="#FFFF99";Ajax.InPlaceEditor.prototype={initialize:function(I,l,i){var o=this;o.url=l;o.element=$(I);o.options=Object.extend({okText:"ok",cancelText:"cancel",savingText:"Saving...",clickToEditText:"Click to edit",okText:"ok",rows:1,onComplete:function(I,i){new Effect.Highlight(i,{startcolor:this.options.highlightcolor})},onFailure:function(i){alert("Error communicating with the server: "+i.responseText.stripTags())},callback:function(i){return Form.serialize(i)},loadingText:'Loading...',savingClassName:'inplaceeditor-saving',formClassName:'inplaceeditor-form',highlightcolor:Ajax.InPlaceEditor.defaultHighlightColor,highlightendcolor:"#FFFFFF",externalControl:null,ajaxOptions:{}},i||{});if(!o.options.formId&&o.element.id){o.options.formId=o.element.id+"-inplaceeditor";if($(o.options.formId)){o.options.formId=null}}
if(o.options.externalControl){o.options.externalControl=$(o.options.externalControl)}
o.originalBackground=Element.getStyle(o.element,'background-color');if(!o.originalBackground){o.originalBackground="transparent"}
o.element.title=o.options.clickToEditText;o.onclickListener=o.enterEditMode.bindAsEventListener(o);o.mouseoverListener=o.enterHover.bindAsEventListener(o);o.mouseoutListener=o.leaveHover.bindAsEventListener(o);Event.observe(o.element,'click',o.onclickListener);Event.observe(o.element,'mouseover',o.mouseoverListener);Event.observe(o.element,'mouseout',o.mouseoutListener);if(o.options.externalControl){Event.observe(o.options.externalControl,'click',o.onclickListener);Event.observe(o.options.externalControl,'mouseover',o.mouseoverListener);Event.observe(o.options.externalControl,'mouseout',o.mouseoutListener)}},enterEditMode:function(){var i=this;if(i.saving)return;if(i.editing)return;i.editing=true;i.onEnterEditMode();if(i.options.externalControl){Element.hide(i.options.externalControl)}
Element.hide(i.element);i.form=i.getForm();i.element.parentNode.insertBefore(i.form,i.element)},getForm:function(){var I=this;form=document.createElement("form");form.id=I.options.formId;Element.addClassName(form,I.options.formClassName)
form.onsubmit=I.onSubmit.bind(I);I.createEditField(form);if(I.options.textarea){var i=document.createElement("br");form.appendChild(i)}
okButton=document.createElement("input");okButton.type="submit";okButton.value=I.options.okText;form.appendChild(okButton);cancelLink=document.createElement("a");cancelLink.href="#";cancelLink.appendChild(document.createTextNode(I.options.cancelText));cancelLink.onclick=I.onclickCancel.bind(I);form.appendChild(cancelLink);return form},createEditField:function(l){var O=this;if(O.options.rows==1){O.options.textarea=false;var i=document.createElement("input");i.type="text";i.name="value";i.value=O.getText();i.style.backgroundColor=O.options.highlightcolor;var o=O.options.size||O.options.cols||0;if(o!=0)i.size=o;l.appendChild(i);O.editField=i}else{O.options.textarea=true;var I=document.createElement("textarea");I.name="value";I.value=O.getText();I.rows=O.options.rows;I.cols=O.options.cols||40;l.appendChild(I);O.editField=I}},getText:function(){var i=this;if(i.options.loadTextURL){i.loadExternalText();return i.options.loadingText}else{return i.element.innerHTML}},loadExternalText:function(){var i=this;new Ajax.Request(i.options.loadTextURL,{asynchronous:true,onComplete:i.onLoadedExternalText.bind(i)})},onLoadedExternalText:function(i){this.form.value.value=i.responseText.stripTags()},onclickCancel:function(){var i=this;i.onComplete();i.leaveEditMode();return false},onFailure:function(i){var I=this;I.options.onFailure(i);if(I.oldInnerHTML){I.element.innerHTML=I.oldInnerHTML;I.oldInnerHTML=null}
return false},onSubmit:function(){var i=this;i.saving=true;new Ajax.Updater({success:i.element,failure:null},i.url,Object.extend({parameters:i.options.callback(i.form,i.editField.value),onComplete:i.onComplete.bind(i),onFailure:i.onFailure.bind(i)},i.options.ajaxOptions));i.onLoading();return false},onLoading:function(){var i=this;i.saving=true;i.removeForm();i.leaveHover();i.showSaving()},showSaving:function(){var i=this;i.oldInnerHTML=i.element.innerHTML;i.element.innerHTML=i.options.savingText;Element.addClassName(i.element,i.options.savingClassName);i.element.style.backgroundColor=i.originalBackground;Element.show(i.element)},removeForm:function(){var i=this;if(i.form){Element.remove(i.form);i.form=null}},enterHover:function(){var i=this;if(i.saving)return;i.element.style.backgroundColor=i.options.highlightcolor;if(i.effect){i.effect.cancel()}
Element.addClassName(i.element,i.options.hoverClassName)},leaveHover:function(){var i=this;if(i.options.backgroundColor){i.element.style.backgroundColor=i.oldBackground}
Element.removeClassName(i.element,i.options.hoverClassName)
if(i.saving)return;i.effect=new Effect.Highlight(i.element,{startcolor:i.options.highlightcolor,endcolor:i.options.highlightendcolor,restorecolor:i.originalBackground})},leaveEditMode:function(){var i=this;Element.removeClassName(i.element,i.options.savingClassName);i.removeForm();i.leaveHover();i.element.style.backgroundColor=i.originalBackground;Element.show(i.element);if(i.options.externalControl){Element.show(i.options.externalControl)}
i.editing=false;i.saving=false;i.oldInnerHTML=null;i.onLeaveEditMode()},onComplete:function(i){var I=this;I.leaveEditMode();I.options.onComplete.bind(I)(i,I.element)},onEnterEditMode:function(){},onLeaveEditMode:function(){},dispose:function(){var i=this;if(i.oldInnerHTML){i.element.innerHTML=i.oldInnerHTML}
i.leaveEditMode();Event.stopObserving(i.element,'click',i.onclickListener);Event.stopObserving(i.element,'mouseover',i.mouseoverListener);Event.stopObserving(i.element,'mouseout',i.mouseoutListener);if(i.options.externalControl){Event.stopObserving(i.options.externalControl,'click',i.onclickListener);Event.stopObserving(i.options.externalControl,'mouseover',i.mouseoverListener);Event.stopObserving(i.options.externalControl,'mouseout',i.mouseoutListener)}}};