function sqrtSmooth(valueFrom, valueTo, delay, changeFnc) {		
	this.init(valueFrom, valueTo, delay, changeFnc)
}

sqrtSmooth.prototype.stop = function() {
	clearInterval(this.interval);
}

sqrtSmooth.prototype._do = function(valueFrom, valueTo, delay, changeFnc) {
	this.stop();
	this.init(valueFrom, valueTo, delay, changeFnc);
	
	if(this.valueTo == this.valueFrom) {
		 return;	
	}
	
	var absDiff = Math.abs(this.valueTo - this.valueFrom);
	var defaultStep = 10 + absDiff/(Math.log(absDiff)*10);
	var step = 0;
	var divRes = 1;
	var slowLimit = 0.7;	
	var obj = this;
	var valueToCur = this.valueFrom;
	
	var stepBank = [];
	
	this.interval = setInterval(
		function() {
			if(obj.raising) {			
				divRes = valueToCur/obj.valueTo;
			} else {
				divRes = obj.valueTo/valueToCur;
			}						
			
			//10 - коэф разброса
			step = (divRes >= slowLimit) ? Math.ceil(defaultStep-(10*divRes+Math.exp(divRes))) : defaultStep;
			stepBank[stepBank.length] = Math.ceil(step);
			
			valueToCur = (obj.raising) ? valueToCur + step : valueToCur - step;
			if(!obj.changeFnc(valueToCur)) {
				clearInterval(obj.interval);
				//alert(stepBank);			
				return true;
			}		
		}
	, this.delay);
}

sqrtSmooth.prototype.init = function(valueFrom, valueTo, delay, changeFnc) {
	this.valueFrom	= (isNaN(valueFrom)) ? this.valueFrom : valueFrom;
	this.valueTo	= (isNaN(valueTo)) ? this.valueTo : valueTo;
	this.delay		= (isNaN(delay)) ? this.delay : delay;
	this.changeFnc	= changeFnc || this.changeFnc;
	this.raising = (this.valueFrom <= this.valueTo);
}