/*
 * @author : Robin Chen robchen@126.com
 */
var Animation = Class.create();
Animation.prototype = {
	initialize:function(element){
		this.element = element;
		if(arguments[1])
		this.callback = arguments[1];
	},
	opacity:100,
	fadeIn:function(){
		var __this = this;
		this.element.style.display = "";
		new PeriodicalExecuter(function(pe){
			__this.opacity += 10;
			if(__this.opacity <= 100){
				$(__this.element).setStyle({
					"filter":"alpha(opacity=" + __this.opacity + ")",
					"-moz-opacity":__this.opacity/100,
					"opacity":__this.opacity/100
				});
			}else{
				pe.stop();
				__this.opacity = 100;
				if(__this.callback && __this.callback.onFadeIn)__this.callback.onFadeIn.apply(__this,[]);
			}
		},1/1000);
	},
	fadeOut:function(){
		var __this = this;
		new PeriodicalExecuter(function(pe){
			__this.opacity -= 10;
			if(__this.opacity >= 0){
				$(__this.element).setStyle({
					"filter":"alpha(opacity=" + __this.opacity + ")",
					"-moz-opacity":__this.opacity/100,
					"opacity":__this.opacity/100
				});
			}else{
				pe.stop();
				__this.opacity = 0;
				__this.element.style.display = "none";
				if(__this.callback && __this.callback.onFadeOut)__this.callback.onFadeOut.apply(__this,[]);
			}
		},1/1000);
	},
	/*
	 * zoom parameter example:
	 * params = {
		 speed:10,  //px,default
		 interval:1, //millisecond,default
		 acceleration:1, //px,default
		 x:{
		 	speed:10,
			interval:1,
			acceleration:1,
			target:..,
			callback:{
				beforeZoom:functino(){...},
				zooming:function(){...},
				afterZoom:function(){...}
			}
		 },
		 y:{
			 ....
		 }
	 * }
	 */
	zoom:function(params){
		var speed = params.speed || 1;
		var interval = params.interval || 1;
		var acceleration = params.acceleration || 1;
		if(params.x){
			var speedX = params.x.speed || speed;
			var intervalX = params.x.interval || interval;
			var accelerationX = params.x.acceleration || acceleration;
			var targetX = params.x.target > 0 ? params.x.target : 0;
			var directionX = targetX > this.element.offsetWidth ? 1 : -1;
			var __this = this;
			if(params.x.callback && params.x.callback.beforeZoom)params.x.callback.beforeZoom();
			new PeriodicalExecuter(function(pe){
				__this.element.style.width = parseInt(__this.element.style.width) + directionX * speedX + "px";
				speedX += accelerationX;
				if(params.x.callback && params.x.callback.zooming)params.x.callback.zooming();
				if( (directionX == 1 && __this.element.offsetWidth >= targetX) || (directionX == -1 && __this.element.offsetWidth <= targetX)){
					__this.element.style.width = targetX + "px";
					if(params.x.callback && params.x.callback.afterZoom)params.x.callback.afterZoom();
					pe.stop();
				}
			},intervalX/1000);
		}
		if(params.y){
			var speedY = params.y.speed || speed;
			var intervalY = params.y.interval || interval;
			var accelerationY = params.y.acceleration || acceleration;
			var targetY = params.y.target > 0 ? params.y.target : 0;
			var directionY = targetY > this.element.offsetHeight ? 1 : -1;
			var __this = this;
			if(params.y.callback && params.y.callback.beforeZoom)params.y.callback.beforeZoom();
			new PeriodicalExecuter(function(pe){
				var temp = parseInt(__this.element.style.height) + directionY * speedY;
				__this.element.style.height = temp > 0 ? temp + "px" : "0px";
				speedY += accelerationY;
				if(params.y.callback && params.y.callback.zooming)params.y.callback.zooming();
				if( (directionY == 1 && __this.element.offsetHeight >= targetY) || (directionY == -1 && __this.element.offsetHeight <= targetY)){
					__this.element.style.height = targetY + "px";
					if(params.y.callback && params.y.callback.afterZoom)params.y.callback.afterZoom();
					pe.stop();
				}
			},intervalY/1000);
		}
	}
}
