/** * carousel class */ function UGCarousel(){ var t = this, g_objThis = jQuery(this); var g_gallery = new UniteGalleryMain(), g_objGallery, g_objWrapper; var g_functions = new UGFunctions(), g_arrItems, g_objTileDesign = new UGTileDesign(); var g_thumbs = new UGThumbsGeneral(), g_objCarouselWrapper, g_objInner, arrOrigTiles = []; var g_options = { carousel_padding: 8, //padding at the sides of the carousel carousel_space_between_tiles: 20, //space between tiles carousel_navigation_numtiles:3, //number of tiles to scroll when user clicks on next/prev button carousel_scroll_duration:500, //duration of scrolling to tile carousel_scroll_easing:"easeOutCubic", //easing of scrolling to tile animation carousel_autoplay: true, //true,false - autoplay of the carousel on start carousel_autoplay_timeout: 3000, //autoplay timeout carousel_autoplay_direction: "right", //left,right - autoplay direction carousel_autoplay_pause_onhover: true //pause the autoplay on mouse over }; this.events = { START_PLAY: "carousel_start_play", PAUSE_PLAY: "carousel_pause_play", STOP_PLAY: "carousel_stop_play" }; var g_temp = { eventSizeChange: "thumb_size_change", isFirstTimeRun:true, //if run once carouselMaxWidth: null, tileWidth:0, sideSpace:1500, //the space that must be filled with items spaceActionSize:500, numCurrent:0, touchActive: false, startInnerPos: 0, lastTime:0, startTime:0, startMousePos:0, lastMousePos:0, scrollShortDuration: 200, scrollShortEasing: "easeOutQuad", handle:null, isPlayMode: false, isPaused: false }; function __________GENERAL_________(){}; /** * init the gallery */ function init(gallery, customOptions){ g_objects = gallery.getObjects(); g_gallery = gallery; g_objGallery = jQuery(gallery); g_objWrapper = g_objects.g_objWrapper; g_arrItems = g_objects.g_arrItems; g_options = jQuery.extend(g_options, customOptions); g_objTileDesign.setFixedMode(); g_objTileDesign.setApproveClickFunction(isApproveTileClick); g_objTileDesign.init(gallery, g_options); g_thumbs = g_objTileDesign.getObjThumbs(); g_options = g_objTileDesign.getOptions(); g_temp.tileWidth = g_options.tile_width; } /** * set the grid panel html */ function setHtml(objParent){ if(!objParent) var objParent = g_objWrapper; var html = ""; g_objWrapper.append(html); g_objCarouselWrapper = g_objWrapper.children(".ug-carousel-wrapper"); g_objInner = g_objCarouselWrapper.children(".ug-carousel-inner"); g_objTileDesign.setHtml(g_objInner); g_thumbs.getThumbs().fadeTo(0,1); } /** * run the gallery after init and set html */ function run(){ //validation if(g_temp.carouselMaxWidth === null){ throw new Error("The carousel width not set"); return(false); } //set wrapper width var numTiles = g_functions.getNumItemsInSpace(g_temp.carouselMaxWidth, g_temp.tileWidth, g_options.carousel_space_between_tiles); var realWidth = g_functions.getSpaceByNumItems(numTiles, g_temp.tileWidth, g_options.carousel_space_between_tiles); realWidth += g_options.carousel_padding * 2; g_objCarouselWrapper.width(realWidth); if(g_temp.isFirstTimeRun == true){ initEvents(); g_objTileDesign.run(); //set data indexes to tiles jQuery.each(g_arrItems, function(index, item){ item.objThumbWrapper.data("index", index); g_objWrapper.trigger(g_temp.eventSizeChange, [item.objThumbWrapper,true]); item.objTileOriginal = item.objThumbWrapper.clone(true, true); }); positionTiles(true); //set heights at first time if(g_options.carousel_autoplay == true) startAutoplay(); }else{ if(g_options.carousel_autoplay == true) pauseAutoplay(); scrollToTile(0, false); if(g_options.carousel_autoplay == true) startAutoplay(); } positionElements(); g_temp.isFirstTimeRun = false; } function __________GETTERS_______(){}; /** * get inner position */ function getInnerPos(){ return g_functions.getElementSize(g_objInner).left; } /** * get mouse position */ function getMousePos(event){ return g_functions.getMousePosition(event).pageX; } /** * get all tiles */ function getTiles(){ var objTiles = g_objInner.children(".ug-thumb-wrapper"); return(objTiles); } /** * get num tiles in some space */ function getNumTilesInSpace(space){ var numItems = g_functions.getNumItemsInSpace(space, g_temp.tileWidth, g_options.carousel_space_between_tiles) return(numItems); } /** * get all tiles in the inner object */ function getTiles(){ return g_objInner.children(".ug-thumb-wrapper"); } /** * get num tiles */ function getNumTiles(){ return getTiles().length; } /** * get tile */ function getTile(numTile){ validateTileNum(numTile); var objTiles = getTiles(); var objTile = jQuery(objTiles[numTile]); return(objTile); } /** * get first tile in the inner object */ function getFirstTile(){ return g_objInner.children(".ug-thumb-wrapper").first(); } /** * get last tile in the inner object */ function getLastTile(){ return g_objInner.children(".ug-thumb-wrapper").last(); } /** * get clone of the time next or prev the given */ function getTileClones(objTile, numClones, dir){ var index = objTile.data("index"); if(index == undefined){ throw new Error("every tile should have index!"); } var arrClonedItems = []; for(var i=0;i (getTiles().length-1)) throw new Error("Wrogn tile number: " + numTile); } /** * add tile to left */ function addTiles(numTiles, dir){ if(dir == "left") var anchorTile = getFirstTile(); else var anchorTile = getLastTile(); var clonesType = (dir == "left")?"prev":"next"; var arrNewTiles = getTileClones(anchorTile, numTiles, clonesType); jQuery.each(arrNewTiles, function(index, objTile){ if(dir == "left") g_objInner.prepend(objTile); else g_objInner.append(objTile); g_objWrapper.trigger(g_temp.eventSizeChange, objTile); g_objTileDesign.loadTileImage(objTile); }); } /** * remove some tiles */ function removeTiles(numTilesToRemove, direction){ validateTileNum(numTiles); var arrTiles = getTiles(); var numTiles = arrTiles.length; for(var i=0; i g_temp.spaceActionSize){ numItemsLeft = getNumTilesInSpace(spaceLeft); addTiles(numItemsLeft, "left"); g_temp.numCurrent += numItemsLeft; }else if(spaceLeft < -g_temp.spaceActionSize){ var numItemsRemoveLeft = getNumTilesInSpace(Math.abs(spaceLeft)); removeTiles(numItemsRemoveLeft, "left"); g_temp.numCurrent -= numItemsRemoveLeft; } //add tiles to right if(spaceRight > g_temp.spaceActionSize){ numItemsRight = getNumTilesInSpace(spaceRight); addTiles(numItemsRight, "right"); }else if(spaceRight < -g_temp.spaceActionSize){ numItemsRemoveRight = getNumTilesInSpace(Math.abs(spaceRight)); removeTiles(numItemsRemoveRight, "right"); } //trace("numItems: " + getNumTiles()); //scroll to tile and position inner object var isPositioned = false; if(numItemsLeft || numItemsRight || numItemsRemoveLeft || numItemsRemoveRight){ /* debugLine({ numItemsLeft:numItemsLeft, numItemsRight:numItemsRight, numItemsRemoveLeft:numItemsRemoveLeft, numItemsRemoveRight: numItemsRemoveRight }); */ //trace("do something"); positionTiles(); isPositioned = true } return(isPositioned); } /** * position tiles */ function positionElements(isFirstTime){ //position inner strip g_functions.placeElement(g_objInner, 0, g_options.carousel_padding); //position sides fillSidesWithTiles(); } function __________AUTOPLAY_______(){}; /** * start autoplay */ function startAutoplay(){ g_temp.isPlayMode = true; g_temp.isPaused = false; g_objThis.trigger(t.events.START_PLAY); if(g_temp.handle) clearInterval(g_temp.handle); g_temp.handle = setInterval(autoplayStep, g_options.carousel_autoplay_timeout); } /** * unpause autoplay after pause */ function unpauseAutoplay(){ if(g_temp.isPlayMode == false) return(true); if(g_temp.isPaused == false) return(true); startAutoplay(); } /** * pause the autoplay */ function pauseAutoplay(){ if(g_temp.isPlayMode == false) return(true); g_temp.isPaused = true; if(g_temp.handle) clearInterval(g_temp.handle); g_objThis.trigger(t.events.PAUSE_PLAY); } /** * stop autoplay */ function stopAutoplay(){ if(g_temp.isPlayMode == false) return(true); g_temp.isPaused = false; g_temp.isPlayMode = false; if(g_temp.handle) clearInterval(g_temp.handle); g_objThis.trigger(t.events.STOP_PLAY); } /** * autoplay step, advance the carousel by 1 */ function autoplayStep(){ if(g_options.carousel_autoplay_direction == "left"){ t.scrollRight(1); }else{ t.scrollLeft(1); } } function __________EVENTS_______(){}; /** * on touch start */ function onTouchStart(event){ if(g_temp.touchActive == true) return(true); g_temp.touchActive = true; pauseAutoplay(); g_temp.startTime = jQuery.now(); g_temp.startMousePos = getMousePos(event); g_temp.startInnerPos = getInnerPos(); g_temp.lastTime = g_temp.startTime; g_temp.lastMousePos = g_temp.startMousePos; } /** * on touch move */ function onTouchMove(event){ if(g_temp.touchActive == false) return(true); event.preventDefault(); g_temp.lastMousePos = getMousePos(event); var diff = g_temp.lastMousePos - g_temp.startMousePos; var innerPos = g_temp.startInnerPos + diff; var direction = (diff > 0) ? "prev":"next"; var innerSize = g_functions.getElementSize(g_objInner).width; //slow down when off limits if(innerPos > 0 && direction == "prev"){ innerPos = innerPos / 3; } if(innerPos < -innerSize && direction == "next"){ innerPos = g_temp.startInnerPos + diff / 3; } setInnerPos(innerPos); } /** * on touch end * change panes or return to current pane */ function onTouchEnd(event){ if(g_temp.touchActive == false) return(true); //event.preventDefault(); g_temp.touchActive = false; scrollToNeerestTile(); unpauseAutoplay(); } /** * pause the playing */ function onMouseEnter(event){ if(g_options.carousel_autoplay_pause_onhover == false) return(true); if(g_temp.isPlayMode == true && g_temp.isPaused == false) pauseAutoplay(); } /** * start the playing again */ function onMouseLeave(event){ if(g_options.carousel_autoplay_pause_onhover == false) return(true); unpauseAutoplay(); } /** * init panel events */ function initEvents(){ g_objTileDesign.initEvents(); //touch drag events //slider mouse down - drag start g_objCarouselWrapper.bind("mousedown touchstart",onTouchStart); //on body move jQuery("body").bind("mousemove touchmove",onTouchMove); //on body mouse up - drag end jQuery(window).add("body").bind("mouseup touchend", onTouchEnd); g_objCarouselWrapper.hover(onMouseEnter, onMouseLeave); } /** * destroy the carousel events */ this.destroy = function(){ if(g_temp.handle) clearInterval(g_temp.handle); g_objThis.off(t.events.START_PLAY); g_objThis.off(t.events.STOP_PLAY); //touch drag events //slider mouse down - drag start g_objCarouselWrapper.unbind("mousedown"); g_objCarouselWrapper.unbind("touchstart"); //on body move jQuery("body").unbind("mousemove"); jQuery("body").unbind("touchmove"); //on body mouse up - drag end jQuery(window).add("body").unbind("mouseup").unbind("touchend"); g_objCarouselWrapper.off("mouseenter").off("mouseleave"); g_objTileDesign.destroy(); } /** * init function for avia controls */ this.init = function(gallery, customOptions, width){ if(width) this.setMaxWidth(width); init(gallery, customOptions); } /** * set the width */ this.setMaxWidth = function(width){ g_temp.carouselMaxWidth = width; } /** * set html */ this.setHtml = function(objParent){ setHtml(objParent); } /** * get the carousel element */ this.getElement = function(){ return g_objCarouselWrapper; } /** * get tile design object */ this.getObjTileDesign = function(){ return(g_objTileDesign); } /** * get estimated height */ this.getEstimatedHeight = function(){ var height = g_options.tile_height + g_options.carousel_padding * 2; return(height); } /** * set html and properties */ this.run = function(){ run(); } /** * scroll to right */ this.scrollRight = function(tilesToScroll){ if(!tilesToScroll || typeof tilesToScroll == "object") var tilesToScroll = g_options.carousel_navigation_numtiles; var numTilesInCarousel = getNumTilesInCarousel(); if(tilesToScroll > numTilesInCarousel) tilesToScroll = numTilesInCarousel; var numPrev = g_temp.numCurrent - tilesToScroll; if(numPrev <=0) numPrev = 0; scrollToTile(numPrev); } /** * scroll to left */ this.scrollLeft = function(tilesToScroll){ if(!tilesToScroll || typeof tilesToScroll == "object") var tilesToScroll = g_options.carousel_navigation_numtiles; var numTilesInCarousel = getNumTilesInCarousel(); if(tilesToScroll > numTilesInCarousel) tilesToScroll = numTilesInCarousel; var numTiles = getNumTiles(); var numNext = g_temp.numCurrent + tilesToScroll; if(numNext >= numTiles) numNext = numTiles-1; scrollToTile(numNext); } /** * set scroll left button */ this.setScrollLeftButton = function(objButton){ g_functions.setButtonMobileReady(objButton); g_functions.setButtonOnClick(objButton, t.scrollLeft); } /** * set scroll right button */ this.setScrollRightButton = function(objButton){ g_functions.setButtonMobileReady(objButton); g_functions.setButtonOnClick(objButton, t.scrollRight); } /** * set scroll right button */ this.setPlayPauseButton = function(objButton){ g_functions.setButtonMobileReady(objButton); if(g_temp.isPlayMode == true && g_temp.isPaused == false){ objButton.addClass("ug-pause-icon"); } g_objThis.on(t.events.START_PLAY, function(){ objButton.addClass("ug-pause-icon"); }); g_objThis.on(t.events.STOP_PLAY, function(){ objButton.removeClass("ug-pause-icon"); }); g_functions.setButtonOnClick(objButton, function(){ if(g_temp.isPlayMode == false || g_temp.isPaused == true) startAutoplay(); else stopAutoplay(); }); } /** * return if passed some significant movement */ function isApproveTileClick(){ var passedTime = g_temp.lastTime - g_temp.startTime; var passedDistanceAbs = Math.abs(g_temp.lastMousePos - g_temp.startMousePos); if(passedTime > 300) return(false); if(passedDistanceAbs > 30) return(false); return(true); } }