/*
 * [jQuery.listSlider 0.3 - for jQuery plugin]
 *	author: takahashi takashi	
 *	web: http://megane.to , http://takahashitakashi.com
 * date: 2011.6.28
 *
 *	Dual licensed under the MIT (MIT-LICENSE.txt)
 *	and GPL (GPL-LICENSE.txt) licenses.
 */
 
/*
 *	[example]
 *	$("#slideContainer").meganetoSlider(options:Object);
 *	
 * <div id="slideContainer">
 *		<ul>
 *			<li></li>
 *			<li></li>
 *			<li></li>
 *		</ul>
 *	</div>
 * 
 */

 

(function($)
{
	$.fn.listSlider = function(options)
	{
		var defaults = 
		{
			vertical:		false,
			displayNum:		1,
			slideDistance:	341,
			speed:			400,
			pause:			2000,
			auto:				false,
			container:		'',
			numType:			"default",	// 'default', 'circle', 'custom'
			numContainer:	'nav.slideNum',	//class名!
			prevButtonId:	'.prevButton',	//class名!
			nextButtonId:	'.nextButton',	//class名!
			firstButtonId:	'.firstButton',	//class名!
			lastButtonId:	'.lastButton'	//class名!
		}
		
		
		var options = $.extend(defaults, options);
		
		
		
		this.each(function()
		{
			var _this = $(this);
			var _containerName = options.container + " ";
			
			var _itemLen		= $("li", _this).length;
			var _displayNum	= options.displayNum;
			var _leftNum		= (_displayNum==1)? 0 : Math.floor(_displayNum/2);
			var _rightNum		= (_displayNum==1)? 0 : (_displayNum%2)? _leftNum : _leftNum+1;
			var _currentPage	= 0
			var _maxPage		= 0;
			
			// 番号ナビが●の時は全て表示
			//if(options.numType == 'circle') _maxPage		= _itemLen;
			if(options.numType == 'circle') _maxPage = _itemLen - (options.displayNum - 1);
			else _maxPage		= _itemLen - (options.displayNum - 1);
			
			
			var w = $("li", _this).width(); 
			var h = $("li", _this).height();
			
			var prevButton = $(_containerName + options.prevButtonId)
			var nextButton = $(_containerName + options.nextButtonId)
			prevButton.addClass("selected");
			
			var firstButton	= $(_containerName + options.firstButtonId)
			var lastButton		= $(_containerName + options.lastButtonId)
			
			if(_maxPage <= 1)
			{
				prevButton.hide();
				nextButton.hide();
			}
			
			
			/* 番号のコンテナが存在する場合に生成 */
			if(options.numContainer)
			{
				var numContainer = $(_containerName + options.numContainer);
				
				$(_containerName + options.numContainer).append("<ul class='clearfix'></ul>");
				
				
/*
				for(var n=0,cnt=0; n<_maxPage; n++)
				{
					var _n = 0;
					if(options.numType == 'custom')
					{
						_n = n;
						var str = String(n+1);
						if(n==_maxPage-2) str = "図面";
						if(n==_maxPage-1) str = "アメニティ";
						$(_containerName + options.numContainer + " > ul").append("<li class='num" + _n +"'>" + str + "</li>");
					}
					else if(options.numType == 'circle')
					{
						if(n-_leftNum <= 0) _n = 0;
						else if(n >= _maxPage - _rightNum ) _n = _maxPage-_rightNum-2;	//!!!
						else
						{
							cnt++;
							 _n = cnt;
						}
						
						$(_containerName + options.numContainer + " > ul").append("<li id='id" + n + "' class='num" + _n +"'>" + "●" + "</li>");
					}
					else //'default'
					{
						_n = n;
						$(_containerName + options.numContainer + " > ul").append("<li class='num" + _n +"'>" + (_n+1) + "</li>");
					}
*/
				
				for(var n=-_leftNum,cnt=0; n<_maxPage+_rightNum; n++)
				{
					var _n = 0;
					
					// ○●●○○
					if(options.numType == 'circle')
					{
						if(n <= 0) _n = 0;
						else if(n >= _maxPage ) _n = _maxPage-1;	//!!!
						else
						{
							cnt++;
							 _n = cnt;
						}
						
						$(_containerName + options.numContainer + " > ul").append("<li id='id" + n + "' class='num" + _n +"'>" + "●" + "</li>");
						
						$(_containerName + options.numContainer + " > ul > li#id" + n).bind("click",{num:_n, id:n} , function(ev)
						{
							slideAnim(ev.data.num, true);
							updateNavigation();
						});
					}
					// 1 2 3...アメニティ 図面 
					else if(options.numType == 'custom')
					{
						_n = n;
						var str = String(n+1);
						if(n==_maxPage-2) str = "図面";
						if(n==_maxPage-1) str = "アメニティ";
						$(_containerName + options.numContainer + " > ul").append("<li class='num" + _n +"'>" + str + "</li>");
						
						$(_containerName + options.numContainer + " > ul > li.num" + _n).bind("click",{num:_n, id:n} , function(ev)
						{
							slideAnim(ev.data.num, true);
							updateNavigation();
						});
					}
					// 1 2 3...altのテキスト altのテキスト..
					// alt内のテキストを表示するが、文字列に'photo'が含まれると数字1,2..と変換
					else if(options.numType == 'alt')
					{
						_n = n;
						var str = String(n+1);
						//console.log($("li:eq("+n+") > img", _this).attr("alt"));
						
						var alt = $("li:eq(" +_n+ ") > img", _this).attr("alt");						
						re = new RegExp("photo", "i");
						if (alt.match(re)) str =  String(n+1);
						else str = alt;
						
						$(_containerName + options.numContainer + " > ul").append("<li class='num" + _n +"'>" + str + "</li>");
						
						$(_containerName + options.numContainer + " > ul > li.num" + _n).bind("click",{num:_n, id:n} , function(ev)
						{
							slideAnim(ev.data.num, true);
							updateNavigation();
						});
					}
				}
				
				// 先頭を選択された状態に
				//$(_containerName + options.numContainer + " > ul > li.num0").addClass("selected");
			}
			
			
			$("ul", _this).css('width',_itemLen * w);
			if(!options.vertical) $("li", _this).css('float','left');
			
			updateNavigation();
			
			
			/* ボタンのセットアップ */
			prevButton.click(function(){
				if($(this).css('cursor') != 'default')
				{
					slideAnim(-1,false);
					updateNavigation();
				}
			});	
			nextButton.click(function(){
				if($(this).css('cursor') != 'default')
				{
					slideAnim(1,false);
					updateNavigation();
				}
			});
			firstButton.click(function(){
				if($(this).css('cursor') != 'default')
				{
					slideAnim(0, true);
					updateNavigation();
				}
			});				
			lastButton.click(function(){
				if($(this).css('cursor') != 'default')
				{
					slideAnim(_maxPage, true);
					updateNavigation();		
				}
			});
			

			
			//dir:String, fromNaviClip:Boolean=false
			function slideAnim(dir, fromNaviClip)
			{
				if (fromNaviClip)
				{
					_currentPage = dir;
				}
				else
				{
					_currentPage += dir;
					if (_currentPage >= _maxPage-1) _currentPage = _maxPage-1;
					else if (_currentPage < 0) _currentPage = 0
				}
				
				$("ul.s",_this).animate(
					{ marginLeft: -_currentPage * options.slideDistance},
					{ queue:false, duration:options.speed, complete:null }
				);
			}
			
			function updateNavigation(id)
			{
				if (_currentPage > 0) btnUnlock(prevButton);
				else btnLock(prevButton);
				if (_currentPage < _maxPage-1) btnUnlock(nextButton);
				else btnLock(nextButton);
				
				
				if(options.numContainer)
				{
					$(options.numContainer + " > ul > li.selected").removeClass("selected");
					//alert(_currentPage);
					
					var st = _currentPage - _leftNum;
					var en = _currentPage + _rightNum;
					//alert(Array( _currentPage, st,en))
					for(var n=st; n<=en; n++)
					{
						//$(options.numContainer + " > ul > li.num"+n).addClass("selected");
						$(_containerName + options.numContainer + " > ul > li#id"+n).addClass("selected");
					}
				}
			}
			function btnUnlock(_btn)
			{
				if(_btn) _btn.removeClass("selected");
			}
			function btnLock(_btn)
			{
				if(_btn) _btn.addClass("selected");
			}
		}
	)}
})(jQuery);
