(function($) {
	var namespace = 'ticker';

	$.fn[namespace] = function(option){

		var tickerDataAry = [];
		var nowPosition = 0;
		var nowTickerId = 0;
		var isOpenMore = false;
		var isOpenEvent = false;
		var isDispTicker = true;
		var tickerTimerId = '';
		var isWaitRedrawMinTimePassed = false;	// データ更新するまでの最短時間が過ぎたかを管理するフラグ
		
		var MORE_BTN_CLOSED_IMAGE = '/common/img/blt_05d.gif';
		var MORE_BTN_OPEND_IMAGE = '/common/img/blt_05u.gif';
		var MORE_BTN_NORMAL_IMAGE = '';
		
		var setting = jQuery.extend({
					tickerBlockElemId: 'tickerBlock',
					tickerSpeed: 80,
					loopDTime: 1000,
					watiRedrawMinTime: 60000,
					searchBreakinNewsAPI: '/wi/wi_breaking_news_aj.php',
					dispTypeChangeBtnElemId: 'moreBtn',
					searchBreakinNewsTimeout: 10000
				},option);

		var isOldBrowser = (jQuery.browser['msie'] && jQuery.browser['version'] <= 6);
		// API連携用
		var bids = ''; // 前回取得のBreaking NewsのIDを連結したもの
		
		var tickerBlockElem = $('#' + setting.tickerBlockElemId);
		isDispTicker = !tickerBlockElem.is(':hidden');
		var tickerAreaElem = $(this);
		var tickerAreaHeight = tickerAreaElem.css('height');
		var tickerTextElem = null;
		var baseTextHeight = 0;
		initTickerTextElem();
		var dispTypeChangeBtnElem = $('#' + setting.dispTypeChangeBtnElemId);
		
		if (isOldBrowser) {
			$('.tickerBlockInner', tickerBlockElem).css({padding:'2px 2px 0px 2px'});
		}

		function init() {
			MORE_BTN_NORMAL_IMAGE = dispTypeChangeBtnElem.attr('src');
			//tickerBlockElem.hide();
			// 非同期により、初回ティッカーデータを取得
			searchBreakingNews(false);
			// データ更新タイミングのカウントスタート
			setTimeout(setWaitRedrawMinTimePassedFlag, setting.watiRedrawMinTime);
		}

		function dispTypeChangeClick() {
			if (!isOpenMore) {
				openMorePanel();
			} else {
				closeMorePanel();
			}
		}

		function openMorePanel() {
			isOpenMore = true;
			clearTimeout(tickerTimerId);
			nowPosition = 0;
			
			dispTypeChangeBtnElem.attr('src', MORE_BTN_OPEND_IMAGE);
			
			var tickerListElem = $('<ul/>');
			tickerListElem.css('height', isOldBrowser ? '100%' : 'auto');
			for (var i=0; i < tickerDataAry.length; i++) {
				tickerListElem.append($('<li/>').text(tickerDataAry[i]));
			}
			tickerAreaElem
				.empty()
				.append(tickerListElem)
				.animate({height: tickerListElem.height()}, 'fast', 'swing');
		}

		function initTickerTextElem() {
			tickerTextElem = $('<div/>');
			tickerAreaElem.empty().append(tickerTextElem);
		}

		function closeMorePanel() {
			isOpenMore = false;

			dispTypeChangeBtnElem.attr('src', MORE_BTN_CLOSED_IMAGE);
			tickerAreaElem.animate({height: tickerAreaHeight}, 'fast', 'swing',
				function() {
					initTickerTextElem();
					tickerTimerId = setTimeout(dispTicker, setting.tickerSpeed);
				}
			);
		}

		function setWaitRedrawMinTimePassedFlag() {
			isWaitRedrawMinTimePassed = true;
		}
		
		function searchBreakingNews(asyncFlag) {
			var type = 'POST';
			var url  = setting.searchBreakinNewsAPI;

			// send request
			$.ajax({
				async: asyncFlag,
				type: type,
				url: url,
				data: bids,
				timeout: setting.searchBreakinNewsTimeout,
				success: function(buf){
					var preloadDatas = eval('(' + buf + ')');
					setTickerDataFromJson(preloadDatas);
				},
				error: function(buf, status){
//					alert( 'error: ' + buf + ',' + status);
					dispTicker();
				}
			});
		}

		function dispTicker() {
			clearTimeout(tickerTimerId);

			if (tickerDataAry.length == 0) {
				if (isWaitRedrawMinTimePassed) {
					getNewTickerData();
				} else {
					tickerTimerId = setTimeout(dispTicker, setting.loopDTime);
				}
			} else {
				if (nowPosition <= tickerDataAry[nowTickerId].length) {
					var tickerText = tickerDataAry[nowTickerId].substring(0, nowPosition);
					tickerTextElem.text(tickerText);
					if (nowPosition == 1) {
						baseTextHeight = tickerTextElem.height();
					}
					if (nowPosition > 1 && tickerTextElem.height() > baseTextHeight) {
						tickerTextElem.text(tickerText.substring(0, nowPosition - 1));
						tickerTimerId = setTimeout(newTickerStart, setting.loopDTime - setting.tickerSpeed);
						return;
					}
					nowPosition++;
					tickerTimerId = setTimeout(dispTicker, setting.tickerSpeed);
				} else {
					tickerTimerId = setTimeout(newTickerStart, setting.loopDTime);
				}
			}
		}
		
		function newTickerStart() {
			clearTimeout(tickerTimerId);
			nowPosition = 0;
			nowTickerId++;
			if (nowTickerId >= tickerDataAry.length) {
				nowTickerId = 0;
				if (isWaitRedrawMinTimePassed) {
					getNewTickerData();
					return;
				}
			}
			tickerTimerId = setTimeout(dispTicker, setting.tickerSpeed);
		}
		
		function getNewTickerData() {

			// 同期により、ティッカーデータを取得
			searchBreakingNews(true);

			isWaitRedrawMinTimePassed = false;
			// データ更新タイミングのカウントスタート
			setTimeout(setWaitRedrawMinTimePassedFlag, setting.watiRedrawMinTime);
		}
		
		function setTickerDataFromJson(jsonDatas) {
			if (checkExistNewTickerData(jsonDatas)) {
				nowTickerId = 0;
				nowPosition = 0;
				tickerDataAry = [];

				bids = jsonDatas.bids;

				var cnt  = jsonDatas.count;
				for (var i=0; i<cnt; i++) {
					tickerDataAry[i] = jsonDatas[i];
				}
			}
			if (tickerDataAry.length) {
				if (!isDispTicker) {
					tickerBlockElem.slideDown(600);
					isDispTicker = true;
				}
				var isMultiNews = tickerDataAry.length > 1;
				if (isOpenEvent != isMultiNews) {
					if (isOpenEvent) {
						dispTypeChangeBtnElem
							.attr('src', MORE_BTN_NORMAL_IMAGE)
							.css('cursor', 'default')
							.unbind('click');
					} else {
						dispTypeChangeBtnElem
							.attr('src', MORE_BTN_CLOSED_IMAGE)
							.css('cursor', 'pointer')
							.click(dispTypeChangeClick);
					}
				}
				isOpenEvent = isMultiNews;
			} else {
				if (isDispTicker) {
					tickerBlockElem.slideUp(600);
					isDispTicker = false;
				}
			}
			dispTicker();
		}

		function checkExistNewTickerData(checkData) {
			return bids != checkData.bids;
//			if (checkData['status'] != 1) {
//				return false;
//			}
//			return true;
		}

		init();
		return this;
	}

})(jQuery);


