var Spinner=new Class({Extends:Mask,Implements:Chain,options:{"class":"spinner",containerPosition:{},content:{"class":"spinner-content"},messageContainer:{"class":"spinner-msg"},img:{"class":"spinner-img"},fxOptions:{link:"chain"}},initialize:function(target,options){this.target=document.id(target)||document.id(document.body);this.target.store("spinner",this);this.setOptions(options);this.render();this.inject();var deactivate=function(){this.active=false}.bind(this);this.addEvents({hide:deactivate,show:deactivate})},render:function(){this.parent();this.element.set("id",this.options.id||"spinner-"+String.uniqueID());this.content=document.id(this.options.content)||new Element("div",this.options.content);this.content.inject(this.element);if(this.options.message){this.msg=document.id(this.options.message)||new Element("p",this.options.messageContainer).appendText(this.options.message);this.msg.inject(this.content)}if(this.options.img){this.img=document.id(this.options.img)||new Element("div",this.options.img);this.img.inject(this.content)}this.element.set("tween",this.options.fxOptions)},show:function(noFx){if(this.active){return this.chain(this.show.bind(this))}if(!this.hidden){this.callChain.delay(20,this);return this}this.active=true;return this.parent(noFx)},showMask:function(noFx){var pos=function(){this.content.position(Object.merge({relativeTo:this.element},this.options.containerPosition))}.bind(this);if(noFx){this.parent();pos()}else{if(!this.options.style.opacity){this.options.style.opacity=this.element.getStyle("opacity").toFloat()}this.element.setStyles({display:"block",opacity:0}).tween("opacity",this.options.style.opacity);pos();this.hidden=false;this.fireEvent("show");this.callChain()}},hide:function(noFx){if(this.active){return this.chain(this.hide.bind(this))}if(this.hidden){this.callChain.delay(20,this);return this}this.active=true;return this.parent(noFx)},hideMask:function(noFx){if(noFx){return this.parent()}this.element.tween("opacity",0).get("tween").chain(function(){this.element.setStyle("display","none");this.hidden=true;this.fireEvent("hide");this.callChain()}.bind(this))},destroy:function(){this.content.destroy();this.parent();this.target.eliminate("spinner")}});Request=Class.refactor(Request,{options:{useSpinner:false,spinnerOptions:{},spinnerTarget:false},initialize:function(options){this._send=this.send;this.send=function(options){var spinner=this.getSpinner();if(spinner){spinner.chain(this._send.pass(options,this)).show()}else{this._send(options)}return this};this.previous(options)},getSpinner:function(){if(!this.spinner){var update=document.id(this.options.spinnerTarget)||document.id(this.options.update);if(this.options.useSpinner&&update){update.set("spinner",this.options.spinnerOptions);var spinner=this.spinner=update.get("spinner");["complete","exception","cancel"].each(function(event){this.addEvent(event,spinner.hide.bind(spinner))},this)}}return this.spinner}});Element.Properties.spinner={set:function(options){var spinner=this.retrieve("spinner");if(spinner){spinner.destroy()}return this.eliminate("spinner").store("spinner:options",options)},get:function(){var spinner=this.retrieve("spinner");if(!spinner){spinner=new Spinner(this,this.retrieve("spinner:options"));this.store("spinner",spinner)}return spinner}};Element.implement({spin:function(options){if(options){this.set("spinner",options)}this.get("spinner").show();return this},unspin:function(){this.get("spinner").hide();return this}});