/**
* thumbs class
* addon to strip gallery
*/
function UGThumbsGrid(){
var t = this, g_objThis = jQuery(this);
var g_gallery = new UniteGalleryMain(), g_objGallery, g_objects, g_objWrapper;
var g_functions = new UGFunctions(), g_arrItems, g_objGrid, g_objInner;
var g_thumbs = new UGThumbsGeneral(), g_tilesDesign = new UGTileDesign();
var g_options = {
grid_panes_direction: "left", //where panes will move -> left, bottom
grid_num_cols: 2, //number of grid columns
grid_num_rows: 2, //number of grid rows (for horizontal type)
grid_space_between_cols: 10, //space between columns
grid_space_between_rows: 10, //space between rows
grid_transition_duration: 300, //transition of the panes change duration
grid_transition_easing: "easeInOutQuad", //transition of the panes change easing function
grid_carousel: false, //next pane goes to first when last
grid_padding: 0, //set padding to the grid
grid_vertical_scroll_ondrag: false //scroll the gallery on vertical drag
};
this.events = {
PANE_CHANGE: "pane_change"
};
var g_temp = {
eventSizeChange: "thumb_size_change",
isHorizontal: false,
isMaxHeight:false, //set if the height that set is max height. In that case need a height correction
isMaxWidth:false, //set if the height that set is max height. In that case need a height correction
gridHeight: 0,
gridWidth: 0,
innerWidth: 0,
innerHeight:0,
numPanes:0,
arrPanes:0,
numThumbs:0,
currentPane:0,
numThumbsInPane:0,
isNavigationVertical:false,
touchActive: false,
startScrollPos:0,
isFirstTimeRun:true,
isTilesMode: false,
storedEventID: "thumbsgrid"
};
function __________GENERAL_________(){};
/**
* init the gallery
*/
function init(gallery, customOptions, isTilesMode){
g_objects = gallery.getObjects();
g_gallery = gallery;
g_objGallery = jQuery(gallery);
g_objWrapper = g_objects.g_objWrapper;
g_arrItems = g_objects.g_arrItems;
if(isTilesMode === true)
g_temp.isTilesMode = true;
g_temp.numThumbs = g_arrItems.length;
setOptions(customOptions);
//set vertical or horizon
g_temp.isNavigationVertical = (g_options.grid_panes_direction == "top" || g_options.grid_panes_direction == "bottom")
if(g_temp.isTilesMode == true){
g_tilesDesign.setFixedMode();
g_tilesDesign.setApproveClickFunction(isApproveTileClick);
g_tilesDesign.init(gallery, g_options);
g_thumbs = g_tilesDesign.getObjThumbs();
}else{
g_thumbs.init(gallery);
}
}
/**
* set the grid panel html
*/
function setHtml(parentContainer){
var objParent = g_objWrapper;
if(parentContainer)
objParent = parentContainer;
objParent.append("
");
g_objGrid = objParent.children(".ug-thumbs-grid");
g_objInner = g_objGrid.children(".ug-thumbs-grid-inner");
//put the thumbs to inner strip
if(g_temp.isTilesMode == true)
g_tilesDesign.setHtml(g_objInner);
else
g_thumbs.setHtmlThumbs(g_objInner);
}
/**
* validate before running the grid
*/
function validateBeforeRun(){
if(g_temp.isHorizontal == false){ //vertical type
if(g_temp.gridHeight == 0)
throw new Error("You must set height before run.");
}else{
if(g_temp.gridWidth == 0)
throw new Error("You must set width before run.");
}
}
/**
* run the gallery after init and set html
*/
function run(){
var selectedItem = g_gallery.getSelectedItem();
validateBeforeRun();
if(g_temp.isFirstTimeRun == true){
if(g_temp.isTilesMode == true){
initSizeParams();
g_tilesDesign.run();
}else{
g_thumbs.setHtmlProperties();
initSizeParams();
g_thumbs.loadThumbsImages();
}
initEvents();
}
positionThumbs();
if(g_temp.isFirstTimeRun == true && g_temp.isTilesMode){
var objTiles = g_thumbs.getThumbs();
//fire size change event
objTiles.each(function(index, tile){
g_objWrapper.trigger(g_temp.eventSizeChange, jQuery(tile));
});
objTiles.fadeTo(0,1);
}
if(selectedItem != null)
scrollToThumb(selectedItem.index);
//trigger pane change event on the start
g_objThis.trigger(t.events.PANE_CHANGE, g_temp.currentPane);
g_temp.isFirstTimeRun = false;
}
/**
* init grid size horizontal
* get height param
*/
function initSizeParamsHor(){
var arrThumbs = g_objInner.children(".ug-thumb-wrapper");
var firstThumb = jQuery(arrThumbs[0]);
var thumbsRealHeight = firstThumb.outerHeight();
//set grid size
var gridWidth = g_temp.gridWidth;
var gridHeight = g_options.grid_num_rows * thumbsRealHeight + (g_options.grid_num_rows-1) * g_options.grid_space_between_rows + g_options.grid_padding*2;
g_temp.gridHeight = gridHeight;
g_functions.setElementSize(g_objGrid, gridWidth, gridHeight);
//set inner size (as grid size, will be corrected after placing thumbs
g_functions.setElementSize(g_objInner, gridWidth, gridHeight);
//set initial inner size params
g_temp.innerWidth = gridWidth;
g_temp.innerHeight = gridHeight;
}
/**
* init size params vertical
*/
function initSizeParamsVert(){
//set thumb outer size:
var arrThumbs = g_objInner.children(".ug-thumb-wrapper");
var firstThumb = jQuery(arrThumbs[0]);
var thumbsRealWidth = firstThumb.outerWidth();
//set grid size
var gridWidth = g_options.grid_num_cols * thumbsRealWidth + (g_options.grid_num_cols-1) * g_options.grid_space_between_cols + g_options.grid_padding*2;
var gridHeight = g_temp.gridHeight;
g_temp.gridWidth = gridWidth;
g_functions.setElementSize(g_objGrid, gridWidth, gridHeight);
//set inner size (as grid size, will be corrected after placing thumbs
g_functions.setElementSize(g_objInner, gridWidth, gridHeight);
//set initial inner size params
g_temp.innerWidth = gridWidth;
g_temp.innerHeight = gridHeight;
}
/**
* init grid size
*/
function initSizeParams(){
if(g_temp.isHorizontal == false)
initSizeParamsVert();
else
initSizeParamsHor();
}
/**
* goto pane by index
*/
function scrollToThumb(thumbIndex){
var paneIndex = getPaneIndexByThumbIndex(thumbIndex);
if(paneIndex == -1)
return(false);
t.gotoPane(paneIndex, "scroll");
}
/**
* set the options of the strip
*/
function setOptions(objOptions){
g_options = jQuery.extend(g_options, objOptions);
g_thumbs.setOptions(objOptions);
}
/**
* position the thumbs and init panes horizontally
*/
function positionThumb_hor(){
var arrThumbs = g_objInner.children(".ug-thumb-wrapper");
var posx = 0;
var posy = 0;
var counter = 0;
var baseX = 0;
var maxx = 0, maxy = 0;
g_temp.innerWidth = 0;
g_temp.numPanes = 1;
g_temp.arrPanes = [];
g_temp.numThumbsInPane = 0;
//set first pane position
g_temp.arrPanes.push(baseX);
var numThumbs = arrThumbs.length;
for(i=0;i < numThumbs; i++){
var objThumb = jQuery(arrThumbs[i]);
g_functions.placeElement(objThumb, posx, posy);
var thumbWidth = objThumb.outerWidth();
var thumbHeight = objThumb.outerHeight();
//count maxx
if(posx > maxx)
maxx = posx;
//count maxy
var endY = posy + thumbHeight;
if(endY > maxy)
maxy = endY;
//count maxx end
var endX = maxx + thumbWidth;
if(endX > g_temp.innerWidth)
g_temp.innerWidth = endX;
posx += thumbWidth + g_options.grid_space_between_cols;
//next row
counter++;
if(counter >= g_options.grid_num_cols){
posy += thumbHeight + g_options.grid_space_between_rows;
posx = baseX;
counter = 0;
}
//count number thumbs in pane
if(g_temp.numPanes == 1)
g_temp.numThumbsInPane++;
//prepare next pane
if((posy + thumbHeight) > g_temp.gridHeight){
posy = 0;
baseX = g_temp.innerWidth + g_options.grid_space_between_cols;
posx = baseX;
counter = 0;
//correct max height size (do it once only)
if(g_temp.isMaxHeight == true && g_temp.numPanes == 1){
g_temp.gridHeight = maxy;
g_objGrid.height(g_temp.gridHeight);
}
//save next pane props (if exists)
if(i < (numThumbs - 1)){
g_temp.numPanes++;
//set next pane position
g_temp.arrPanes.push(baseX);
}
}
}
//set inner strip width and height
g_objInner.width(g_temp.innerWidth);
//set grid height
if(g_temp.isMaxHeight == true && g_temp.numPanes == 1){
g_temp.gridHeight = maxy;
g_objGrid.height(maxy);
}
}
/**
* position the thumbs and init panes vertically
*/
function positionThumb_vert(){
var arrThumbs = g_objInner.children(".ug-thumb-wrapper");
var posx = 0;
var posy = 0;
var maxy = 0;
var counter = 0;
var baseX = 0;
var paneStartY = 0;
g_temp.innerWidth = 0;
g_temp.numPanes = 1;
g_temp.arrPanes = [];
g_temp.numThumbsInPane = 0;
//set first pane position
g_temp.arrPanes.push(baseX);
var numThumbs = arrThumbs.length;
for(i=0;i < numThumbs; i++){
var objThumb = jQuery(arrThumbs[i]);
g_functions.placeElement(objThumb, posx, posy);
var thumbWidth = objThumb.outerWidth();
var thumbHeight = objThumb.outerHeight();
posx += thumbWidth + g_options.grid_space_between_cols;
var endy = (posy + thumbHeight);
if(endy > maxy)
maxy = endy;
//next row
counter++;
if(counter >= g_options.grid_num_cols){
posy += thumbHeight + g_options.grid_space_between_rows;
posx = baseX;
counter = 0;
}
//count number thumbs in pane
if(g_temp.numPanes == 1)
g_temp.numThumbsInPane++;
//prepare next pane
endy = (posy + thumbHeight);
var paneMaxY = paneStartY + g_temp.gridHeight;
//advance next pane
if(endy > paneMaxY){
//correct max height size (do it once only)
if(g_temp.isMaxHeight == true && g_temp.numPanes == 1){
g_temp.gridHeight = maxy;
g_objGrid.height(g_temp.gridHeight);
paneMaxY = g_temp.gridHeight;
}
posy = paneMaxY + g_options.grid_space_between_rows;
paneStartY = posy;
baseX = 0;
posx = baseX;
counter = 0;
//save next pane props (if exists)
if(i < (numThumbs - 1)){
g_temp.numPanes++;
//set next pane position
g_temp.arrPanes.push(posy);
}
}
}//for
//set inner height
g_objInner.height(maxy);
g_temp.innerHeight = maxy;
//set grid height
if(g_temp.isMaxHeight == true && g_temp.numPanes == 1){
g_temp.gridHeight = maxy;
g_objGrid.height(maxy);
}
}
/**
* position the thumbs horizontal type
*/
function positionThumb_hortype(){
var arrThumbs = g_objInner.children(".ug-thumb-wrapper");
var baseX = g_options.grid_padding;
var baseY = g_options.grid_padding;
var posy = baseY;
var posx = baseX;
var maxx = 0, maxy = 0, paneMaxY = 0;
var rowsCounter = 0;
g_temp.innerWidth = 0;
g_temp.numPanes = 1;
g_temp.arrPanes = [];
g_temp.numThumbsInPane = 0;
//set first pane position
g_temp.arrPanes.push(baseX-g_options.grid_padding);
var numThumbs = arrThumbs.length;
for(i=0;i < numThumbs; i++){
var objThumb = jQuery(arrThumbs[i]);
var thumbWidth = objThumb.outerWidth();
var thumbHeight = objThumb.outerHeight();
//check end of the size, start a new row
if((posx - baseX + thumbWidth) > g_temp.gridWidth){
rowsCounter++;
posy = 0;
if(rowsCounter >= g_options.grid_num_rows){
//change to a new pane
rowsCounter = 0;
baseX = posx;
paneMaxY = 0;
posy = baseY;
//change grid width to max width
if(g_temp.numPanes == 1){
g_temp.gridWidth = maxx+g_options.grid_padding;
g_objGrid.width(g_temp.gridWidth);
}
g_temp.numPanes++;
g_temp.arrPanes.push(baseX-g_options.grid_padding);
}else{ //start new line in existing pane
posx = baseX;
posy = paneMaxY + g_options.grid_space_between_rows;
}
}
//place the thumb
g_functions.placeElement(objThumb, posx, posy);
//count maxx
var endX = posx + thumbWidth;
if(endX > maxx)
maxx = endX;
//count maxy
var endY = posy + thumbHeight;
if(endY > paneMaxY)
paneMaxY = endY;
if(endY > maxy)
maxy = endY;
//count maxx end
var endX = maxx + thumbWidth;
if(endX > g_temp.innerWidth)
g_temp.innerWidth = endX;
posx += thumbWidth + g_options.grid_space_between_cols;
//count number thumbs in pane
if(g_temp.numPanes == 1)
g_temp.numThumbsInPane++;
}//end for
//set inner strip width and height
g_temp.innerWidth = maxx;
g_temp.innerHeight = paneMaxY;
g_objInner.width(g_temp.innerWidth);
g_objInner.height(g_temp.innerHeight);
//set grid height
if(g_temp.numPanes == 1){
g_temp.gridWidth = maxx + g_options.grid_padding;
g_temp.gridHeight = maxy + g_options.grid_padding;
g_objGrid.width(g_temp.gridWidth);
g_objGrid.height(g_temp.gridHeight);
}
}
/**
* position the thumbs and init panes related and width related vars
*/
function positionThumbs(){
if(g_temp.isHorizontal == false){ //position vertical type
if(g_temp.isNavigationVertical)
positionThumb_vert();
else
positionThumb_hor();
}else{
positionThumb_hortype();
}
}
/**
* validate thumb index
*/
function validateThumbIndex(thumbIndex){
if(thumbIndex < 0 || thumbIndex >= g_temp.numThumbs){
throw new Error("Thumb not exists: " + thumbIndex);
return(false);
}
return(true);
}
/**
*
* validate that the pane index exists
*/
function validatePaneIndex(paneIndex){
if(paneIndex >= g_temp.numPanes || paneIndex < 0){
throw new Error("Pane " + index + " doesn't exists.");
return(false);
}
return(true);
}
/**
* validate inner position
*/
function validateInnerPos(pos){
var absPos = Math.abs(pos);
if(g_temp.isNavigationVertical == false){
if(absPos < 0 || absPos >= g_temp.innerWidth){
throw new Error("wrong inner x position: " + pos);
return(false);
}
}else{
if(absPos < 0 || absPos >= g_temp.innerHeight){
throw new Error("wrong inner y position: " + pos);
return(false);
}
}
return(true);
}
/**
*
* set inner strip position
*/
function setInnerPos(pos){
var objCss = getInnerPosObj(pos);
if(objCss == false)
return(false);
g_objInner.css(objCss);
}
/**
* animate inner to some position
*/
function animateInnerTo(pos){
var objCss = getInnerPosObj(pos);
if(objCss == false)
return(false);
g_objInner.stop(true).animate(objCss ,{
duration: g_options.grid_transition_duration,
easing: g_options.grid_transition_easing,
queue: false
});
}
/**
* animate back to current pane
*/
function animateToCurrentPane(){
var innerPos = -g_temp.arrPanes[g_temp.currentPane];
animateInnerTo(innerPos);
}
function __________GETTERS_________(){};
/**
* get inner object size according the orientation
*/
function getInnerSize(){
if(g_temp.isNavigationVertical == true)
return(g_temp.innerHeight);
else
return(g_temp.innerWidth);
}
/**
* get pane width or height according the orientation
*/
function getPaneSize(){
if(g_temp.isNavigationVertical == true)
return(g_temp.gridHeight);
else
return(g_temp.gridWidth);
}
/**
* get object of iner position move
*/
function getInnerPosObj(pos){
var obj = {};
if(g_temp.isNavigationVertical == true)
obj.top = pos + "px";
else
obj.left = pos + "px";
return(obj);
}
/**
* get mouse position according the orientation
*/
function getMousePos(event){
var mousePos = g_functions.getMousePosition(event);
if(g_temp.isNavigationVertical == true)
return(mousePos.pageY);
else
return(mousePos.pageX);
}
/**
* get inner position according the orientation
*/
function getInnerPos(){
var objSize = g_functions.getElementSize(g_objInner);
if(g_temp.isNavigationVertical == true)
return(objSize.top);
else
return(objSize.left);
}
/**
* get pane by thumb index
*/
function getPaneIndexByThumbIndex(thumbIndex){
//validate thumb index
if(validateThumbIndex(thumbIndex) == false)
return(-1);
var numPane = Math.floor(thumbIndex / g_temp.numThumbsInPane);
return(numPane);
}
/**
* get position of some pane
*/
function getPanePosition(index){
var pos = g_temp.arrPanes[index];
return(pos);
}
/**
* return if passed some significant movement, for thumb click
*/
function isSignificantPassed(){
if(g_temp.numPanes == 1)
return(false);
var objData = g_functions.getStoredEventData(g_temp.storedEventID);
var passedTime = objData.diffTime;
var currentInnerPos = getInnerPos();
var passedDistanceAbs = Math.abs(currentInnerPos - objData.startInnerPos);
if(passedDistanceAbs > 30)
return(true);
if(passedDistanceAbs > 5 && passedTime > 300)
return(true);
return(false);
}
/**
* check if the movement that was held is valid for pane change
*/
function isMovementValidForChange(){
var objData = g_functions.getStoredEventData(g_temp.storedEventID);
//check position, if more then half, move
var currentInnerPos = getInnerPos();
diffPos = Math.abs(objData.startInnerPos - currentInnerPos);
var paneSize = getPaneSize();
var breakSize = Math.round(paneSize * 3 / 8);
if(diffPos >= breakSize)
return(true);
if(objData.diffTime < 300 && diffPos > 25)
return(true);
return(false);
}
/**
* return if passed some significant movement
*/
function isApproveTileClick(){
if(g_temp.numPanes == 1)
return(true);
var isApprove = g_functions.isApproveStoredEventClick(g_temp.storedEventID, g_temp.isNavigationVertical);
return(isApprove);
}
function __________EVENTS_______(){};
/**
* on thumb click event
*/
function onThumbClick(event){
//event.preventDefault();
if(isSignificantPassed() == true)
return(true);
//run select item operation
var objThumb = jQuery(this);
var objItem = g_thumbs.getItemByThumb(objThumb);
g_gallery.selectItem(objItem);
}
/**
* on touch start
*/
function onTouchStart(event){
if(g_temp.numPanes == 1)
return(true);
if(g_temp.touchActive == true)
return(true);
if(g_temp.isTilesMode == false)
event.preventDefault();
g_temp.touchActive = true;
var addData = {
startInnerPos: getInnerPos()
};
g_functions.storeEventData(event, g_temp.storedEventID, addData);
}
/**
* handle scroll top, return if scroll mode or not
*/
function handleScrollTop(objData){
if(g_temp.isNavigationVertical == true)
return(false);
if(Math.abs(objData.diffMouseY) < Math.abs(objData.diffMouseX))
return(false);
var currentScrollTop = jQuery(document).scrollTop();
var toScroll = objData.diffMouseY - currentScrollTop;
var scrollPos = objData.scrollTop - toScroll;
if(scrollPos > 0)
jQuery(document).scrollTop(scrollPos);
return(true);
}
/**
* on touch move
*/
function onTouchMove(event){
if(g_temp.touchActive == false)
return(true);
event.preventDefault();
g_functions.updateStoredEventData(event, g_temp.storedEventID);
var objData = g_functions.getStoredEventData(g_temp.storedEventID, g_temp.isNavigationVertical);
if(g_options.grid_vertical_scroll_ondrag == true){
var isScroll = handleScrollTop(objData);
if(isScroll)
return(true);
}
var diff = objData.diffMousePos;
var innerPos = objData.startInnerPos + diff;
var direction = (diff > 0) ? "prev":"next";
var lastPaneSize = g_temp.arrPanes[g_temp.numPanes-1];
//slow down when off limits
if(g_options.grid_carousel == false && innerPos > 0 && direction == "prev"){
innerPos = innerPos / 3;
}
//debugLine({lastSize:lastPaneSize,innerPos: innerPos});
if(g_options.grid_carousel == false && innerPos < -lastPaneSize && direction == "next"){
innerPos = objData.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);
g_functions.updateStoredEventData(event, g_temp.storedEventID);
var objData = g_functions.getStoredEventData(g_temp.storedEventID, g_temp.isNavigationVertical);
//event.preventDefault();
g_temp.touchActive = false;
if(isMovementValidForChange() == false){
animateToCurrentPane();
return(true);
}
//move pane or return back
var innerPos = getInnerPos();
var diff = innerPos - objData.startInnerPos;
var direction = (diff > 0) ? "prev":"next";
if(direction == "next"){
if(g_options.grid_carousel == false && t.isLastPane())
animateToCurrentPane();
else
t.nextPane();
}
else{
if(g_options.grid_carousel == false && t.isFirstPane()){
animateToCurrentPane();
}
else
t.prevPane();
}
}
/**
* on item change
*/
function onItemChange(){
var objItem = g_gallery.getSelectedItem();
g_thumbs.setThumbSelected(objItem.objThumbWrapper);
scrollToThumb(objItem.index);
}
/**
* init panel events
*/
function initEvents(){
if(g_temp.isTilesMode == false){
g_thumbs.initEvents();
var objThumbs = g_objGrid.find(".ug-thumb-wrapper");
objThumbs.on("click touchend",onThumbClick);
g_objGallery.on(g_gallery.events.ITEM_CHANGE, onItemChange);
}else{
g_tilesDesign.initEvents();
}
//touch drag events
//slider mouse down - drag start
g_objGrid.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);
}
/**
* destroy the events
*/
this.destroy = function(){
if(g_temp.isTilesMode == false){
var objThumbs = g_objGrid.find(".ug-thumb-wrapper");
objThumbs.off("click");
objThumbs.off("touchend");
g_objGallery.on(g_gallery.events.ITEM_CHANGE);
g_thumbs.destroy();
}else{
g_tilesDesign.destroy();
}
g_objGrid.unbind("mousedown");
g_objGrid.unbind("touchstart");
jQuery("body").unbind("mousemove");
jQuery("body").unbind("touchmove");
jQuery(window).add("body").unbind("touchend");
jQuery(window).add("body").unbind("mouseup");
g_objThis.off(t.events.PANE_CHANGE);
}
this.__________EXTERNAL_GENERAL_________ = function(){};
/**
* set the thumb unselected state
*/
this.setThumbUnselected = function(objThumbWrapper){
g_thumbs.setThumbUnselected(objThumbWrapper);
}
/**
* check if thmb item visible, means inside the visible part of the inner strip
*/
this.isItemThumbVisible = function(objItem){
var itemIndex = objItem.index;
var paneIndex = getPaneIndexByThumbIndex(itemIndex);
if(paneIndex == g_temp.currentPane)
return(true);
return(false);
}
this.__________EXTERNAL_API_________ = function(){};
/**
* get estimation of number of panes by the height of the grid.
*/
this.getNumPanesEstimationByHeight = function(gridHeight){
if(g_temp.isTilesMode == true){
var thumbHeight = g_options.tile_height;
}else{
var thumbsOptions = g_thumbs.getOptions();
var thumbHeight = thumbsOptions.thumb_height;
}
var numThumbs = g_thumbs.getNumThumbs();
var numRows = Math.ceil(numThumbs / g_options.grid_num_cols);
var totalHeight = numRows * thumbHeight + (numRows-1) * g_options.grid_space_between_rows;
var numPanes = Math.ceil(totalHeight / gridHeight);
return(numPanes);
}
/**
* get estimation of number of panes by the width of the grid.
*/
this.getNumPanesEstimationByWidth = function(gridWidth){
if(g_temp.isTilesMode){
var thumbWidth = g_options.tile_width;
}else{
var thumbsOptions = g_thumbs.getOptions();
var thumbWidth = thumbsOptions.thumb_width;
}
var numThumbs = g_thumbs.getNumThumbs();
var numCols = Math.ceil(numThumbs / g_options.grid_num_rows);
var totalWidth = numCols * thumbWidth + (numCols-1) * g_options.grid_space_between_cols;
var numPanes = Math.ceil(totalWidth / gridWidth);
return(numPanes);
}
/**
* get height estimation by width, works only in tiles mode
*/
this.getHeightEstimationByWidth = function(width){
if(g_temp.isTilesMode == false)
throw new Error("This function works only with tiles mode");
var numThumbs = g_thumbs.getNumThumbs();
var numCols = g_functions.getNumItemsInSpace(width, g_options.tile_width, g_options.grid_space_between_cols);
var numRows = Math.ceil(numThumbs / numCols);
if(numRows > g_options.grid_num_rows)
numRows = g_options.grid_num_rows;
var gridHeight = g_functions.getSpaceByNumItems(numRows, g_options.tile_height, g_options.grid_space_between_rows);
gridHeight += g_options.grid_padding * 2;
return(gridHeight);
}
/**
* get the grid element
*/
this.getElement = function(){
return(g_objGrid);
}
/**
* get element size and position
*/
this.getSize = function(){
var objSize = g_functions.getElementSize(g_objGrid);
return(objSize);
}
/**
* get number of panes
*/
this.getNumPanes = function(){
return(g_temp.numPanes);
}
/**
* get if the current pane is first
*/
this.isFirstPane = function(){
if(g_temp.currentPane == 0)
return(true);
return(false);
}
/**
* get if the current pane is last
*/
this.isLastPane = function(){
if(g_temp.currentPane == (g_temp.numPanes -1) )
return(true);
return(false);
}
/**
* get pane number, and num panes
*/
this.getPaneInfo = function(){
var obj = {
pane: g_temp.currentPane,
total: g_temp.numPanes
};
return(obj);
}
/**
* get current pane
*/
this.getPane = function(){
return(g_temp.currentPane);
}
/**
* set grid width (horizontal type)
*/
this.setWidth = function(gridWidth){
g_temp.gridWidth = gridWidth;
g_temp.isHorizontal = true;
}
/**
* set max width, the width will be corrected by the number of items
* set vertical type
*/
this.setMaxWidth = function(maxWidth){
g_temp.gridWidth = maxWidth;
g_temp.isMaxWidth = true;
g_temp.isHorizontal = true;
}
/**
* set grid height (vertical type)
*/
this.setHeight = function(gridHeight){
g_temp.gridHeight = gridHeight;
g_temp.isHorizontal = false;
}
/**
* set max height, the height will be corrected by the number of items
* set the vertical type
*/
this.setMaxHeight = function(maxHeight){
g_temp.gridHeight = maxHeight;
g_temp.isMaxHeight = true;
g_temp.isHorizontal = false;
}
/**
* goto some pane
* force skip current pane checks
*/
this.gotoPane = function(index, fromWhere){
if(validatePaneIndex(index) == false)
return(false);
if(index == g_temp.currentPane)
return(false);
var innerPos = -g_temp.arrPanes[index];
g_temp.currentPane = index;
animateInnerTo(innerPos);
//trigger pane change event
g_objThis.trigger(t.events.PANE_CHANGE, index);
}
/**
* foreward to the next pane
*/
this.nextPane = function(){
var nextPaneIndex = g_temp.currentPane+1;
if(nextPaneIndex >= g_temp.numPanes){
if(g_options.grid_carousel == false)
return(true);
nextPaneIndex = 0;
}
t.gotoPane(nextPaneIndex, "next");
}
/**
* foreward to the next pane
*/
this.prevPane = function(){
var prevPaneIndex = g_temp.currentPane-1;
if(prevPaneIndex < 0){
prevPaneIndex = g_temp.numPanes-1;
if(g_options.grid_carousel == false)
return(false);
}
t.gotoPane(prevPaneIndex, "prev");
}
/**
* set next pane button
*/
this.attachNextPaneButton = function(objButton){
g_functions.setButtonOnClick(objButton, t.nextPane);
if(g_options.grid_carousel == true)
return(true);
if(t.isLastPane())
objButton.addClass("ug-button-disabled");
//set disabled button class if first pane
g_objThis.on(t.events.PANE_CHANGE, function(){
if(t.isLastPane())
objButton.addClass("ug-button-disabled");
else
objButton.removeClass("ug-button-disabled");
});
}
/**
* set prev pane button
*/
this.attachPrevPaneButton = function(objButton){
g_functions.setButtonOnClick(objButton, t.prevPane);
if(g_options.grid_carousel == true)
return(true);
if(t.isFirstPane())
objButton.addClass("ug-button-disabled");
//set disabled button class if first pane
g_objThis.on(t.events.PANE_CHANGE, function(){
if(t.isFirstPane())
objButton.addClass("ug-button-disabled");
else
objButton.removeClass("ug-button-disabled");
});
}
/**
* attach bullets object
*/
this.attachBullets = function(objBullets){
objBullets.setActive(g_temp.currentPane);
jQuery(objBullets).on(objBullets.events.BULLET_CLICK, function(data, numBullet){
t.gotoPane(numBullet, "theme");
objBullets.setActive(numBullet);
});
jQuery(t).on(t.events.PANE_CHANGE, function(data, numPane){
objBullets.setActive(numPane);
});
}
/**
* get tile design object
*/
this.getObjTileDesign = function(){
return g_tilesDesign;
}
/**
* init function
*/
this.init = function(gallery, customOptions, isTilesMode){
init(gallery, customOptions, isTilesMode);
}
/**
* set html and properties
*/
this.run = function(){
run();
}
/**
* set html
*/
this.setHtml = function(parentContainer){
setHtml(parentContainer);
}
}