/**
 +-------------------------------------------------------------------------------------------------------------
 * [全屏焦点图]插件 jquery.kinMaxShow
 +-------------------------------------------------------------------------------------------------------------
 * @author   Mr.kin
 * @version  1.1
 * @file  	 jquery.kinMaxShow-1.1.src.js
 * @info  	 报告BUG、建议、索取最新版本 请Mail：Mr.kin@foxmail.com(注：邮件标题请包含kinMaxShow 以便于邮箱自动归档)
 * @date  	 2013-08-27
 +-------------------------------------------------------------------------------------------------------------
 */
(function($){
	$.fn.kinMaxShow = function(user_options){
			//默认设置
			var default_options = {
						//幻灯片高度 默认500
						height:500,				
						//幻灯片切换间隔时间 单位:秒
						intervalTime:3,
						//幻灯片切换时间 单位：毫秒 ,若设置为0 则无切换效果 直接跳到下一张
						switchTime:1000,
						//悬停暂停切换 鼠标停留在kinMaxShow内 是否暂停切换 默认true 悬停暂停，设置为false 悬停不暂停
						hoverPause:true,
						//擦除效果(切换) jQuery自带有 "linear" 和 "swing" ,如需要其他擦除效果请使用 jquery.easing.js  插件
						easing:'linear',
						//图片对齐方式
						imageAlign:'center center',
						//按钮
						button:{
								//按钮鼠标切换事件 可选事件 click、mouseover
								switchEvent:'click',
								//按钮上是否显示索引数字，从1开始，默认不显示
								showIndex:false,
								//按钮样式
								//正常 按钮样式  支持常规CSS样式，方法同jQuery css({key:val,……})
								normal:{width:'14px',height:'14px',lineHeight:'14px',right:'5px',bottom:'5px',fontSize:'10px',background:"none",border:"",color:"",textAlign:'center',marginLeft:'5px',fontFamily:"Verdana",float:'left',borderRadius:"10px"},
								//当前 按钮样式
								focus:{background:"none",border:"",color:""}
							},
						//切换回调 index 当前图片索引，action 动作 的切入 还是 切出 值:fadeIn或fadeOut ，函数内 this指向 当前图片容器对象 可用来操作里面元素的动作 详情见demo。
						callback:function(index,action){}
					
			};
			options = jQuery.extend(true,{},default_options,user_options);
			
			var k = {};
			
			//当前选择符
			k.selector = $(this).selector;
			
			//判断是否有多个对象 如选取了多个对象抛出错误，同一页面可以使用多个 但需要分别调用并且建议选择符用id。
			if($(this).length>1){
				$.error('kinMaxShow error[More than one selected object]');
				return false;	
			}
			
			//当前操作对象
			k.self = this;
			//当前图片索引
			k.index = 0;
			//前一个图片索引
			k.lindex = 0;
			//图片数量
			k.size = $(k.self).children('div').size();
			//CSS class命名空间前缀
			k.prename = 'KMSPrefix_' + k.selector.replace(/\W/ig,'') + '_';
			//数据存储
			k.data = {};
			//支持函数集合
			k.fn = {};
			
			//加载 解析幻灯片宽和高
			k.onload = function(){
				//设置容器尺寸 并且暂时隐藏内容部分
				$(k.self).css({width:'100%',height:options.height,overflow:'hidden',position:'relative'}).children('div').addClass(k.prename+'image_item').hide();
				//初始化
				k.init();
					
			};			
			
			//初始化
			k.init = function(){
				k.setLayout();
				k.setAnimate();
				
			};
		
			//布局
			k.setLayout = function(){
				
				//image 容器
				$(k.self).children('div').wrapAll('<div class="'+k.prename+'image_box"></div>');
				$('.'+k.prename+'image_item',k.self).each(function() {
                    var a = $(this).children('a');
					if(a.length){
						var image = a.children('img').attr('src');
						a.children('img').remove();
						a.addClass(k.prename+'coverlink');
					}else{
						var image = $(this).children('img').attr('src');
						$(this).children('img').remove();		
					}
					//
					$(this).css({background:'url('+image+') no-repeat '+options.imageAlign,'z-index':1});
					
                });
				
				$('.'+k.prename+'image_item',k.self).eq(0).css('z-index','2');
				
				//button 容器
				if(options.button.normal.display!='none'){
					var button_list = '';
					for(i=1;i<=k.size;i++){
						if(options.button.showIndex){
							button_list+='<li>'+i+'</li>';
						}else{
							button_list+='<li> </li>';	
						}
					}				
					$(k.self).append('<ul class="'+k.prename+'button">'+button_list+'</ul>');
					$('.'+k.prename+'button li',k.self).eq(0).addClass(k.prename+'focus');
				}
				
				//设置 css
				k.setCSS();	
				
				//显示内容
				$('.'+k.prename+'image_item:gt(0)',k.self).css('z-index',1).css({opacity:0});
				$('.'+k.prename+'image_item',k.self).show();
				$(k.self).css({overflow:'visible',visibility:'visible',display:'block'});
			};
			
			//CSS
			k.setCSS = function(){
				
			var cssCode = '<style type="text/css">';
				cssCode+= k.selector+' *{ margin:0;padding:0;} ';
				cssCode+= k.selector+' .'+k.prename+'image_box{width:100%;height:'+parseInt(options.height)+'px;position:relative;z-index:1;} ';
				cssCode+= k.selector+' .'+k.prename+'image_box .'+k.prename+'image_item{width:100%;height:'+parseInt(options.height)+'px;position:absolute;overflow:hidden;} ';
				cssCode+= k.selector+' .'+k.prename+'image_box .'+k.prename+'image_item a.'+k.prename+'coverlink{width:100%;height:'+parseInt(options.height)+'px;display:block;text-decoration:none;padding:0;margin:0;background:transparent;text-indent:0;outline:none;hide-focus:expression(this.hideFocus=true);} ';
				if(options.button.normal.display!='none'){
					cssCode+= k.selector+' .'+k.prename+'button{'+k.fn.objToCss(options.button.normal,['top','right','bottom','left'],true)+';position:absolute;list-style:none;z-index:2;overflow:hidden;_zoom:1;}';				
					cssCode+= k.selector+' .'+k.prename+'button li{'+k.fn.objToCss(options.button.normal,['top','right','bottom','left'])+';cursor:pointer;-webkit-text-size-adjust:none;}';				
					cssCode+= k.selector+' .'+k.prename+'button li.'+k.prename+'focus{'+k.fn.objToCss(options.button.focus,['top','right','bottom','left'])+';cursor:default;}';				
				}
				cssCode+= '</style>';
				$(k.self).prepend(cssCode);
			}
			
			//动画管理
			k.setAnimate = function(){
				
				options.callback.call($('.'+k.prename+'image_item:eq('+k.index+')',k.self),k.index,'fadeIn');
				
				var overDelayTimer;//当switchEvent是mouseover时  执行延迟计时器
				$('.'+k.prename+'button',k.self).delegate('li',options.button.switchEvent,function(){
					_this = this;
					function setChange(){
						k.index = $(_this).index();
						k.setOpacity();
					}
					if(options.button.switchEvent=='mouseover'){
						overDelayTimer = setTimeout(setChange,200);
					}else{
						setChange();
					}
				})
				//mouseover 延时
				if(options.button.switchEvent=='mouseover'){
					$('.'+k.prename+'button',k.self).delegate('li','mouseout',function(){
						clearTimeout(overDelayTimer);
					})						
				}				
				
				//设置索引
				k.index  = 1;
				k.lindex = 0;
				//自动切换定时器
				k.data.moveTimer = setInterval(k.setOpacity,options.intervalTime*1000+options.switchTime);
				
				//悬停暂停
				if(options.hoverPause){	
					$(k.self).hover(function(){
						clearInterval(k.data.moveTimer);
					},function(){
						k.data.moveTimer = setInterval(k.setOpacity,options.intervalTime*1000+options.switchTime);
					})
				}
			};
			
			//擦除(切换)
			k.setOpacity = function(){
				
				//回调 fadeOut callback
				options.callback.call($('.'+k.prename+'image_item:eq('+(k.lindex)+')',k.self),k.lindex,'fadeOut');
				//按钮切换
				if(options.button.normal.display!='none'){
					$('ul.'+k.prename+'button li',k.self).removeClass(k.prename+'focus');
					$('ul.'+k.prename+'button li',k.self).eq(k.index).addClass(k.prename+'focus');
				}
				
				//停止执行中的动画
				$('.'+k.prename+'image_item:animated',k.self).stop(true,false);
				//设置上一个显示的z-index为0
				$('.'+k.prename+'image_item',k.self).css('z-index',1);
				//设置当前显示的z-index为1
				$('.'+k.prename+'image_item',k.self).eq(k.index).css({opacity:0,'z-index':2});
	  			//alert(k.index)
				$('.'+k.prename+'image_item',k.self).eq(k.index).animate({opacity:1},options.switchTime,options.easing,function(){
						$('.'+k.prename+'image_box .'+k.prename+'image_item:not(:eq('+k.index+'))',k.self).css({opacity:0});
						//回调 fadeIn callback
						options.callback.call($('.'+k.prename+'image_item:eq('+k.index+')',k.self),k.index,'fadeIn');
						k.lindex = k.index;
						if(k.index==k.size-1){
							k.index=0;
						}else{
							k.index++;
						}
					}
				);
				
			};
			
			//运行			
			k.run = function(){
				k.onload();
			};
			
			/* obj 对象样式，带有"-"的需要转为驼峰式写法 如：font-size:12px; fontSize:12px;  excArr:不需要转换的列表排除在外的 类型 数组 ['test1','opacity'] 若excFlag为ture则只转换excArr数组中的CSS*/
			k.fn.objToCss = function(obj,excArr,excFlag){
				excFlag = excFlag?true:false;
				var isIE = navigator.userAgent.indexOf("MSIE")!=-1;
				var style = '';
				if(excFlag){
					for (var key in obj){
						if($.inArray(key,excArr)!=-1){
							pKey = key.replace(/([A-Z])/,KtoLowerCase);
							if(pKey=='opacity' && isIE){
								style +="filter:alpha(opacity="+(obj[key]*100)+");";
							}else{
								style +=pKey+":"+obj[key]+";";	
							}
						}
					};					
				}else{
					for (var key in obj){
						if($.isArray(excArr)){
							if($.inArray(key,excArr)==-1){
								pKey = key.replace(/([A-Z])/,KtoLowerCase);
								if(pKey=='opacity' && isIE){
									style +="filter:alpha(opacity="+(obj[key]*100)+");";
								}else{
									style +=pKey+":"+obj[key]+";";	
								}
							}
						}else{
							pKey = key.replace(/([A-Z])/,KtoLowerCase);
							if(pKey=='opacity' && isIE){
								style +="filter:alpha(opacity="+(obj[key]*100)+");";
							}else{
								style +=pKey+":"+obj[key]+";";	
							}					 
						}
					};	
				}
				
				function KtoLowerCase(word){
					var str='';
					str = '-'+word.toLowerCase();
					return str; 
				};
				return style;
			};
			
			/* 运行 */
			k.run();
	}	
	
})(jQuery)