/*
 *  File:coca_scrollbar3.js (scriptaculous.js v1.8.0(effects.js, slider.js)　Prototype v1.6.0に依存します。)
 *	Date: 2007/10/16
 *	Author: hasegawa
 *	Browser Compatibility: Win: IE6and7 Firefox Opera, Mac: Safari
 *	
 * 
 *	このJavaScriptは、スクロールバーを生成します。
 *　
 * 	使用方法-----------------------
 *
 *	以下の記述をhtml側のheadに記述してください。
 *	newswrapWの値は　newswrapの幅 - 19 px　を指定してください。
 *
 *	Event.observe(window, 'load', function() { 
 *		// newswrapW = newswrapの幅 - 19 px
 *		var newswrapW = '705px';
 *		cokeScrollbar = new customScrollbar(newswrapW);
 *	}, false);
 *
 *
/*--------------------------------------------------------------------------*/



/* customScrollbarクラス
----------------------------------------------------------------------------*/
var customScrollbar = Class.create();


customScrollbar.prototype = {

	// コンストラクタ
	initialize: function (newswrapW) {
	
		// スタイル変更
		$('newswrap').style.width = newswrapW;
		$('newswrap').style.overflow = 'hidden';
		$('js_sliderwrap').style.display = 'block';
		
		this.init();
	},
	

	// init
	init: function () {
		
		// 変数宣言
		var newsH_str = Element.getStyle('js_news', 'height');
		var newswrapH_str = Element.getStyle('newswrap', 'height');
		var 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);
		
		var newspos; // ニュースの位置
		var knobpos; // ノブの位置
		var steppos = 0; // ステップ数
		var type_smooth = true; // 上下のボタンが押されたかどうか
		var effect = ''; // Effect.MoveByの格納用
		
			
		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 = '';
					}
		
					newspos = -1 * newsH_num / 100 * step;
					var dis = newspos - changeNum(Element.getStyle('js_news', 'top'));
					effect = new Effect.MoveBy('js_news', dis, 0);
				}
				steppos = step;
				type_smooth = true;
			},
			
			onSlide: function (step) {
				steppos = step;
				newspos = -1 * newsH_num / 100 * step;
				knobpos = knobH_num / 100 * step;
				$('js_news').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);
			newspos = - 1 * newsH_num / 100 * targetstep;
			knobpos = knobH_num / 100 * targetstep;
			$('js_news').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);
		
	}
}


/* 「px」を取り除く関数
----------------------------------------*/
function changeNum(str) {
		return 	eval(str.slice(0, str.indexOf('px')));
}
