// --------------------------------------------------------------------
// Author  : mashimonator
// Create  : 2009/03/09
// Update  : 2009/03/09
// Description : 指定されたIDを持つ要素まで画面をスクロールする
// -------------------------------------------------------------------- 


var scroller = {

	//-----------------------------------------
	// 設定値
	//-----------------------------------------
	conf : {
		// スクロールのスピード(数値が増えると遅くなる)
		speed : 20,
		// スクロールの対象外とするid (複数指定可)
		offSubjects : [
						'',
						''
					   ]
	},

	//-----------------------------------------
	// ロード時に対象要素のhref属性を上書きする
	//-----------------------------------------
	add : function() {
		// 全a要素を取得
		var elements = document.body.getElementsByTagName('a');
		// 対象a要素を検索
		for (var i = 0; i < elements.length; i++) {
			var reg = RegExp(/\/+/g);
			var url = location.href;
			var res = url.match(reg);
			res = RegExp.leftContext + '/';
			var link = elements[i].href;
			// URLがファイル名を含む場合
			if ( link.match('.htm') || link.match('.php') ) {
				if ( !url.match('.htm') && !url.match('.php') ) {
					link = link.replace('index.html','');
					link = link.replace('index.htm','');
					link = link.replace('index.php','');
				} else {
					var file = '';
					if ( url.match('#') ) {
						file = url.substring(url.lastIndexOf('/',url.length)+1, url.lastIndexOf('#',url.length));
					} else {
						file = url.substring(url.lastIndexOf('/',url.length)+1, url.length);
					}
					link = link.replace(file,'');
				}
			} else {
				if ( url.match('.htm') || url.match('.php') ) {
					if ( !url.match('index.') ) {
						continue;
					}
				}
			}
			// リンク先が#から始まっていればイベントに関数追加
			link = link.replace(res,'');
			if ( link && link.match(/^#/) ) {
				// 除外チェック
				var flg = false;
				for (var x = 0; x < scroller.conf.offSubjects.length; x++) {
					if ( scroller.conf.offSubjects[x].match(link) ) {
						flg = true;
					}
				}
				// hrefの値を上書き
				if ( !flg ) {
					elements[i].setAttribute('href','javascript:scroller.main(\''+link+'\');');
				}
			}
		}
	},

	//-----------------------------------------
	// main処理
	//-----------------------------------------
	main : function(linkPos){

		// クリックされた要素のリンク先を取得
		linkPos = linkPos.replace('#','')
		if ( document.getElementById(linkPos) ) {
			var elm = document.getElementById(linkPos);
		}else{
			return;
		}
		
		// 移動位置 取得
		var end = scroller.getElementPosition(elm);
		// 現在位置 取得
		var start = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
		// 上下移動の判定
		var flag = (end < start) ? "up" : "down";
		
		// スクロール用関数
		function scrollMe(start,end,flag) {
			setTimeout(
				function(){
					
					if ( flag == 'up' && start >= end ) {
						start = start-(start-end)/scroller.conf.speed-1;
						window.scrollTo(0,start)
						arguments.callee(start,end,flag);
					} else if (flag == 'down' && start <= end ) {
						start=start+(end-start)/scroller.conf.speed+1;
						window.scrollTo(0,start)
						arguments.callee(start,end,flag);
					} else {
						scrollTo(0,end);
					}
					
				}
				,200
			);
		}
		// スクロール実行
		scrollMe(start,end,flag);
	},

	//-----------------------------------------
	// 対象要素のポジション取得
	//-----------------------------------------
	getElementPosition : function(element) {

		var x = 0;
		do {
			x += element.offsetTop  || 0;
			element = element.offsetParent;
		} while (element);
		return x;

	},

	//-----------------------------------------
	// Loadイベントに追加
	//-----------------------------------------
	addLoadEvent : function() {
		try {
			window.addEventListener('load', this.add, false);
		} catch (e) {
			window.attachEvent('onload', this.add);
		}
	}

}

scroller.addLoadEvent();

