/*
  Required:
    — jQuery
    — jQuery Easing plugin
    — John Resig Simple JavaScript Inheritance (object: "_Class")
*/

(function( $ ){
  
  this.classAnimate = _Class.extend({
    init: function( step, duration, easing, callback ){
    	this.opt = {
    		step: step,
    		complete: callback ? callback : function(){}
    	};
    	if( $.isFunction(easing) ){
    	  this.opt.complete = easing;
    	}

    	this.now = 0;
    	this.duration = duration;

    	this.easing = !$.isFunction(easing) ? easing : "swing";

    	this._init();
    },

  	_init: function(){
  		var self = this;
  		this.startTime = ( new Date() ).getTime();
  		this.timerId = setInterval(function(){
  			self.next();
  		}, 13);
  	},

  	next: function(){
  		this.prev = this.now;
  		var t = ( new Date() ).getTime();
  		this.step = t - this.startTime;

  		if( this.step > this.duration ){
  			this.step = this.duration;
  			this.exec();
  			clearInterval(this.timerId);
  			this.opt.complete.apply(this);

  			return;
  		}
		
  		this.exec();
  	},

  	exec: function(){
  		this.state = this.step / this.duration;
  		this.now = $.easing[this.easing](this.state, this.step, 0, 1, this.duration);
  		this.opt.step.apply(this, [this.now, this.prev]);
  	},

  	stop: function(){
  		clearInterval(this.timerId);
  	}
    
  })

})( jQuery );

