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