/*MooTools, My Object Oriented Javascript Tools. Copyright (c) 2006-2007 Valerio Proietti, <http://mad4milk.net>, MIT Style License.||CNET Libraries Copyright (c) 2006-2008, http://clientside.cnet.com/wiki/cnet-libraries#license

Dependencies:
	moo_dBug.js;
	moo_ShortCuts.js;
	moo_Messure.js;
*/

Fx.Reveal=new Class({Extends:Fx.Morph,options:{styles:['padding','border','margin'],transitionOpacity:true,mode:'vertical',heightOverride:null,widthOverride:null},dissolve:function(){try{if(!this.hiding&&!this.showing){if(this.element.getStyle('display')!='none'){this.hiding=true;this.showing=false;this.hidden=true;var startStyles=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});var setToAuto=this.element.style.height===""||this.element.style.height=="auto";this.element.setStyle('display','block');if(this.element.fxOpacityOk()&&this.options.transitionOpacity)startStyles.opacity=1;var zero={};$each(startStyles,function(style,name){zero[name]=[style,0]},this);var overflowBefore=this.element.getStyle('overflow');this.element.setStyle('overflow','hidden');if(!this.$chain)this.$chain=[];this.$chain.unshift(function(){if(this.hidden){this.hiding=false;$each(startStyles,function(style,name){startStyles[name]=style},this);this.element.setStyles($merge({display:'none',overflow:overflowBefore},startStyles));if(setToAuto)this.element.setStyle('height','auto')}this.fireEvent('onShow',this.element);this.callChain()}.bind(this));this.start(zero)}else{this.callChain.delay(10,this);this.fireEvent('onComplete',this.element);this.fireEvent('onHide',this.element)}}}catch(e){this.hiding=false;this.element.hide();this.callChain.delay(10,this);this.fireEvent('onComplete',this.element);this.fireEvent('onHide',this.element)}return this},reveal:function(){try{if(!this.showing&&!this.hiding){if(this.element.getStyle('display')=="none"||this.element.getStyle('visiblity')=="hidden"||this.element.getStyle('opacity')==0){this.showing=true;this.hiding=false;this.hidden=false;var before=this.element.getStyles('visibility','display','position');this.element.setStyles({visibility:'hidden',display:'block',position:'absolute'});var setToAuto=this.element.style.height===""||this.element.style.height=="auto";if(this.element.fxOpacityOk()&&this.options.transitionOpacity)this.element.setStyle('opacity',0);var startStyles=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode});this.element.setStyles(before);$each(startStyles,function(style,name){startStyles[name]=style},this);if($chk(this.options.heightOverride))startStyles['height']=this.options.heightOverride.toInt();if($chk(this.options.widthOverride))startStyles['width']=this.options.widthOverride.toInt();if(this.element.fxOpacityOk()&&this.options.transitionOpacity)startStyles.opacity=1;var zero={height:0,display:'block'};$each(startStyles,function(style,name){zero[name]=0},this);var overflowBefore=this.element.getStyle('overflow');this.element.setStyles($merge(zero,{overflow:'hidden'}));this.start(startStyles);if(!this.$chain)this.$chain=[];this.$chain.unshift(function(){if(!this.options.heightOverride&&setToAuto){if(["vertical","both"].contains(this.options.mode))this.element.setStyle('height','auto');if(["width","both"].contains(this.options.mode))this.element.setStyle('width','auto')}if(!this.hidden)this.showing=false;this.element.setStyle('overflow',overflowBefore);this.callChain();this.fireEvent('onShow',this.element)}.bind(this))}else{this.callChain();this.fireEvent('onComplete',this.element);this.fireEvent('onShow',this.element)}}}catch(e){this.element.setStyles({display:'block',visiblity:'visible',opacity:1});this.showing=false;this.callChain.delay(10,this);this.fireEvent('onComplete',this.element);this.fireEvent('onShow',this.element)}return this},toggle:function(){try{if(this.element.getStyle('display')=="none"||this.element.getStyle('visiblity')=="hidden"||this.element.getStyle('opacity')==0){this.reveal()}else{this.dissolve()}}catch(e){this.show()}return this}});Element.Properties.reveal={set:function(options){var reveal=this.retrieve('reveal');if(reveal)reveal.cancel();return this.eliminate('reveal').store('reveal:options',$extend({link:'cancel'},options))},get:function(options){if(options||!this.retrieve('reveal')){if(options||!this.retrieve('reveal:options'))this.set('reveal',options);this.store('reveal',new Fx.Reveal(this,this.retrieve('reveal:options')))}return this.retrieve('reveal')}};Element.Properties.dissolve=Element.Properties.reveal;Element.implement({reveal:function(options){this.get('reveal',options).reveal();return this},dissolve:function(options){this.get('reveal',options).dissolve();return this}});Element.implement({nix:function(){var params=Array.link(arguments,{destroy:Boolean.type,options:Object.type});this.get('reveal',params.options).dissolve().chain(function(){this[params.destroy?'destroy':'erase']()}.bind(this));return this}});