// плавное изменение размера
function effResize(id,newWidth,newHeight,beginFunc,endFunc,step,frequency){
	if(!step) step=20; // шаг
	if(!frequency) frequency=20; // частота
	var e=document.getElementById(id);
	var w=(parseInt(e.style.width)?parseInt(e.style.width):parseInt(e.offsetWidth));
	var h=(parseInt(e.style.height)?parseInt(e.style.height):parseInt(e.offsetHeight));
	var more=false; // нужно ли еще изменять размер
	// функция перед изменением размеров
	if(beginFunc) beginFunc();
	// новая ширина
	if((newWidth-w)>step){ w=w+step; more=true; }
	else if((newWidth-w)<-step){ w=w-step; more=true; }
	else{ w=newWidth; }
	// новая высота
	if((newHeight-h)>step){ h=h+step; more=true; }
	else if((newHeight-h)<-step){ h=h-step; more=true; }
	else{ h=newHeight; }
	// установка новых размеров
	e.style.width=w+'px';
	e.style.height=h+'px';
	// если надо еще, то ставим таймер
	if(more) setTimeout(function(){ effResize(id,newWidth,newHeight,null,endFunc); },frequency);
	// функция после изменеия размеров
	else if(endFunc) endFunc();
}

// анимированный скролл блока (вертикальный)
var t_lock=false;
function effScrollAnimate(block,offset,step){
	if(!t_lock)t_lock=true;
	else{
		effWait(block,offset,step);
		return false;
	}
	var cpos=block.scrollTop;
	var npos=cpos+offset;
	var direction=npos>cpos?'forward':'backward';
	var t=setInterval(function(){
		/*if((direction=='forward'&&block.scrollTop<npos)||(direction=='backward'&&block.scrollTop>npos)){ // анимация не завершена
			//alert(direction+';'+block.scrollTop+';'+npos);
			if(direction=='forward'){
				if(block.scrollTop+step>npos) block.scrollTop=npos;
				else block.scrollTop+=step?step:1;
			}else{
				if(block.scrollTop-step<npos) block.scrollTop=npos;
				else block.scrollTop-=step?step:1;
			}
		}else{ // анимация завершена
			clearInterval(t);
			t_lock=false;
		}*/

		// линар: немоного изменил принцип остановки скролла, в опере глючило
		// после прокрутки до самого низа происходило зацикливание, и обратная прокрутка не работала
		// видимо неправильно считался npos и block.scrollTop=npos; работал не так, как ожидалось
		if(direction=='forward'){
			if(block.scrollTop+step>npos){
				block.scrollTop=npos;
				clearInterval(t);
				t_lock=false;
			}else block.scrollTop+=step?step:1;
		}else{
			if(block.scrollTop-step<npos){
				block.scrollTop=npos;
				clearInterval(t);
				t_lock=false;
			}else block.scrollTop-=step?step:1;
		}

		return true;
	},100);
}
function effWait(block,offset,step){
	var w=setInterval(function(){
		if(!t_lock){
			clearInterval(w);
			effScrollAnimate(block,offset,step);
		}
	},100);
}
