Scroll = { 
sL:function(o){return o!=window?o.scrollLeft:document.body.scrollLeft||document.documentElement.scrollLeft}, 
sT:function(o){return o!=window?o.scrollTop:document.body.scrollTop||document.documentElement.scrollTop},   
anim:function(p){function d(p){return Math.pow(p,3)};if(p<0.5){return d(2*p)/2;}else{return (2-d(2*(1-p)))/2;}}, // рассчет анимации 
animator:[], /* массив с анимируемыми объектами */ 
anielems:0, /* счетчик анимируемых объектов */ 
to: function(obj,values,time,callback){ 
// перебираем параметры и значения  
for(key in values){anima(key,values[key])} 
function anima(param,to){ 
// проверяем и останавливаем предыдущие анимации  
for(key in Scroll.animator){if(Scroll.animator[key].o==obj&&Scroll.animator[key].p==param){clearInterval(Scroll.animator[key].timer)}} 
var aID=Scroll.anielems, 
result, 
now, 
progress, 
w=obj==window?1:0, 
param=param=='x'?1:0, 
from=param?Scroll.sL(obj):Scroll.sT(obj); 
Scroll.animator[aID] = { 
start: new Date().getTime(), 
timer: setInterval(function(){ 
now=(new Date().getTime())-Scroll.animator[aID].start; 
progress=now/time; 
result=(to-from)*Scroll.anim(progress)+from; 
if(param){ 
if(w){window.scrollTo(result,Scroll.sT(obj))} 
else{obj.scrollLeft=result} 
}else{ 
if(w){window.scrollTo(Scroll.sL(obj),result)} 
else{obj.scrollTop=result} 
} 
if(progress>=1){ 
clearInterval(Scroll.animator[aID].timer); 
if(param){ 
if(w){window.scrollTo(to,Scroll.sT(obj))} 
else{obj.scrollLeft=to} 
}else{ 
if(w){window.scrollTo(Scroll.sL(obj),to)} 
else{obj.scrollTop=to} 
} 
if(callback){callback()} 
} 
},10) 
} 
Scroll.anielems++; 
} 
} 
};
