// ============================================================
// ローテーションビジュアル
// 
// %update / 2011.09.30
// 
// %use / indispensableFunc.js
// %use / jquery
// ============================================================

// jQueryの『$』を置き換える
if(! $jQ) { var $jQ = jQuery.noConflict(); }

// 名前の衝突をふせぐために名前空間を用意する
var RotVis;
if( ( RotVis && ( (typeof RotVis !== 'object') || !('isNamespace' in RotVis) ) ) || (RotVis === false) || (RotVis === 0) ) {
	throw new Error('"RotVis" already exists! You cannot define "RotVis".');
} else if( RotVis && ('isNamespace' in RotVis) ) {
	throw new Error('Namespace "RotVis" already exists!');
}
RotVis = {};  // 名前空間用のオブジェ生成
RotVis.toString = function() { return '[object RotVis(is Namespace)]'; };
RotVis.isNamespace = true;

// ------------------
// 【定数・変数】
// ------------------
RotVis.idRotVisArea = 'RotVisArea';  // エリアのid
RotVis.idRotVisMainArea = 'RotVisMainArea';  // メイン画像エリアのid
RotVis.idRotVisCtrlArea = 'RotVisCtrlArea';  // コントローラーエリアのid

RotVis.clsItemInnr = 'itemInnr01';  // 直接操作する内側class名

RotVis.clsHide = 'hide';  // 非表示class名
RotVis.clsOver = 'over';  // ロールオーバーclass名
RotVis.clsCr = 'current';  // カレントclass名
RotVis.clsClone = 'clone';  // クローンclass名
RotVis.clsOriginal = 'original';  // オリジナルclass名

RotVis.suffixCr = '_on';  // カレント画像の接尾辞（※『_』を含む）
RotVis.suffixOver = '_on';  // ロールオーバー画像の接尾辞（※『_』を含む）

RotVis.itemTotal = 0;  // アイテムの総数 ⇒外部ファイルで設定
RotVis.itemCr = 0;  // アイテム番号（カレント）
RotVis.durationSecFreeze = 0;  // 1枚の静止時間（sec） ⇒外部ファイルで設定

RotVis.timerIdNext = null;  // タイマーID（次へ用）


// ------------------
// 【関数】
// ------------------
// ■アイテムの総数の設定
// %param / itemTotal:Number / アイテムの総数
// ------
// %return / なし
RotVis.setItemTotal = function(itemTotal) {
	RotVis.itemTotal = itemTotal;
}

// ■1枚の静止時間（sec）の設定
// %param / sec:Number / 1枚の静止時間（sec）
// ------
// %return / なし
RotVis.setDurationSecFreeze = function(sec) {
	RotVis.durationSecFreeze = sec;
}

// ■次へ
// %param / itemNum:Number / アイテム番号
// ------
// %return / なし
RotVis.toNext = function(itemNum) {

	// タイマー停止
	RotVis.stopTimer();

	// カレントを表示
	RotVis.showCr(itemNum);

	// タイマー開始
	RotVis.startTimer(RotVis.itemCr);

}


// ■カレントを表示
// %param / itemNum:Number / アイテム番号
// ------
// %return / なし
RotVis.showCr = function(itemNum) {

	var itemCtrl_jq = $jQ('#' + RotVis.idRotVisCtrlArea + ' li');  // コントローラー
	var itemCtrlCr_jq = itemCtrl_jq.eq(itemNum);  // コントローラーカレント
		$jQ('#DbugOutput01').text( itemNum + '：' + itemCtrlCr_jq.size() );  // DBUG
	var itemCtrlInnrCr_jq = $jQ('.' + RotVis.clsItemInnr, itemCtrlCr_jq);  // コントローラー（内側）カレント
	var itemMain_jq = $jQ('#' + RotVis.idRotVisMainArea + ' li');  // メイン画像
	var itemMainCr_jq = itemMain_jq.eq(itemNum);  // メイン画像カレント

	var clone_jq = null;  // クローン
	var cloneImg_jq = null;

	// コントローラーをカレント
	// まずすべてのクローンをリセット
	itemCtrl_jq.each( function() {  // すべて
		$jQ(this).removeClass(RotVis.clsCr);  // カレントを削除
		$jQ( '.' + RotVis.clsClone, $jQ(this) ).remove();  // クローンを削除
		$jQ( '.' + RotVis.clsOriginal, $jQ(this) ).removeClass(RotVis.clsHide).removeClass(RotVis.clsOriginal);// オリジナルを表示
	} );  // each()

	// クローン生成
	clone_jq = itemCtrlInnrCr_jq.clone();  // クローン生成（イベントはコピーしない）
	clone_jq.addClass(RotVis.clsClone);  // クローンclass名を追加
	itemCtrlInnrCr_jq.addClass(RotVis.clsOriginal);  // オリジナルclass名を追加
	itemCtrlInnrCr_jq.addClass(RotVis.clsHide);  // オリジナルを非表示
	itemCtrlCr_jq.addClass(RotVis.clsCr);  // カレントclass名を追加
	itemCtrlInnrCr_jq.parent().append(clone_jq);  // クローンを挿入

	// クローンの画像を調整
	cloneImg_jq = $jQ('img', clone_jq);
	cloneImg_jq.removeClass(RotVis.clsOver);  // ロールオーバーclass名を削除
	cloneImg_jq.attr( { src : cloneImg_jq.attr('src').replace( new RegExp(RotVis.suffixOver + '\.'), '.') } );
	cloneImg_jq.attr( { src : cloneImg_jq.attr('src').replace(/\.(jpg|gif|png)$/, RotVis.suffixCr + '.$1') } );

	// メイン画像を表示
	itemMain_jq.each( function() {
		$jQ(this).addClass(RotVis.clsHide);
	} );  // each()
	itemMainCr_jq.removeClass(RotVis.clsHide);

	// アイテム番号を設定
	RotVis.itemCr = itemNum;

}


// ■タイマー開始
// %param / itemNum:Number / アイテム番号
// ------
// %return / なし
RotVis.startTimer = function(itemNum) {

	if( itemNum < RotVis.itemTotal -1) {  // 範囲内のとき
		itemNum++;
	} else {
		itemNum = 0;  // リセット
	}

	// 次へ用タイマー開始
	RotVis.timerIdNext = setTimeout( 'RotVis.toNext(' + itemNum + ')', RotVis.durationSecFreeze *1000 );
}


// ■タイマー停止
// %param / itemNum:Number / アイテム番号
// ------
// %return / なし
RotVis.stopTimer = function() {
	// 次へ用タイマー停止
	if(RotVis.timerIdNext !== null) {
		clearTimeout(RotVis.timerIdNext);
	}
}


// ------------------------------------------------------------
// ▼処理
// ------------------------------------------------------------
$jQ(document).ready( function() {

	// ==============================
	( function() {

		// ■window　イベント
		$jQ(window).unload( function() {
			// タイマー停止
			RotVis.stopTimer();
		} );  // unload()

		// ------------------
		// 【関数】
		// ------------------

		// ■初期化
		// %param / なし
		// ------
		// %return / なし
		function _init() {

			var itemCtrl_jq = $jQ('#' + RotVis.idRotVisCtrlArea + ' li a');  // コントローラー

			if(RotVis.itemTotal <= 0) { return; }  // コントローラーが0以下のときはタイマー開始させない

			// カレントを表示
			RotVis.showCr(0);

			if(RotVis.itemTotal <= 1) { return; }  // コントローラーが1つ以下のときはタイマー開始させない

			// タイマー停止
			RotVis.stopTimer();

			// タイマー開始
			RotVis.startTimer(0);
		}

		// ■実行
		// %param / なし
		// ------
		// %return / なし
		RotVis.exec = function() {

			var itemCtrl_jq = $jQ('#' + RotVis.idRotVisCtrlArea + ' li a');  // コントローラー
			var itemMain_jq = $jQ('#' + RotVis.idRotVisMainArea + ' li');  // メイン画像

			// 初期化
			_init();

			if(RotVis.itemTotal <= 1) { return; }  // コントローラが1つのときはイベント登録しない

			// ■コントローラー　イベント
			itemCtrl_jq.mouseover( function(e) {
				// タイマー停止
				RotVis.stopTimer();

				// カレントを表示
				RotVis.showCr( itemCtrl_jq.index(this) );

				e.stopPropagation();  // イベントバブリングを停止
			} );  // mouseover()
			itemCtrl_jq.mouseout( function(e) {
				// タイマー停止
				RotVis.stopTimer();

				// タイマー開始
				RotVis.startTimer(RotVis.itemCr);

				e.stopPropagation();  // イベントバブリングを停止
			} );  // mouseout()

			// ■メイン画像　イベント
			itemMain_jq.mouseover( function(e) {
				// タイマー停止
				RotVis.stopTimer();

				e.stopPropagation();  // イベントバブリングを停止
			} );  // mouseover()
			itemMain_jq.mouseout( function(e) {
				// タイマー停止
				RotVis.stopTimer();

				// タイマー開始
				RotVis.startTimer(RotVis.itemCr);

				e.stopPropagation();  // イベントバブリングを停止
			} );  // mouseout()

		};

	} )();
	// /==============================

} );  // ready()

