/**
* ckImgViewStack for jQuery v1.3+
* 
* @author 	Stone [stone58@163.com] [QQ：31474361]
* @version  v1.10 beta
* @baseon	jquery.js  download from: http://www.jquery.com
* 简要说明
* 参数：   
*   handle:                 框架容器，jQuery对象或jQuery选择器
*   ckImages: [],           要显示的图片对象数组, 基本属性 url, href, title
*   width: int              容器宽，需要图片和容器大小一致才能保证特殊播放效果
*   height: int             容器高
*   autoPlay: true,         自动播放
*   effect: 'def',          播放效果, 可取 def,fadeIn,hShutter,random  默认(无效果),渐显，水平百叶，随机
*   effectFilter: 'all',    效果筛选， all 或 效果队列'fadeIn,hShutter'
*   effectOptions: {}       特殊效果的播放参数， 如hShutter的 页宽 width:20
*   playInterval: 5000,     播放间隔， ms
*   playSpeedRate: .323,    播放速率 0-1
*   playStartIndex: 0,      第一次播放的索引
*   playMode: 'normal',     播放模式 normal:正常, backward:倒序， shuff:随机顺序
*   hoverStop: true,        鼠标经过停止播放
*   linkTarget: 'blank',    链接target  blank,self,top
*   naviLabel: function,    导航标签定义，如 function(i){ return ['一','二','三','四'][i]; }
*   naviAddClass: '',       导航添加类
*   
* 事件:
*   onReady: function(ckimgs, i, length){},     初始化时调用
*   onPlayStart: function(ckimg, i, length){},  开播播放时调用
*   onPlayEnd: function(ckimg, i, length){},    播放结束时调用
*
* 方法：
*   play(index)     播放index图片
*   stop()          停止播放
*   continute()     继续播放
*/
(function($){var ck=window.CkImgViewStack=function(){return this.initialize.apply(this,arguments)};function initialize(options){var ckInterval=0;var opt=$.extend({},ck.defaults,options);this.effect=ck.effects[opt.effect]||ck.effects['def'];opt.effectOptions=$.extend({},this.effect.defaults,opt.effectOptions);this.options=opt;this.ckImages=(function(imgs,news){imgs=$.makeArray(imgs);$.each(imgs,function(i,m){if(!m)return true;var ckImg={url:(typeof m==='string')?m:(m.url?m.url:''),href:m.href||'',title:m.title||'',text:m.text||'',target:m.target||opt.linkTarget};if(ckImg.url)news.push(ckImg);});return news;})(opt.ckImages,[]);this.pLength=this.ckImages.length;this.playAllow=opt.autoPlay;var _this=this;this.ui=$(opt.handle);this.ui.html(['<div class="ck-imgvs" style="width:'+opt.width+'px; height:'+opt.height+'px;">','<div class="ck-imgvs-wrapper" >','<div class="ck-imgvs-content" ></div>','</div>','<a class="ck-imgvs-link" hidefocus href="#"></a>','<div class="ck-imgvs-navi" ></div>','<div class="ck-imgvs-loading"></div>','</div>'].join(''));ck.loadImage({url:function(v){v=[];$.each(_this.ckImages,function(i,m){v.push(m.url)});return v;},complete:function(){$(_this.ui).find('.ck-imgvs-loading').hide();_naviInit.call(_this);_this.effect.initialize.call(_this,opt.playStartIndex,_ready);}});function _ready(i){this.pIndex=-1;this.cIndex=-1;this.lIndex=-2;if(opt.hoverStop&&opt.autoPlay){$(this.ui).find('.ck-imgvs').hover(function(){_this.stop();},function(){_this.continute();});}
if($.isFunction(opt.onReady))opt.onReady.call(this,this.ckImages[i],i,this.pLength);this.play(i);this._naviSelect(i);}
function _naviInit(){$(this.ui).find('.ck-imgvs-navi').attr('className','ck-imgvs-navi '+opt.naviAddClass).html((function(s,l,i){for(i=0;i<l;i++){s+=('<div class="ck-imgvs-navi-item"><div class="ck-imgvs-navi-bg"></div><div class="ck-imgvs-navi-label">'+(($.isFunction(opt.naviLabel))?opt.naviLabel.call(this,i):i)+'</div></div>');}
return s;})('',this.pLength,0)).find('.ck-imgvs-navi-item').hover(function(){$(this).addClass('hover').siblings().removeClass('hover');},function(){$(this).removeClass('hover');}).each(function(i){$(this).click(function(){_this.play(i);})});}}
function _intervalPlay(){var _this=this;if(this.playAllow){clearTimeout(this.ckInterval);this.ckInterval=setTimeout(function(){_this.play()},_this.options.playInterval);}}
function stop(){clearTimeout(this.ckInterval);this.playAllow=false;}
function continute(){this.playAllow=this.options.autoPlay;this._intervalPlay();}
function play(iplay){var _this=this,opt=this.options;this.lIndex=this.cIndex;this.pIndex=iplay>=0?iplay:this._getPlayIndex();if(this.pIndex===this.lIndex){this._intervalPlay();return false;}
this.effect.endLast.call(this,this.lIndex);if($.isFunction(opt.onPlayStart))opt.onPlayStart.call(this,this.ckImages[this.pIndex],this.pIndex,this.pLength);this._naviSelect(this.pIndex);this.cIndex=this.pIndex;this.effect.play.call(this,this.pIndex,function(i){this.cIndex=i;if($.isFunction(opt.onPlayEnd))opt.onPlayEnd.call(this,this.ckImages[i],i,this.pLength);this._intervalPlay();});}
function _getPlayIndex(){switch(this.options.playMode){case'normal':case 1:default:return(this.cIndex>=(this.pLength-1)?0:(this.cIndex+1));case'backward':case 2:return(this.cIndex<=0?(this.pLength-1):(this.cIndex-1));case'shuff':case 3:return(function(i,r){r=i;while(i===r){r=Math.floor(Math.random()*this.pLength);}return r;})(this.cIndex);}}
function _naviSelect(i){var ckImg=this.ckImages[i];$(this.ui).find('.ck-imgvs-navi-item').eq(i).addClass('select').siblings().removeClass('select');$(this.ui).find('.ck-imgvs-link').attr('href',ckImg.href).attr('target',ckImg.target);}
$.extend(ck.prototype,{initialize:initialize,play:play,stop:stop,continute:continute,_intervalPlay:_intervalPlay,_getPlayIndex:_getPlayIndex,_naviSelect:_naviSelect});ck.effects={def:{initialize:function(i,callback){var ckImg=this.ckImages[i],opt=this.options,_this=this;$(this.ui).find('.ck-imgvs').attr('className','ck-imgvs default');$(this.ui).find('.ck-imgvs-content').html(['<div class="ck-image" style="background-image:url(',ckImg.url,')"></div>'].join(''));callback.call(_this,i);},play:function(i,callback){$(this.ui).find('.ck-image').ckSetImg(this.ckImages[i]);callback.call(this,i);},endLast:function(){},defaults:{}},fadeIn:{initialize:function(i,callback){var ckImg=this.ckImages[i];$(this.ui).find('.ck-imgvs').attr('className','ck-imgvs fadeIn');$(this.ui).find('.ck-imgvs-content').html('<div class="ck-image" style="background-image:url('+ckImg.url+')"></div>'+'<div class="ck-image" style="background-image:url('+ckImg.url+')"></div>');callback.call(this,i);},play:function(i,callback){var ckImg=this.ckImages[i],_this=this,opt=this.options,$first=$(this.ui).find('.ck-image:first'),$last=$(this.ui).find('.ck-image:last'),duration=Math.floor(opt.playInterval*opt.playSpeedRate);$last.css({opacity:0}).ckSetImg(ckImg).animate({opacity:1},duration,function(){$first.ckSetImg(ckImg);$last.css({opacity:0});callback.call(_this,i);});},endLast:function(i){$(this.ui).find('.ck-image:last').stop(true,true);},defaults:{}},hShutter:{initialize:function(iplay,callback){var ckImg=this.ckImages[iplay],opt=this.options,w=opt.effectOptions.width,_this=this,lamina=Math.ceil(opt.width/w);$(this.ui).find('.ck-imgvs').attr('className','ck-imgvs shutter');$(this.ui).find('.ck-imgvs-content').html(['<div class="ck-image" style="background-image:url('+ckImg.url+')"></div>','<div class="ck-shutter-wrapper" >',(function(l,s,i){for(i=0;i<l;i++){s.push('<div class="ck-shutter-lamina" style="'+'background:transparent url('+ckImg.url+') no-repeat scroll '+
(-i*w)+'px center;'+'left:'+(i*w)+'px; width:0; "></div>');}
return s.join('');})(lamina,[]),'</div>'].join(''));callback.call(this,iplay);},play:function(i,callback){var ckImg=this.ckImages[i],opt=this.options,_this=this,w=opt.effectOptions.width,duration=Math.floor(opt.playInterval*opt.playSpeedRate);var $shutters=$(this.ui).find('.ck-shutter-wrapper').show().find('.ck-shutter-lamina').ckSetImg(ckImg).css({width:'0'});var $first=$shutters.eq(0);$shutters.not($first).animate({width:w+'px'},duration);$first.animate({width:w+'px'},duration,function(){$(_this.ui).find('.ck-image').ckSetImg(ckImg);$shutters.hide();callback.call(_this,i);});},endLast:function(i){$(this.ui).find(':animated').stop(true,true);},defaults:{width:20}},random:{initialize:function(i,callback){var opt=this.options;if(typeof opt.effectFilter=='string'){if(opt.effectFilter=='all'){this.effectFilter=[];for(var e in ck.effects){if(e!='random')this.effectFilter.push(e)}}else{var effects=opt.effectFilter.split(/[\s,]+/);this.effectFilter=[];for(var x=0,l=effects.length;x<l;x++){if(!!ck.effects[effects[x]]){this.effectFilter.push(effects[x])}}}}else if(Object.prototype.toString.apply(opt.effectFilter)==='[object Array]'){this.effectFilter=opt.effectFilter;}else{throw new Error('CkImgViewStack: effetFilter is not in a correct data type!')}
callback.call(this,i);},play:function(i,callback){var _this=this,opt=this.options;var effect=this.effectFilter[parseInt(Math.random()*this.effectFilter.length)];opt.effectOptions=$.extend({},ck.effects[effect].defaults,opt.effectOptions);this.lIndex=this.lIndex>=0?this.lIndex:opt.playStartIndex;ck.effects[effect].initialize.call(this,this.lIndex,function(){ck.effects[effect].play.call(this,i,callback);});},endLast:function(i){},defaults:{}}};ck.loadImage=function(s){var urlset=[];switch(Object.prototype.toString.apply(s.url)){case'[object String]':urlset[urlset.length]=s.url;break;case'[object Array]':if(!s.url.length){return false;}urlset=s.url;break;case'[object Function]':s.url=s.url();return ck.loadImage(s);default:return false;}
var imgset=[],timer,callbacked=false,k=function(){},r={total:urlset.length,load:0,error:0,abort:0,complete:0,currentIndex:0},_defaults={url:'',onload:k,onerror:k,oncomplete:k,ready:k,complete:k,timeout:20000};s=(function(d){if(typeof s!='object')return d;for(var v in s){d[v]=s[v];}
return d;})(_defaults);s.timeout=parseInt(s.timeout)||_defaults.timeout;timer=setTimeout(_callback,s.timeout);for(var i=urlset.length,img;i--;){img=new Image();img.loaded=false;imgset[imgset.length]=img;}
if($.isFunction(s.ready)){s.ready.call({},imgset,r);}
for(var i=0,l=imgset.length;i<l;i++){imgset[i].onload=function(){_imageHandle.call(this,'load',i);};imgset[i].onerror=function(){_imageHandle.call(this,'error',i);};imgset[i].onabort=function(){_imageHandle.call(this,'abort',i);};imgset[i].src=''+urlset[i];}
function _imageHandle(handle,index){r.currentIndex=index;switch(handle){case'load':this.onload=null;this.loaded=true;r.load++;s.onload.call(this,r);break;case'error':r.error++;s.onerror.call(this,r);break;case'abort':r.abort++;break;}
r.complete++;s.oncomplete.call(this,r);if(r.complete===imgset.length){_callback();}}
function _callback(){clearTimeout(timer);if(callbacked)return false;if($.isFunction(s.complete)){callbacked=true;s.complete.call({},imgset,r);}}
return true;};ck.defaults={handle:'',ckImages:[],autoPlay:true,effect:'def',effectFilter:'all',playInterval:5000,playSpeedRate:.323,playStartIndex:0,playMode:'normal',hoverStop:true,onReady:function(){},onPlayStart:function(){},onPlayEnd:function(){},linkTarget:'blank',naviLabel:function(i){return i+1;},naviAddClass:'',effectOptions:{}};$.fn.ckSetImg=function(ckImg){return this.css({backgroundImage:'url('+ckImg.url+')'});};})(jQuery);
