/*--------------------------------------------------------------------------------------------------
	FileName: scroll.js
	Description: スクロールスクリプト
	Usage: onClick="toAnchor('_id')" onClick="toPageTop()"
	Last Update: 2006.11.11
	To Do: 存在しないID指定時処理、URLに#を含むときの処理、#のみで移動可能に
	Memo: MacIE, Safariの挙動処理修正
--------------------------------------------------------------------------------------------------*/

var U = navigator.userAgent;

//OS
var Win = U.indexOf("Win",0) != -1;
var Mac = U.indexOf("Mac",0) != -1;

//Browser
var IE = ((U.indexOf("MSIE") != -1) && (U.indexOf("Opera") == -1));
var Firefox = U.indexOf("Firefox") != -1;
var Gecko = (U.indexOf("Gecko") != -1) && (U.indexOf("like Gecko") == -1);
var Opera = U.indexOf("Opera") != -1;
var Safari = U.indexOf("Safari") != -1;

//CompactMode
var Standard = document.compatMode == "CSS1Compat";
var Quirks = document.compatMode == "BackCompat";
var pageScrollTimer;


function toAnchor(_id) {
	if (_id && (IE || Gecko || Opera || Safari)) {
		var anchorY = getPos(_id).y - 20;
//		var anchorY = getPos(getHash(_id)).y - 20; //getHash
		var maxY = getPos("end").y - getClientHeight();
		var tgtY = (anchorY < 1)?0 : (anchorY > maxY)?maxY : anchorY;

/*
	if (Standard && IE || Standard && Gecko ){
		var dbgmode = "stdIE";
	} else if (IE || Gecko || Opera){
		var dbgmode = "other";
	} else if (Safari) {
		var dbgmode = "Safari";
	}

		alert("Mode: " + dbgmode +
		"\nanchorY: " + anchorY + 
		"\nend.y: " + getPos("end").y + 
		"\ngetClientHeight: " + getClientHeight() +
		"\nmaxY: " + maxY + 
		"\ntgtY: " + tgtY
		);
*/
		pageScroll(0, tgtY);
	}
}


function pageScroll(_toX, _toY, _spd, _curX, _curY) {
	if (pageScrollTimer) clearTimeout(pageScrollTimer);
	var time = 20;
	if (!_toX || _toX < 0) _toX = 0;
	if (!_toY || _toY < 0) _toY = 0;
	if (!_spd) _spd = 3
	if (!_curX) _curX = 0 + getScrollLeft();
	if (!_curY) _curY = 0 + getScrollTop();
	_curX += (_toX - getScrollLeft()) / _spd; if (_curX < 0) _curX = 0;
	_curY += (_toY - getScrollTop()) / _spd; if (_curY < 0) _curY = 0;
	var posX = Math.floor(_curX);
	var posY = Math.floor(_curY);
	window.scrollTo(posX, posY);
	if ((Math.floor(Math.abs(_curX - _toX)) < 1) && (Math.floor(Math.abs(_curY - _toY)) < 1)) {
		clearTimeout(pageScrollTimer);
		window.scrollTo(_toX, _toY);
	} else if ( posY != _toY) {
		pageScrollTimer = setTimeout("pageScroll("+ _toX +","+ _toY +","+ _spd +","+ _curX +","+ _curY +")", time);
	} else {
		clearTimeout(pageScrollTimer);
	}
}


function toPageTop() {
	if (IE || Gecko || Opera || Safari) {
		pageScroll(0, 0, 3);
	}
}


function setObj(_id) {
	if (document.all) {
		return document.all(_id);
	} else if (document.getElementById) {
		return document.getElementById(_id);
	} 
	return false;
}


/*
function getHash(_path) {
	return _path.substring(_path.lastIndexOf( "#" ) + 1);
}
*/

function getPos(_id) {
	var obj = setObj(_id);
	var objnew = new Object();
	var objtmp;
	if(document.getElementById) {
		objtmp = obj;
		objnew.x = objtmp.offsetLeft;
		objnew.y = objtmp.offsetTop;
		while((objtmp = objtmp.offsetParent) != null) {
			objnew.x += objtmp.offsetLeft;
			objnew.y += objtmp.offsetTop;
		}
	} else if(document.all) {
		objtmp = obj;
		objnew.x = objtmp.offsetLeft;
		objnew.y = objtmp.offsetTop;
		while((objtmp = objtmp.offsetParent) != null) {
			objnew.x += objtmp.offsetLeft;
			objnew.y += objtmp.offsetTop;
		}
	} else {
		objnew.x = 0;
		objnew.y = 0;
	}
	return objnew;
}


function getScrollLeft() {
	if(Standard) {
		return document.body.parentNode.scrollLeft;
	} else if (IE) {
		return document.body.scrollLeft;
	} else if (Gecko || Opera || Safari) {
		return window.pageXOffset;
	} else {
		return 0;
	}
}


function getScrollTop() {
	if (Standard) {
		return document.body.parentNode.scrollTop;
	} else if (IE) {
		return document.body.scrollTop;
	} else if (Gecko || Opera || Safari) {
		return window.pageYOffset;
	} else {
		return 0;
	}
}


function getClientHeight(){
	if (Standard && IE || Standard && Gecko ){
		return document.documentElement.clientHeight;
	} else if (IE || Gecko || Opera){
		return document.body.clientHeight;
	} else if (Safari) {
		return window.innerHeight;
	}
}

/*EOF*/