/*----------------------------- fade_carousel -----------------------------*/ (function($){ var defaults = { activeIndex:0, autoExecute:false, timeAutoExecute:3000, pagerShow:true, navigatorShow:true, navigatorInner:[ 'prev', 'next' ], speedFadeIn:500, speedAnimationHeight:500, classNameContentsParent:'fade_carousel_contents_parent', classNameList:'fade_carousel_list', classNameContents:'fade_carousel_contents', classNameTriggerPrev:'fade_carousel_trigger_prev', classNameTriggerNext:'fade_carousel_trigger_next', funcSetFinishCallback:function( activeIndex, ele ){}, funcFadeInStartCallback:function( prevIndex, nextIndex, ele ){}, funcFadeInEndCallback:function( prevIndex, nextIndex, ele ){} }; $.fn.fadeCarousel = function(options){ var configs = {}, el = this, lenEl = el.length, nextIndex = 0, flagFuncExecute = flagTouchExecute = true, flagPutPager = false, timeAutoExecute = null, funcInit = function(){ configs = $.extend({}, defaults, options); var eleFadeCarouselUnorderedList = $('.' + configs.classNameList, el), eleFadeCarouselContentsParent = $('.' + configs.classNameContentsParent + ':eq(0)', el); if(configs.navigatorShow) funcPutNavigator(); if(configs.pagerShow){ if(!eleFadeCarouselUnorderedList[0]) funcPutPager(); $(eleFadeCarouselUnorderedList).show(); }else{ $(eleFadeCarouselUnorderedList).hide(); } funcImgLoad(eleFadeCarouselContentsParent, function(){ var eleFadeCarouselContents = $('> .' + configs.classNameContents, eleFadeCarouselContentsParent), eleFadeCarouselContentsActive = eleFadeCarouselContents.eq(configs.activeIndex); eleFadeCarouselContentsActive .css({ 'z-index':'2' }); funcAdjustmentHeight(function(){ var eleFadeCarouselUnorderedList = $('.' + configs.classNameList, el); if(configs.navigatorShow){ var eleFadeCarouselTriggerPrev = $('.' + configs.classNameTriggerPrev, el), eleFadeCarouselTriggerNext = $('.' + configs.classNameTriggerNext, el); eleFadeCarouselTriggerPrev .on({ 'click':function(){ funcExecute(configs.activeIndex === 0?eleFadeCarouselContents.length - 1:configs.activeIndex -1); } }); eleFadeCarouselTriggerNext .on({ 'click':function(){ funcExecute(configs.activeIndex === eleFadeCarouselContents.length - 1?0:configs.activeIndex + 1); } }); } if(eleFadeCarouselUnorderedList[0]){ var eleFadeCarouselList = $(' > li', eleFadeCarouselUnorderedList); eleFadeCarouselList.eq(configs.activeIndex).addClass('fade_carousel_active'); eleFadeCarouselList.each(function(index){ $(' > *', this) .on({ 'click':function(){ funcExecute(index); } }); }); } $(window).on({ 'resize.fadeCarousel':function(){ funcAdjustmentHeight(); } }); var posTouch, executeRange = 70; eleFadeCarouselContentsParent .on({ 'mousedown':function(e){ e.preventDefault(); if(flagTouchExecute === false) return; flagTouchExecute = false; posTouch = e.clientX; }, 'mousemove':function(e){ e.preventDefault(); }, 'mouseup':function(e){ e.preventDefault(); if( flagTouchExecute || typeof posTouch !== 'number' ) return; movePos = posTouch - e.clientX; if( movePos < 0 && movePos < executeRange * -1 ){ var nextIndex = configs.activeIndex + 1; posTouch = void 0; funcExecute(nextIndex === eleFadeCarouselContents.length?0:nextIndex); setTimeout(function(){ flagTouchExecute = true; }, 50); return ; }else if( movePos > 0 && movePos > executeRange ){ var prevIndex = configs.activeIndex - 1; posTouch = void 0; funcExecute(prevIndex < 0?eleFadeCarouselContents.length - 1:prevIndex); setTimeout(function(){ flagTouchExecute = true; }, 50); return ; } flagTouchExecute = true; }, 'click':function(){ if(flagTouchExecute === false) return false; }, 'touchstart':function(e){ if(flagTouchExecute === false) return; flagTouchExecute = false; posTouch = e.originalEvent.changedTouches[0].clientX; }, 'touchend':function(e){ if( flagTouchExecute || typeof posTouch !== 'number' ) return; movePos = posTouch - e.originalEvent.changedTouches[0].clientX; if( movePos < 0 && movePos < executeRange * -1 ){ var nextIndex = configs.activeIndex + 1; posTouch = void 0; funcExecute(nextIndex === eleFadeCarouselContents.length?0:nextIndex); setTimeout(function(){ flagTouchExecute = true; }, 50); return ; }else if( movePos > 0 && movePos > executeRange ){ var prevIndex = configs.activeIndex - 1; posTouch = void 0; funcExecute(prevIndex < 0?eleFadeCarouselContents.length - 1:prevIndex); setTimeout(function(){ flagTouchExecute = true; }, 50); return ; } flagTouchExecute = true; } }); if(configs.autoExecute) funcSetAutoExecute(); funcCustomEvents(); funcDestructor(); configs.funcSetFinishCallback( configs.activeIndex, el ); }); }); }, funcDestructor = function(){ lenEl = void 0; }, funcCustomEvents = function(){ el.on({ 'fadeCarousel.funcFadeCarouselExecute':function(e, index){ funcExecute(index); e.stopPropagation(); }, 'fadeCarousel.funcFadeCarouselAdjustmentHeight':function(e, callback){ if(flagFuncExecute === false) return false; funcAdjustmentHeight(callback); e.stopPropagation(); }, 'fadeCarousel.funcFadeCarouselDestroy':function(e){ if( configs.autoExecute && typeof timeAutoExecute === 'number' ){ clearTimeout(timeAutoExecute); timeAutoExecute = void 0; } var eleFadeCarouselContentsParent = $('.' + configs.classNameContentsParent + ':eq(0)', el), eleFadeCarouselContents = $('> .' + configs.classNameContents, eleFadeCarouselContentsParent), eleFadeCarouselContentsActiveNext = eleFadeCarouselContents.eq(nextIndex), eleFadeCarouselList = $('.' + configs.classNameList, el); if(eleFadeCarouselList[0]){ if(flagPutPager){ eleFadeCarouselList.remove(); flagPutPager = false; }else if(configs.pagerShow){ var eleFadeCarouselList = $('> li', eleFadeCarouselList); eleFadeCarouselList.eq(configs.activeIndex).removeClass('fade_carousel_active'); eleFadeCarouselList.each(function(){ $('> span', this).off('click'); }); } } $(window).off('resize.fadeCarousel'); eleFadeCarouselContentsParent .stop() .off('mousedown mousemove mouseup click touchstart touchend'); el.off('fadeCarousel.funcFadeCarouselExecute fadeCarousel.funcFadeCarouselAdjustmentHeight fadeCarousel.funcFadeCarouselReset'); eleFadeCarouselContentsActiveNext .stop() .css('opacity', 'unset'); eleFadeCarouselContents .css('z-index', 'unset'); e.stopPropagation(); } }); }, funcImgLoad = function(ele, callback){ var count = 0, eleImg = ele.find('img'), lenImg = $(eleImg).length; if(lenImg === 0) callback(); $(eleImg).each(function(){ var eleImg = $(''); eleImg.on({ 'load':function(){ count++; if(lenImg === count) callback(); }, 'error':function(){ count++; if(lenImg === count) callback(); } }); eleImg.attr('src', $(this).attr('src')); }); }, funcAdjustmentHeight = function(callback){ var eleFadeCarouselContentsParent = $('.' + configs.classNameContentsParent + ':eq(0)', el), eleFadeCarouselContentsCurrent = $('> .' + configs.classNameContents, eleFadeCarouselContentsParent).eq(configs.activeIndex); eleFadeCarouselContentsParent .stop() .animate( { 'height':eleFadeCarouselContentsCurrent.outerHeight(true) + 'px' }, configs.speedAnimationHeight, function(){ if(typeof callback === 'function') callback(configs.activeIndex); } ); }, funcSetAutoExecute = function(){ var eleFadeCarouselContentsParent = $('.' + configs.classNameContentsParent + ':eq(0)', el), eleFadeCarouselContents = $('> .' + configs.classNameContents, eleFadeCarouselContentsParent); timeAutoExecute = setTimeout(function(){ var nextIndex = configs.activeIndex + 1; funcExecute(nextIndex === eleFadeCarouselContents.length?0:nextIndex); }, configs.timeAutoExecute + configs.speedFadeIn); }, funcPutPager = function(){ el.append('