//slide 幻灯插件
//author: lizus.com@gmail.com
//url: http://lizus.com
//插件使用:
//需要保持幻灯所在DIV的格式如下:
/*
<div class='slide_show'></div>
<ul class="slide_begin">
	<li><a href="slide show url">text</a></li>
</ul>
<span class='slidesetting direction'>down</span>
*/
//此插件目前需要结合spark-function.js,有调用其中elemResize(),runOnLoad();

jQuery.fn.extend({	
	slide:function(o){
		o=jQuery.extend({
			width:jQuery(this).width() || 500,//动画整体宽度
			height:jQuery(this).height() || 300,//动画整体高度
			direction: jQuery(this).siblings('.direction:last').html() || 'right',//动画方向: up,down,left,right,fade,rand
			speed: parseInt(jQuery(this).siblings('.speed:last').html()) || 1000,//动画速度
			pause: parseInt(jQuery(this).siblings('.pause:last').html()) || 5000,//停顿时长
			extra: jQuery(this).siblings('.extra:last').html() || 'none' //slide extra type: none, number,thumbnail,title_excerpt,multi
		}, o || {});
		var step;//unit animate length;
		var goid;//recode go interval;
		var w=o.width;
		var h=o.height;
		var div=jQuery(this);// show div
		var div_parent=div.parent();
		var items=div.children('.slide_item');
		var ul=jQuery(this).siblings('.slide_begin:last');//begin ul
		var li=jQuery('li',ul);
		var loading='<div class="loading" style="width:'+w+'px;height:'+h+'px;"></div>';
		var readerror='Read Error, Sorry';
		if(li.size()<2){//判断假如只有一个Li就退出不进行动画;
			div_parent.hide();
			return;
		}
		div_parent.append('<a href="#" title="Prev" class="slide_btn slide_prev"><span>Prev</span></a>');
		div_parent.append('<a href="#" title="Next" class="slide_btn slide_next"><span>next</span></a>');
		var slide_prev=jQuery('.slide_prev',div_parent);
		var slide_next=jQuery('.slide_next',div_parent);
		slide_prev.add(slide_next).hide();
		_init();//初始化相关内容;
		goid=setInterval(go,o.pause);
		div_parent.hover(function(event){
				clearInterval(goid);
				slide_prev.add(slide_next).show();
		},function(event){
				goid=setInterval(go,o.pause);
				slide_prev.add(slide_next).hide();
		});
		li.bind('mouseover',function(event){//额外信息点击事件;
			div_parent.trigger('mouseover');
				if (jQuery(this).is('.current')){
					return false;
				}	
				li.removeClass('ready');
				jQuery(this).addClass('ready');
				go();
			return false;
		});
		slide_prev.bind('click',function (){//上一张;
			var current=li.filter('.current:last');
			var prev=current.prev();
			if (current.size()<1){
				current=li.filter(':first');
			}
			if (li.index(current)===0){
				prev=li.filter(':last');
			}
			li.removeClass('ready');
			prev.addClass('ready');
			go();
			return false;
		})
		slide_next.bind('click',function (){//下一张;
			var current=li.filter('.current:last');
			var next=current.next();
			if (current.size()<1){
				current=li.filter(':first');
			}
			if (li.index(current)===li.index(li.filter(':last'))){
				next=li.filter(':first');
			}
			li.removeClass('ready');
			next.addClass('ready');
			go();
			return false;
		})
		
		function _init(){//动画运行前的初始化;
			items.stop(true,true);
			var current=li.filter('.current:last');
			if (current.size()<1){
				current=li.filter(':first');
			}
			var ready=li.filter('.ready:last');
			if (ready.size()<1){
				ready=current.next();
			}
			if (ready.size()<1){
				ready=li.filter(':first');
			}
			li.removeClass('current');
			li.removeClass('ready');
			current.addClass('current');
			ready.addClass('ready');
			current_content='';
			ready_content='';
			var current_target=current.children('a:first').attr('href');
			var ready_target=ready.children('a:first').attr('href');
			var current_index=li.index(current);
			var ready_index=li.index(ready);
			var current_item=items.filter(':eq('+current_index+')');
			var ready_item=items.filter(':eq('+ready_index+')');
			items.removeClass('current');
			items.removeClass('ready');
			items.removeClass('prev');
			current_item.addClass('current');
			ready_item.addClass('ready');
			if (ready_index<current_index){
				ready_item.addClass('prev');
			}
			div.css({
				'overflow':'hidden'
			});
			items.css({
				'position':'absolute',
				'display':'block',
				'left':div.width(),
				'top':div.height(),
				'overflow':'hidden',
				'zoom':1,
				'z-index':10,
				'opacity':1,
				'width':div.width(),
				'height':div.height()
			});
			current_item.css({
				'left':0,
				'top':0,
				'z-index':50
			});
			ready_item.css({
				'z-index':100
			});
			if (current_item.is(':empty')){
				jQuery.ajax({
					type: "get",
					url: current_target,
					beforeSend: function(XMLHttpRequest){
						//ShowLoading();
						current_item.html(loading);
					},
					success: function(data){
						current_item.html(data);
						clearInterval(goid);
						goid=setInterval(go,o.pause);
					},
					complete: function(XMLHttpRequest, textStatus){
						//HideLoading();
					},
					error: function(){
						//请求出错处理
						current_item.html(readerror);
					}
				});
			}
			if (ready_item.is(':empty')){
				jQuery.ajax({
					type: "get",
					url: ready_target,
					beforeSend: function(XMLHttpRequest){
						//ShowLoading();
						ready_item.html(loading);
					},
					success: function(data){
						ready_item.html(data);
					},
					complete: function(XMLHttpRequest, textStatus){
						//HideLoading();
					},
					error: function(){
						//请求出错处理
						ready_item.html(readerror);
					}
				});
			}
		}
		function _aftergo(){
			li.removeClass('current');
			li.filter('.ready').removeClass('ready').addClass('current');
		}
		function go(){
			_init();
			switch(o.direction){
				case "left":
					return _slideLeft();
					break;
				case "right":
					return _slideRight();
					break;
				case "up":
					return _slideUp();
					break;
				case "down":
					return _slideDown();
					break;
				case "fade":
					return _slideFade();
					break;
				case 'rand':
					var goarray=[_slideLeft,_slideRight,_slideUp,_slideDown,_slideFade];
					var randnum=Math.floor(Math.random()*10/2);
					return goarray[randnum]();
					break;
				defaut:
					return _slideDown();
					break;
			}
		}
		function _slideUp(){
			if (items.filter('.ready').hasClass('prev')){
				items.filter('.ready').removeClass('prev');
				_slideDown();
				return;
			}
			items.filter('.ready').css({
				left:0,
				top:h
			});
			items.filter('.current').animate({
				top:-h
			},o.speed,function (){
				jQuery(this).removeClass('current');
			});
			items.filter('.ready').animate({
				left:0,
				top:0
			},o.speed,function (){
				jQuery(this).removeClass('ready');
				jQuery(this).addClass('current');
			});
			_aftergo();
		}
		function _slideDown(){
			if (items.filter('.ready').hasClass('prev')){
				items.filter('.ready').removeClass('prev');
				_slideUp();
				return;
			}
			items.filter('.ready').css({
				left:0,
				top:-h
			});
			items.filter('.current').animate({
				top:h
			},o.speed,function (){
				jQuery(this).removeClass('current');
			});
			items.filter('.ready').animate({
				left:0,
				top:0
			},o.speed,function (){
				jQuery(this).removeClass('ready');
				jQuery(this).addClass('current');
			});
			_aftergo();
		}
		function _slideLeft(){
			if (items.filter('.ready').hasClass('prev')){
				items.filter('.ready').removeClass('prev');
				_slideRight();
				return;
			}
			items.filter('.ready').css({
				left:w,
				top:0
			});
			items.filter('.current').animate({
				left:-w
			},o.speed,function (){
				jQuery(this).removeClass('current');
			});
			items.filter('.ready').animate({
				left:0,
				top:0
			},o.speed,function (){
				jQuery(this).removeClass('ready');
				jQuery(this).addClass('current');
			});
			_aftergo();
		}
		function _slideRight(){
			if (items.filter('.ready').hasClass('prev')){
				items.filter('.ready').removeClass('prev');
				_slideLeft();
				return;
			}
			items.filter('.ready').css({
				left:-w,
				top:0
			});
			items.filter('.current').animate({
				left:w
			},o.speed,function (){
				jQuery(this).removeClass('current');
			});
			items.filter('.ready').animate({
				left:0,
				top:0
			},o.speed,function (){
				jQuery(this).removeClass('ready');
				jQuery(this).addClass('current');
			});
			_aftergo();
		}
		function _slideFade(){
			items.css({
				left:0,
				top:0,
				display:'none'
			});
			items.filter('.ready').css({
				display:'block',
				opacity:0
			});
			items.filter('.current').css({
				display:'block',
				opacity:1
			});
			items.filter('.current').animate({
				opacity:0
			},o.speed,function (){
				jQuery(this).removeClass('current');
			});
			items.filter('.ready').animate({
				opacity:1
			},o.speed,function (){
				jQuery(this).removeClass('ready');
				jQuery(this).addClass('current');
			});
			_aftergo();
		}
	}
});

//使用class='slide_show'即可自动幻灯;
runOnLoad(function(){
	jQuery('.slide_show').each(function(){
		jQuery(this).slide();
	});
});
