$.fn.slideScroll = function(options){
var c = $.extend({
interval: 20,
easing: 0.6,
comeLink: false
},options);
var d = document;
var timer;
var pos;
function currentPoint(){
var current = {
x: d.body.scrollLeft || d.documentElement.scrollLeft,
y: d.body.scrollTop || d.documentElement.scrollTop
}
return current;
}
function setPoint(){
var h = d.documentElement.clientHeight;
var w = d.documentElement.clientWidth;
var maxH = d.documentElement.scrollHeight;
var maxW = d.documentElement.scrollWidth;
pos.top = ((maxH-h)<pos.top && pos.top<maxH) ? maxH-h : pos.top;
pos.left = ((maxW-w)<pos.left && pos.left<maxW) ? maxW-w : pos.left;
}
function nextPoint(){
var x = currentPoint().x;
var y = currentPoint().y;
var sx = Math.ceil((x - pos.left)/(5*c.easing));
var sy = Math.ceil((y - pos.top)/(5*c.easing));
var next = {
x: x - sx,
y: y - sy,
ax: sx,
ay: sy
}
return next;
}
function scroll(){
timer = setInterval(function(){
nextPoint();
if(Math.abs(nextPoint().ax)<1 && Math.abs(nextPoint().ay)<1){
clearInterval(timer);
window.scroll(pos.left,pos.top);
}
window.scroll(nextPoint().x,nextPoint().y);
},c.interval);
}
function comeLink(){
if(location.hash){
if($(location.hash) && $(location.hash).length>0){
pos = $(location.hash).offset();
setPoint();
window.scroll(0,0);
if($.browser.msie){
setTimeout(function(){
scroll();
},50);
}else{
scroll();
}
}
}
}
if(c.comeLink) comeLink();
$(this).each(function(){
url = location.href.split("#")[0];
url = url.replace(new RegExp("(\\\\|\\?|\\|)","g"),"\\$1");
if(this.hash && $(this.hash).length>0
&& this.href.match(url)){
var hash = this.hash;
$(this).click(function(){
pos = $(hash).offset();
clearInterval(timer);
setPoint();
scroll();
return false;
});
}
});
}
