﻿(function($) {
	var namespace = 'carouselWidget02';

	$.fn[namespace] = function(){
		var PREV_BTN_ON_IMG = 'imgsBB/btn_prev01.gif';
		var PREV_BTN_OFF_IMG = 'imgsBB/btn_prev01_off.gif';
		var NEXT_BTN_ON_IMG = 'imgsBB/btn_next01.gif';
		var NEXT_BTN_OFF_IMG = 'imgsBB/btn_next01_off.gif';
		
		//var rootElem = $('#carouselItem02');
		var rootElem = $(this);
		var carouselInnerElem = $('#carouselItem02Inner');
		var carouselPrevElem = $('#carouselPrev02');
		var carouselNextElem = $('#carouselNext02');
		var carouselPrevImg = $('img', carouselPrevElem);
		var carouselNextImg = $('img', carouselNextElem);
		var statusBoxElem = $('#statusBox');

		// スライドページ個数
		var PAGE_NUM = $('ul', carouselInnerElem).size();
		// スライドページ１個の幅
		var PAGE_SIZE = 404;
		// 自動切換え表示の時間(ms)
		var CAROUSEL_CHANGE_DTIME = 5000;

		// ページIDの最大値
		var MAX_PAGE_ID = PAGE_NUM - 1;
		// 現在表示中のページID
		var nowPageId = 0;

		// 各画像<li>要素に付けるID属性のプレフィックス
		var ID_PREFIX = rootElem.attr('id');

		var carouselChangeTimerId;

		function init() {
			rootElem.css('height', '335px');

			carouselInnerElem.css('width', PAGE_SIZE * PAGE_NUM + 'px');

			carouselPrevBtnOnOff(false);
			carouselNextBtnOnOff(MAX_PAGE_ID != 0);

			carouselPrevElem.click(onPrevClick);
			carouselNextElem.click(onNextClick);

			// li要素にID属性を設定
			$('ul > li', carouselInnerElem).each(
				function(index) {
					$('div.captionContent', this)
						.css('height', 0)
						.hide();
					$(this)
						.attr('id', ID_PREFIX + '_' + index)
						.hover(
							function() {
								dispCaptionContent();
							},
							function() {
								hideCaptionContent();
							}
						);
				}
			);

			dispPageNavi();

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}
		
		// 画像表示切替のタイマーコールバック
		function carouselChangeTimerCB() {
			clearTimeout(carouselChangeTimerId);
			
			if (nowPageId == 0) {
				carouselPrevBtnOnOff(true);
			} else if (nowPageId == MAX_PAGE_ID) {
				carouselPrevBtnOnOff(false);
			}
			
			if (nowPageId == MAX_PAGE_ID) {
				carouselNextBtnOnOff(true);
			} else if (nowPageId == MAX_PAGE_ID - 1) {
				carouselNextBtnOnOff(false);
			}
			
			pageChange(nowPageId + 1);
			dispPageNavi();

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}
		
		function dispCaptionContent() {
			var captionElem = $('#' + ID_PREFIX + '_' + nowPageId).children('div.captionContent');
			if (!captionElem.is(':hidden')) {
				return;
			}
			clearTimeout(carouselChangeTimerId);
			captionElem
				.show()
				.animate({'height': 114}, 'fast', 'swing');
		}

		function hideCaptionContent() {
			var captionElem = $('#' + ID_PREFIX + '_' + nowPageId).children('div.captionContent');
			if (captionElem.is(':hidden')) {
				return;
			}
			captionElem
				.stop()
				.animate({'height': 0}, 'fast', 'swing',
						function() {
							$(this).hide();
						}
					);
			clearTimeout(carouselChangeTimerId);
			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}


		function onNextClick() {
			if (nowPageId >= MAX_PAGE_ID) {
				return;
			}

			clearTimeout(carouselChangeTimerId);

			if (nowPageId == 0) {
				carouselPrevBtnOnOff(true);
			} else if (nowPageId == MAX_PAGE_ID - 1) {
				carouselNextBtnOnOff(false);
			}

			pageChange(nowPageId + 1);
			dispPageNavi();

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}

		function onPrevClick() {
			if (nowPageId <= 0) {
				return;
			}

			clearTimeout(carouselChangeTimerId);

			if (nowPageId == 1) {
				carouselPrevBtnOnOff(false);
			} else if (nowPageId == MAX_PAGE_ID) {
				carouselNextBtnOnOff(true);
			}

			pageChange(nowPageId - 1);
			dispPageNavi();

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}

		function pageChange(nextPageId) {
			var duration = 'show';
			if (nextPageId > MAX_PAGE_ID) {
				nextPageId = 0;
				duration = 300;
			}
			carouselInnerElem.stop().animate({marginLeft: -(nextPageId * PAGE_SIZE)}, duration, 'swing');
			nowPageId = nextPageId;
		}

		function dispPageNavi() {
			statusBoxElem.text((nowPageId+ 1) + ' / ' + PAGE_NUM);
		}

		function carouselPrevBtnOnOff(isOn) {
			carouselPrevImg.attr('src', isOn ? PREV_BTN_ON_IMG : PREV_BTN_OFF_IMG);
			carouselPrevElem.css('cursor', isOn ? 'pointer' : 'default');
		}

		function carouselNextBtnOnOff(isOn) {
			carouselNextImg.attr('src', isOn ? NEXT_BTN_ON_IMG : NEXT_BTN_OFF_IMG);
			carouselNextElem.css('cursor', isOn ? 'pointer' : 'default');
		}

		init();
		return this;
	}

})(jQuery);



