/*
 * @author : Robin Chen robchen@126.com
 */
var Class = {
	create:function(){
		return function(){
			this.initialize.apply(this,arguments);	
		}
	}
}
var $ = function(id){
	return document.getElementById(id);	
}
var Element = {
	show:function(elm){
		elm.style.display = "";	
	},
	hide:function(elm){
		elm.style.display = "none";	
	}
}
Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}
String.prototype.toArray = function() {
    return this.split('');
}
var $A = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.callback(this);
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
}

var Animation = Class.create();
Animation.prototype = {
	initialize:function(element){
		this.element = element;
		if(arguments[1])
		this.callback = arguments[1];
	},
	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;

			new PeriodicalExecuter(function(pe){
				__this.element.style.width = parseInt(__this.element.style.width) + directionX * speedX + "px";
				speedX += accelerationX;
				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();
					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;

			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( (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();
					pe.stop();
				}
			},intervalY/1000);
		}
	}
}
