var toggleHash = new Array(20);

Effect.MoveAndReSize = Class.create();
Object.extend(Object.extend(Effect.MoveAndReSize.prototype, Effect.Base.prototype), {
	initialize: function(element) {

		this.element = $(element);		
		if(!this.element) throw(Effect._elementDoesNotExistError);
		
		// AVAILABLE OPTIONS (all is optional) 
		//{opacity: 0.2 ,move:['all:200:300','x:500','y:400','fixed:100:100'], resize: ['all:200:300','y:400','x:500','fixed:100:100'], toggleIndex:1...x}
		var options = Object.extend({move:[], resize: []}, arguments[1] || {});
		
		var goMove =( options.move.length > 0);
		var goResize = (options.resize.length > 0);
		var goToggle = (options.toggleIndex!=null);
		var goOpacity = (options.opacity!=null);
		
		var dimension = Element.getDimensions(this.element);
		var position = Position.positionedOffset(this.element);
		
		if (goToggle) 
		{
			originalElement = toggleHash[options.toggleIndex];
			
			// Prevent mutliclic on same object
			if (originalElement!=null)		
				if (originalElement.usedNow==true) return;
					else originalElement.usedNow=true;
			
			this.goToggle(options,dimension,position);
		}
		
		options.addToSize = new Object();
		
		if (goResize)
			this.goResize(options,dimension);	
		
		if(goOpacity)
			this.goOpacity(options);
		
		if (goMove)	
			this.goMove(options,position);
		
		if (goResize || goOpacity) 
			this.start(options);
	},

  	initToggle: function(index){
		if (index!=null)
			toggleHash[index].usedNow=false;
	},
  
	goToggle: function(options,dimension,position){
		
		index = options.toggleIndex
		originalElement = toggleHash[index];

		if (originalElement==null)
		{			
			toggleHash[index] = new Array(dimension,position,this.element.getStyle('opacity'),this.element.getStyle('z-index'));
		}
		else if (!toggleHash[index].isInitPosition)
		{
			options.resize = new Array('fixed:'  + originalElement[0].width +':'+originalElement[0].height);
			options.move   = new Array('fixed:'  + originalElement[1][0] +':'+originalElement[1][1]);
			options.opacity= originalElement[2];
			
			this.element.style.zIndex = originalElement[3];
			toggleHash[index].isInitPosition = true;
		}
		else toggleHash[index].isInitPosition = false;
	},  
  
	goResize: function(options,dimension) {
		
		this.originalSize = new Object();			
	
		options.resize.each( 
				function(szd) { 
					tmp = szd.split(':');
					if ((tmp[0]=='all') || (tmp[0]=='y')){
						options.addToSize.changeY = true;
						options.addToSize.y = parseInt(((tmp[0]=='y')?tmp[1]:tmp[2]));
					}
	
					if ((tmp[0]=='all') || (tmp[0]=='x')){
						options.addToSize.changeX = true;
						options.addToSize.x = parseInt(tmp[1]);
					}
					
					if (tmp[0]=='fixed')  {
						options.addToSize.changeX = true;
						options.addToSize.changeY = true;
	
						options.addToSize.x = parseInt(tmp[1]) - dimension.width; 						
						options.addToSize.y = parseInt(tmp[2]) - dimension.height; 			
					}
				} 
		 );
		
		this.originalSize.x = dimension.width;
		this.originalSize.y = dimension.height;

	},  
  
	goMove: function(options,position) {
		var x = 0;
		var y = 0;
		var duration = 0.3;
		options.move.each( 
				function(szd) { 
					tmp = szd.split(':');
		
					if ((tmp[0]=='all') || (tmp[0]=='y')){y = parseInt(((tmp[0]=='y')?tmp[1]:tmp[2]));}				
					if ((tmp[0]=='all') || (tmp[0]=='x')){x = parseInt(tmp[1]);}
					
					if (tmp[0]=='fixed')  {
						x = parseInt(tmp[1]) - position[0]; 					
						y = parseInt(tmp[2]) - position[1]; 
					}
				} 
		 );
		 
		 new Effect.Move(this.element,{x:x,y:y, afterFinish: this.initToggle(options.toggleIndex)});
	},
	
	goOpacity: function(options){
		this.originalOpacity = parseFloat(this.element.getStyle('opacity'));
		options.changeOpacity = true;
		options.addTOpacity = parseFloat(options.opacity) - this.originalOpacity;
	},
  
	setOpacity: function(opacity) {
		this.element.style.opacity =''+opacity;
		this.element.style.filter = 'alpha(opacity='+(opacity*100)+')';
	},
  
	setup: function() {
		if(!this.element.visible()) { this.cancel(); return; }
	},
  
	update: function(position) {
	
		if(this.options.addToSize.changeX)
		  this.element.setStyle({width: this.originalSize.x+(this.options.addToSize.x*position)+'px'});
		
		if(this.options.addToSize.changeY)   
		  this.element.setStyle({height: this.originalSize.y+(this.options.addToSize.y*position)+'px'});
		
		if(this.options.changeOpacity)   
		  this.setOpacity(this.originalOpacity+(this.options.addTOpacity*position));
	
	},
	
	finish: function(){
	
		if(this.options.addToSize.changeX)
		  this.element.setStyle({width: this.originalSize.x+this.options.addToSize.x+'px'});
		  
		if(this.options.addToSize.changeY)  
		  this.element.setStyle({height: this.originalSize.y+this.options.addToSize.y+'px'});
		  
		if (this.options.toggleIndex!=null) 
			toggleHash[this.options.toggleIndex].usedNow=false;
			
		if(this.options.changeOpacity)   
		{
		  this.setOpacity(this.originalOpacity+this.options.addTOpacity);
		  // Initialize z-index if layer is hidden (opacity = 0.0)						
		
		  if((this.originalOpacity+this.options.addTOpacity)==0.0)
			this.element.style.zIndex = 1;
		}
		
	}
});