/*******************************************************************************

	scroller クラス var1.0.1 (20071115)

	powered  by  http://www.ishinotec.com 
	scripted by KKK


	任意のID位置まで縦スクロールを行う。

	idが存在しない
	別ページのidへのリンク、
	対応idを振ったリンクにonClickイベントがある
	以上の場合はクリックonClickハンドラを追加しない。

	aタグ内に複数のエレメント（imgなど）が含まれていてもOK

	※設定方法

	<head>
		<script src="scroller.js"></script>
	</head>
	<body>
		<a href="#ex1">ex1</a>
		<a href="#ex2">ex2</a>
		<a href="#ex3">ex3</a>
		<div id="ex1">ex1</div>
		<div id="ex2">ex2</div>
		<div id="ex3">ex3</div>
	</body>

	更新履歴
	
	20071220	Maplinkに対応

*******************************************************************************/


var scroller = {

	raito:0.1,
	sec:0.01,

	addY:0,
	tgtY:0,
	timeout:0,

	init:function() {
		var links,len,path,i,hash,targetElm;

		links = window.document.links;
		len = links.length;
		path = String(window.location);
		path = path.replace(/#.*/,"");

		for(i = 0 ; i < len; i++) {	
			hash = links[i].href.replace(path,'');
			if(hash.charAt(0) == '#' && !links[i].onclick){
				targetElm = document.getElementById(hash.replace(/#/,""));
				if(!targetElm) continue;
				links[i].targetElm = targetElm;
				links[i].onclick = scroller.click;
			}
		}
	},

	click:function(e){

		var elm,e;

		if (!e) e = window.event;
		if (e.target){
			elm = e.target;
		}else if (e.srcElement){
			elm = e.srcElement;
		}

		elm = scroller.getlinkElm(elm);
		if(!elm) return;

		clearTimeout(scroller.timeout);
		scroller.tgtY = scroller.getTgtY(elm.targetElm);

		scroller.addY = scroller.getY();
		scroller.scroll();

		return false;
	},

	getTgtY:function(elm){
		var ret = 0;
		while(elm.offsetParent){
			ret += elm.offsetTop
			elm = elm.offsetParent;
		}
		return ret;
	},


	getY:function(){
		return document.body.scrollTop  || document.documentElement.scrollTop;
	},


	setY:function(pnt){
		document.body.scrollTop = document.documentElement.scrollTop = pnt;
	},

	scroll:function(){
		var sub,p;
		sub = (scroller.tgtY - scroller.addY) * scroller.raito;
		if(0<sub){
			p = (1 < sub ) ? sub : 1;
		}else{
			p = (-1 > sub) ? sub : -1;
		}
		scroller.setY(scroller.addY += p);
		scroller.timeout = window.setTimeout("scroller.scroll()", scroller.sec * 1000);
		if(0.5 >= Math.abs(scroller.tgtY - scroller.addY)){
			clearTimeout(scroller.timeout);
			scroller.setY(scroller.tgtY);
		}
	},

	getlinkElm:function(elm){
		var tag = elm.nodeName;
		if(tag == "A" || tag == "AREA"){
			return elm;
		}else if(tag == "BODY"){
			return;
		}else{
			return scroller.getlinkElm(elm.parentNode);
		}
	},

	onload:function(){

		if(window.attachEvent){
			window.attachEvent("onload", scroller.init);
		}else if(window.addEventListener){
			window.addEventListener("load", scroller.init, true);
		}else {
			return;
		}
	}
}

scroller.onload();
