Fx.Slide=new Class({Extends:Fx,options:{mode:"vertical"},initialize:function(element,options){this.addEvent("complete",function(){this.open=(this.wrapper["offset"+this.layout.capitalize()]!=0);if(this.open&&Browser.Engine.webkit419){this.element.dispose().inject(this.wrapper)}},true);this.element=this.subject=$(element);this.parent(options);var wrapper=this.element.retrieve("wrapper");this.wrapper=wrapper||new Element("div",{styles:$extend(this.element.getStyles("margin","position"),{overflow:"hidden"})}).wraps(this.element);this.element.store("wrapper",this.wrapper).setStyle("margin",0);this.now=[];this.open=true},vertical:function(){this.margin="margin-top";this.layout="height";this.offset=this.element.offsetHeight},horizontal:function(){this.margin="margin-left";this.layout="width";this.offset=this.element.offsetWidth},set:function(now){this.element.setStyle(this.margin,now[0]);this.wrapper.setStyle(this.layout,now[1]);return this},compute:function(from,to,delta){var now=[];var x=2;x.times(function(i){now[i]=Fx.compute(from[i],to[i],delta)});return now},start:function(how,mode){if(!this.check(arguments.callee,how,mode)){return this}this[mode||this.options.mode]();var margin=this.element.getStyle(this.margin).toInt();var layout=this.wrapper.getStyle(this.layout).toInt();var caseIn=[[margin,layout],[0,this.offset]];var caseOut=[[margin,layout],[-this.offset,0]];var start;switch(how){case"in":start=caseIn;break;case"out":start=caseOut;break;case"toggle":start=(this.wrapper["offset"+this.layout.capitalize()]==0)?caseIn:caseOut}return this.parent(start[0],start[1])},slideIn:function(mode){return this.start("in",mode)},slideOut:function(mode){return this.start("out",mode)},hide:function(mode){this[mode||this.options.mode]();this.open=false;return this.set([-this.offset,0])},show:function(mode){this[mode||this.options.mode]();this.open=true;return this.set([0,this.offset])},toggle:function(mode){return this.start("toggle",mode)}});Element.Properties.slide={set:function(options){var slide=this.retrieve("slide");if(slide){slide.cancel()}return this.eliminate("slide").store("slide:options",$extend({link:"cancel"},options))},get:function(options){if(options||!this.retrieve("slide")){if(options||!this.retrieve("slide:options")){this.set("slide",options)}this.store("slide",new Fx.Slide(this,this.retrieve("slide:options")))}return this.retrieve("slide")}};Element.implement({slide:function(how,mode){how=how||"toggle";var slide=this.get("slide"),toggle;switch(how){case"hide":slide.hide(mode);break;case"show":slide.show(mode);break;case"toggle":var flag=this.retrieve("slide:flag",slide.open);slide[(flag)?"slideOut":"slideIn"](mode);this.store("slide:flag",!flag);toggle=true;break;default:slide.start(how,mode)}if(!toggle){this.eliminate("slide:flag")}return this}});Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(elements,options){this.elements=this.subject=$$(elements);this.parent(options)},compute:function(from,to,delta){var now={};for(var i in from){var iFrom=from[i],iTo=to[i],iNow=now[i]={};for(var p in iFrom){iNow[p]=this.parent(iFrom[p],iTo[p],delta)}}return now},set:function(now){for(var i in now){var iNow=now[i];for(var p in iNow){this.render(this.elements[i],p,iNow[p],this.options.unit)}}return this},start:function(obj){if(!this.check(arguments.callee,obj)){return this}var from={},to={};for(var i in obj){var iProps=obj[i],iFrom=from[i]={},iTo=to[i]={};for(var p in iProps){var parsed=this.prepare(this.elements[i],p,iProps[p]);iFrom[p]=parsed.from;iTo[p]=parsed.to}}return this.parent(from,to)}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,modifiers:{x:"left",y:"top"}},initialize:function(){var params=Array.link(arguments,{options:Object.type,element:$defined});this.element=$(params.element);this.document=this.element.getDocument();this.setOptions(params.options||{});var htype=$type(this.options.handle);this.handles=(htype=="array"||htype=="collection")?$$(this.options.handle):$(this.options.handle)||this.element;this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.Engine.trident)?"selectstart":"mousedown";this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:$lambda(false)};this.attach()},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this},detach:function(){this.handles.removeEvent("mousedown",this.bound.start);return this},start:function(event){if(this.options.preventDefault){event.preventDefault()}this.fireEvent("beforeStart",this.element);this.mouse.start=event.page;var limit=this.options.limit;this.limit={x:[],y:[]};for(var z in this.options.modifiers){if(!this.options.modifiers[z]){continue}if(this.options.style){this.value.now[z]=this.element.getStyle(this.options.modifiers[z]).toInt()}else{this.value.now[z]=this.element[this.options.modifiers[z]]}if(this.options.invert){this.value.now[z]*=-1}this.mouse.pos[z]=event.page[z]-this.value.now[z];if(limit&&limit[z]){for(var i=2;i--;i){if($chk(limit[z][i])){this.limit[z][i]=$lambda(limit[z][i])()}}}}if($type(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}}this.document.addEvents({mousemove:this.bound.check,mouseup:this.bound.cancel});this.document.addEvent(this.selection,this.bound.eventStop)},check:function(event){if(this.options.preventDefault){event.preventDefault()}var distance=Math.round(Math.sqrt(Math.pow(event.page.x-this.mouse.start.x,2)+Math.pow(event.page.y-this.mouse.start.y,2)));if(distance>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop});this.fireEvent("start",this.element).fireEvent("snap",this.element)}},drag:function(event){if(this.options.preventDefault){event.preventDefault()}this.mouse.now=event.page;for(var z in this.options.modifiers){if(!this.options.modifiers[z]){continue}this.value.now[z]=this.mouse.now[z]-this.mouse.pos[z];if(this.options.invert){this.value.now[z]*=-1}if(this.options.limit&&this.limit[z]){if($chk(this.limit[z][1])&&(this.value.now[z]>this.limit[z][1])){this.value.now[z]=this.limit[z][1]}else{if($chk(this.limit[z][0])&&(this.value.now[z]<this.limit[z][0])){this.value.now[z]=this.limit[z][0]}}}if(this.options.grid[z]){this.value.now[z]-=(this.value.now[z]%this.options.grid[z])}if(this.options.style){this.element.setStyle(this.options.modifiers[z],this.value.now[z]+this.options.unit)}else{this.element[this.options.modifiers[z]]=this.value.now[z]}}this.fireEvent("drag",this.element)},cancel:function(event){this.document.removeEvent("mousemove",this.bound.check);this.document.removeEvent("mouseup",this.bound.cancel);if(event){this.document.removeEvent(this.selection,this.bound.eventStop);this.fireEvent("cancel",this.element)}},stop:function(event){this.document.removeEvent(this.selection,this.bound.eventStop);this.document.removeEvent("mousemove",this.bound.drag);this.document.removeEvent("mouseup",this.bound.stop);if(event){this.fireEvent("complete",this.element)}}});Element.implement({makeResizable:function(options){return new Drag(this,$merge({modifiers:{x:"width",y:"height"}},options))}});Drag.Move=new Class({Extends:Drag,options:{droppables:[],container:false},initialize:function(element,options){this.parent(element,options);this.droppables=$$(this.options.droppables);this.container=$(this.options.container);if(this.container&&$type(this.container)!="element"){this.container=$(this.container.getDocument().body)}element=this.element;var current=element.getStyle("position");var position=(current!="static")?current:"absolute";if(element.getStyle("left")=="auto"||element.getStyle("top")=="auto"){element.position(element.getPosition(element.offsetParent))}element.setStyle("position",position);this.addEvent("start",function(){this.checkDroppables()},true)},start:function(event){if(this.container){var el=this.element,cont=this.container,ccoo=cont.getCoordinates(el.offsetParent),cps={},ems={};["top","right","bottom","left"].each(function(pad){cps[pad]=cont.getStyle("padding-"+pad).toInt();ems[pad]=el.getStyle("margin-"+pad).toInt()},this);var width=el.offsetWidth+ems.left+ems.right,height=el.offsetHeight+ems.top+ems.bottom;var x=[ccoo.left+cps.left,ccoo.right-cps.right-width];var y=[ccoo.top+cps.top,ccoo.bottom-cps.bottom-height];this.options.limit={x:x,y:y}}this.parent(event)},checkAgainst:function(el){el=el.getCoordinates();var now=this.mouse.now;return(now.x>el.left&&now.x<el.right&&now.y<el.bottom&&now.y>el.top)},checkDroppables:function(){var overed=this.droppables.filter(this.checkAgainst,this).getLast();if(this.overed!=overed){if(this.overed){this.fireEvent("leave",[this.element,this.overed])}if(overed){this.overed=overed;this.fireEvent("enter",[this.element,overed])}else{this.overed=null}}},drag:function(event){this.parent(event);if(this.droppables.length){this.checkDroppables()}},stop:function(event){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed]);this.overed=null;return this.parent(event)}});Element.implement({makeDraggable:function(options){return new Drag.Move(this,options)}});var Tips=new Class({Implements:[Events,Options],options:{onShow:function(tip){tip.setStyle("visibility","visible")},onHide:function(tip){tip.setStyle("visibility","hidden")},showDelay:100,hideDelay:100,className:null,offsets:{x:16,y:16},fixed:false},initialize:function(){var params=Array.link(arguments,{options:Object.type,elements:$defined});this.setOptions(params.options||null);this.tip=new Element("div").inject(document.body);if(this.options.className){this.tip.addClass(this.options.className)}var top=new Element("div",{"class":"tip-top"}).inject(this.tip);this.container=new Element("div",{"class":"tip"}).inject(this.tip);var bottom=new Element("div",{"class":"tip-bottom"}).inject(this.tip);this.tip.setStyles({position:"absolute",top:0,left:0,visibility:"hidden"});if(params.elements){this.attach(params.elements)}},attach:function(elements){$$(elements).each(function(element){var title=element.retrieve("tip:title",element.get("title"));var text=element.retrieve("tip:text",element.get("rel")||element.get("href"));var enter=element.retrieve("tip:enter",this.elementEnter.bindWithEvent(this,element));var leave=element.retrieve("tip:leave",this.elementLeave.bindWithEvent(this,element));element.addEvents({mouseenter:enter,mouseleave:leave});if(!this.options.fixed){var move=element.retrieve("tip:move",this.elementMove.bindWithEvent(this,element));element.addEvent("mousemove",move)}element.store("tip:native",element.get("title"));element.erase("title")},this);return this},detach:function(elements){$$(elements).each(function(element){element.removeEvent("mouseenter",element.retrieve("tip:enter")||$empty);element.removeEvent("mouseleave",element.retrieve("tip:leave")||$empty);element.removeEvent("mousemove",element.retrieve("tip:move")||$empty);element.eliminate("tip:enter").eliminate("tip:leave").eliminate("tip:move");var original=element.retrieve("tip:native");if(original){element.set("title",original)}});return this},elementEnter:function(event,element){$A(this.container.childNodes).each(Element.dispose);var title=element.retrieve("tip:title");if(title){this.titleElement=new Element("div",{"class":"tip-title"}).inject(this.container);this.fill(this.titleElement,title)}var text=element.retrieve("tip:text");if(text){this.textElement=new Element("div",{"class":"tip-text"}).inject(this.container);this.fill(this.textElement,text)}this.timer=$clear(this.timer);this.timer=this.show.delay(this.options.showDelay,this);this.position((!this.options.fixed)?event:{page:element.getPosition()})},elementLeave:function(event){$clear(this.timer);this.timer=this.hide.delay(this.options.hideDelay,this)},elementMove:function(event){this.position(event)},position:function(event){var size=window.getSize(),scroll=window.getScroll();var tip={x:this.tip.offsetWidth,y:this.tip.offsetHeight};var props={x:"left",y:"top"};for(var z in props){var pos=event.page[z]+this.options.offsets[z];if((pos+tip[z]-scroll[z])>size[z]){pos=event.page[z]-this.options.offsets[z]-tip[z]}this.tip.setStyle(props[z],pos)}},fill:function(element,contents){(typeof contents=="string")?element.set("html",contents):element.adopt(contents)},show:function(){this.fireEvent("show",this.tip)},hide:function(){this.fireEvent("hide",this.tip)}});var Slider=new Class({Implements:[Events,Options],options:{onTick:function(position){if(this.options.snap){position=this.toPosition(this.step)}this.knob.setStyle(this.property,position)},snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(element,knob,options){this.setOptions(options);this.element=$(element);this.knob=$(knob);this.previousChange=this.previousEnd=this.step=-1;this.element.addEvent("mousedown",this.clickedElement.bind(this));if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement.bindWithEvent(this))}var offset,limit={},modifiers={x:false,y:false};switch(this.options.mode){case"vertical":this.axis="y";this.property="top";offset="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";offset="offsetWidth"}this.half=this.knob[offset]/2;this.full=this.element[offset]-this.knob[offset]+(this.options.offset*2);this.min=$chk(this.options.range[0])?this.options.range[0]:0;this.max=$chk(this.options.range[1])?this.options.range[1]:this.options.steps;this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps;this.stepWidth=this.stepSize*this.full/Math.abs(this.range);this.knob.setStyle("position","relative").setStyle(this.property,-this.options.offset);modifiers[this.axis]=this.property;limit[this.axis]=[-this.options.offset,this.full-this.options.offset];this.drag=new Drag(this.knob,{snap:0,limit:limit,modifiers:modifiers,onDrag:this.draggedKnob.bind(this),onStart:this.draggedKnob.bind(this),onComplete:function(){this.draggedKnob();this.end()}.bind(this)});if(this.options.snap){this.drag.options.grid=Math.ceil(this.stepWidth);this.drag.options.limit[this.axis][1]=this.full}},set:function(step){if(!((this.range>0)^(step<this.min))){step=this.min}if(!((this.range>0)^(step>this.max))){step=this.max}this.step=Math.round(step);this.checkStep();this.end();this.fireEvent("tick",this.toPosition(this.step));return this},clickedElement:function(event){var dir=this.range<0?-1:1;var position=event.page[this.axis]-this.element.getPosition()[this.axis]-this.half;position=position.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+dir*this.toStep(position));this.checkStep();this.end();this.fireEvent("tick",position)},scrolledElement:function(event){var mode=(this.options.mode=="horizontal")?(event.wheel<0):(event.wheel>0);this.set(mode?this.step-this.stepSize:this.step+this.stepSize);event.stop()},draggedKnob:function(){var dir=this.range<0?-1:1;var position=this.drag.value.now[this.axis];position=position.limit(-this.options.offset,this.full-this.options.offset);this.step=Math.round(this.min+dir*this.toStep(position));this.checkStep()},checkStep:function(){if(this.previousChange!=this.step){this.previousChange=this.step;this.fireEvent("change",this.step)}},end:function(){if(this.previousEnd!==this.step){this.previousEnd=this.step;this.fireEvent("complete",this.step+"")}},toStep:function(position){var step=(position+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(step-=step%this.stepSize):step},toPosition:function(step){return(this.full*Math.abs(this.min-step))/(this.steps*this.stepSize)-this.options.offset}});