SMScroll = function() {
    this.SCROLL = null; //現在のスクロールバー座標
    this.stepRatio = 0.1; //毎回のスクロール量(0〜1)
    this.preDeltaY = -1; //一つ前のステータス変数
    this.timerStop = true; //タイマーを停止
    this.timerID = null;  //タイマーID
    this.interval = 30; //再描画時間[msec]
}

SMScroll.prototype.CanUseScriptBrowser = function()
{
    var appname = navigator.appName;
    var ua = navigator.userAgent;
    if(appname == "Microsoft Internet Explorer" && ua.indexOf("Opera")<0){
        var appver = navigator.appVersion;
        var p = appver.indexOf("MSIE",0);
        if(p >= 0){
            var p2 = appver.indexOf(";",p);
            if(p2 >= 0){
                var iever = appver.substring(p + 5, p2);
                // IEのバージョンが抽出できた。
                if(iever >= 5.0){    // IE5以降
                    return true;
                }
            }
        }
    } else if(ua.indexOf("Gecko/") >= 0){
        var p = ua.indexOf("Gecko/");
        var p2 = ua.indexOf(" ", p);
        if(p2 >= 0){
            var ver = ua.substring(p + 6, p2);
            if(ver >= 20001108){// Netscape6.0以降(メジャーバージョン)
                return true;
            }
        }
    } else if (ua.indexOf("Opera/")>=0) {
	// MacのOperaを禁止
	if (ua.indexOf("Macintosh")>=0)
	    return false;
        var p = ua.indexOf("Opera/");
        var p2 = ua.indexOf(" ",p);
        if (p2 >= 0) {
            var ver = ua.substring(p + 6, p2);
            if (ver >= 5) { // Opera 5以降（メジャーバージョン）
                return true;
            }
        }
    } else if (ua.indexOf("Opera")>=0) {
	// MacのOperaを禁止
	if (ua.indexOf("Macintosh") >=0)
	    return false;	
        var p = ua.indexOf("Opera");
        var p2 = ua.indexOf(" ",p+6);
        if (p2 >= 0) {
            var ver = ua.substring(p + 6, p2);
            if (ver >= 5) { // Opera 5.0以降（メジャーバージョン）
                return true;
            }
        }
    } else if (navigator.appName=="Netscape") { //Netscape, safariなど
       var version = navigator.appVersion;
       if (version.match(/^([0-9\.]+).+/i)){
          if (RegExp.$1>=4.03) 
            return true;
       }
    }
    return false;
}


//現在のスクロールバーの座標
SMScroll.prototype.getCurrentPos = function() {
    var x,y;
    if (document.all) { //IE4, IE5, IE6
	if (document.compatMode && document.compatMode.match(/CSS/i)) {
		x = document.documentElement.scrollLeft;
		y = document.documentElement.scrollTop;
	    } else {
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	    }
    } else if (document.layers != void 0 || (navigator.userAgent.indexOf("Opera") != -1 || window.opera != void 0)) { // NN4, Opera6
	x = window.pageXOffset;
	y = window.pageYOffset;
    } else if (navigator.userAgent.indexOf("Gecko") != -1) { // NS6, Mozilla
	x = window.scrollX;
	y = window.scrollY;
    } else {
	x = y = 0;
    }
    return {x: x, y:y};
}

//ウィンドウサイズを取得
SMScroll.prototype.getWindowSize = function() {
    if (window.innerWidth && window.innerHeight){
	winSizeWidth = window.innerWidth;
	winSizeHeight = window.innerHeight;
    } else if (document.documentElement && (document.compatMode=="CSS1Compat")) {
	winSizeWidth = document.documentElement.offsetWidth;
	winSizeHeight = document.documentElement.offsetHeight;
    } else if (document.body) {
	winSizeWidth = document.body.clientWidth;
	winSizeHeight = document.body.clientHeight;
    }
    return {width:winSizeWidth, height:winSizeHeight};
}

//コンテンツの幅を取得する
SMScroll.prototype.getContentsSize = function() {
    if (document.getElementById) {
	bodyWidth = document.getElementById('container').offsetWidth;
	bodyHeight = document.getElementById('container').offsetHeight;
    } else {
	bodyWidth = 0;
	bodyHeight = 0;
    }
    return {width: bodyWidth, height: bodyHeight};
}

//要素の座標を取得する
SMScroll.prototype.getElementPosition = function(eleID) {
    var obj = document.getElementById(eleID);
    var py = obj.offsetTop;
    while(obj.offsetParent) {
	obj = obj.offsetParent;
	py += obj.offsetTop;
    }
    return py;
}

// 現在のスクロール位置から、指定座標までスクロールします
SMScroll.prototype.scroller = function(targetY, count) {
    if (count == void 0) {
	count = 0;
	this.timerStop = false;
    }
    var y = 0;
    if (typeof(targetY) == 'number') y = targetY;
    if (typeof(targetY) == 'string') {
	y = this.getElementPosition(targetY);
    }

    // 停止フラグ（クリック）真であれば停止
    if (this.timerStop==true) {
	if (this.timerID) clearTimeout(this.timerID);
	this.timerID = null;
	return;
    }

    count++;
    this.SCROLL = this.getCurrentPos();
    var windowSize = this.getWindowSize();
    var contentsSize = this.getContentsSize();

    var deltaY = ((y+windowSize.height)>contentsSize.height)? contentsSize.height - (this.SCROLL.y + windowSize.height): (y - this.SCROLL.y);

    if (Math.abs(this.preDeltaY - deltaY)>1) {
	this.preDeltaY = deltaY;
	if (Math.abs(deltaY)>2) {
	    deltaY = Math.ceil(deltaY * this.stepRatio);
	} else {
	    deltaY = deltaY / Math.abs(deltaY);
	}
	var ny = this.SCROLL.y + deltaY;

	window.scrollTo(0, ny);
	this.timerID = setTimeout("smscroller.scroller("+y+","+count+");", this.interval);
    } else {
	this.timerStop = true;
	//	window.scrollTo(0,y);
    }
}

SMScroll.prototype.init = function() {

    _smsmdown = function(evt) {
	if (!evt) {
	    evt = window.event;
	}
	smscroller.timerStop = true;
    }

    if (document.addEventListener) { // DOM Level 2
	document.addEventListener("mousedown", _smsmdown, true);
	window.addEventListener('DOMMouseScroll', _smsmdown, false);
    } else if (document.attachEvent) { // IE5+
	document.body.attachEvent("onmousedown", _smsmdown);
    } else { //IE 4 Event Model
	document.onmousedown = _smsmdown;
    }
    window.onmousewheel = document.onmousewheel = _smsmdown;

}

SMScroll.prototype.setSMScrollEvt = function() {
    if (this.CanUseScriptBrowser()) {
	var oThis = this;
	for (var i = 0; i < document.links.length; i++) {
	    if (document.links[i] && document.links[i].hash) {
		document.links[i].onclick = function () {
		    if (this.hash && this.hash.match(/#/)) {
			if (this.hash) {
			    var id_name = this.hash.substring(1);
			    pos = oThis.getElementPosition(id_name);
			    oThis.scroller(pos);
			    return false;
			}
		    };
		}
	    }
	}
    }
}

var smscroller = new SMScroll();

