(function($) {
	var namespace = 'carouselWidget01';

	$.fn[namespace] = function(){
		var PREV_BTN_ON_IMG = '/common/img/btn_prev01.gif';
		var PREV_BTN_OFF_IMG = '/common/img/btn_prev01_off.gif';
		var NEXT_BTN_ON_IMG = '/common/img/btn_next01.gif';
		var NEXT_BTN_OFF_IMG = '/common/img/btn_next01_off.gif';

		//var rootElem = $('#carouselItem01');
		var rootElem = $(this);
		var carouselInnerElem = $('#carouselItem01Inner');
		var carouselPrevElem = $('#carouselPrev01');
		var carouselNextElem = $('#carouselNext01');
		var carouselPrevImg = $('img', carouselPrevElem);
		var carouselNextImg = $('img', carouselNextElem);

		// スライドページ個数
		var PAGE_NUM = $('ul', carouselInnerElem).size();
		// スライドページ１個の幅
		var PAGE_SIZE = 294;
		// 自動切換え表示の時間(ms)
		var CAROUSEL_CHANGE_DTIME = 3500;

		var INDICATOR_OFF_IMAGE = '/common/img/ico_jump.gif';
		var INDICATOR_ON_IMAGE = '/common/img/ico_jump_on.gif';

		// ページIDの最大値
		var MAX_PAGE_ID = PAGE_NUM - 1;
		// 現在表示中のページID
		var nowPageId = 0;

		// 各画像<li>要素に付けるID属性のプレフィックス
		var ID_PREFIX = rootElem.attr('id');
		
		// インジケータ<li>要素に付けるID属性のプレフィックス
		var ID_PAGENAVI_PREFIX = 'carousel01Indicator';

		var carouselChangeTimerId;

		function init(option) {

			carouselInnerElem.css('width', PAGE_SIZE * PAGE_NUM + 'px');

			carouselPrevBtnOnOff(false);
			carouselNextBtnOnOff(MAX_PAGE_ID != 0);

			carouselPrevElem.click(onPrevClick);
			carouselNextElem.click(onNextClick);

			$('#' + ID_PAGENAVI_PREFIX + '_0 img').attr('src', INDICATOR_ON_IMAGE);

			if ($('#carouselIndicator01 ul li').size() > 1) {
				$('#carouselIndicator01 ul li').each(
					function(index) {
						var img = $(this).find('img');
						$(this)
							.attr('id', ID_PAGENAVI_PREFIX + '_' + index)
							.css('cursor', 'pointer')
							.hover(
								function() {
									if (index != nowPageId) {
										img.attr('src', INDICATOR_ON_IMAGE);
									}
								},
								function() {
									if (index != nowPageId) {
										img.attr('src', INDICATOR_OFF_IMAGE);
									}
								
								}
							)
							.click(
								function() {
									if (MAX_PAGE_ID == 0) {
										return;
									}
									clearTimeout(carouselChangeTimerId);
									var nextPageId = index;
									if (nextPageId != nowPageId) {

										carouselPrevBtnOnOff(nextPageId != 0);
										carouselNextBtnOnOff(nextPageId != MAX_PAGE_ID);

										pageChange(nextPageId);
									}
									carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
								}
							);
					}
				);
			}

			$('ul > li', carouselInnerElem).each(
				function() {
					$(this).hover(
						function() {
							clearTimeout(carouselChangeTimerId);
						},
						function() {
							carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
						}
					);
				}
			);

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}
		
		// 画像表示切替のタイマーコールバック
		function carouselChangeTimerCB() {
			clearTimeout(carouselChangeTimerId);
			
			if (MAX_PAGE_ID == 0 || nowPageId == MAX_PAGE_ID) {
				carouselPrevBtnOnOff(false);
			} else if (nowPageId == 0) {
				carouselPrevBtnOnOff(true);
			}
			if (MAX_PAGE_ID == 0 || nowPageId == MAX_PAGE_ID - 1) {
				carouselNextBtnOnOff(false);
			} else if (nowPageId == MAX_PAGE_ID) {
				carouselNextBtnOnOff(true);
			}

			pageChange(nowPageId + 1);

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}

		function onNextClick() {
			if (nowPageId >= MAX_PAGE_ID) {
				return;
			}

			clearTimeout(carouselChangeTimerId);

			if (nowPageId == 0) {
				carouselPrevBtnOnOff(true);
			}
			if (nowPageId == MAX_PAGE_ID - 1) {
				carouselNextBtnOnOff(false);
			}

			pageChange(nowPageId + 1);

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}

		function onPrevClick() {
			if (nowPageId <= 0) {
				return;
			}

			clearTimeout(carouselChangeTimerId);

			if (nowPageId == 1) {
				carouselPrevBtnOnOff(false);
			}
			if (nowPageId == MAX_PAGE_ID) {
				carouselNextBtnOnOff(true);
			}

			pageChange(nowPageId - 1);

			carouselChangeTimerId = setTimeout(carouselChangeTimerCB, CAROUSEL_CHANGE_DTIME);
		}
		
		function pageChange(nextPageId) {
			var duration = 'show';
			if (nextPageId > MAX_PAGE_ID) {
				nextPageId = 0;
				duration = 300;
			}
			dispPageNavi(nextPageId);
			carouselInnerElem
				.stop(true, true)
				.animate({marginLeft: -(nextPageId * PAGE_SIZE)}, duration, 'swing');
			nowPageId = nextPageId;
		}

		function dispPageNavi(nextPageId) {
			$('#' + ID_PAGENAVI_PREFIX + '_' + nowPageId + ' img').attr('src', INDICATOR_OFF_IMAGE);
			$('#' + ID_PAGENAVI_PREFIX + '_' + nextPageId + ' img').attr('src', INDICATOR_ON_IMAGE);
		}

		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);


