/*
 *  File:scrollbar.js (scriptaculous.js v1.8.0(effects.js, slider.js)　Prototype v1.6.0に依存します。)
 *	Date: 2009/4/21
 *	Author: hasegawa
 *	Browser Compatibility: Win: IE6and7 Firefox Opera(下に突き抜ける場合があります), Mac: Safari
 *	Varsion: 2.6
 * 
 *	このJavaScriptは、スクロールバーを生成します。
 *　
 * 	使用方法-----------------------
 *
 *	以下の記述をhtml側のheadに記述してください。
 *	scrollWの値は　js-scroll-wrapの幅 - 11 px　を指定してください。
 *
 *	Event.observe(window, 'load', function() { 
 *		// scrollW = js-scroll-wrapの幅 - 11 px
 *		var scrollW = '705px';
 *		scrollbar = new customScrollbar(scrollW);
 *	}, false);
 *
 *
 *　同ページ内でアンカーリンクの設置方法---
 *
 *
 *　<a href="#ここにアンカー名" rel="scrollanchor">リンクへ</a>
 * 
/*--------------------------------------------------------------------------*/



/* customScrollbarクラス
----------------------------------------------------------------------------*/
var customScrollbar = Class.create();


customScrollbar.prototype = {
	
	anchorFlag: '', // アンカーリンクがあるかどうか

	// コンストラクタ
	initialize: function (newswrapW, anchorFlag) {
		
		this.anchorFlag = anchorFlag || '';
	
		// スタイル変更
		$('js-scroll-wrap').style.width = newswrapW;
		$('js-scroll-wrap').style.overflow = 'hidden';
		$('js_sliderwrap').style.display = 'block';
		
		// 変数宣言
		var newsH_str = Element.getStyle('js-scroll', 'height');
		newswrapH_str = Element.getStyle('js-scroll-wrap', 'height');
		newsH_num = changeNum(newsH_str) - changeNum(newswrapH_str);
		
		var sliderH_str = Element.getStyle('js_slider', 'height');
		var knobH_str =  Element.getStyle('js_knob', 'height');
		knobH_num = changeNum(sliderH_str) - changeNum(knobH_str);
		if (changeNum(newsH_str) > changeNum(newswrapH_str)) {	// スライダーが出る場合
			this.init();
		} else { // スライダーが出ない場合
			$('js_sliderwrap').style.display = 'none'; 
		}
	},
	

	// init
	init: function () {
		
		var newspos; // ニュースの位置
		var knobpos; // ノブの位置
		var steppos = 0; // ステップ数
		var type_smooth = true; // 上下のボタンが押されたかどうか
		var effect = ''; // Effect.MoveByの格納用
		
		// 高さの再設定
		var resetHeight = function() {
			var newsH_str = Element.getStyle('js-scroll', 'height');
			newswrapH_str = Element.getStyle('js-scroll-wrap', 'height');
			newsH_num = changeNum(newsH_str) - changeNum(newswrapH_str);
		}

		
		sliderObj = new Control.Slider('js_knob', 'js_slider', {
			axis: 'vertical',
			range: $R(0, 100),
			
			onChange: function (step) {
				if (type_smooth) {

					// エフェクト実行中の場合、中断
					if (effect != '' && effect.state != 'finished') {
						effect.cancel();
						effect = '';
					}
					resetHeight();
					newspos = -1 * newsH_num / 100 * step;
					var dis = newspos - changeNum(Element.getStyle('js-scroll', 'top'));
					effect = new Effect.MoveBy('js-scroll', dis, 0);
				}
				steppos = step;
				type_smooth = true;
			},
			
			onSlide: function (step) {
				resetHeight();
				steppos = step;
				newspos = -1 * newsH_num / 100 * step;
				knobpos = knobH_num / 100 * step;
				$('js-scroll').style.top = newspos + 'px';
			}
			
		});
		
		
		Element.observe($('js_knob'), 'mousedown', function(event) {
			Event.stop(event);
			type_smooth = false;
		}, false);
		
		
		/*　上下の移動ボタン
		-------------------------------------*/
		//移動距離
		var intervalDis = (newsH_num < 200) ? 2 : 1;
		
		
		// インターバルスクロール
		var intervalScroll = function(targetstep) {
			type_smooth = false;
			sliderObj.setValue(targetstep);
			resetHeight();
			newspos = - 1 * newsH_num / 100 * targetstep;
			knobpos = knobH_num / 100 * targetstep;
			$('js-scroll').style.top = newspos + 'px';
		}
		
		
		// mouseup,outイベント
		var mouseUpTop = function(event) {
			Event.stop(event);
			Event.stopObserving($('js_slider_top'), 'mouseoup', mouseUpTop, false);
			Event.stopObserving($('js_slider_top'), 'mouseout', mouseUpTop, false);
			clearInterval(mousetimer);
		}
		
		
		// 上
		Element.observe($('js_slider_top'), 'mousedown', function(event) {
			Event.stop(event);
			if (steppos > 0) {
				mousetimer = setInterval(function(){
					if (steppos > 0) {
						var targetstep = steppos - intervalDis;
						intervalScroll(targetstep);
					} else {
						clearInterval(mousetimer);
					}
				}, 30);
				
			Element.observe($('js_slider_top'), 'mouseup', mouseUpTop, false);
			Element.observe($('js_slider_top'), 'mouseout', mouseUpTop, false);
			}
		}, false);
		
		
		// mouseup,outイベント
		var mouseUpBtm = function(event) {
			Event.stop(event);
			Event.stopObserving($('js_slider_bottom'), 'mouseoup', mouseUpBtm, false);
			Event.stopObserving($('js_slider_bottom'), 'mouseout', mouseUpBtm, false);
			clearInterval(mousetimer);
		};
		
		
		// 下
		Element.observe($('js_slider_bottom'), 'mousedown', function(event) {
			Event.stop(event);
			if (steppos < 100) {
				mousetimer = setInterval(function(){
					if (steppos < 100) {
						var targetstep = steppos + intervalDis;
						intervalScroll(targetstep);
					} else {
						clearInterval(mousetimer);
					}
				}, 30);
				
			Element.observe($('js_slider_bottom'), 'mouseup', mouseUpBtm, false);
			Element.observe($('js_slider_bottom'), 'mouseout', mouseUpBtm, false);
			}
		}, false);
		
		
		
		var anchors = document.getElementsByTagName('a');

		for (var i=0; i<anchors.length; i++){
			var anchor = anchors[i];
			
			var relAttribute = String(anchor.getAttribute('rel'));
			
			if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('scrollanchor'))){
				Element.observe(anchor, 'click', function(event) {
					Event.stop(event);
					var targetStr = String(this.getAttribute('href'));
					var targetId = targetStr.slice(targetStr.indexOf('#')+1);
					var topPos = $(targetId).offsetTop;
					resetHeight();
					var targetPos = topPos / newsH_num * 100;
					
					sliderObj.setValue(targetPos);
					return false;
				}, false);

			}
		}
		
		
		
		/* マウスホイール設定
		----------------------------------*/
		//移動距離
		var wheelDis = (newsH_num < 200) ? 6 : 3;

		var handle = function(delta) {
			if (delta < 0) {// 下方向にまわした場合の処理
				if (steppos < 100) {
					var targetstep = steppos + wheelDis;
					intervalScroll(targetstep);
				}
			} else {// 上方向にまわした場合の処理
				if (steppos > 0) {
					var targetstep = steppos - wheelDis;
					intervalScroll(targetstep);
				}
			}
		}
		
		var wheel = function(event) {
			var delta = 0;
			if (!event) /* For IE. */
					event = window.event;
			if (event.wheelDelta) { /* IE/Opera. */
					delta = event.wheelDelta/120;
					if (window.opera)
							delta = -delta;
			} else if (event.detail) { /** Mozilla case. */
					delta = -event.detail/3;
			}
			if (delta)
					handle(delta);
			if (event.preventDefault) {
					event.preventDefault();
			}
			event.returnValue = false;			
		};
		
		// マウスホイールイベント
		if (window.addEventListener) window.addEventListener('DOMMouseScroll', wheel, false);
		window.onmousewheel = document.onmousewheel = wheel;
	}
}


/* 「px」を取り除く関数
----------------------------------------*/
function changeNum(str) {
		return 	eval(str.slice(0, str.indexOf('px')));
}
