
KISSY.add('datalazyload/impl',function(S,DOM,Event,undefined){var win=window,doc=document,IMG_SRC_DATA='data-ks-lazyload',AREA_DATA_CLS='ks-datalazyload',CUSTOM='-custom',MANUAL='manual',DISPLAY='display',DEFAULT='default',NONE='none',SCROLL='scroll',RESIZE='resize',defaultConfig={mod:MANUAL,diff:DEFAULT,placeholder:NONE,execScript:true};function DataLazyload(containers,config){var self=this;if(!(self instanceof DataLazyload)){return new DataLazyload(containers,config);}
if(config===undefined){config=containers;containers=[doc];}
if(!S.isArray(containers)){containers=[DOM.get(containers)||doc];}
self.containers=containers;self.config=S.merge(defaultConfig,config);self.callbacks={els:[],fns:[]};self._init();return undefined;}
S.augment(DataLazyload,{_init:function(){var self=this;self.threshold=self._getThreshold();self._filterItems();self._initLoadEvent();},_filterItems:function(){var self=this,containers=self.containers,n,N,imgs,areaes,i,img,lazyImgs=[],lazyAreas=[];for(n=0,N=containers.length;n<N;++n){imgs=DOM.query('img',containers[n]);lazyImgs=lazyImgs.concat(S.filter(imgs,self._filterImg,self));areaes=DOM.query('textarea',containers[n]);lazyAreas=lazyAreas.concat(S.filter(areaes,self._filterArea,self));}
self.images=lazyImgs;self.areaes=lazyAreas;},_filterImg:function(img){var self=this,dataSrc=img.getAttribute(IMG_SRC_DATA),threshold=self.threshold,placeholder=self.config.placeholder,isManualMod=self.config.mod===MANUAL;if(isManualMod){if(dataSrc){if(placeholder!==NONE){img.src=placeholder;}
return true;}}
else{if(DOM.offset(img).top>threshold&&!dataSrc){DOM.attr(img,IMG_SRC_DATA,img.src);if(placeholder!==NONE){img.src=placeholder;}else{img.removeAttribute('src');}
return true;}}},_filterArea:function(area){return DOM.hasClass(area,AREA_DATA_CLS);},_initLoadEvent:function(){var timer,self=this,resizeHandler;Event.on(win,SCROLL,loader);Event.on(win,RESIZE,(resizeHandler=function(){self.threshold=self._getThreshold();loader();}));if(self._getItemsLength()){S.ready(function(){loadItems();});}
function loader(){if(timer)return;timer=S.later(function(){loadItems();timer=null;},100);}
function loadItems(){self._loadItems();if(self._getItemsLength()===0){Event.remove(win,SCROLL,loader);Event.remove(win,RESIZE,resizeHandler);}}},_loadItems:function(){var self=this;self._loadImgs();self._loadAreas();self._fireCallbacks();},_loadImgs:function(){var self=this;self.images=S.filter(self.images,self._loadImg,self);},_loadImg:function(img){var self=this,scrollTop=DOM.scrollTop(),threshold=self.threshold+scrollTop,offset=DOM.offset(img);if(offset.top<=threshold){self._loadImgSrc(img);}else{return true;}},_loadImgSrc:function(img,flag){flag=flag||IMG_SRC_DATA;var dataSrc=img.getAttribute(flag);if(dataSrc&&img.src!=dataSrc){img.src=dataSrc;img.removeAttribute(flag);}},_loadAreas:function(){var self=this;self.areaes=S.filter(self.areaes,self._loadArea,self);},_loadArea:function(area){var self=this,top,isHidden=DOM.css(area,DISPLAY)===NONE;top=DOM.offset(isHidden?area.parentNode:area).top;if(top<=self.threshold+DOM.scrollTop()){self._loadAreaData(area.parentNode,area,self.config.execScript);}else{return true;}},_loadAreaData:function(container,area,execScript){area.style.display=NONE;area.className='';var content=DOM.create('<div>');container.insertBefore(content,area);DOM.html(content,area.value,execScript===undefined?true:execScript);},_fireCallbacks:function(){var self=this,callbacks=self.callbacks,els=callbacks.els,fns=callbacks.fns,scrollTop=DOM.scrollTop(),threshold=self.threshold+scrollTop,i,el,fn,remainEls=[],remainFns=[];for(i=0;(el=els[i])&&(fn=fns[i++]);){if(DOM.offset(el).top<=threshold){fn.call(el);}else{remainEls.push(el);remainFns.push(fn);}}
callbacks.els=remainEls;callbacks.fns=remainFns;},addCallback:function(el,fn){var callbacks=this.callbacks;el=DOM.get(el);if(el&&S.isFunction(fn)){callbacks.els.push(el);callbacks.fns.push(fn);}},_getThreshold:function(){var diff=this.config.diff,vh=DOM['viewportHeight']();if(diff===DEFAULT)return 2*vh;else return vh+(+diff);},_getItemsLength:function(){var self=this;return self.images.length+self.areaes.length+self.callbacks.els.length;},loadCustomLazyData:function(containers,type){var self=this,area,imgs;if(!S.isArray(containers)){containers=[DOM.get(containers)];}
S.each(containers,function(container){switch(type){case'img-src':if(container.nodeName==='IMG'){imgs=[container];}else{imgs=DOM.query('img',container);}
S.each(imgs,function(img){self._loadImgSrc(img,IMG_SRC_DATA+CUSTOM);});break;default:area=DOM.get('textarea',container);if(area&&DOM.hasClass(area,AREA_DATA_CLS+CUSTOM)){self._loadAreaData(container,area);}}});}});S.mix(DataLazyload,DataLazyload.prototype,true,['loadCustomLazyData','_loadImgSrc','_loadAreaData']);return DataLazyload;},{requires:['dom','event']});
