/*===============================================================

ksSlider 1.0 - jQuery plugin

Copyright (c) 2011 ACCENT INC. (http://www.accent.co.jp/)
Dual licensed under the MIT and GPL licenses.

Built for jQuery library
http://jquery.com/

===============================================================*/

/*===============================================================

*記述例（javascript）****************************
<script type="text/javascript" src="jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="ksSlider.js"></script>
<script type="text/javascript">
$(function(){
	$("#wrap_slide").ksSlider({
		pause : 3000,
		speed : 800,
		returnMove : true,		//true or false
		returnSpeed : 1000,
		random : false,			//true or false
		mode : 1				//1：横スライド、2：縦スライド、3：フェードイン
	});
});
</script>


*記述例（html）****************************
<div id="wrap_slide">
<ul>
<li><img src="image_01.jpg" width="500" height="300" alt="" /><br /></li>
<li><img src="image_02.jpg" width="500" height="300" alt="" /><br /></li>
<li><img src="image_03.jpg" width="500" height="300" alt="" /><br /></li>
</ul>
</div>


*記述例（CSS）****************************
#wrap_slide {
	width : 500px;
	height : 300px;
	overflow : hidden;
}
#wrap_slide li {
	width : 500px;
	height : 300px;
	display : none;
}

===============================================================*/


(function($) {

	$.fn.ksSlider = function(config){
		
		var defaults = {
			pause : 4000,
			speed : 1000,
			returnMove : true,
			returnSpeed : 2000,
			random : false,
			mode : 1
		}; 
		
		var options = $.extend(defaults, config);  
		
		this.each(function() {
			
			var obj = $(this);
			
			var pause = defaults.pause;
			var speed = defaults.speed;
			var returnMove = defaults.returnMove;
			var returnSpeed = defaults.returnSpeed;
			var random = defaults.random;
			var mode = defaults.mode;
			
			//ul,li,imgの設定
			$('ul', obj).css({'margin':'0px','padding':'0px','position':'relative'});
			$('li', obj).css({
				'margin':'0px','padding':'0px','list-style':'none',
				'display':'block','position': 'absolute'
			});
			$('img', obj).css({'border':'0px'});
			
			var listWidth = $('li', obj).width();
			var listHeight = $('li', obj).height();
			
			//対象の要素の幅、高さを設定
			obj.css({
				'position':'relative',
				'width':listWidth,
				'height':listHeight,
				'display':'block',
				'overflow':'hidden'
			});
			
			//スライドの移動値
			var positionNum = 0;
			//カウント数
			var countNum = 0;
			//liの要素数
			var listLength = $('li', obj).size();
			//フェード効果のターゲット番号
			var fadeNum = listLength;
			
			var listAry = [];
			
			//ランダムの場合
			if(random) {
				
				for(i=0; i<listLength; i++) {
					listAry[i] = $('li:eq('+i+')', obj).html();
				};
				
				for(i=0; i<listLength; i++) {
					var htmlA, htmlB, random;
					random = Math.floor(Math.random()*listAry.length);
					htmlA = listAry[i];
					htmlB = listAry[random];
					listAry[i] = htmlB;
					listAry[random] = htmlA;
				};
				
				for(i=0; i<listLength; i++) {
					$('li:eq('+i+')', obj).html(listAry[i]);
				};
			}
			
			//モード3（フェードイン）でランダムではない場合
			if(!random && mode == 3) {
				for(i=0; i<listLength; i++) {
					listAry[i] = $('li:eq('+i+')', obj).html();
				};
				
				listAry.reverse();
				
				for(i=0; i<listLength; i++) {
					$('li:eq('+i+')', obj).html(listAry[i]);
				};
			}
			
			//li要素をmode別に配置
			var myPosition = 0;
			var cssObj;
			var addHtml;
			if(mode == 1) {
				for(i=0; i<listLength; i++) {
					$('li:eq('+i+')', obj).css({
						'top': '0',
						'left': myPosition
					});
					myPosition += listWidth;
				};
				if(!returnMove) {	//リターンの動きがない場合
					//li要素を複製して挿入
					addHtml = $('li:first-child', obj).clone();
					$('li:last-child', obj).after(addHtml);
					$('li:last-child', obj).css({
						'top': '0',
						'left': myPosition
					});
				}
			} else if(mode == 2) {
				for(i=0; i<listLength; i++) {
					$('li:eq('+i+')', obj).css({
						'left': '0',
						'top': myPosition
					});
					myPosition += listHeight;
				};
				if(!returnMove) {	//リターンの動きがない場合
					//li要素を複製して挿入
					addHtml = $('li:first-child', obj).clone();
					$('li:last-child', obj).after(addHtml);
					$('li:last-child', obj).css({
						'left': '0',
						'top': myPosition
					});
				}
			} else if(mode == 3) {
				for(i=0; i<listLength; i++) {
					$('li:eq('+i+')', obj).css({
						'left': '0',
						'top': '0'
					});
				};
				//li要素を複製して挿入
				addHtml = $('li:last-child', obj).clone();
				$('li:first-child', obj).before(addHtml);
			}
			
			//タイマーを設定
			var slideTimer;
			slideTimer = setTimeout(runSlide, pause);
			
			function runSlide() {
				
				clearTimeout(slideTimer);
				
				countNum++;
				
				if(countNum < listLength) {
					
					if(mode == 1) {
						positionNum -= listWidth;
						$('ul', obj).animate({'left':positionNum}, speed, 'swing', animeComp);
					} else if(mode == 2) {
						positionNum -= listHeight;
						$('ul', obj).animate({'top':positionNum}, speed, 'swing', animeComp);
					} else if(mode == 3) {
						$('li:eq('+fadeNum+')', obj).fadeOut(speed, animeComp);
						fadeNum--;
					}
					
				} else {
					
					//カウンターをリセット
					countNum = 0;
					
					if(mode == 1) {
						if(returnMove) {
							//スライドのpositionをリセット
							positionNum = 0;
							$('ul', obj).animate({'left':positionNum}, returnSpeed, 'swing', animeComp);
						} else {
							positionNum -= listWidth;
							$('ul', obj).animate({'left':positionNum}, speed, 'swing', animeComp);
						}
					} else if(mode == 2) {
						if(returnMove) {
							//スライドのpositionをリセット
							positionNum = 0;
							$('ul', obj).animate({'top':positionNum}, returnSpeed, 'swing', animeComp);
						} else {
							positionNum -= listHeight;
							$('ul', obj).animate({'top':positionNum}, speed, 'swing', animeComp);
						}
					} else if(mode == 3) {
						$('li:eq('+fadeNum+')', obj).fadeOut(speed, animeComp);
					}
					
				};
			}
			
			//animate処理が終了したらタイマーを作動
			function animeComp() {
				if(mode == 3 && countNum == 0) {
					for(i=0; i<=listLength; i++) {
						$('li:eq('+i+')', obj).show();
					};
					fadeNum = listLength;
				}
				if(!(mode == 3) && countNum == 0 && !returnMove) {
					positionNum = 0;
					$('ul', obj).css({
						'left': '0',
						'top': '0'
					});
				}
				
				slideTimer = setTimeout(runSlide, pause);
			}
			
			
		});
	};
})(jQuery);

