UNPKG

aced

Version:

php+node light FE/BE framework

179 lines (165 loc) 5.14 kB
/* <script type="text/ace-carousel">{ imgs: [ 'http://remotweb.com/files/uploads/2014/06/fashion_jewelry.jpg' ,'http://delsonjewelry.com/site/images/stories/virtuemart/product/three-stones-engagement-ring.jpg' ,'http://thechrisellefactor.com/wp-content/uploads/2012/04/Chanel_Wallet_Chriselle1.jpg' ,'http://thechrisellefactor.com/wp-content/uploads/2012/09/Peplum_Leather_zara_top_Valentino_rockstud_leopard_shoes_Purse_chriselle_Lim_5.jpg' ,'http://glambistro.com/wp-content/uploads/2013/10/summer-arm-candy.jpg' ,'http://www.mychicadventure.com/wp-content/uploads/2014/05/boho-chic-2.jpg' ] ,dims: '195x148' ,speed: 300 ,shadbox: true }</script> */ ace.ui.register('carousel',{ opts: { imgs: [] ,dims: '195x148' ,speed: 300 ,shadbox: true } ,init: function(){ var z = this ,d = z.opts.dims.split('x') ; z.slideQueue = []; z.imgWidth = +d[0]; z.imgHeight = +d[1]; if (!z.opts.imgs.length) { z.$.cont.css('display','none'); return z.log('missing imgs'); } z.build(); z.calcDims(); z.position(); z.functionalize(); } ,build: function(){ var z = this ,x = z.cssKey ; z.$.cont.html('<div class="'+x+'-mask">' + '<div class="'+x+'-slide_cont"></div>' + '</div>' +'<div class="'+x+'-arr '+x+'-arr-left" xdata-dir="-1" style="display:none;"></div>' +'<div class="'+x+'-arr '+x+'-arr-right" xdata-dir="1" style="display:none;"></div>' ); z.$.mask = z.$.cont.find('div.'+x+'-mask'); z.$.slidesCont = z.$.mask.find('div.'+x+'-slide_cont'); z.$.arrows = z.$.cont.find('div.'+x+'-arr'); z.$.slides = z.createSlide(); z.$.slidesCont.append(z.$.slides); } ,calcDims: function(){ var z = this ,x = z.cssKey ,td = ace.util.trueDim(z.$.slides.eq(0).find('div.'+x+'-img').eq(0),true) ; z.itemWidth = td.w; z.itemHeight = td.h; z.slideWidth = z.opts.imgs.length*z.itemWidth; z.maskWidth = z.$.mask.width(); z.slideDistance = Math.floor(z.maskWidth/z.itemWidth)*z.itemWidth; } ,createSlide: function(){ var z = this ,x = z.cssKey ,jSlide ; if (z.$.slides && z.$.slides.length) return z.$.slides.eq(0).clone(true); jSlide = $('<div class="'+x+'-slide" style="visibility:hidden;"></div>') $.each(z.opts.imgs,function(i,src){ jSlide.append('<div class="'+x+'-img is-loading" style="width:'+z.imgWidth+'px;height:'+z.imgHeight+'px;">' + '<div class="'+x+'-img-wrap">' + '<img class="'+x+'-img-img" alt="" src="'+src+'" style="display:none;" />' + '</div>' + '</div>'); }); return jSlide; } ,position: function(){ var z = this ,x = z.cssKey ,jSlide ; z.$.mask.css('height',z.itemHeight+'px'); if (z.slideWidth > z.maskWidth) { // need arrow functionality z.$.slides.eq(0).css('left',0); z.$.slides = z.$.slides.add(jSlide=z.createSlide().css('left',(-z.slideWidth)+'px')); z.$.slidesCont.append(jSlide); z.$.slides = z.$.slides.add(jSlide=z.createSlide().css('left',z.slideWidth+'px')); z.$.slidesCont.append(jSlide); z.$.arrows.css('display',''); } z.$.slides.each(function(i){ z.$.slides.eq(i).find('div.'+x+'-img').each(function(n){ $(this).css('left',(n*z.itemWidth)+'px').imagesLoaded(function(){ var jImg = $(this) ,jImgImg = jImg.find('img.'+x+'-img-img') ; jImg.removeClass('is-loading'); jImgImg.css( ace.util.getImageToWindowFit([z.imgWidth,z.imgHeight],[jImgImg[0].width,jImgImg[0].height]).css ).css('display',''); }); }); }); z.$.slides.css('visibility',''); } ,functionalize: function(){ var z = this ,x = z.cssKey ; z.$.arrows.bind('click',function(){ z.slide(+$(this).attr('xdata-dir')); }); if (z.opts.shadbox) { z.$.cont.addClass('shadbox_enabled'); z.$.slides.find('img.'+x+'-img-img').bind('click',function(){ ace.shadbox($(this).attr('src')); }); } } ,slide: function(dir){ var z = this; //z.slideQueue.push(dir); // if they click a direction opposite of current animation lets clear the queue if (z.slideQueue[0] && z.slideQueue[0] != dir) z.slideQueue = [z.slideQueue[0],dir] else z.slideQueue.push(dir); if (z.slideQueue.length == 1) slide(); function slide() { var dir = z.slideQueue[0]; if (!dir) return; z.$.slidesCont.animate({ left: (z.$.slidesCont.position().left-(dir*z.slideDistance))+'px' },{ duration: z.opts.speed ,complete: function(){ var offsetX = z.$.slidesCont.position().left; z.$.slides.sort(function(a,b){ return $(a).position().left-$(b).position().left; }); // this wastes resources popping back and forth unnecessarily // dont have time to fix atm if (z.$.slides.eq(0).position().left+offsetX + z.slideWidth < -z.slideDistance) { // push onto end z.$.slides.eq(0).css('left', (z.$.slides.eq(2).position().left+z.slideWidth)+'px'); } else if (z.$.slides.eq(2).position().left+offsetX > z.maskWidth+z.slideDistance) { // pop into beginning z.$.slides.eq(2).css('left', (z.$.slides.eq(0).position().left-z.slideWidth)+'px'); } z.slideQueue.shift(); slide(); } }); } } });