SmoothCounter = Class.create();

SmoothCounter.prototype = {
	
	/* Initialize */				
	initialize : function(p_sTarget, p_oOptions) {
		this.m_iInterval = 80;
		this.i=0;
		
		/* Init variables */
		this.m_oTarget = $(p_sTarget);
		
		this.m_iCountFrom = (p_oOptions.countFrom>=0) ?  p_oOptions.countFrom : parseFloat(this.m_oTarget.innerHTML);
		this.m_iCountTo = p_oOptions.countTo;

		this.m_iDuration = (p_oOptions.duration || 1)*1000;

		this.m_aValues = new Array();

		this.m_iPrecision = p_oOptions.precision || 0;
		
		return this;
	},
	start : function() {
		this.m_iTotalCount = this.m_iCountTo - this.m_iCountFrom;
			
		this.m_iIntervalTimes = this.m_iDuration/this.m_iInterval;
		this.m_iIntervalPart = (this.m_iTotalCount/this.m_iIntervalTimes);
		
		this.m_iIntervalTimes.times(this._addValue.bindAsEventListener(this));
		this.i=0;
		
		new PeriodicalExecuter(this._count.bindAsEventListener(this), this.m_iInterval/1000);
	},
	_count : function(p_oExec) {
		if(!this.m_aValues[this.i+1]) {
			this.m_oTarget.update(this.m_iCountTo.toFixed(this.m_iPrecision));
			p_oExec.stop();
			return;	
		}
		this.m_oTarget.update(this.m_aValues[this.i].toFixed(this.m_iPrecision));
		this.i++;
	},
	_addValue : function (i) { 
		if(i) {
			this.m_aValues.push(this.m_iCountFrom + (this.i*this.m_iIntervalPart ));
		} else {
			this.m_aValues.push(this.m_iCountFrom);
		}
		this.i++;
	}
}
