// unite gallery, version: 1.7.45, released 27 feb 2017 var imgzoom = 1; var smallimgheight = 68; /** * write something to debug line */ function debugline(html, addrandom, addhtml) { if (html === true) html = "true"; if (html === false) html = "false"; var output = html; if (typeof html == "object") { output = ""; for (name in html) { var value = html[name]; output += " " + name + ": " + value; } } if (addrandom == true && !addhtml) output += " " + math.random(); if (addhtml == true) { var objline = jquery("#debug_line"); objline.width(200); if (objline.height() >= 500) objline.html(""); var currenthtml = objline.html(); output = currenthtml + "
--------------
" + output; } jquery("#debug_line").show().html(output); } /** * * debug side some object */ function debugside(obj) { var html = ""; for (name in obj) { var value = obj[name]; html += name + " : " + value + "
"; } jquery("#debug_side").show().html(html); } /** * output some string to console */ function trace(str) { if (typeof console != "undefined") console.log(str); } /** -------------- ugfunctions class ---------------------*/ function ugfunctions() { var g_browserprefix = null; var t = this; var g_temp = { startime: 0, arrthemes: [], istouchdevice: -1, isrgbasupported: -1, timecache: {}, datacache: {}, lasteventtype: "", //for validate touchstart click lasteventtime: 0, lasttouchstartelement: null, touchthreshold: 700, handle: null //interval handle }; this.debugvar = ""; this.z__________full_screen___________ = function () { } /** * move to full screen mode * fullscreen id - the id of current fullscreen */ this.tofullscreen = function (element, fullscreenid) { if (element.requestfullscreen) { element.requestfullscreen(); } else if (element.mozrequestfullscreen) { element.mozrequestfullscreen(); } else if (element.webkitrequestfullscreen) { element.webkitrequestfullscreen(); } else if (element.msrequestfullscreen) { element.msrequestfullscreen(); } else { return (false); } return (true); } /** * exit full screen mode * return if operation success (or if fullscreen mode supported) */ this.exitfullscreen = function () { if (t.isfullscreen() == false) return (false); if (document.exitfullscreen) { document.exitfullscreen(); } else if (document.cancelfullscreen) { document.cancelfullscreen(); } else if (document.mozcancelfullscreen) { document.mozcancelfullscreen(); } else if (document.webkitexitfullscreen) { document.webkitexitfullscreen(); } else if (document.msexitfullscreen) { document.msexitfullscreen(); } else { return (false); } return (true); } /** * cross browser attach even function */ function addevent(evnt, elem, func) { if (elem.addeventlistener) // w3c dom elem.addeventlistener(evnt, func, false); else if (elem.attachevent) { // ie dom elem.attachevent("on" + evnt, func); } else { // no much to do elem[evnt] = func; } } /** * add fullscreen event to some function */ this.addfullscreenchangeevent = function (func) { if (document["webkitcancelfullscreen"]) addevent("webkitfullscreenchange", document, func); else if (document["msexitfullscreen"]) addevent("msfullscreenchange", document, func); else if (document["mozcancelfullscreen"]) addevent("mozfullscreenchange", document, func); else addevent("fullscreenchange", document, func); } /** * destroy the full screen change event */ this.destroyfullscreenchangeevent = function () { jquery(document).unbind("fullscreenchange"); jquery(document).unbind("mozfullscreenchange"); jquery(document).unbind("webkitfullscreenchange"); jquery(document).unbind("msfullscreenchange"); } /** * get the fullscreen element */ this.getfullscreenelement = function () { var fullscreenelement = document.fullscreenelement || document.mozfullscreenelement || document.webkitfullscreenelement || document.msfullscreenelement; return (fullscreenelement); } /** * return if fullscreen enabled */ this.isfullscreen = function () { var isfullscreen = document.fullscreen || document.mozfullscreen || document.webkitisfullscreen || document.msfullscreenelement; if (!isfullscreen) isfullscreen = false; else isfullscreen = true; return (isfullscreen); } this.z__________get_props___________ = function () { } /** * get browser prefix, can be empty if not detected. */ this.getbrowserprefix = function () { if (g_browserprefix !== null) return g_browserprefix; var arrayofprefixes = ['webkit', 'moz', 'ms', 'o']; var div = document.createelement("div"); for (var index in arrayofprefixes) { var prefix = arrayofprefixes[index]; if (prefix + "transform" in div.style) { prefix = prefix.tolowercase(); g_browserprefix = prefix; return (prefix); } } g_browserprefix = ""; return ""; } /** * get image inside parent data by image (find parent and size) * scalemode: fit, down, fill, fitvert */ this.getimageinsideparentdatabyimage = function (objimage, scalemode, objpadding) { var objparent = objimage.parent(); var objorgsize = t.getimageoriginalsize(objimage); var objdata = t.getimageinsideparentdata(objparent, objorgsize.width, objorgsize.height, scalemode, objpadding); return (objdata); } /** * get data of image inside parent * scalemode: fit, down, fill, fitvert */ this.getimageinsideparentdata = function (objparent, originalwidth, originalheight, scalemode, objpadding, maxwidth, maxheight) { if (!objpadding) var objpadding = {}; var objoutput = {}; if (typeof maxwidth === "undefined") var maxwidth = objparent.width(); if (typeof maxheight === "undefined") var maxheight = objparent.height(); if (objpadding.padding_left) maxwidth -= objpadding.padding_left; if (objpadding.padding_right) maxwidth -= objpadding.padding_right; if (objpadding.padding_top) maxheight -= objpadding.padding_top; if (objpadding.padding_bottom) maxheight -= objpadding.padding_bottom; var imagewidth = null; var imageheight = "100%"; var imagetop = null; var imageleft = null; var style = "display:block;margin:0px auto;"; if (originalwidth > 0 && originalheight > 0) { //get image size and position if (scalemode == "down" && originalwidth < maxwidth && originalheight < maxheight) { imageheight = originalheight; imagewidth = originalwidth; imageleft = (maxwidth - imagewidth) / 2; imagetop = (maxheight - imageheight) / 2; } else if (scalemode == "fill") { var ratio = originalwidth / originalheight; imageheight = maxheight; imagewidth = imageheight * ratio; if (imagewidth < maxwidth) { imagewidth = maxwidth; imageheight = imagewidth / ratio; //center y position imageleft = 0; imagetop = math.round((imageheight - maxheight) / 2 * -1); } else { //center x position imagetop = 0; imageleft = math.round((imagewidth - maxwidth) / 2 * -1); } } else { //fit to borders var ratio = originalwidth / originalheight; imageheight = maxheight; imagewidth = imageheight * ratio; imagetop = 0; imageleft = (maxwidth - imagewidth) / 2; if (scalemode != "fitvert" && imagewidth > maxwidth) { imagewidth = maxwidth; imageheight = imagewidth / ratio; imageleft = 0; imagetop = (maxheight - imageheight) / 2; } } imagewidth = math.floor(imagewidth); imageheight = math.floor(imageheight); imagetop = math.floor(imagetop); imageleft = math.floor(imageleft); style = "position:absolute;"; } //set padding if (objpadding.padding_top) imagetop += objpadding.padding_top; if (objpadding.padding_left) imageleft += objpadding.padding_left; objoutput.imagewidth = imagewidth; objoutput.imageheight = imageheight; objoutput.imagetop = imagetop; objoutput.imageleft = imageleft; objoutput.imageright = imageleft + imagewidth; if (imagetop == 0 || imageheight == "100%") objoutput.imagebottom = null; else objoutput.imagebottom = imagetop + imageheight; objoutput.style = style; return (objoutput); } /** * get element center position inside parent * even if the object bigger than the parent */ this.getelementcenterposition = function (element, objpadding) { var parent = element.parent(); var objsize = t.getelementsize(element); var objsizeparent = t.getelementsize(parent); var parentwidth = objsizeparent.width; var parentheight = objsizeparent.height; if (objpadding && objpadding.padding_top !== undefined) parentheight -= objpadding.padding_top; if (objpadding && objpadding.padding_bottom !== undefined) parentheight -= objpadding.padding_bottom; if (objpadding && objpadding.padding_left !== undefined) parentwidth -= objpadding.padding_left; if (objpadding && objpadding.padding_right !== undefined) parentwidth -= objpadding.padding_right; var output = {}; output.left = math.round((parentwidth - objsize.width) / 2); output.top = math.round((parentheight - objsize.height) / 2); if (objpadding && objpadding.padding_top !== undefined) output.top += objpadding.padding_top; if (objpadding && objpadding.padding_left !== undefined) output.left += objpadding.padding_left; return (output); } /** * get the center of the element * includeparent - including left / right related to the parent */ this.getelementcenterpoint = function (element, includeparent) { if (!includeparent) var includeparent = false; var objsize = t.getelementsize(element); var output = {}; output.x = objsize.width / 2; output.y = objsize.height / 2; if (includeparent == true) { output.x += objsize.left; output.y += objsize.top; } output.x = math.round(output.x); output.y = math.round(output.y); return (output); } /** * * get mouse position from the event * optimised to every device */ this.getmouseposition = function (event, element) { var output = { pagex: event.pagex, pagey: event.pagey, clientx: event.clientx, clienty: event.clienty }; if (event.originalevent && event.originalevent.touches && event.originalevent.touches.length > 0) { output.pagex = event.originalevent.touches[0].pagex; output.pagey = event.originalevent.touches[0].pagey; output.clientx = event.originalevent.touches[0].clientx; output.clienty = event.originalevent.touches[0].clienty; } /** * get element's mouse position */ if (element) { var elementpos = element.offset(); output.mousex = output.pagex - elementpos.left; output.mousey = output.pagey - elementpos.top; } return (output); } /** * get mouse element related point from page related point */ this.getmouseelementpoint = function (point, element) { //rename the input and output var newpoint = { x: point.pagex, y: point.pagey }; var elementpoint = t.getelementlocalpoint(newpoint, element); return (elementpoint); } /** * get element local point from global point position */ this.getelementlocalpoint = function (point, element) { var elementpoint = {}; var elementpos = element.offset(); elementpoint.x = math.round(point.x - elementpos.left); elementpoint.y = math.round(point.y - elementpos.top); return (elementpoint); } /** * get image oritinal size * if originalwidth, originalheight is set, just return them. */ this.getimageoriginalsize = function (objimage, originalwidth, originalheight) { if (typeof originalwidth != "undefined" && typeof originalheight != "undefined") return ({ width: originalwidth, height: originalheight }); var htmlimage = objimage[0]; if (typeof htmlimage == "undefined") throw new error("getimageoriginalsize error - image not found"); var output = {}; if (typeof htmlimage.naturalwidth == "undefined") { //check from cache if (typeof objimage.data("naturalwidth") == "number") { var output = {}; output.width = objimage.data("naturalwidth"); output.height = objimage.data("naturalheight"); return (output); } //load new image var newimg = new image(); newimg.src = htmlimage.src; if (newimg.complete) { output.width = newimg.width; output.height = newimg.height; //caching objimage.data("naturalwidth", output.width); objimage.data("naturalheight", output.height); return (output); } return ({ width: 0, height: 0 }); } else { output.width = htmlimage.naturalwidth; output.height = htmlimage.naturalheight; return (output); } } /** * get current image ratio from original size */ this.getimageratio = function (objimage) { var originalsize = t.getimageoriginalsize(objimage); var size = t.getelementsize(objimage); var ratio = size.width / originalsize.width; return (ratio); } /** * tells if the image fit the parent (smaller then the parent) */ this.isimagefitparent = function (objimage) { var objparent = objimage.parent(); var sizeimage = t.getelementsize(objimage); var sizeparent = t.getelementsize(objparent); if (sizeimage.width <= sizeparent.width && sizeimage.height <= sizeparent.height) return (true); return (false); } /** * get size and position of some object */ this.getelementsize = function (element) { if (element === undefined) { throw new error("can't get size, empty element"); } var obj = element.position(); obj.height = element.outerheight(); obj.width = element.outerwidth(); obj.left = math.round(obj.left); obj.top = math.round(obj.top); obj.right = obj.left + obj.width; obj.bottom = obj.top + obj.height; return (obj); } /** * return true if the element is bigger then it's parent */ this.iselementbiggerthenparent = function (element) { var objparent = element.parent(); var objsizeelement = t.getelementsize(element); var objsizeparent = t.getelementsize(objparent); if (objsizeelement.width > objsizeparent.width || objsizeelement.height > objsizeparent.height) return (true); return (false); } /** * tells if the mouse point inside image * the mouse point is related to image pos */ this.ispointinsideelement = function (point, objsize) { var ismousexinside = (point.x >= 0 && point.x < objsize.width); if (ismousexinside == false) return (false); var ismouseyinside = (point.y >= 0 && point.y < objsize.height); if (ismouseyinside == false) return (false); return (true); } /** * get element relative position according the parent * if the left / top is offset text (left , center, right / top, middle , bottom) * the element can be number size as well */ this.getelementrelativepos = function (element, pos, offset, objparent) { if (!objparent) var objparent = element.parent(); if (typeof element == "number") { var elementsize = { width: element, height: element }; } else var elementsize = t.getelementsize(element); var parentsize = t.getelementsize(objparent); switch (pos) { case "top": case "left": pos = 0; if (offset) pos += offset; break; case "center": pos = math.round((parentsize.width - elementsize.width) / 2); if (offset) pos += offset; break; case "right": pos = parentsize.width - elementsize.width; if (offset) pos -= offset; break; case "middle": pos = math.round((parentsize.height - elementsize.height) / 2); if (offset) pos += offset; break; case "bottom": pos = parentsize.height - elementsize.height; if (offset) pos -= offset; break; } return (pos); } this.z_________set_element_props_______ = function () { } /** * * zoom image inside parent * the mouse point is page offset position, can be null * return true if zoomed and false if not zoomed */ this.zoomimageinsideparent = function (objimage, zoomin, step, point, scalemode, maxzoomratio, objpadding) { if (!step) var step = 1.2; if (!scalemode) var scalemode = "fit"; var zoomratio = step; var objparent = objimage.parent(); var objsize = t.getelementsize(objimage); var objoriginalsize = t.getimageoriginalsize(objimage); var ismouseinside = false; var newheight, newwidth, panx = 0, pany = 0, newx, newy, panorientx = 0, panorienty = 0; if (!point) { ismouseinside = false; } else { var pointimg = t.getmouseelementpoint(point, objimage); ismouseinside = t.ispointinsideelement(pointimg, objsize); //if mouse point outside image, set orient to image center panorientx = pointimg.x; panorienty = pointimg.y; } if (ismouseinside == false) { var imgcenterpoint = t.getelementcenterpoint(objimage); panorientx = imgcenterpoint.x; panorienty = imgcenterpoint.y; } //zoom: if (zoomin == true) { //zoom in newheight = objsize.height * zoomratio; newwidth = objsize.width * zoomratio; if (panorientx != 0) panx = -(panorientx * zoomratio - panorientx); if (panorienty != 0) pany = -(panorienty * zoomratio - panorienty); } else { //zoom out newheight = objsize.height / zoomratio; newwidth = objsize.width / zoomratio; var objscaledata = t.getimageinsideparentdata(objparent, objoriginalsize.width, objoriginalsize.height, scalemode, objpadding); //go back to original size if (newwidth < objscaledata.imagewidth) { t.scaleimagefitparent(objimage, objoriginalsize.width, objoriginalsize.height, scalemode, objpadding); return (true); } if (ismouseinside == true) { if (panorientx != 0) panx = -(panorientx / zoomratio - panorientx); if (panorienty != 0) pany = -(panorienty / zoomratio - panorienty); } } //check max zoom ratio, ix exeeded, abort if (maxzoomratio) { var expectedzoomratio = 1; if (objoriginalsize.width != 0) expectedzoomratio = newwidth / objoriginalsize.width; if (expectedzoomratio > maxzoomratio) return (false); } //resize the element t.setelementsize(objimage, newwidth, newheight); //set position: //if zoom out and mouse point not inside image, //get the image to center if (zoomin == false && ismouseinside == false) { var poscenter = t.getelementcenterposition(objimage); newx = poscenter.left; newy = poscenter.top; } else { newx = objsize.left + panx; newy = objsize.top + pany; } t.placeelement(objimage, newx, newy); return (true); } /** * place some element to some position * if the left / top is offset text (left , center, right / top, middle , bottom) * then put it in parent by the offset. */ this.placeelement = function (element, left, top, offsetleft, offsettop, objparent) { if (jquery.isnumeric(left) == false || jquery.isnumeric(top) == false) { if (!objparent) var objparent = element.parent(); var elementsize = t.getelementsize(element); var parentsize = t.getelementsize(objparent); } //select left position if (jquery.isnumeric(left) == false) { switch (left) { case "left": left = 0; if (offsetleft) left += offsetleft; break; case "center": left = math.round((parentsize.width - elementsize.width) / 2); if (offsetleft) left += offsetleft; break; case "right": left = parentsize.width - elementsize.width; if (offsetleft) left -= offsetleft; break; } } //select top position if (jquery.isnumeric(top) == false) { switch (top) { case "top": top = 0; if (offsettop) top += offsettop; break; case "middle": case "center": top = math.round((parentsize.height - elementsize.height) / 2); if (offsettop) top += offsettop; break; case "bottom": top = parentsize.height - elementsize.height; if (offsettop) top -= offsettop; break; } } var objcss = { "position": "absolute", "margin": "0px" }; if (left !== null) objcss.left = left; if (top !== null) objcss.top = top; element.css(objcss); } /** * place element inside parent center. * the element should be absolute position */ this.placeelementinparentcenter = function (element) { t.placeelement(element, "center", "middle"); } /** * set element size and position */ this.setelementsizeandposition = function (element, left, top, width, height) { var objcss = { "width": width + "px", "height": height + "px", "left": left + "px", "top": top + "px", "position": "absolute", "margin": "0px" } element.css(objcss); } /** * set widht and height of the element */ this.setelementsize = function (element, width, height) { var objcss = { "width": width + "px" } if (height !== null && typeof height != "undefined") objcss["height"] = height + "px" element.css(objcss); } /** * clone element size and position */ this.cloneelementsizeandpos = function (objsource, objtarget, isouter, offsetx, offsety) { var objsize = objsource.position(); if (objsize == undefined) { throw new error("can't get size, empty element"); } if (isouter === true) { objsize.height = objsource.outerheight(); objsize.width = objsource.outerwidth(); } else { objsize.height = objsource.height(); objsize.width = objsource.width(); } objsize.left = math.round(objsize.left); objsize.top = math.round(objsize.top); if (offsetx) objsize.left += offsetx; if (offsety) objsize.top += offsety; t.setelementsizeandposition(objtarget, objsize.left, objsize.top, objsize.width, objsize.height); } /** * place image inside parent, scale it by the options * and scale it to fit the parent. * scalemode: fit, down, fill */ this.placeimageinsideparent = function (urlimage, objparent, originalwidth, originalheight, scalemode, objpadding) { var obj = t.getimageinsideparentdata(objparent, originalwidth, originalheight, scalemode, objpadding); //set html image: var htmlimage = " realmax) value = realmax; } return (value); } /** * * get "real" setting from normalized setting */ this.getnormalizedvalue = function (realmin, realmax, settingmin, settingmax, realvalue) { var ratio = (realvalue - realmin) / (realmax - realmin); realvalue = realmin + (settingmax - settingmin) * ratio; return (realvalue); } /** * get distance between 2 points */ this.getdistance = function (x1, y1, x2, y2) { var distance = math.round(math.sqrt(math.abs(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))))); return distance; } /** * get center point of the 2 points */ this.getmiddlepoint = function (x1, y1, x2, y2) { var output = {} output.x = x1 + math.round((x2 - x1) / 2); output.y = y1 + math.round((y2 - y1) / 2); return (output); } /** * get number of items in space width gap * even item sizes * by lowest */ this.getnumitemsinspace = function (spacesize, itemssize, gapsize) { var numitems = math.floor((spacesize + gapsize) / (itemssize + gapsize)); return (numitems); } /** * get number of items in space width gap * even item sizes * by math.round */ this.getnumitemsinspaceround = function (spacesize, itemssize, gapsize) { var numitems = math.round((spacesize + gapsize) / (itemssize + gapsize)); return (numitems); } /** * get space (width in carousel for example) by num items, item size, and gap size */ this.getspacebynumitems = function (numitems, itemsize, gapsize) { var space = numitems * itemsize + (numitems - 1) * gapsize; return (space); } /** * get item size by space and gap */ this.getitemsizeinspace = function (spacesize, numitems, gapsize) { var itemsize = math.floor((spacesize - (numitems - 1) * gapsize) / numitems); return (itemsize); } /** * get column x pos with even column sizes, start from 0 */ this.getcolx = function (col, colwidth, colgap) { var posx = col * (colwidth + colgap); return posx; } /** * get column number by index */ this.getcolbyindex = function (numcols, index) { var col = index % numcols; return (col); } /** * get col and row by index */ this.getcolrowbyindex = function (index, numcols) { var row = math.floor(index / numcols); var col = math.floor(index % numcols); return ({ col: col, row: row }); } /** * get index by row, col, numcols */ this.getindexbyrowcol = function (row, col, numcols) { if (row < 0) return (-1); if (col < 0) return (-1); var index = row * numcols + col; return (index); } /** * get previous row item in the same column */ this.getprevrowsamecolindex = function (index, numcols) { var obj = t.getcolrowbyindex(index, numcols); var previndex = t.getindexbyrowcol(obj.row - 1, obj.col, numcols); return (previndex); } /** * get next row item in the same column */ this.getnextrowsamecolindex = function (index, numcols) { var obj = t.getcolrowbyindex(index, numcols); var nextindex = t.getindexbyrowcol(obj.row + 1, obj.col, numcols); return (nextindex); } this.z_________data_functions_______ = function () { } /** * set data value */ this.setglobaldata = function (key, value) { jquery.data(document.body, key, value); } /** * get global data */ this.getglobaldata = function (key) { var value = jquery.data(document.body, key); return (value); } this.z_________event_data_functions_______ = function () { } /** * handle scroll top, return if scroll mode or not */ this.handlescrolltop = function (storedeventid) { if (t.istouchdevice() == false) return (null); var objdata = t.getstoredeventdata(storedeventid); var horpass = 15; var vertpass = 15; //check if need to set some movement if (objdata.scrolldir === null) { if (math.abs(objdata.diffmousex) > horpass) objdata.scrolldir = "hor"; else if (math.abs(objdata.diffmousey) > vertpass && math.abs(objdata.diffmousey) > math.abs(objdata.diffmousex)) { objdata.scrolldir = "vert"; objdata.scrollstarty = objdata.lastmouseclienty; objdata.scrollorigin = jquery(document).scrolltop(); g_temp.datacache[storedeventid].scrollstarty = objdata.lastmouseclienty; g_temp.datacache[storedeventid].scrollorigin = objdata.scrollorigin; } //update scrolldir g_temp.datacache[storedeventid].scrolldir = objdata.scrolldir; } if (objdata.scrolldir !== "vert") return (objdata.scrolldir); var currentscroll = jquery(document).scrolltop(); var scrollpos = objdata.scrollorigin - (objdata.lastmouseclienty - objdata.scrollstarty); if (scrollpos >= 0) jquery(document).scrolltop(scrollpos); return (objdata.scrolldir); } /** * return true / false if was vertical scrolling */ this.wasverticalscroll = function (storedeventid) { var objdata = t.getstoredeventdata(storedeventid); if (objdata.scrolldir === "vert") return (true); return (false); } /** * store event data */ this.storeeventdata = function (event, id, adddata) { var mousepos = t.getmouseposition(event); var time = jquery.now(); var obj = { starttime: time, lasttime: time, startmousex: mousepos.pagex, startmousey: mousepos.pagey, lastmousex: mousepos.pagex, lastmousey: mousepos.pagey, startmouseclienty: mousepos.clienty, lastmouseclienty: mousepos.clienty, scrolltop: jquery(document).scrolltop(), scrolldir: null }; if (adddata) obj = jquery.extend(obj, adddata); g_temp.datacache[id] = obj; } /** * update event data with last position */ this.updatestoredeventdata = function (event, id, adddata) { if (!g_temp.datacache[id]) throw new error("updateeventdata error: must have stored cache object"); var obj = g_temp.datacache[id]; var mousepos = t.getmouseposition(event); obj.lasttime = jquery.now(); if (mousepos.pagex !== undefined) { obj.lastmousex = mousepos.pagex; obj.lastmousey = mousepos.pagey; obj.lastmouseclienty = mousepos.clienty; } if (adddata) obj = jquery.extend(obj, adddata); g_temp.datacache[id] = obj; } /** * get stored event data */ this.getstoredeventdata = function (id, isvertical) { if (!g_temp.datacache[id]) throw new error("updateeventdata error: must have stored cache object"); var obj = g_temp.datacache[id]; obj.diffmousex = obj.lastmousex - obj.startmousex; obj.diffmousey = obj.lastmousey - obj.startmousey; obj.diffmouseclienty = obj.lastmouseclienty - obj.startmouseclienty; obj.difftime = obj.lasttime - obj.starttime; //get mouse position according orientation if (isvertical === true) { obj.startmousepos = obj.lastmousey; obj.lastmousepos = obj.lastmousey; obj.diffmousepos = obj.diffmousey; } else { obj.startmousepos = obj.lastmousex; obj.lastmousepos = obj.lastmousex; obj.diffmousepos = obj.diffmousex; } return (obj); } /** * return if click event approved according the done motion */ this.isapprovestoredeventclick = function (id, isvertical) { if (!g_temp.datacache[id]) return (true); var objdata = t.getstoredeventdata(id, isvertical); var passeddistanceabs = math.abs(objdata.diffmousepos); if (objdata.difftime > 400) return (false); if (passeddistanceabs > 30) return (false); return (true); } /** * clear stored event data */ this.clearstoredeventdata = function (id) { g_temp.datacache[id] = null; } this.z_________check_support_functions_______ = function () { } /** * is canvas exists in the browser */ this.iscanvasexists = function () { var canvas = jquery(' ')[0]; if (typeof canvas.getcontext == "function") return (true); return (false); } /** * tells if vertical scrollbar exists */ this.isscrollbarexists = function () { var hasscrollbar = window.innerwidth > document.documentelement.clientwidth; return (hasscrollbar); } /** * check if this device are touch enabled */ this.istouchdevice = function () { //get from cache if (g_temp.istouchdevice !== -1) return (g_temp.istouchdevice); try { document.createevent("touchevent"); g_temp.istouchdevice = true; } catch (e) { g_temp.istouchdevice = false; } return (g_temp.istouchdevice); } /** * check if */ this.isrgbasupported = function () { if (g_temp.isrgbasupported !== -1) return (g_temp.isrgbasupported); var scriptelement = document.getelementsbytagname('script')[0]; var prevcolor = scriptelement.style.color; try { scriptelement.style.color = 'rgba(1,5,13,0.44)'; } catch (e) { } var result = scriptelement.style.color != prevcolor; scriptelement.style.color = prevcolor; g_temp.isrgbasupported = result; return result; } this.z_________general_functions_______ = function () { } /** * check if current jquery version is more then minimal version * version can be "1.8.0" for example */ this.checkminjqueryversion = function (version) { var arrcurrent = jquery.fn.jquery.split('.'); var arrmin = version.split('.'); for (var i = 0, len = arrcurrent.length; i < len; i++) { var numcurrent = parseint(arrcurrent[i]); var nummin = parseint(arrmin[i]); if (typeof arrmin[i] == "undefined") return (true); if (nummin > numcurrent) return (false); if (numcurrent > nummin) return (true); } //if all equal then all ok return true; } /** * get css size parameter, like width. if % given, leave it, if number without px - add px. */ this.getcsssizeparam = function (sizeparam) { if (jquery.isnumeric(sizeparam)) return (sizeparam + "px"); return (sizeparam); } /** * convert hex color to rgb color */ this.converthextorgb = function (hexinput, opacity) { var hex = hexinput.replace('#', ''); if (hex === hexinput) return (hexinput); r = parseint(hex.substring(0, 2), 16); g = parseint(hex.substring(2, 4), 16); b = parseint(hex.substring(4, 6), 16); result = 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')'; return result; } /** * get timestamp to string */ this.timestamptostring = function (stamp) { var d = new date(stamp); var str = d.getdate() + "/" + d.getmonth(); str += " " + d.gethours() + ":" + d.getminutes() + ":" + d.getseconds() + ":" + d.getmilliseconds(); return (str); } /** * get touches array (if exists) from the event */ this.getarrtouches = function (event) { var arrtouches = []; if (event.originalevent && event.originalevent.touches && event.originalevent.touches.length > 0) { arrtouches = event.originalevent.touches; } return (arrtouches); } /** * extract touch positions from arrtouches */ this.getarrtouchpositions = function (arrtouches) { var arroutput = []; for (var i = 0; i < arrtouches.length; i++) { var point = { pagex: arrtouches[i].pagex, pagey: arrtouches[i].pagey }; arroutput.push(point); } return (arroutput); } /** * start time debug */ this.starttimedebug = function () { g_temp.startime = jquery.now(); } /** * show time debug */ this.showtimedebug = function () { var endtime = jquery.now(); var difftime = endtime - g_temp.startime; debugline({ "time passed": difftime }, true); } /** * put progress indicator to some parent by type * return the progress indicator object */ this.initprogressindicator = function (type, options, objparent) { //check canvas compatability if (type != "bar" && t.iscanvasexists() == false) type = "bar"; //put the progress indicator switch (type) { case "bar": var g_objprogress = new ugprogressbar(); g_objprogress.puthidden(objparent, options); break; default: case "pie": var g_objprogress = new ugprogresspie(); g_objprogress.puthidden(objparent, options); break; case "pie2": options.type_fill = true; var g_objprogress = new ugprogresspie(); g_objprogress.puthidden(objparent, options); break; } return (g_objprogress); } /** * add to button ug-nohover class on ipad * need to be processed in css */ this.setbuttonmobileready = function (objbutton) { objbutton.on("touchstart", function (event) { //event.preventdefault(); jquery(this).addclass("ug-nohover"); }); objbutton.on("mousedown touchend", function (event) { //debugline("button touchend",true,true); //event.preventdefault(); event.stoppropagation(); event.stopimmediatepropagation(); //debugline(event.type, true, true); return (false); }); } /** * register gallery theme */ this.registertheme = function (themename) { g_temp.arrthemes.push(themename); } /** * get themes array */ this.getarrthemes = function () { return (g_temp.arrthemes); } /** * check if theme exists */ this.isthemeregistered = function (theme) { if (jquery.inarray(theme, g_temp.arrthemes) !== -1) return (true); return (false); } /** * get first registered theme name */ this.getfirstregisteredtheme = function () { if (g_temp.arrthemes.length == 0) return (""); var themename = g_temp.arrthemes[0]; return (themename); } /** * function checks if enought time passsed between function calls. * good for filtering same time events */ this.istimepassed = function (handlername, timelimit) { if (!timelimit) var timelimit = 100; var currenttime = jquery.now(); if (g_temp.timecache.hasownproperty(handlername) == false) lasttime = 0; else lasttime = g_temp.timecache[handlername]; var difftime = currenttime - lasttime; g_temp.timecache[handlername] = currenttime; //debugline(difftime,true,true); if (difftime <= timelimit) return (false); return (true); } /** * check if continious event is over like resize */ this.whencontiniouseventover = function (handlername, oneventover, timelimit) { if (!timelimit) var timelimit = 300; if (g_temp.timecache.hasownproperty(handlername) == true && g_temp.timecache[handlername] != null) { cleartimeout(g_temp.timecache[handlername]); g_temp.timecache[handlername] = null; } g_temp.timecache[handlername] = settimeout(oneventover, timelimit); } /** * validate click and touchstart events. * if click comes after touchstart, return false. */ this.validateclicktouchstartevent = function (eventtype) { var returnval = true; var diff = jquery.now() - g_temp.lasteventtime; //debugline({lasttype:g_temp.lasteventtype, diff:diff},true, true); if (eventtype == "click" && g_temp.lasteventtype == "touchstart" && diff < 1000) returnval = false; g_temp.lasteventtime = jquery.now(); g_temp.lasteventtype = eventtype; return (returnval); } /** * add some class on hover (hover event) */ this.addclassonhover = function (element, classname) { if (!classname) var classname = "ug-button-hover"; element.hover(function () { jquery(this).addclass(classname); }, function () { jquery(this).removeclass(classname); }); } /** * destroy hover effect on elements */ this.destroybutton = function (element) { element.off("mouseenter"); element.off("mouseleave"); element.off("click"); element.off("touchstart"); element.off("touchend"); element.off("mousedown"); element.off("tap"); } /** * set button on click event, advanced */ this.setbuttononclick = function (objbutton, onclickfunction) { t.setbuttonmobileready(objbutton); objbutton.on("click touchstart", function (event) { objthis = jquery(this); event.stoppropagation(); event.stopimmediatepropagation(); if (t.validateclicktouchstartevent(event.type) == false) return (true); onclickfunction(objthis, event); }); } /** * set button on tap */ this.setbuttonontap = function (objbutton, onclickfunction) { //set the event objbutton.on("tap", onclickfunction); //set tap event trigger if (t.istouchdevice() == false) { objbutton.on("click", function (event) { var objelement = jquery(this); if (t.validateclicktouchstartevent(event.type) == false) return (true); objelement.trigger("tap"); }); } else { //set tap event objbutton.on("touchstart", function (event) { var objelement = jquery(this); objelement.addclass("ug-nohover"); g_temp.lasttouchstartelement = jquery(this); g_temp.lasteventtime = jquery.now(); }); objbutton.on("touchend", function (event) { var objelement = jquery(this); //validate same element if (objelement.is(g_temp.lasttouchstartelement) == false) return (true); //validate time passed if (!g_temp.lasteventtime) return (true); var timepassed = jquery.now() - g_temp.lasteventtime; if (timepassed > g_temp.touchthreshold) return (true); objelement.trigger("tap"); }); } } /** * load javascript dynamically */ this.loadjs = function (url, addprotocol) { if (addprotocol === true) url = location.protocol + "//" + url; var tag = document.createelement('script'); tag.src = url; var firstscripttag = document.getelementsbytagname('script')[0]; firstscripttag.parentnode.insertbefore(tag, firstscripttag); } /** * load css dymanically */ this.loadcss = function (url, addprotocol) { if (addprotocol === true) url = location.protocol + "//" + url; var tag = document.createelement("link"); tag.setattribute("rel", "stylesheet"); tag.setattribute("type", "text/css"); tag.setattribute("href", url); document.getelementsbytagname("head")[0].appendchild(tag); } /** * add event listener with old browsers fallback */ this.addevent = function (elem, event, func) { if (typeof (elem.addeventlistener) != "undefined") { elem.addeventlistener(event, func, false); } else if (elem.attachevent) { elem.attachevent('on' + event, func); } } /** * fire event where all images are loaded */ this.checkimagesloaded = function (objimages, oncomplete, onprogress) { var arrimages = []; var counter = 0; var numimages = objimages.length; //if no images - exit if (numimages == 0 && oncomplete) { oncomplete(); return (false); } //nested function function checkcomplete(image, iserror) { counter++; if (typeof onprogress == "function") { settimeout(function () { onprogress(image, iserror); }); } if (counter == numimages && typeof oncomplete == "function") { settimeout(function () { oncomplete(); }); } } //start a little later settimeout(function () { //start the function for (var index = 0; index < numimages; index++) { var image = objimages[index]; //arrimages.push(jquery(image)); if (image.naturalwidth !== undefined && image.naturalwidth !== 0) { checkcomplete(objimages[index], false); } else { var proxyimage = jquery(''); proxyimage.data("index", index); proxyimage.on("load", function () { var index = jquery(this).data("index"); checkcomplete(objimages[index], false); }); proxyimage.on("error", function () { var index = jquery(this).data("index"); checkcomplete(objimages[index], true); }); proxyimage.attr("src", image.src); } } }); } /** * run the function when the element size will be not 0 */ this.waitforwidth = function (element, func) { var width = element.width(); if (width != 0) { func(); return (false); } g_temp.handle = setinterval(function () { width = element.width(); if (width != 0) { clearinterval(g_temp.handle); func(); } }, 300); } /** * shuffle (randomise) array */ this.arrayshuffle = function (arr) { if (typeof arr != "object") return (arr); for (var j, x, i = arr.length; i; j = parseint(math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x); return arr; } /** * get object length */ this.getobjectlength = function (object) { var num = 0; for (var item in object) num++; return num; } /** * normalize the percent, return always between 0 and 1 */ this.normalizepercent = function (percent) { if (percent < 0) percent = 0; if (percent > 1) percent = 1; return (percent); } /** * strip tags from string */ this.striptags = function (html) { var text = html.replace(/(<([^>]+)>)/ig, ""); return (text); } /** * escape double slash */ this.escapedoubleslash = function (str) { return str.replace('"', '\"'); } /** * html entitles */ this.htmlentitles = function (html) { var text = jquery('
').text(html).html(); return (text); } this.z_________end_general_functions_______ = function () { } } var g_ugfunctions = new ugfunctions(); /** -------------- end ugfunctions class ---------------------*/ /** -------------- mousewheel ---------------------*/ !function (e) { "function" == typeof define && define.amd ? define(["jquery"], e) : "object" == typeof exports ? module.exports = e : e(jquery) }(function (e) { function t(t) { var s = t || window.event, a = h.call(arguments, 1), u = 0, r = 0, d = 0, f = 0; if (t = e.event.fix(s), t.type = "mousewheel", "detail" in s && (d = -1 * s.detail), "wheeldelta" in s && (d = s.wheeldelta), "wheeldeltay" in s && (d = s.wheeldeltay), "wheeldeltax" in s && (r = -1 * s.wheeldeltax), "axis" in s && s.axis === s.horizontal_axis && (r = -1 * d, d = 0), u = 0 === d ? r : d, "deltay" in s && (d = -1 * s.deltay, u = d), "deltax" in s && (r = s.deltax, 0 === d && (u = -1 * r)), 0 !== d || 0 !== r) { if (1 === s.deltamode) { var c = e.data(this, "mousewheel-line-height"); u *= c, d *= c, r *= c } else if (2 === s.deltamode) { var m = e.data(this, "mousewheel-page-height"); u *= m, d *= m, r *= m } return f = math.max(math.abs(d), math.abs(r)), (!l || l > f) && (l = f, i(s, f) && (l /= 40)), i(s, f) && (u /= 40, r /= 40, d /= 40), u = math[u >= 1 ? "floor" : "ceil"](u / l), r = math[r >= 1 ? "floor" : "ceil"](r / l), d = math[d >= 1 ? "floor" : "ceil"](d / l), t.deltax = r, t.deltay = d, t.deltafactor = l, t.deltamode = 0, a.unshift(t, u, r, d), o && cleartimeout(o), o = settimeout(n, 200), (e.event.dispatch || e.event.handle).apply(this, a) } } function n() { l = null } function i(e, t) { return r.settings.adjustolddeltas && "mousewheel" === e.type && t % 120 === 0 } var o, l, s = ["wheel", "mousewheel", "dommousescroll", "mozmousepixelscroll"], a = "onwheel" in document || document.documentmode >= 9 ? ["wheel"] : ["mousewheel", "dommousescroll", "mozmousepixelscroll"], h = array.prototype.slice; if (e.event.fixhooks) for (var u = s.length; u;) e.event.fixhooks[s[--u]] = e.event.mousehooks; var r = e.event.special.mousewheel = { version: "3.1.9", setup: function () { if (this.addeventlistener) for (var n = a.length; n;) this.addeventlistener(a[--n], t, !1); else this.onmousewheel = t; e.data(this, "mousewheel-line-height", r.getlineheight(this)), e.data(this, "mousewheel-page-height", r.getpageheight(this)) }, teardown: function () { if (this.removeeventlistener) for (var e = a.length; e;) this.removeeventlistener(a[--e], t, !1); else this.onmousewheel = null }, getlineheight: function (t) { return parseint(e(t)["offsetparent" in e.fn ? "offsetparent" : "parent"]().css("fontsize"), 10) }, getpageheight: function (t) { return e(t).height() }, settings: { adjustolddeltas: !0 } }; e.fn.extend({ mousewheel: function (e) { return e ? this.bind("mousewheel", e) : this.trigger("mousewheel") }, unmousewheel: function (e) { return this.unbind("mousewheel", e) } }) }); /** -------------- easing functions ---------------------*/ (function (factory) { if (typeof define === "function" && define.amd) { define(["jquery"], function ($) { return factory($) }) } else if (typeof module === "object" && typeof module.exports === "object") { exports = factory(require("jquery")) } else { factory(jquery) } })(function ($) { $.easing["jswing"] = $.easing["swing"]; var pow = math.pow, sqrt = math.sqrt, sin = math.sin, cos = math.cos, pi = math.pi, c1 = 1.70158, c2 = c1 * 1.525, c3 = c1 + 1, c4 = 2 * pi / 3, c5 = 2 * pi / 4.5; function bounceout(x) { var n1 = 7.5625, d1 = 2.75; if (x < 1 / d1) { return n1 * x * x } else if (x < 2 / d1) { return n1 * (x -= 1.5 / d1) * x + .75 } else if (x < 2.5 / d1) { return n1 * (x -= 2.25 / d1) * x + .9375 } else { return n1 * (x -= 2.625 / d1) * x + .984375 } } $.extend($.easing, { def: "easeoutquad", swing: function (x) { return $.easing[$.easing.def](x) }, easeinquad: function (x) { return x * x }, easeoutquad: function (x) { return 1 - (1 - x) * (1 - x) }, easeinoutquad: function (x) { return x < .5 ? 2 * x * x : 1 - pow(-2 * x + 2, 2) / 2 }, easeincubic: function (x) { return x * x * x }, easeoutcubic: function (x) { return 1 - pow(1 - x, 3) }, easeinoutcubic: function (x) { return x < .5 ? 4 * x * x * x : 1 - pow(-2 * x + 2, 3) / 2 }, easeinquart: function (x) { return x * x * x * x }, easeoutquart: function (x) { return 1 - pow(1 - x, 4) }, easeinoutquart: function (x) { return x < .5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2 }, easeinquint: function (x) { return x * x * x * x * x }, easeoutquint: function (x) { return 1 - pow(1 - x, 5) }, easeinoutquint: function (x) { return x < .5 ? 16 * x * x * x * x * x : 1 - pow(-2 * x + 2, 5) / 2 }, easeinsine: function (x) { return 1 - cos(x * pi / 2) }, easeoutsine: function (x) { return sin(x * pi / 2) }, easeinoutsine: function (x) { return -(cos(pi * x) - 1) / 2 }, easeinexpo: function (x) { return x === 0 ? 0 : pow(2, 10 * x - 10) }, easeoutexpo: function (x) { return x === 1 ? 1 : 1 - pow(2, -10 * x) }, easeinoutexpo: function (x) { return x === 0 ? 0 : x === 1 ? 1 : x < .5 ? pow(2, 20 * x - 10) / 2 : (2 - pow(2, -20 * x + 10)) / 2 }, easeincirc: function (x) { return 1 - sqrt(1 - pow(x, 2)) }, easeoutcirc: function (x) { return sqrt(1 - pow(x - 1, 2)) }, easeinoutcirc: function (x) { return x < .5 ? (1 - sqrt(1 - pow(2 * x, 2))) / 2 : (sqrt(1 - pow(-2 * x + 2, 2)) + 1) / 2 }, easeinelastic: function (x) { return x === 0 ? 0 : x === 1 ? 1 : -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * c4) }, easeoutelastic: function (x) { return x === 0 ? 0 : x === 1 ? 1 : pow(2, -10 * x) * sin((x * 10 - .75) * c4) + 1 }, easeinoutelastic: function (x) { return x === 0 ? 0 : x === 1 ? 1 : x < .5 ? -(pow(2, 20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2 : pow(2, -20 * x + 10) * sin((20 * x - 11.125) * c5) / 2 + 1 }, easeinback: function (x) { return c3 * x * x * x - c1 * x * x }, easeoutback: function (x) { return 1 + c3 * pow(x - 1, 3) + c1 * pow(x - 1, 2) }, easeinoutback: function (x) { return x < .5 ? pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2 }, easeinbounce: function (x) { return 1 - bounceout(1 - x) }, easeoutbounce: bounceout, easeinoutbounce: function (x) { return x < .5 ? (1 - bounceout(1 - 2 * x)) / 2 : (1 + bounceout(2 * x - 1)) / 2 } }) }); /** -------------- jquery color animations ---------------------*/ !function (r, n) { if (typeof r.csshooks == "undefined") //error protection return (false); function t(r, n, t) { var e = f[n.type] || {}; return null == r ? t || !n.def ? null : n.def : (r = e.floor ? ~~r : parsefloat(r), isnan(r) ? n.def : e.mod ? (r + e.mod) % e.mod : 0 > r ? 0 : e.max < r ? e.max : r) } function e(n) { var t = l(), e = t._rgba = []; return n = n.tolowercase(), h(u, function (r, o) { var a, s = o.re.exec(n), i = s && o.parse(s), u = o.space || "rgba"; return i ? (a = t[u](i), t[c[u].cache] = a[c[u].cache], e = t._rgba = a._rgba, !1) : void 0 }), e.length ? ("0,0,0,0" === e.join() && r.extend(e, a.transparent), t) : a[n] } function o(r, n, t) { return t = (t + 1) % 1, 1 > 6 * t ? r + (n - r) * t * 6 : 1 > 2 * t ? n : 2 > 3 * t ? r + (n - r) * (2 / 3 - t) * 6 : r } var a, s = "backgroundcolor borderbottomcolor borderleftcolor borderrightcolor bordertopcolor color columnrulecolor outlinecolor textdecorationcolor textemphasiscolor", i = /^([\-+])=\s*(\d+\.?\d*)/, u = [{ re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, parse: function (r) { return [r[1], r[2], r[3], r[4]] } }, { re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, parse: function (r) { return [2.55 * r[1], 2.55 * r[2], 2.55 * r[3], r[4]] } }, { re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, parse: function (r) { return [parseint(r[1], 16), parseint(r[2], 16), parseint(r[3], 16)] } }, { re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, parse: function (r) { return [parseint(r[1] + r[1], 16), parseint(r[2] + r[2], 16), parseint(r[3] + r[3], 16)] } }, { re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, space: "hsla", parse: function (r) { return [r[1], r[2] / 100, r[3] / 100, r[4]] } }], l = r.color = function (n, t, e, o) { return new r.color.fn.parse(n, t, e, o) }, c = { rgba: { props: { red: { idx: 0, type: "byte" }, green: { idx: 1, type: "byte" }, blue: { idx: 2, type: "byte" } } }, hsla: { props: { hue: { idx: 0, type: "degrees" }, saturation: { idx: 1, type: "percent" }, lightness: { idx: 2, type: "percent" } } } }, f = { "byte": { floor: !0, max: 255 }, percent: { max: 1 }, degrees: { mod: 360, floor: !0 } }, p = l.support = {}, d = r("

")[0], h = r.each; d.style.csstext = "background-color:rgba(1,1,1,.5)", p.rgba = d.style.backgroundcolor.indexof("rgba") > -1, h(c, function (r, n) { n.cache = "_" + r, n.props.alpha = { idx: 3, type: "percent", def: 1 } }), l.fn = r.extend(l.prototype, { parse: function (o, s, i, u) { if (o === n) return this._rgba = [null, null, null, null], this; (o.jquery || o.nodetype) && (o = r(o).css(s), s = n); var f = this, p = r.type(o), d = this._rgba = []; return s !== n && (o = [o, s, i, u], p = "array"), "string" === p ? this.parse(e(o) || a._default) : "array" === p ? (h(c.rgba.props, function (r, n) { d[n.idx] = t(o[n.idx], n) }), this) : "object" === p ? (o instanceof l ? h(c, function (r, n) { o[n.cache] && (f[n.cache] = o[n.cache].slice()) }) : h(c, function (n, e) { var a = e.cache; h(e.props, function (r, n) { if (!f[a] && e.to) { if ("alpha" === r || null == o[r]) return; f[a] = e.to(f._rgba) } f[a][n.idx] = t(o[r], n, !0) }), f[a] && r.inarray(null, f[a].slice(0, 3)) < 0 && (f[a][3] = 1, e.from && (f._rgba = e.from(f[a]))) }), this) : void 0 }, is: function (r) { var n = l(r), t = !0, e = this; return h(c, function (r, o) { var a, s = n[o.cache]; return s && (a = e[o.cache] || o.to && o.to(e._rgba) || [], h(o.props, function (r, n) { return null != s[n.idx] ? t = s[n.idx] === a[n.idx] : void 0 })), t }), t }, _space: function () { var r = [], n = this; return h(c, function (t, e) { n[e.cache] && r.push(t) }), r.pop() }, transition: function (r, n) { var e = l(r), o = e._space(), a = c[o], s = 0 === this.alpha() ? l("transparent") : this, i = s[a.cache] || a.to(s._rgba), u = i.slice(); return e = e[a.cache], h(a.props, function (r, o) { var a = o.idx, s = i[a], l = e[a], c = f[o.type] || {}; null !== l && (null === s ? u[a] = l : (c.mod && (l - s > c.mod / 2 ? s += c.mod : s - l > c.mod / 2 && (s -= c.mod)), u[a] = t((l - s) * n + s, o))) }), this[o](u) }, blend: function (n) { if (1 === this._rgba[3]) return this; var t = this._rgba.slice(), e = t.pop(), o = l(n)._rgba; return l(r.map(t, function (r, n) { return (1 - e) * o[n] + e * r })) }, torgbastring: function () { var n = "rgba(", t = r.map(this._rgba, function (r, n) { return null == r ? n > 2 ? 1 : 0 : r }); return 1 === t[3] && (t.pop(), n = "rgb("), n + t.join() + ")" }, tohslastring: function () { var n = "hsla(", t = r.map(this.hsla(), function (r, n) { return null == r && (r = n > 2 ? 1 : 0), n && 3 > n && (r = math.round(100 * r) + "%"), r }); return 1 === t[3] && (t.pop(), n = "hsl("), n + t.join() + ")" }, tohexstring: function (n) { var t = this._rgba.slice(), e = t.pop(); return n && t.push(~~(255 * e)), "#" + r.map(t, function (r) { return r = (r || 0).tostring(16), 1 === r.length ? "0" + r : r }).join("") }, tostring: function () { return 0 === this._rgba[3] ? "transparent" : this.torgbastring() } }), l.fn.parse.prototype = l.fn, c.hsla.to = function (r) { if (null == r[0] || null == r[1] || null == r[2]) return [null, null, null, r[3]]; var n, t, e = r[0] / 255, o = r[1] / 255, a = r[2] / 255, s = r[3], i = math.max(e, o, a), u = math.min(e, o, a), l = i - u, c = i + u, f = .5 * c; return n = u === i ? 0 : e === i ? 60 * (o - a) / l + 360 : o === i ? 60 * (a - e) / l + 120 : 60 * (e - o) / l + 240, t = 0 === l ? 0 : .5 >= f ? l / c : l / (2 - c), [math.round(n) % 360, t, f, null == s ? 1 : s] }, c.hsla.from = function (r) { if (null == r[0] || null == r[1] || null == r[2]) return [null, null, null, r[3]]; var n = r[0] / 360, t = r[1], e = r[2], a = r[3], s = .5 >= e ? e * (1 + t) : e + t - e * t, i = 2 * e - s; return [math.round(255 * o(i, s, n + 1 / 3)), math.round(255 * o(i, s, n)), math.round(255 * o(i, s, n - 1 / 3)), a] }, h(c, function (e, o) { var a = o.props, s = o.cache, u = o.to, c = o.from; l.fn[e] = function (e) { if (u && !this[s] && (this[s] = u(this._rgba)), e === n) return this[s].slice(); var o, i = r.type(e), f = "array" === i || "object" === i ? e : arguments, p = this[s].slice(); return h(a, function (r, n) { var e = f["object" === i ? r : n.idx]; null == e && (e = p[n.idx]), p[n.idx] = t(e, n) }), c ? (o = l(c(p)), o[s] = p, o) : l(p) }, h(a, function (n, t) { l.fn[n] || (l.fn[n] = function (o) { var a, s = r.type(o), u = "alpha" === n ? this._hsla ? "hsla" : "rgba" : e, l = this[u](), c = l[t.idx]; return "undefined" === s ? c : ("function" === s && (o = o.call(this, c), s = r.type(o)), null == o && t.empty ? this : ("string" === s && (a = i.exec(o), a && (o = c + parsefloat(a[2]) * ("+" === a[1] ? 1 : -1))), l[t.idx] = o, this[u](l))) }) }) }), l.hook = function (n) { var t = n.split(" "); h(t, function (n, t) { r.csshooks[t] = { set: function (n, o) { var a, s, i = ""; if ("transparent" !== o && ("string" !== r.type(o) || (a = e(o)))) { if (o = l(a || o), !p.rgba && 1 !== o._rgba[3]) { for (s = "backgroundcolor" === t ? n.parentnode : n; ("" === i || "transparent" === i) && s && s.style;) try { i = r.css(s, "backgroundcolor"), s = s.parentnode } catch (u) { } o = o.blend(i && "transparent" !== i ? i : "_default") } o = o.torgbastring() } try { n.style[t] = o } catch (u) { } } }, r.fx.step[t] = function (n) { n.colorinit || (n.start = l(n.elem, t), n.end = l(n.end), n.colorinit = !0), r.csshooks[t].set(n.elem, n.start.transition(n.end, n.pos)) } }) }, l.hook(s), r.csshooks.bordercolor = { expand: function (r) { var n = {}; return h(["top", "right", "bottom", "left"], function (t, e) { n["border" + e + "color"] = r }), n } }, a = r.color.names = { aqua: "#00ffff", black: "#000000", blue: "#0000ff", fuchsia: "#ff00ff", gray: "#808080", green: "#008000", lime: "#00ff00", maroon: "#800000", navy: "#000080", olive: "#808000", purple: "#800080", red: "#ff0000", silver: "#c0c0c0", teal: "#008080", white: "#ffffff", yellow: "#ffff00", transparent: [null, null, null, 0], _default: "#ffffff" } }(jquery); /** -------------- some general functions ---------------------*/ /** * ismouseover function - check if the mouse over some object */ !function (t) { function e() { try { var i = this === document ? t(this) : t(this).contents(); } catch (error) { return (false); } i.mousemove(function (e) { t.mlp = { x: e.pagex, y: e.pagey } }), i.find("iframe").on("load", e) } t.mlp = { x: 0, y: 0 }, t(e), t.fn.ismouseover = function () { var e = !1; return this.eq(0).each(function () { var i = t(this).is("iframe") ? t(this).contents().find("body") : t(this), n = i.offset(); e = n.left <= t.mlp.x && n.left + i.outerwidth() > t.mlp.x && n.top <= t.mlp.y && n.top + i.outerheight() > t.mlp.y }), e } }(jquery); function ugthumbsgeneral() { var t = this, g_objthis = jquery(t); var g_gallery = new unitegallerymain(), g_objgallery, g_objects, g_objwrapper; var g_arritems, g_objstrip, g_objparent; var g_functions = new ugfunctions(); var g_strip; var outer_options; this.type = { get_thumbs_all: "all", get_thumbs_ratio: "ratio", get_thumbs_no_ratio: "no_ratio", get_thumbs_new: "new" }; this.events = { setoverstyle: "thumbmouseover", setnormalstyle: "thumbmouseout", setselectedstyle: "thumbsetselected", placeimage: "thumbplaceimage", afterplaceimage: "thumb_after_place_image", imageloaderror: "thumbimageloaderror", thumb_image_loaded: "thumb_image_loaded" }; var g_options = { thumb_width: 88, //thumb width thumb_height: 50, //thumb height thumb_fixed_size: true, //true,false - fixed/dynamic thumbnail width thumb_resize_by: "height", //set resize by width or height of the image in case of non fixed size, thumb_border_effect: true, //true, false - specify if the thumb has border thumb_border_width: 0, //thumb border width thumb_border_color: "#000000", //thumb border color thumb_over_border_width: 0, //thumb border width in mouseover state thumb_over_border_color: "#d9d9d9", //thumb border color in mouseover state thumb_selected_border_width: 1, //thumb width in selected state thumb_selected_border_color: "#d9d9d9", //thumb border color in selected state thumb_round_corners_radius: 0, //thumb border radius thumb_color_overlay_effect: true, //true,false - thumb color overlay effect, release the overlay on mouseover and selected states thumb_overlay_color: "#000000", //thumb overlay color thumb_overlay_opacity: 0.4, //thumb overlay color opacity thumb_overlay_reverse: false, //true,false - reverse the overlay, will be shown on selected state only thumb_image_overlay_effect: false, //true,false - images orverlay effect on normal state only thumb_image_overlay_type: "bw", //bw , blur, sepia - the type of image effect overlay, black and white, sepia and blur. thumb_transition_duration: 200, //thumb effect transition duration thumb_transition_easing: "easeoutquad", //thumb effect transition easing thumb_show_loader: true, //show thumb loader while loading the thumb thumb_loader_type: "dark", //dark, light - thumb loader type thumb_wrapper_as_link: false, //set thumb as link thumb_link_newpage: false //set the link to open newpage } var g_temp = { touchenabled: false, num_thumbs_checking: 0, customthumbs: false, funcsetcustomthumbhtml: null, iseffectborder: false, iseffectoverlay: false, iseffectimage: false, coloroverlayopacity: 1, thumbinnerreduce: 0, allowonresize: true, //allow onresize event classnewthumb: "ug-new-thumb" }; var g_serviceparams = { //service variables timeout_thumb_check: 100, thumb_max_check_times: 600, //60 seconds eventsizechange: "thumb_size_change" }; /** * init the thumbs object */ this.init = function (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); //set effects vars: g_temp.iseffectborder = g_options.thumb_border_effect; g_temp.iseffectoverlay = g_options.thumb_color_overlay_effect; g_temp.iseffectimage = g_options.thumb_image_overlay_effect; } this._____________external_setters__________ = function () { }; /** * append html from item */ function appendhtmlthumbfromitem(itemindex, imageeffectclass) { var objitem = g_arritems[itemindex]; var classaddition = ""; if (g_temp.customthumbs == false) classaddition = " ug-thumb-generated"; var zindex = objitem.index + 1; var thumbstyle = "style='z-index:" + zindex + ";'"; var htmlthumb = "

"; if (g_options.thumb_wrapper_as_link == true) { var urllink = objitem.link; if (objitem.link == "") urllink = "javascript:void(0)"; var linktarget = ""; if (g_options.thumb_link_newpage == true && objitem.link) linktarget = " target='_blank'"; var htmlthumb = ""; } var objthumbwrapper = jquery(htmlthumb); var objimage = objitem.objthumbimage; if (g_temp.customthumbs == false) { if (g_options.thumb_show_loader == true && objimage) { var loaderclass = "ug-thumb-loader-dark"; if (g_options.thumb_loader_type == "bright") loaderclass = "ug-thumb-loader-bright"; objthumbwrapper.append("
"); objthumbwrapper.append(""); } if (objimage) { objimage.addclass("ug-thumb-image"); //if image overlay effects active, clone the image, and set the effects class on it if (g_options.thumb_image_overlay_effect == true) { var objimageoverlay = objimage.clone().appendto(objthumbwrapper); objimageoverlay.addclass("ug-thumb-image-overlay " + imageeffectclass).removeclass("ug-thumb-image"); objimageoverlay.fadeto(0, 0); objitem.objimageoverlay = objimageoverlay; } objthumbwrapper.append(objimage); } }//end if not custom thumb if (g_temp.iseffectborder) objthumbwrapper.append("
"); if (g_temp.iseffectoverlay) objthumbwrapper.append("
"); g_objparent.append(objthumbwrapper); //only custom thumbs function if (g_temp.customthumbs) { g_temp.funcsetcustomthumbhtml(objthumbwrapper, objitem); } //add thumb wrapper object to items array g_arritems[itemindex].objthumbwrapper = objthumbwrapper; return (objthumbwrapper); } /** * append the thumbs html to some parent */ this.sethtmlthumbs = function (objparent, isappend) { g_objparent = objparent; //set image effect class if (g_temp.iseffectimage == true) { var imageeffectclass = getimageeffectsclass(); } if (isappend !== true) { //set all thumbs var numitems = g_gallery.getnumitems(); //append thumbs to strip for (var i = 0; i < numitems; i++) { appendhtmlthumbfromitem(i, imageeffectclass); } } else { //append only new items, mark only new added thumbs as new thumbs var objthumbs = t.getthumbs(); objthumbs.removeclass(g_temp.classnewthumb); var arrnewindexes = g_gallery.getnewaddeditemsindexes(); jquery.each(arrnewindexes, function (i, itemindex) { var objthumbwrapper = appendhtmlthumbfromitem(itemindex, imageeffectclass); objthumbwrapper.addclass(g_temp.classnewthumb); }); } } function _______________setters______________() { }; /** * set thumb size with all the inside components (without the image). * else, set to all the thumbs */ function setthumbsize(width, height, objthumb, inneronly) { var objcss = { width: width + "px", height: height + "px" }; var objcssinner = { width: width - g_temp.thumbinnerreduce + "px", height: height - g_temp.thumbinnerreduce + "px" }; var selectorsstring = ".ug-thumb-loader, .ug-thumb-error, .ug-thumb-border-overlay, .ug-thumb-overlay"; //set thumb size if (objthumb) { if (inneronly !== true) objthumb.css(objcss); objthumb.find(selectorsstring).css(objcssinner); } else { //set to all items g_objparent.children(".ug-thumb-wrapper").css(objcss); g_objparent.find(selectorsstring).css(objcssinner); } } /** * set thumb border effect */ function setthumbbordereffect(objthumb, borderwidth, bordercolor, noanimation) { if (!noanimation) var noanimation = false; if (g_gallery.isfakefullscreen()) noanimation = true; var objborderoverlay = objthumb.children(".ug-thumb-border-overlay"); //set the border to thumb and not to overlay if no border size transition /* if(g_options.thumb_border_width == g_options.thumb_over_border_width && g_options.thumb_border_width == g_options.thumb_selected_border_width) objborderoverlay = objthumb; */ var objcss = {}; objcss["border-width"] = borderwidth + "px"; if (borderwidth != 0) objcss["border-color"] = bordercolor; if (noanimation && noanimation === true) { objborderoverlay.css(objcss); if (borderwidth == 0) objborderoverlay.hide(); else objborderoverlay.show(); } else { if (borderwidth == 0) objborderoverlay.stop().fadeout(g_options.thumb_transition_duration); else objborderoverlay.show().stop().fadein(g_options.thumb_transition_duration); animatethumb(objborderoverlay, objcss); } } /** * set thumb border effect */ function setthumbcoloroverlayeffect(objthumb, isactive, noanimation) { var objoverlay = objthumb.children(".ug-thumb-overlay"); var animationduration = g_options.thumb_transition_duration; if (noanimation && noanimation === true) animationduration = 0; if (isactive) { objoverlay.stop(true).fadeto(animationduration, g_temp.coloroverlayopacity); } else { objoverlay.stop(true).fadeto(animationduration, 0); } } /** * set thumbnail bw effect */ function setthumbimageoverlayeffect(objthumb, isactive, noanimation) { var objimage = objthumb.children("img.ug-thumb-image"); var objimageoverlay = objthumb.children("img.ug-thumb-image-overlay"); var animationduration = g_options.thumb_transition_duration; if (noanimation && noanimation === true) animationduration = 0; if (isactive) { objimageoverlay.stop(true).fadeto(animationduration, 1); } else { //show the image, hide the overlay objimage.fadeto(0, 1); objimageoverlay.stop(true).fadeto(animationduration, 0); } } /** * on thumb mouse out - return the thumb style to original */ this.setthumbnormalstyle = function (objthumb, noanimation, fromwhere) { if (g_temp.customthumbs == true) { objthumb.removeclass("ug-thumb-over"); } if (g_temp.iseffectborder) setthumbbordereffect(objthumb, g_options.thumb_border_width, g_options.thumb_border_color, noanimation); if (g_temp.iseffectoverlay) { var isset = (g_options.thumb_overlay_reverse == true) ? false : true; setthumbcoloroverlayeffect(objthumb, isset, noanimation); } if (g_temp.iseffectimage) { setthumbimageoverlayeffect(objthumb, true, noanimation); } g_objthis.trigger(t.events.setnormalstyle, objthumb); } /** * on thumb mouse over - turn thumb style to over position */ this.setthumboverstyle = function (objthumb) { if (g_temp.customthumbs == true) { objthumb.addclass("ug-thumb-over"); } //border effect if (g_temp.iseffectborder) setthumbbordereffect(objthumb, g_options.thumb_over_border_width, g_options.thumb_over_border_color); //color overlay effect if (g_temp.iseffectoverlay) { var isset = (g_options.thumb_overlay_reverse == true) ? true : false; setthumbcoloroverlayeffect(objthumb, isset); } //image overlay effect if (g_temp.iseffectimage == true) { setthumbimageoverlayeffect(objthumb, false); } //trigger event for parent classes g_objthis.trigger(t.events.setoverstyle, objthumb); } /** * set thumb selected style */ function setthumbselectedstyle(objthumb, noanimation) { if (g_temp.iseffectborder) setthumbbordereffect(objthumb, g_options.thumb_selected_border_width, g_options.thumb_selected_border_color, noanimation); if (g_temp.iseffectoverlay) { var isset = (g_options.thumb_overlay_reverse == true) ? true : false; setthumbcoloroverlayeffect(objthumb, isset, noanimation); } //image overlay effect if (g_temp.iseffectimage) setthumbimageoverlayeffect(objthumb, false, noanimation); g_objthis.trigger(t.events.setselectedstyle, objthumb); } /** * set loading error of the thumb */ function setitemthumbloadederror(objthumb) { var objitem = t.getitembythumb(objthumb); objitem.isloaded = true; objitem.isthumbimageloaded = false; if (g_temp.customthumbs == true) { g_objthis.trigger(t.events.imageloaderror, objthumb); return (true); } objthumb.children(".ug-thumb-loader").hide(); objthumb.children(".ug-thumb-error").show(); } /** * set border radius of all the thmbs */ function setthumbsborderradius(objthumbs) { if (g_options.thumb_round_corners_radius <= 0) return (false); //set radius: var objcss = { "border-radius": g_options.thumb_round_corners_radius + "px" }; if (objthumbs) { objthumbs.css(objcss); objthumbs.find(".ug-thumb-border-overlay").css(objcss); } else { g_objparent.find(".ug-thumb-wrapper, .ug-thumb-wrapper .ug-thumb-border-overlay").css(objcss); } } /** * animate thumb transitions */ function animatethumb(objthumb, objthumbcss) { objthumb.stop(true).animate(objthumbcss, { duration: g_options.thumb_transition_duration, easing: g_options.thumb_transition_easing, queue: false }); } /** * redraw the thumb style according the state */ function redrawthumbstyle(objthumb) { if (isthumbselected(objthumb) == true) setthumbselectedstyle(objthumb, true, "redraw"); else t.setthumbnormalstyle(objthumb, true, "redraw"); } /** * place thumb image * retrun - false, if already loaded * return true - if was set on this function * isforce - set the image anyway */ function placethumbimage(objthumb, objimage, objitem) { //scale the image if (g_options.thumb_fixed_size == true) { g_functions.scaleimagecoverparent(objimage, objthumb); } else { //variant size if (g_options.thumb_resize_by == "height") //horizontal strip g_functions.scaleimagebyheight(objimage, g_options.thumb_height); else //vertical strip g_functions.scaleimagebywidth(objimage, g_options.thumb_width); var imagesize = g_functions.getelementsize(objimage); g_functions.placeelement(objimage, 0, 0); setthumbsize(imagesize.width, imagesize.height, objthumb); } //hide loader objthumb.children(".ug-thumb-loader").hide(); //show image objimage.show(); //if overlay effect exists if (g_options.thumb_image_overlay_effect == false) { objimage.fadeto(0, 1); } else { //place bw image also if exists if (g_options.thumb_image_overlay_effect == true) { copypositiontothumboverlayimage(objimage); } //hide the original image (avoid blinking at start) objimage.fadeto(0, 0); //redraw the style, because this function can overwrite it redrawthumbstyle(objthumb); } g_objthis.trigger(t.events.afterplaceimage, objthumb); } /** * copy image position to bw image (if exists) */ function copypositiontothumboverlayimage(objimage) { var objimagebw = objimage.siblings(".ug-thumb-image-overlay"); if (objimagebw.length == 0) return (false); var objsize = g_functions.getelementsize(objimage); var objcss = { "width": objsize.width + "px", "height": objsize.height + "px", "left": objsize.left + "px", "top": objsize.top + "px" } objimagebw.css(objcss); //show the image if (g_temp.customthumbs == false) objimagebw.fadeto(0, 1); } function _______________getters______________() { }; /** * get the image effects class from the options */ function getimageeffectsclass() { var imageeffectclass = ""; var arreffects = g_options.thumb_image_overlay_type.split(","); for (var index in arreffects) { var effect = arreffects[index]; switch (effect) { case "bw": imageeffectclass += " ug-bw-effect"; break; case "blur": imageeffectclass += " ug-blur-effect"; break; case "sepia": imageeffectclass += " ug-sepia-effect"; break; } } return (imageeffectclass); } /** * get if the thumb is selected */ function isthumbselected(objthumbwrapper) { if (objthumbwrapper.hasclass("ug-thumb-selected")) return (true); return (false); } function _______________events______________() { }; /** * on thumb size change - triggered by parent on custom thumbs type */ function onthumbsizechange(temp, objthumb) { objthumb = jquery(objthumb); var objitem = t.getitembythumb(objthumb); var objsize = g_functions.getelementsize(objthumb); setthumbsize(objsize.width, objsize.height, objthumb, true); redrawthumbstyle(objthumb); } /** * on thumb mouse over */ function onmouseover(objthumb) { //if touch enabled unbind event if (g_temp.touchenabled == true) { objthumbs.off("mouseenter").off("mouseleave"); return (true); } if (isthumbselected(objthumb) == false) t.setthumboverstyle(objthumb); } /** * on thumb mouse out */ function onmouseout(objthumb) { if (g_temp.touchenabled == true) return (true); if (isthumbselected(objthumb) == false) t.setthumbnormalstyle(objthumb, false); } /** * on image loaded event */ function onimageloaded(image, isforce) { if (!isforce) var isforce = false; var objimage = jquery(image); var objthumb = objimage.parents(".ug-thumb-wrapper"); if (objthumb.parent().length == 0) //don't treat detached thumbs return (false); objitem = t.getitembythumb(objthumb); if (objitem.isloaded == true && isforce === false) return (false); t.triggerimageloadedevent(objthumb, objimage); if (g_temp.customthumbs == true) { g_objthis.trigger(t.events.placeimage, [objthumb, objimage]); } else { placethumbimage(objthumb, objimage, objitem); } } /** * on image loaded - set appropriete item vars */ function onthumbimageloaded(data, objthumb, objimage) { objitem = t.getitembythumb(objthumb); objitem.isloaded = true; objitem.isthumbimageloaded = true; var objsize = g_functions.getimageoriginalsize(objimage); objitem.thumbwidth = objsize.width; objitem.thumbheight = objsize.height; objitem.thumbratiobywidth = objsize.width / objsize.height; objitem.thumbratiobyheight = objsize.height / objsize.width; objthumb.addclass("ug-thumb-ratio-set"); } /** * set thumbnails html properties */ this.sethtmlproperties = function (objthumbs) { if (!objthumbs) var objthumbs = t.getthumbs(); //set thumb params if (g_temp.customthumbs == false) { var objthumbcss = {}; //set thumb fixed size if (g_options.thumb_fixed_size == true) setthumbsize(g_options.thumb_width, g_options.thumb_height, objthumbs); setthumbsborderradius(objthumbs); } //set normal style to all the thumbs objthumbs.each(function () { var objthumb = jquery(this); redrawthumbstyle(objthumb); }); //set color. if empty set from css if (g_temp.iseffectoverlay) { if (g_options.thumb_overlay_color) { var objcss = {}; if (g_functions.isrgbasupported()) { var colorrgb = g_functions.converthextorgb(g_options.thumb_overlay_color, g_options.thumb_overlay_opacity); objcss["background-color"] = colorrgb; } else { objcss["background-color"] = g_options.thumb_overlay_color; g_temp.coloroverlayopacity = g_options.thumb_overlay_opacity; } objthumbs.find(".ug-thumb-overlay").css(objcss); } } } /** * set the thumb on selected state */ this.setthumbselected = function (objthumbwrapper) { if (g_temp.customthumbs == true) objthumbwrapper.removeclass("ug-thumb-over"); if (isthumbselected(objthumbwrapper) == true) return (true); objthumbwrapper.addclass("ug-thumb-selected"); //set thumb selected style setthumbselectedstyle(objthumbwrapper); } /** * set the thumb unselected state */ this.setthumbunselected = function (objthumbwrapper) { //remove the selected class objthumbwrapper.removeclass("ug-thumb-selected"); t.setthumbnormalstyle(objthumbwrapper, false, "set unselected"); } /** * set the options of the strip */ this.setoptions = function (objoptions) { g_options = jquery.extend(g_options, objoptions); } /** * set thumb inner reduce - reduce this number when resizing thumb inner */ this.setthumbinnerreduce = function (innerreduce) { g_temp.thumbinnerreduce = innerreduce; } /** * set custom thumbs * allowedeffects - border, overlay, image */ this.setcustomthumbs = function (funcsethtml, arralowedeffects, customoptions) { g_temp.customthumbs = true; if (typeof funcsethtml != "function") throw new error("the argument should be function"); g_temp.funcsetcustomthumbhtml = funcsethtml; //enable effects: if (jquery.inarray("overlay", arralowedeffects) == -1) g_temp.iseffectoverlay = false; if (jquery.inarray("border", arralowedeffects) == -1) g_temp.iseffectborder = false; g_temp.iseffectimage = false; //for custom effects the image is always off //check for dissalow onresize if (customoptions && customoptions.allow_onresize === false) { g_temp.allowonresize = false; } } this._____________external_getters__________ = function () { }; /** * get the options object */ this.getoptions = function () { return (g_options); } /** * get num thumbs */ this.getnumthumbs = function () { var numthumbs = g_arritems.length; return (numthumbs); } /** * get thumb image */ this.getthumbimage = function (objthumb) { var objimage = objthumb.find(".ug-thumb-image"); return (objimage); } /** * get thumbs by index */ this.getthumbbyindex = function (index) { var objthumbs = t.getthumbs(); if (index >= objthumbs.length || index < 0) throw new error("wrong thumb index"); var objthumb = jquery(objthumbs[index]); return (objthumb); } /** * get all thumbs jquery object */ this.getthumbs = function (mode) { var thumbclass = ".ug-thumb-wrapper"; var classratio = ".ug-thumb-ratio-set"; switch (mode) { default: case t.type.get_thumbs_all: var objthumbs = g_objparent.children(thumbclass) break; case t.type.get_thumbs_no_ratio: var objthumbs = g_objparent.children(thumbclass).not(classratio); break; case t.type.get_thumbs_ratio: var objthumbs = g_objparent.children(thumbclass + classratio); break; case t.type.get_thumbs_new: var objthumbs = g_objparent.children("." + g_temp.classnewthumb); break; } return (objthumbs); } /** * get item by thumb object */ this.getitembythumb = function (objthumb) { var index = objthumb.data("index"); if (index === undefined) index = objthumb.index(); var arritem = g_arritems[index]; return (arritem); } /** * is thumb loaded */ this.isthumbloaded = function (objthumb) { var objitem = t.getitembythumb(objthumb); return (objitem.isloaded); } /** * get global thumb size */ this.getglobalthumbsize = function () { var objsize = { width: g_options.thumb_width, height: g_options.thumb_height }; return (objsize); } this._____________external_others__________ = function () { }; /** * init events */ this.initevents = function () { var selectorthumb = ".ug-thumb-wrapper"; //one time event if (g_temp.allowonresize == true) g_objwrapper.on(g_serviceparams.eventsizechange, onthumbsizechange); //on image loaded event - for setting the image sizes g_objthis.on(t.events.thumb_image_loaded, onthumbimageloaded); //thumbs events g_objparent.on("touchstart", selectorthumb, function () { g_temp.touchenabled = true; g_objparent.off("mouseenter").off("mouseleave"); }); g_objparent.on("mouseenter", selectorthumb, function (event) { var objthumb = jquery(this); onmouseover(objthumb); }); g_objparent.on("mouseleave", selectorthumb, function (event) { var objthumb = jquery(this); onmouseout(objthumb); }); } /** * destroy the thumb element */ this.destroy = function () { var selectorthumb = ".ug-thumb-wrapper"; g_objparent.off("touchstart", selectorthumb); g_objwrapper.off(g_serviceparams.eventsizechange); g_objparent.off("mouseenter", selectorthumb); g_objparent.off("mouseleave", selectorthumb); g_objthis.off(t.events.thumb_image_loaded); } /** * preload thumbs images and put them into the thumbnails */ this.loadthumbsimages = function () { var objimages = g_objparent.find(".ug-thumb-image"); g_functions.checkimagesloaded(objimages, null, function (objimage, iserror) { if (iserror == false) { onimageloaded(objimage, true); } else { var objitem = jquery(objimage).parent(); setitemthumbloadederror(objitem); } }); } /** * trigger image loaded event */ this.triggerimageloadedevent = function (objthumb, objimage) { g_objthis.trigger(t.events.thumb_image_loaded, [objthumb, objimage]); } /** * hide thumbs */ this.hidethumbs = function () { g_objparent.find(".ug-thumb-wrapper").hide(); } } /** * thumbs class * addon to strip gallery */ function ugthumbsstrip() { var t = this; var g_gallery = new unitegallerymain(), g_objgallery, g_objects, g_objwrapper; var g_arritems, g_objstrip, g_objstripinner; var g_aviacontrol, g_touchthumbscontrol, g_functions = new ugfunctions(); var g_isvertical = false, g_thumbs = new ugthumbsgeneral(); var g_functions = new ugfunctions(); var g_options = { strip_vertical_type: false, strip_thumbs_align: "left", //left, center, right, top, middle, bottom - the align of the thumbs when they smaller then the strip size. strip_space_between_thumbs: 6, //space between thumbs strip_thumb_touch_sensetivity: 15, //from 1-100, 1 - most sensetive, 100 - most unsensetive strip_scroll_to_thumb_duration: 500, //duration of scrolling to thumb strip_scroll_to_thumb_easing: "easeoutcubic", //easing of scrolling to thumb animation strip_control_avia: true, //avia control - move the strip according strip moseover position strip_control_touch: true, //touch control - move the strip by dragging it strip_padding_top: 0, //add some space from the top strip_padding_bottom: 0, //add some space from the bottom strip_padding_left: 0, //add some space from left strip_padding_right: 0 //add some space from right } var g_temp = { isrunonce: false, is_placed: false, isnotfixedthumbs: false, handle: null }; var g_sizes = { stripsize: 0, //set after position thumbs stripactivesize: 0, //strip size without the padding stripinnersize: 0, thumbsize: 0, thumbsecondsize: 0 //size of the height and width of the strip } this.events = { //events variables strip_move: "stripmove", inner_size_change: "size_change" } //the defaults for vertical align var g_defaultsvertical = { strip_thumbs_align: "top", thumb_resize_by: "width" } /** * set the thumbs strip html */ this.sethtml = function (objparent) { if (!objparent) { var objparent = g_objwrapper; if (g_options.parent_container != null) objparent = g_options.parent_container; } objparent.append("
"); g_objstrip = objparent.children(".ug-thumbs-strip"); g_objstripinner = g_objstrip.children(".ug-thumbs-strip-inner"); //put the thumbs to inner strip g_thumbs.sethtmlthumbs(g_objstripinner); //hide thumbs on not fixed mode if (g_temp.isnotfixedthumbs == true) g_thumbs.hidethumbs(); } function ___________general___________() { }; /** * init the strip */ function initstrip(gallery, customoptions) { g_objects = gallery.getobjects(); g_gallery = gallery; g_gallery.attachthumbspanel("strip", t); g_objgallery = jquery(gallery); g_objwrapper = g_objects.g_objwrapper; g_arritems = g_objects.g_arritems; g_options = jquery.extend(g_options, customoptions); g_isvertical = g_options.strip_vertical_type; //set vertical defaults if (g_isvertical == true) { g_options = jquery.extend(g_options, g_defaultsvertical); g_options = jquery.extend(g_options, customoptions); customoptions.thumb_resize_by = "width"; } g_thumbs.init(gallery, customoptions); onaftersetoptions(); } /** * run this funcion after set options. */ function onaftersetoptions() { var thumbsoptions = g_thumbs.getoptions(); g_temp.isnotfixedthumbs = (thumbsoptions.thumb_fixed_size === false); g_isvertical = g_options.strip_vertical_type; } /** * run the strip */ function runstrip() { g_thumbs.sethtmlproperties(); initsizeparams(); fixsize(); positionthumbs(); //run only once if (g_temp.isrunonce == false) { //init thumbs strip touch if (g_options.strip_control_touch == true) { g_touchthumbscontrol = new ugtouchthumbscontrol(); g_touchthumbscontrol.init(t); } //init thumbs strip avia control if (g_options.strip_control_avia == true) { g_aviacontrol = new ugaviacontrol(); g_aviacontrol.init(t); } checkcontrolsenabledisable(); g_thumbs.loadthumbsimages(); initevents(); } g_temp.isrunonce = true; } /** * store strip size and strip active size in vars * do after all strip size change */ function storestripsize(size) { g_sizes.stripsize = size; if (g_isvertical == false) g_sizes.stripactivesize = g_sizes.stripsize - g_options.strip_padding_left - g_options.strip_padding_right; else g_sizes.stripactivesize = g_sizes.stripsize - g_options.strip_padding_top - g_options.strip_padding_bottom; if (g_sizes.stripactivesize < 0) g_sizes.stripactivesize = 0; } /** * init some size parameters, before size init and after position thumbs */ function initsizeparams() { //set thumb outer size: var arrthumbs = g_objstripinner.children(".ug-thumb-wrapper"); var firstthumb = jquery(arrthumbs[0]); var thumbsrealwidth = firstthumb.outerwidth(); var thumbsrealheight = firstthumb.outerheight(); var thumbs_options = g_thumbs.getoptions(); if (g_isvertical == false) { //horizontal g_sizes.thumbsize = thumbsrealwidth; if (thumbs_options.thumb_fixed_size == true) { g_sizes.thumbsecondsize = thumbsrealheight; } else { g_sizes.thumbsecondsize = thumbs_options.thumb_height; } storestripsize(g_objstrip.width()); g_sizes.stripinnersize = g_objstripinner.width(); } else { //vertical g_sizes.thumbsize = thumbsrealheight; if (thumbs_options.thumb_fixed_size == true) { g_sizes.thumbsecondsize = thumbsrealwidth; } else { g_sizes.thumbsecondsize = thumbs_options.thumb_width; } storestripsize(g_objstrip.height()); g_sizes.stripinnersize = g_objstripinner.height(); } } /** * set size of inner strip according the orientation */ function setinnerstripsize(innersize) { if (g_isvertical == false) g_objstripinner.width(innersize); else g_objstripinner.height(innersize); g_sizes.stripinnersize = innersize; checkcontrolsenabledisable(); jquery(t).trigger(t.events.inner_size_change); } /** * position thumbnails in the thumbs panel */ function positionthumbs() { var arrthumbs = g_objstripinner.children(".ug-thumb-wrapper"); var posx = 0; var posy = 0; if (g_isvertical == false) posy = g_options.strip_padding_top; for (i = 0; i < arrthumbs.length; i++) { var objthumb = jquery(arrthumbs[i]); //skip from placing if not loaded yet on non fixed mode if (g_temp.isnotfixedthumbs == true) { objitem = g_thumbs.getitembythumb(objthumb); if (objitem.isloaded == false) continue; //the thumb is hidden if not placed objthumb.show(); } g_functions.placeelement(objthumb, posx, posy); if (g_isvertical == false) posx += objthumb.outerwidth() + g_options.strip_space_between_thumbs; else posy += objthumb.outerheight() + g_options.strip_space_between_thumbs; } //set strip size, width or height if (g_isvertical == false) var innerstripsize = posx - g_options.strip_space_between_thumbs; else var innerstripsize = posy - g_options.strip_space_between_thumbs; setinnerstripsize(innerstripsize); } /** * fix strip and inner size */ function fixsize() { if (g_isvertical == false) { //fix horizontal var height = g_sizes.thumbsecondsize; var objcssstrip = {}; objcssstrip["height"] = height + "px"; //set inner strip params var objcssinner = {}; objcssinner["height"] = height + "px"; } else { //fix vertical var width = g_sizes.thumbsecondsize; var objcssstrip = {}; objcssstrip["width"] = width + "px"; //set inner strip params var objcssinner = {}; objcssinner["width"] = width + "px"; } g_objstrip.css(objcssstrip); g_objstripinner.css(objcssinner); } /** * scroll by some number * . */ function scrollby(scrollstep) { var innerpos = t.getinnerstrippos(); var finalpos = innerpos + scrollstep; finalpos = t.fixinnerstriplimits(finalpos); t.positioninnerstrip(finalpos, true); } /** * scroll to thumb from min. (left or top) position */ function scrolltothumbmin(objthumb) { var objthumbpos = getthumbpos(objthumb); var scrollpos = objthumbpos.min * -1; scrollpos = t.fixinnerstriplimits(scrollpos); t.positioninnerstrip(scrollpos, true); } /** * scroll to thumb from max. (right or bottom) position */ function scrolltothumbmax(objthumb) { var objthumbpos = getthumbpos(objthumb); var scrollpos = objthumbpos.max * -1 + g_sizes.stripsize; scrollpos = t.fixinnerstriplimits(scrollpos); t.positioninnerstrip(scrollpos, true); } /** * scroll to some thumbnail */ function scrolltothumb(objthumb) { if (isstripmovingenabled() == false) return (false); var objbounds = getthumbsinsidebounds(); var objthumbpos = getthumbpos(objthumb); if (objthumbpos.min < objbounds.minposthumbs) { var prevthumb = objthumb.prev(); if (prevthumb.length) scrolltothumbmin(prevthumb); else scrolltothumbmin(objthumb); } else if (objthumbpos.max > objbounds.maxposthumbs) { var nextthumb = objthumb.next(); if (nextthumb.length) scrolltothumbmax(nextthumb); else scrolltothumbmax(objthumb); } } /** * scroll to selected thumb */ function scrolltoselectedthumb() { var selecteditem = g_gallery.getselecteditem(); if (selecteditem == null) return (true); var objthumb = selecteditem.objthumbwrapper; if (objthumb) scrolltothumb(objthumb); } /** * check that the inner strip off the limits position, and reposition it if there is a need */ function checkandrepositioninnerstrip() { if (isstripmovingenabled() == false) return (false); var pos = t.getinnerstrippos(); var posfixed = t.fixinnerstriplimits(pos); if (pos != posfixed) t.positioninnerstrip(posfixed, true); } /** * enable / disable controls according inner width (move enabled). */ function checkcontrolsenabledisable() { var ismovingendbled = isstripmovingenabled(); if (ismovingendbled == true) { if (g_aviacontrol) g_aviacontrol.enable(); if (g_touchthumbscontrol) g_touchthumbscontrol.enable(); } else { if (g_aviacontrol) g_aviacontrol.disable(); if (g_touchthumbscontrol) g_touchthumbscontrol.disable(); } } /** * align inner strip according the options */ function aligninnerstrip() { if (isstripmovingenabled()) return (false); if (g_isvertical == false) g_functions.placeelement(g_objstripinner, g_options.strip_thumbs_align, 0); else g_functions.placeelement(g_objstripinner, 0, g_options.strip_thumbs_align); } function ___________events___________() { }; /** * on thumb click event. select the thumb */ function onthumbclick(objthumb) { //cancel click event only if passed significant movement if (t.istouchmotionactive()) { var issignificantpassed = g_touchthumbscontrol.issignificantpassed(); if (issignificantpassed == true) return (true); } //run select item operation var objitem = g_thumbs.getitembythumb(objthumb); g_gallery.selectitem(objitem); } /** * on some thumb placed, run the resize, but with time passed */ function onthumbplaced() { cleartimeout(g_temp.handle); g_temp.handle = settimeout(function () { positionthumbs(); }, 50); } /** * on item change */ function onitemchange() { var objitem = g_gallery.getselecteditem(); g_thumbs.setthumbselected(objitem.objthumbwrapper); scrolltothumb(objitem.objthumbwrapper); } /** * init panel events */ function initevents() { g_thumbs.initevents(); var objthumbs = g_objstrip.find(".ug-thumb-wrapper"); objthumbs.on("click touchend", function (event) { var clickedthumb = jquery(this); onthumbclick(clickedthumb); }); //on item change, make the thumb selected g_objgallery.on(g_gallery.events.item_change, onitemchange); //position thumbs after each load on non fixed mode if (g_temp.isnotfixedthumbs) { jquery(g_thumbs).on(g_thumbs.events.afterplaceimage, onthumbplaced); } } /** * destroy the strip panel events */ this.destroy = function () { var objthumbs = g_objstrip.find(".ug-thumb-wrapper"); objthumbs.off("click"); objthumbs.off("touchend"); g_objgallery.off(g_gallery.events.item_change); jquery(g_thumbs).off(g_thumbs.events.afterplaceimage); if (g_touchthumbscontrol) g_touchthumbscontrol.destroy(); if (g_aviacontrol) g_aviacontrol.destroy(); g_thumbs.destroy(); } function ____________getters___________() { }; /** * check if the inner width is more then strip width */ function isstripmovingenabled() { if (g_sizes.stripinnersize > g_sizes.stripactivesize) return (true); else return (false); } /** * get bounds, if the thumb not in them, it need to be scrolled * minposthumbs, maxposthumbs - the min and max position that the thumbs should be located to be visible */ function getthumbsinsidebounds() { var obj = {}; var innerpos = t.getinnerstrippos(); //the 1 is gap that avoid exact bounds obj.minposthumbs = innerpos * -1 + 1; obj.maxposthumbs = innerpos * -1 + g_sizes.stripsize - 1; return (obj); } /** * get thumb position according the orientation in the inner strip */ function getthumbpos(objthumb) { var objreturn = {}; var objpos = objthumb.position(); if (g_isvertical == false) { objreturn.min = objpos.left; objreturn.max = objpos.left + g_sizes.thumbsize; } else { objreturn.min = objpos.top; objreturn.max = objpos.top + g_sizes.thumbsize; } return (objreturn); } this.________external_general___________ = function () { }; /** * init function for avia controls */ this.init = function (gallery, customoptions) { initstrip(gallery, customoptions); } /** * set html and properties */ this.run = function () { runstrip(); } /** * position inner strip on some pos according the orientation */ this.positioninnerstrip = function (pos, isanimate) { if (isanimate === undefined) var isanimate = false; if (g_isvertical == false) var objposition = { "left": pos + "px" }; else var objposition = { "top": pos + "px" }; if (isanimate == false) { //normal position g_objstripinner.css(objposition); t.triggerstripmoveevent(); } else { //position with animation t.triggerstripmoveevent(); g_objstripinner.stop(true).animate(objposition, { duration: g_options.strip_scroll_to_thumb_duration, easing: g_options.strip_scroll_to_thumb_easing, queue: false, progress: function () { t.triggerstripmoveevent() }, always: function () { t.triggerstripmoveevent() } }); } } /** * trigger event - on strip move */ this.triggerstripmoveevent = function () { //trigger onstripmove event jquery(t).trigger(t.events.strip_move); } /** * return true if the touch animation or dragging is active */ this.istouchmotionactive = function () { if (!g_touchthumbscontrol) return (false); var isactive = g_touchthumbscontrol.istouchactive(); return (isactive); } /** * check if thmb item visible, means inside the visible part of the inner strip */ this.isitemthumbvisible = function (objitem) { var objthumb = objitem.objthumbwrapper; var thumbpos = objthumb.position(); var posmin = t.getinnerstrippos() * -1; if (g_isvertical == false) { var posmax = posmin + g_sizes.stripsize; var thumbposmin = thumbpos.left; var thumbposmax = thumbpos.left + objthumb.width(); } else { var posmax = posmin + g_sizes.stripsize; var thumbposmin = thumbpos.top; var thumbposmax = thumbpos.top + objthumb.height(); } var isvisible = false; if (thumbposmax >= posmin && thumbposmin <= posmax) isvisible = true; return (isvisible); } /** * get inner strip position according the orientation */ this.getinnerstrippos = function () { if (g_isvertical == false) return g_objstripinner.position().left; else return g_objstripinner.position().top; } /** * get inner strip limits */ this.getinnerstriplimits = function () { var output = {}; if (g_isvertical == false) output.maxpos = g_options.strip_padding_left; else output.maxpos = g_options.strip_padding_top; //debugline(g_sizes.stripactivesize); output.minpos = -(g_sizes.stripinnersize - g_sizes.stripactivesize); return (output); } /** * fix inner position by check boundaries limit */ this.fixinnerstriplimits = function (distpos) { var minpos; var objlimits = t.getinnerstriplimits(); if (distpos > objlimits.maxpos) distpos = objlimits.maxpos; if (distpos < objlimits.minpos) distpos = objlimits.minpos; return (distpos); } /** * scroll left or down */ this.scrollforeward = function () { scrollby(-g_sizes.stripsize); } /** * scroll left or down */ this.scrollback = function () { scrollby(g_sizes.stripsize); } this.________external_setters___________ = function () { }; /** * set the options of the strip */ this.setoptions = function (objoptions) { g_options = jquery.extend(g_options, objoptions); g_thumbs.setoptions(objoptions); onaftersetoptions(); } /** * set size of the strip * the height size is set automatically from options */ this.setsizevertical = function (height) { if (g_isvertical == false) { throw new error("setsizevertical error, the strip size is not vertical"); return (false); } var width = g_sizes.thumbsecondsize; var objcssstrip = {}; objcssstrip["width"] = width + "px"; objcssstrip["height"] = height + "px"; g_objstrip.css(objcssstrip); storestripsize(height); //set inner strip params var objcssinner = {}; objcssinner["width"] = width + "px"; objcssinner["left"] = "0px"; objcssinner["top"] = "0px"; g_objstripinner.css(objcssinner); g_temp.is_placed = true; checkcontrolsenabledisable(); } /** * set size of the strip * the height size is set automatically from options */ this.setsizehorizontal = function (width) { if (g_isvertical == true) { throw new error("setsizehorizontal error, the strip size is not horizontal"); return (false); } var height = g_sizes.thumbsecondsize + g_options.strip_padding_top + g_options.strip_padding_bottom; var objcssstrip = {}; objcssstrip["width"] = width + "px"; objcssstrip["height"] = height + "px"; g_objstrip.css(objcssstrip); storestripsize(width); var innerleft = g_options.strip_padding_left; //set inner strip params var objcssinner = {}; objcssinner["height"] = height + "px"; objcssinner["left"] = innerleft + "px"; objcssinner["top"] = "0px"; g_objstripinner.css(objcssinner); g_temp.is_placed = true; checkcontrolsenabledisable(); } /** * set position of the strip */ this.setposition = function (left, top, offsetleft, offsettop) { g_functions.placeelement(g_objstrip, left, top, offsetleft, offsettop); } /** * resize the panel according the orientation */ this.resize = function (newsize) { if (g_isvertical == false) { g_objstrip.width(newsize); g_sizes.stripactivesize = newsize - g_options.strip_padding_left - g_options.strip_padding_right; } else { g_objstrip.height(newsize); g_sizes.stripactivesize = newsize - g_options.strip_padding_top - g_options.strip_padding_bottom; } storestripsize(newsize); checkcontrolsenabledisable(); checkandrepositioninnerstrip(); aligninnerstrip(); scrolltoselectedthumb(); } /** * set the thumb unselected state */ this.setthumbunselected = function (objthumbwrapper) { g_thumbs.setthumbunselected(objthumbwrapper); } /** * set custom thumbs */ this.setcustomthumbs = function (funcsethtml) { g_thumbs.setcustomthumbs(funcsethtml); } this.________external_getters___________ = function () { }; /** * get objects */ this.getobjects = function () { var thumbsoptions = g_thumbs.getoptions(); var commonopitions = jquery.extend(g_options, thumbsoptions); var obj = { g_gallery: g_gallery, g_objgallery: g_objgallery, g_objwrapper: g_objwrapper, g_arritems: g_arritems, g_objstrip: g_objstrip, g_objstripinner: g_objstripinner, g_aviacontrol: g_aviacontrol, g_touchthumbscontrol: g_touchthumbscontrol, isvertical: g_isvertical, g_options: commonopitions, g_thumbs: g_thumbs }; return (obj); } /** * get thumbs onject */ this.getobjthumbs = function () { return (g_thumbs); } /** * get selected thumb */ this.getselectedthumb = function () { var selectedindex = g_gallery.getselecteditemindex(); if (selectedindex == -1) return (null); return g_thumbs.getthumbbyindex(selectedindex); } /** * get strip size and position object */ this.getsizeandposition = function () { var obj = g_functions.getelementsize(g_objstrip); return (obj); } /** * get thumbs strip height */ this.getheight = function () { var stripheight = g_objstrip.outerheight(); return (stripheight) } /** * get thumbs strip width */ this.getwidth = function () { var stripwidth = g_objstrip.outerwidth(); return (stripwidth); } /** * get all stored sizes object */ this.getsizes = function () { return (g_sizes); } /** * return if vertical orientation or not */ this.isvertical = function () { return (g_isvertical); } /** * return if the strip is placed or not */ this.isplaced = function () { return (g_temp.is_placed); } /** * return if the strip moving enabled or not */ this.ismoveenabled = function () { var isenabled = isstripmovingenabled(); return (isenabled); } } /** * touch thumbs control class * addon to strip gallery */ function ugtouchthumbscontrol() { var g_parent, g_gallery, g_objgallery, g_objects; var g_objstrip, g_objstripinner, g_options, g_isvertical; var g_functions = new ugfunctions(); //service variables var g_serviceparams = { touch_portion_time: 200, //the time in ms that the potion is counts for continue touch movement thumb_touch_slowfactor: 0, //set from user mindeltatime: 70, //don't alow portion less then the mintime minpath: 10, //if less then this path, dont' continue motion limitsbreakaddition: 30, //the limits break addition for second return animation returnanimatespeed: 500, //the speed of return animation animationeasing: "easeoutcubic", //animation easing function returnanimationeasing: "easeoutcubic" //return animation easing function }; var g_temp = { //temp variables touch_active: false, loop_active: false, mousepos: 0, innerpos: 0, startpos: 0, starttime: 0, lasttime: 0, buttonreleasetime: 0, lastpos: 0, lastportionpos: 0, lastdeltatime: 0, lastdeltapos: 0, speed: 0, handle: "", touchenabled: false, iscontrolenabled: true }; /** * enable the control */ this.enable = function () { g_temp.iscontrolenabled = true; } /** * disable the control */ this.disable = function () { g_temp.iscontrolenabled = false; } /** * init function for avia controls */ this.init = function (objstrip) { g_parent = objstrip; g_objects = objstrip.getobjects(); g_gallery = g_objects.g_gallery; g_objgallery = g_objects.g_objgallery; //jquery object g_objstrip = g_objects.g_objstrip; g_objstripinner = g_objects.g_objstripinner; g_options = g_objects.g_options; g_isvertical = g_objects.isvertical; setserviceparams(); initevents(); } /** * get action related variables */ function getactionvars() { var currenttime = jquery.now(); var obj = {}; obj.passedtime = g_temp.lasttime - g_temp.starttime; obj.lastactivetime = currenttime - g_temp.buttonreleasetime; obj.passeddistance = g_temp.lastpos - g_temp.startpos; obj.passeddistanceabs = math.abs(obj.passeddistance); return (obj); } /** * return if passed some significant movement */ this.issignificantpassed = function () { var objvars = getactionvars(); if (objvars.passedtime > 300) return (true); if (objvars.passeddistanceabs > 30) return (true); return (false); } /** * return true if the touch dragging or animate motion is active */ this.istouchactive = function () { if (g_temp.touch_active == true) return (true); //check if still animating if (g_objstripinner.is(":animated") == true) return (true); //check if just ended, the touch active continue for a few moments. var objvars = getactionvars(); if (objvars.lastactivetime < 50) return (true); return (false); } /** * set service parameters from user parameters */ function setserviceparams() { //set slow factor by sensetivity of touch motion g_serviceparams.thumb_touch_slowfactor = g_functions.normalizesetting(0.00005, 0.01, 1, 100, g_options.strip_thumb_touch_sensetivity, true); //debugline("slowfactor "+ g_serviceparams.thumb_touch_slowfactor); } /** * get mouse position based on orientation */ function getmouseorientposition(event) { if (g_isvertical == false) return (g_functions.getmouseposition(event).pagex); else return (g_functions.getmouseposition(event).pagey); } /** * position the strip according the touch drag diff */ function handlestripdrag(mousepos) { var diff = g_temp.mousepos - mousepos; var distpos = g_temp.innerpos - diff; //make harder to drag the limits var objlimits = g_parent.getinnerstriplimits(); if (distpos > objlimits.maxpos) { var path = distpos - objlimits.maxpos; distpos = objlimits.maxpos + path / 3; } if (distpos < objlimits.minpos) { var path = objlimits.minpos - distpos; distpos = objlimits.minpos - path / 3; } g_parent.positioninnerstrip(distpos); } /** * store initial touch values */ function storeinittouchvalues(pagepos) { var currentinnerpos = g_parent.getinnerstrippos(); //remember current mouse position and inner strip position g_temp.mousepos = pagepos; g_temp.innerpos = currentinnerpos; g_temp.lastportionpos = currentinnerpos; g_temp.lastdeltatime = 0; g_temp.lastdeltapos = 0; //init position and time related variables g_temp.starttime = jquery.now(); g_temp.startpos = g_temp.innerpos; g_temp.lasttime = g_temp.starttime; g_temp.lastpos = g_temp.startpos; g_temp.speed = 0; } /** * store touch portion data */ function storetouchportiondata() { //calc speed var currenttime = jquery.now(); var deltatime = currenttime - g_temp.lasttime; if (deltatime >= g_serviceparams.touch_portion_time) { g_temp.lastdeltatime = currenttime - g_temp.lasttime; if (g_temp.lastdeltatime > g_serviceparams.touch_portion_time) g_temp.lastdeltatime = g_serviceparams.touch_portion_time; g_temp.lastdeltapos = g_temp.lastpos - g_temp.lastportionpos; g_temp.lastportionpos = g_temp.lastpos; g_temp.lasttime = currenttime; } } /** * continue touch motion - touch motion ending. */ function continuetouchmotion() { var slowfactor = g_serviceparams.thumb_touch_slowfactor; //don't alow portion less then the mintime var mindeltatime = g_serviceparams.mindeltatime; //if less then this path, dont' continue motion var minpath = g_serviceparams.minpath; var currentinnerpos = g_parent.getinnerstrippos(); var currenttime = jquery.now(); var deltatime = currenttime - g_temp.lasttime; var deltapos = currentinnerpos - g_temp.lastportionpos; //if time too fast, take last portion values if (deltatime < mindeltatime && g_temp.lastdeltatime > 0) { deltatime = g_temp.lastdeltatime; deltapos = g_temp.lastdeltapos + deltapos; } //fix delta time if (deltatime < mindeltatime) deltatime = mindeltatime; var dir = (deltapos > 0) ? 1 : -1; var speed = 0; if (deltatime > 0) speed = deltapos / deltatime; var path = (speed * speed) / (slowfactor * 2) * dir; //disable path for very slow motions if (math.abs(path) <= minpath) path = 0; var innerstrippos = g_parent.getinnerstrippos(); var newpos = innerstrippos + path; var correctpos = g_parent.fixinnerstriplimits(newpos); var objlimits = g_parent.getinnerstriplimits(); //check the off the limits and return (second animation) var limitsbreakaddition = g_serviceparams.limitsbreakaddition; var doqueue = false; var returnpos = correctpos; //fix the first animation position (off the limits) if (newpos > objlimits.maxpos) { doqueue = true; correctpos = limitsbreakaddition; if (newpos < limitsbreakaddition) correctpos = newpos; } if (newpos < objlimits.minpos) { doqueue = true; var maxstoppos = objlimits.minpos - limitsbreakaddition; correctpos = maxstoppos; if (newpos > maxstoppos) correctpos = newpos; } var correctpath = correctpos - innerstrippos; //set animation speed var animatespeed = math.abs(math.round(speed / slowfactor)); //fix animation speed according the paths difference if (path != 0) animatespeed = animatespeed * correctpath / path; //do first animation if (innerstrippos != correctpos) { var animateprops = { "left": correctpos + "px" }; if (g_isvertical == true) animateprops = { "top": correctpos + "px" }; g_objstripinner.animate(animateprops, { duration: animatespeed, easing: g_serviceparams.animationeasing, queue: true, progress: onanimateprogress }); } //do second animation if off limits if (doqueue == true) { var returnanimatespeed = g_serviceparams.returnanimatespeed; var returnanimateprops = { "left": returnpos + "px" }; if (g_isvertical == true) returnanimateprops = { "top": returnpos + "px" }; g_objstripinner.animate(returnanimateprops, { duration: returnanimatespeed, easing: g_serviceparams.returnanimationeasing, queue: true, progress: onanimateprogress }); } } /** * on animate progress event. store position and trigger event to gallery */ function onanimateprogress() { g_temp.lastpos = g_parent.getinnerstrippos(); g_parent.triggerstripmoveevent(); } /** * start loop while touching strip */ function startstriptouchloop() { if (g_temp.loop_active == true) return (true); g_temp.loop_active = true; g_temp.handle = setinterval(storetouchportiondata, 10); } /** * end loop when not touching */ function endstriptouchloop(event) { if (g_temp.loop_active == false) return (true); if (event) { var pagepos = getmouseorientposition(event); continuetouchmotion(pagepos); } g_temp.loop_active = false; g_temp.handle = clearinterval(g_temp.handle); } /** * on tuch end event */ function ontouchend(event) { if (g_temp.iscontrolenabled == false) return (true); g_temp.buttonreleasetime = jquery.now(); if (g_temp.touch_active == false) { endstriptouchloop(event); return (true); } event.preventdefault(); g_temp.touch_active = false; endstriptouchloop(event); g_objstrip.removeclass("ug-dragging"); } /** * on touch start - start the motion * @param event */ function ontouchstart(event) { if (g_temp.iscontrolenabled == false) return (true); event.preventdefault(); g_temp.touch_active = true; //don't move this up var pagepos = getmouseorientposition(event); //stop inner animation if exist g_objstripinner.stop(true); //store initial touch values storeinittouchvalues(pagepos); startstriptouchloop(); g_objstrip.addclass("ug-dragging"); } /** * on touch move event, move the strip */ function ontouchmove(event) { if (g_temp.iscontrolenabled == false) return (true); if (g_temp.touch_active == false) return (true); event.preventdefault(); //detect moving without button press if (event.buttons == 0) { g_temp.touch_active = false; endstriptouchloop(event); return (true); } //store current position var pagepos = getmouseorientposition(event); g_temp.lastpos = g_parent.getinnerstrippos(); handlestripdrag(pagepos); storetouchportiondata(); } /** * init strip touch events */ function initevents() { //strip mouse down - drag start g_objstrip.bind("mousedown touchstart", ontouchstart); //on body mouse up - drag end jquery(window).add("body").bind("mouseup touchend", ontouchend); //on body move jquery("body").bind("mousemove touchmove", ontouchmove); } /** * destroy the touch events */ this.destroy = function () { g_objstrip.unbind("mousedown"); g_objstrip.unbind("touchstart"); jquery(window).add("body").unbind("mouseup").unbind("touchend"); jquery("body").unbind("mousemove").unbind("touchmove"); } } /** -------------- panel base functions ---------------------*/ function ugpanelsbase() { var g_temp, g_panel, g_objpanel, g_options, g_objthis; var g_gallery = new unitegallerymain(); var t = this, g_objhandle, g_objgallery; var g_functions = new ugfunctions(); /** * init the base panel */ this.init = function (gallery, g_temparg, g_panelarg, options, g_objthisarg) { g_temp = g_temparg; g_panel = g_panelarg; g_gallery = gallery; g_options = options; g_objthis = g_objthisarg; g_objgallery = jquery(g_gallery); } /** * set common panels html */ this.sethtml = function (g_objpanelarg) { g_objpanel = g_objpanelarg; if (g_temp.paneltype == "strip") var enable_handle = g_options.strippanel_enable_handle; else var enable_handle = g_options.gridpanel_enable_handle; // add handle if (enable_handle == true) { g_objhandle = new ugpanelhandle(); g_objhandle.init(g_panel, g_objpanel, g_options, g_temp.paneltype, g_gallery); g_objhandle.sethtml(); } //set disabled at start if exists if (g_temp.isdisabledatstart === true) { var html = "
"; g_objpanel.append(html); settimeout(function () { g_objpanel.children(".ug-overlay-disabled").hide(); }, g_temp.disabledatstarttimeout); } } /** * place common elements */ this.placeelements = function () { // place handle if (g_objhandle) g_objhandle.placehandle(); } /** * init common events */ this.initevents = function () { // set handle events if (g_objhandle) { g_objhandle.initevents(); //set on slider action events g_objgallery.on(g_gallery.events.slider_action_start, function () { g_objhandle.hidehandle(); }); g_objgallery.on(g_gallery.events.slider_action_end, function () { g_objhandle.showhandle(); }); } } /** * destroy the panel events */ this.destroy = function () { if (g_objhandle) { g_objhandle.destroy(); g_objgallery.off(g_gallery.events.slider_action_start); g_objgallery.off(g_gallery.events.slider_action_end); } } /** * place panel with some animation */ function placepanelanimation(paneldest, functiononcomplete) { switch (g_temp.orientation) { case "right": // vertical case "left": var objcss = { left: paneldest + "px" }; break; case "top": case "bottom": var objcss = { top: paneldest + "px" }; break; } g_objpanel.stop(true).animate(objcss, { duration: 300, easing: "easeinoutquad", queue: false, complete: function () { if (functiononcomplete) functiononcomplete(); } }); } /** * place the panel without animation * * @param paneldest */ function placepanelnoanimation(paneldest) { switch (g_temp.orientation) { case "right": // vertical case "left": g_functions.placeelement(g_objpanel, paneldest, null); break; case "top": case "bottom": g_functions.placeelement(g_objpanel, null, paneldest); break; } } /** * event on panel slide finish */ function onpanelslidefinish() { g_objthis.trigger(g_panel.events.finish_move); } /** * open the panel */ this.openpanel = function (noanimation) { if (!noanimation) var noanimation = false; if (g_objpanel.is(":animated")) return (false); if (g_temp.isclosed == false) return (false); g_temp.isclosed = false; g_objthis.trigger(g_panel.events.open_panel); if (noanimation === false) placepanelanimation(g_temp.originalpos, onpanelslidefinish); else { placepanelnoanimation(g_temp.originalpos); onpanelslidefinish(); } } /** * close the panel (slide in) */ this.closepanel = function (noanimation) { if (!noanimation) var noanimation = false; if (g_objpanel.is(":animated")) return (false); if (g_temp.isclosed == true) return (false); var paneldest = t.getclosedpaneldest(); g_temp.isclosed = true; g_objthis.trigger(g_panel.events.close_panel); if (noanimation === false) placepanelanimation(paneldest, onpanelslidefinish); else { placepanelnoanimation(paneldest); onpanelslidefinish(); } } /** * set the panel that it's in closed state, and set original pos for opening * later */ this.setclosedstate = function (originalpos) { g_temp.originalpos = originalpos; g_objthis.trigger(g_panel.events.close_panel); g_temp.isclosed = true; } /** * set the panel opened state */ this.setopenedstate = function (originalpos) { g_objthis.trigger(g_panel.events.open_panel); g_temp.isclosed = false; } /** * get closed panel destanation */ this.getclosedpaneldest = function () { var objpanelsize = g_functions.getelementsize(g_objpanel), paneldest; switch (g_temp.orientation) { case "left": g_temp.originalpos = objpanelsize.left; paneldest = -g_temp.panelwidth; break; case "right": g_temp.originalpos = objpanelsize.left; var gallerysize = g_gallery.getsize(); paneldest = gallerysize.width; break; case "top": g_temp.originalpos = objpanelsize.top; paneldest = -g_temp.panelheight; break; case "bottom": g_temp.originalpos = objpanelsize.top; var gallerysize = g_gallery.getsize(); paneldest = gallerysize.height; break; } return (paneldest); } /** * tells if the panel is closed */ this.ispanelclosed = function () { return (g_temp.isclosed); } /** * set the panel disabled at start, called after init before sethtml * it's enabled again after timeout end */ this.setdisabledatstart = function (timeout) { if (timeout <= 0) return (false); g_temp.isdisabledatstart = true; g_temp.disabledatstarttimeout = timeout; } } /** -------------- panel handle object ---------------------*/ function ugpanelhandle() { var t = this, g_objpanel, g_panel, g_objhandletip, g_paneloptions = {}; var g_functions = new ugfunctions(); var g_options = { panel_handle_align: "top", //top, middle, bottom , left, right, center - close handle tip align on the handle bar according panel orientation panel_handle_offset: 0, //offset of handle bar according the valign panel_handle_skin: 0 //skin of the handle, if empty inherit from gallery skin }; /** * init the handle */ this.init = function (panel, objpanel, paneloptions, paneltype, gallery) { g_panel = panel; g_objpanel = objpanel; //set needed options switch (paneltype) { case "grid": g_options.panel_handle_align = paneloptions.gridpanel_handle_align; g_options.panel_handle_offset = paneloptions.gridpanel_handle_offset; g_options.panel_handle_skin = paneloptions.gridpanel_handle_skin; break; case "strip": g_options.panel_handle_align = paneloptions.strippanel_handle_align; g_options.panel_handle_offset = paneloptions.strippanel_handle_offset; g_options.panel_handle_skin = paneloptions.strippanel_handle_skin; break; default: throw new error("panel handle error: wrong panel type: " + paneltype); break; } //set arrows skin: var galleryoptions = gallery.getoptions(); var globalskin = galleryoptions.gallery_skin; if (g_options.panel_handle_skin == "") g_options.panel_handle_skin = globalskin; } /** * set handle html */ this.sethtml = function () { var orientation = g_panel.getorientation(); var classtip = "ug-panel-handle-tip"; switch (orientation) { case "right": classtip += " ug-handle-tip-left"; break; case "left": classtip += " ug-handle-tip-right"; break; case "bottom": classtip += " ug-handle-tip-top"; break; case "top": classtip += " ug-handle-tip-bottom"; break; } g_objpanel.append("
"); g_objhandletip = g_objpanel.children(".ug-panel-handle-tip"); } /** * remove hover state of the tip */ function removehoverstate() { g_objhandletip.removeclass("ug-button-hover"); } /** * add closed state class */ function setclosedstate() { g_objhandletip.addclass("ug-button-closed"); } /** * add closed state class */ function removeclosedstate() { g_objhandletip.removeclass("ug-button-closed"); } /** * on handle click, close or open panel */ function onhandleclick(event) { event.stoppropagation(); event.stopimmediatepropagation(); if (g_functions.validateclicktouchstartevent(event.type) == false) return (true); if (g_panel.ispanelclosed()) g_panel.openpanel(); else g_panel.closepanel(); } /** * init events */ this.initevents = function () { g_functions.addclassonhover(g_objhandletip); g_objhandletip.bind("click touchstart", onhandleclick); //on panel open jquery(g_panel).on(g_panel.events.open_panel, function () { removehoverstate(); removeclosedstate(); }); //one panel close jquery(g_panel).on(g_panel.events.close_panel, function () { removehoverstate(); setclosedstate(); }); } /** * destroy the handle panel events */ this.destroy = function () { g_functions.destroybutton(g_objhandletip); jquery(g_panel).off(g_panel.events.open_panel); jquery(g_panel).off(g_panel.events.close_panel); } /** * check and fix align option, set write direction */ function checkandfixalign() { var orientation = g_panel.getorientation(); switch (orientation) { case "right": case "left": if (g_options.panel_handle_align != "top" && g_options.panel_handle_align != "bottom") g_options.panel_handle_align = "top"; break; case "bottom": if (g_options.panel_handle_align != "left" && g_options.panel_handle_align != "right") g_options.panel_handle_align = "left"; break; case "top": if (g_options.panel_handle_align != "left" && g_options.panel_handle_align != "right") g_options.panel_handle_align = "right"; break; } } /** * place the panel */ this.placehandle = function () { var handlesize = g_functions.getelementsize(g_objhandletip); checkandfixalign(); var orientation = g_panel.getorientation(); switch (orientation) { case "left": g_functions.placeelement(g_objhandletip, "right", g_options.panel_handle_align, -handlesize.width); break; case "right": g_functions.placeelement(g_objhandletip, -handlesize.width, g_options.panel_handle_align, 0, g_options.panel_handle_offset); break; case "top": g_functions.placeelement(g_objhandletip, g_options.panel_handle_align, "bottom", g_options.panel_handle_offset, -handlesize.height); break; case "bottom": g_functions.placeelement(g_objhandletip, g_options.panel_handle_align, "top", g_options.panel_handle_offset, -handlesize.height); break; default: throw new error("wrong panel orientation: " + orientation); break; } } /** * hide the handle */ this.hidehandle = function () { if (g_objhandletip.is(":visible") == true) g_objhandletip.hide(); } /** * show the handle */ this.showhandle = function () { if (g_objhandletip.is(":visible") == false) g_objhandletip.show(); } } /** * grid panel class addon to grid gallery */ function ugstrippanel() { var t = this, g_objthis = jquery(this); var g_gallery = new unitegallerymain(), g_objgallery, g_objwrapper, g_objpanel; var g_functions = new ugfunctions(), g_objstrip = new ugthumbsstrip(), g_panelbase = new ugpanelsbase(); var g_objbuttonnext, g_objbuttonprev; this.events = { finish_move: "gridpanel_move_finish", // called after close or open panel (slide finish). open_panel: "open_panel", // called before opening the panel. close_panel: "close_panel" // called before closing the panel. }; var g_options = { strippanel_vertical_type: false, // true, false - specify if the panel is vertical or horizonatal type strippanel_padding_top: 8, // space from top of the panel strippanel_padding_bottom: 8, // space from bottom of the panel strippanel_padding_left: 0, // space from left of the panel strippanel_padding_right: 0, // space from right of the panel strippanel_enable_buttons: true, // enable buttons from the sides of the panel strippanel_buttons_skin: "", // skin of the buttons, if empty inherit from gallery skin strippanel_padding_buttons: 2, // padding between the buttons and the panel strippanel_buttons_role: "scroll_strip", // scroll_strip, advance_item - the role of the side buttons strippanel_enable_handle: true, // enable grid handle strippanel_handle_align: "top", // top, middle, bottom , left, right, center - close handle tip align on the handle bar according panel orientation strippanel_handle_offset: 0, // offset of handle bar according the valign strippanel_handle_skin: "", // skin of the handle, if empty inherit from gallery skin strippanel_background_color: "" // background color of the strip wrapper, if not set, it will be taken from the css }; var g_defaults_vertical = { strip_vertical_type: true, strippanel_padding_left: 8, strippanel_padding_right: 8, strippanel_padding_top: 0, strippanel_padding_bottom: 0 }; var g_defaults_no_buttons = { strippanel_padding_left: 8, strippanel_padding_right: 8, strippanel_padding_top: 8, strippanel_padding_bottom: 8 }; var g_temp = { paneltype: "strip", panelwidth: 0, panelheight: 0, iseventsinited: false, isclosed: false, orientation: null, originalpos: null, isfirstrun: true }; /** * init the panel */ function initpanel(gallery, customoptions) { g_gallery = gallery; g_objgallery = jquery(g_gallery); g_options = jquery.extend(g_options, customoptions); var repeatcustomoptions = false; if (g_options.strippanel_vertical_type == true) { g_options = jquery.extend(g_options, g_defaults_vertical); repeatcustomoptions = true; } if (g_options.strippanel_enable_buttons == false) { g_options = jquery.extend(g_options, g_defaults_no_buttons); repeatcustomoptions = true; } if (repeatcustomoptions == true) g_options = jquery.extend(g_options, customoptions); // do the // set arrows skin: var galleryoptions = g_gallery.getoptions(); var globalskin = galleryoptions.gallery_skin; if (g_options.strippanel_buttons_skin == "") g_options.strippanel_buttons_skin = globalskin; g_objwrapper = g_gallery.getelement(); //init the base panel object: g_panelbase.init(g_gallery, g_temp, t, g_options, g_objthis); //init thumbs strip g_objstrip = new ugthumbsstrip(); g_objstrip.init(g_gallery, g_options); } /** * validate panel before run */ function validatepanelbeforerun() { if (g_options.strippanel_vertical_type == false) { // horizontal // validate if (g_temp.panelwidth == 0) { throw new error( "strip panel error: the width not set, please set width"); return (false); } } else { // vertical validate if (g_temp.panelheight == 0) { throw new error( "strip panel error: the height not set, please set height"); return (false); } } // validate orientation if (g_temp.orientation == null) { throw new error( "wrong orientation, please set panel orientation before run"); return (false); } return (true); } /** * run the panel */ function runpanel() { // validation if (g_temp.isfirstrun == true && validatepanelbeforerun() == false) return (false); g_objstrip.run(); setelementssize(); placeelements(); initevents(); g_temp.isfirstrun = false; checksidebuttons(); } /** * set panel html */ function setpanelhtml(parentcontainer) { if (!parentcontainer) var parentcontainer = g_objwrapper; // add panel wrapper parentcontainer.append("
"); g_objpanel = parentcontainer.children('.ug-strip-panel'); // add arrows: if (g_options.strippanel_enable_buttons == true) { var arrowprevclass = "ug-strip-arrow-left"; var arrownextclass = "ug-strip-arrow-right"; if (g_options.strippanel_vertical_type == true) { arrowprevclass = "ug-strip-arrow-up"; arrownextclass = "ug-strip-arrow-down"; } g_objpanel.append("
"); g_objpanel.append("
"); } g_panelbase.sethtml(g_objpanel); g_objstrip.sethtml(g_objpanel); if (g_options.strippanel_enable_buttons == true) { g_objbuttonprev = g_objpanel.children("." + arrowprevclass); g_objbuttonnext = g_objpanel.children("." + arrownextclass); } sethtmlproperties(); } /** * set html properties according the options */ function sethtmlproperties() { // set panel background color if (g_options.strippanel_background_color != "") g_objpanel.css("background-color", g_options.strippanel_background_color); } /** * set elements size horizontal type */ function setelementssize_hor() { // get strip height var stripheight = g_objstrip.getheight(); var panelwidth = g_temp.panelwidth; // set buttons height if (g_objbuttonnext) { g_objbuttonprev.height(stripheight); g_objbuttonnext.height(stripheight); // arrange buttons tip var prevtip = g_objbuttonprev.children(".ug-strip-arrow-tip"); g_functions.placeelement(prevtip, "center", "middle"); var nexttip = g_objbuttonnext.children(".ug-strip-arrow-tip"); g_functions.placeelement(nexttip, "center", "middle"); } // set panel height var panelheight = stripheight + g_options.strippanel_padding_top + g_options.strippanel_padding_bottom; // set panel size g_objpanel.width(panelwidth); g_objpanel.height(panelheight); g_temp.panelheight = panelheight; // set strip size var stripwidth = panelwidth - g_options.strippanel_padding_left - g_options.strippanel_padding_right; if (g_objbuttonnext) { var buttonwidth = g_objbuttonnext.outerwidth(); stripwidth = stripwidth - buttonwidth * 2 - g_options.strippanel_padding_buttons * 2; } g_objstrip.resize(stripwidth); } /** * set elements size vertical type */ function setelementssize_vert() { // get strip width var stripwidth = g_objstrip.getwidth(); var panelheight = g_temp.panelheight; // set buttons height if (g_objbuttonnext) { g_objbuttonprev.width(stripwidth); g_objbuttonnext.width(stripwidth); // arrange buttons tip var prevtip = g_objbuttonprev.children(".ug-strip-arrow-tip"); g_functions.placeelement(prevtip, "center", "middle"); var nexttip = g_objbuttonnext.children(".ug-strip-arrow-tip"); g_functions.placeelement(nexttip, "center", "middle"); } // set panel width var panelwidth = stripwidth + g_options.strippanel_padding_left + g_options.strippanel_padding_right; // set panel size g_objpanel.width(panelwidth); g_objpanel.height(panelheight); g_temp.panelwidth = panelwidth; // set strip size var stripheight = panelheight - g_options.strippanel_padding_top - g_options.strippanel_padding_bottom; if (g_objbuttonnext) { var buttonheight = g_objbuttonnext.outerheight(); stripheight = stripheight - buttonheight * 2 - g_options.strippanel_padding_buttons * 2; } g_objstrip.resize(stripheight); } /** * set elements size and place the elements */ function setelementssize() { if (g_options.strippanel_vertical_type == false) setelementssize_hor(); else setelementssize_vert(); } /** * place elements horizontally */ function placeelements_hor() { // place buttons if (g_objbuttonnext) { g_functions.placeelement(g_objbuttonprev, "left", "top", g_options.strippanel_padding_left, g_options.strippanel_padding_top); g_functions.placeelement(g_objbuttonnext, "right", "top", g_options.strippanel_padding_right, g_options.strippanel_padding_top); } var stripx = g_options.strippanel_padding_left; if (g_objbuttonnext) stripx += g_objbuttonnext.outerwidth() + g_options.strippanel_padding_buttons; g_objstrip.setposition(stripx, g_options.strippanel_padding_top); } /** * place elements vertically */ function placeelements_vert() { // place buttons if (g_objbuttonnext) { g_functions.placeelement(g_objbuttonprev, "left", "top", g_options.strippanel_padding_left, g_options.strippanel_padding_top); g_functions.placeelement(g_objbuttonnext, "left", "bottom", g_options.strippanel_padding_left, g_options.strippanel_padding_bottom); } var stripy = g_options.strippanel_padding_top; if (g_objbuttonnext) stripy += g_objbuttonnext.outerheight() + g_options.strippanel_padding_buttons; g_objstrip.setposition(g_options.strippanel_padding_left, stripy); } /** * place elements */ function placeelements() { if (g_options.strippanel_vertical_type == false) placeelements_hor(); else placeelements_vert(); g_panelbase.placeelements(); } function __________events___________() { } ; /** * on next button click */ function onnextbuttonclick(objbutton) { if (g_functions.isbuttondisabled(objbutton)) return (true); if (g_options.strippanel_buttons_role == "advance_item") g_gallery.nextitem(); else g_objstrip.scrollforeward(); } /** * on previous button click */ function onprevbuttonclick(objbutton) { if (g_functions.isbuttondisabled(objbutton)) return (true); if (g_options.strippanel_buttons_role == "advance_item") g_gallery.previtem(); else g_objstrip.scrollback(); } /** * check buttons if they need to be disabled or not */ function checksidebuttons() { if (!g_objbuttonnext) return (true); // if the strip not movable - disable both buttons if (g_objstrip.ismoveenabled() == false) { g_functions.disablebutton(g_objbuttonprev); g_functions.disablebutton(g_objbuttonnext); return (true); } // check the limits var limits = g_objstrip.getinnerstriplimits(); var pos = g_objstrip.getinnerstrippos(); if (pos >= limits.maxpos) { g_functions.disablebutton(g_objbuttonprev); } else { g_functions.enablebutton(g_objbuttonprev); } if (pos <= limits.minpos) g_functions.disablebutton(g_objbuttonnext); else g_functions.enablebutton(g_objbuttonnext); } /** * on strip move event */ function onstripmove() { checksidebuttons(); } /** * on item change event, disable or enable buttons according the images * position */ function onitemchange() { if (g_gallery.islastitem()) g_functions.disablebutton(g_objbuttonnext); else g_functions.enablebutton(g_objbuttonnext); if (g_gallery.isfirstitem()) g_functions.disablebutton(g_objbuttonprev); else g_functions.enablebutton(g_objbuttonprev); } /** * init panel events */ function initevents() { if (g_temp.iseventsinited == true) return (false); g_temp.iseventsinited = true; // buttons events if (g_objbuttonnext) { // add hove class g_functions.addclassonhover(g_objbuttonnext, "ug-button-hover"); g_functions.addclassonhover(g_objbuttonprev, "ug-button-hover"); // add click events g_functions.setbuttononclick(g_objbuttonprev, onprevbuttonclick); g_functions.setbuttononclick(g_objbuttonnext, onnextbuttonclick); // add disable / enable buttons on strip move event if (g_options.strippanel_buttons_role != "advance_item") { jquery(g_objstrip).on(g_objstrip.events.strip_move, onstripmove); jquery(g_objstrip).on(g_objstrip.events.inner_size_change, checksidebuttons); g_objgallery.on(g_gallery.events.size_change, checksidebuttons); } else { var galleryoptions = g_gallery.getoptions(); if (galleryoptions.gallery_carousel == false) jquery(g_gallery).on(g_gallery.events.item_change, onitemchange); } } g_panelbase.initevents(); } /** * destroy the strip panel events */ this.destroy = function () { if (g_objbuttonnext) { g_functions.destroybutton(g_objbuttonnext); g_functions.destroybutton(g_objbuttonprev); jquery(g_objstrip).off(g_objstrip.events.strip_move); jquery(g_gallery).off(g_gallery.events.item_change); jquery(g_gallery).off(g_gallery.events.size_change); } g_panelbase.destroy(); g_objstrip.destroy(); } /** * get panel orientation */ this.getorientation = function () { return (g_temp.orientation); } /** * set panel orientation (left, right, top, bottom) */ this.setorientation = function (orientation) { g_temp.orientation = orientation; } /** * init the panel */ this.init = function (gallery, customoptions) { initpanel(gallery, customoptions); } /** * run the panel */ this.run = function () { runpanel(); } /** * place panel html */ this.sethtml = function (parentcontainer) { setpanelhtml(parentcontainer); } /** * get the panel element */ this.getelement = function () { return (g_objpanel); } /** * get panel size object */ this.getsize = function () { var objsize = g_functions.getelementsize(g_objpanel); return (objsize); } /** * set panel width (for horizonal type) */ this.setwidth = function (width) { g_temp.panelwidth = width; } /** * set panel height (for vertical type) */ this.setheight = function (height) { g_temp.panelheight = height; } /** * resize the panel */ this.resize = function (newwidth) { t.setwidth(newwidth); setelementssize(); placeelements(); } this.__________functions_from_base_____ = function () { } /** * tells if the panel is closed */ this.ispanelclosed = function () { return (g_panelbase.ispanelclosed()); } /** * get closed panel destanation */ this.getclosedpaneldest = function () { return g_panelbase.getclosedpaneldest(); } /** * open the panel */ this.openpanel = function (noanimation) { g_panelbase.openpanel(noanimation); } /** * close the panel (slide in) */ this.closepanel = function (noanimation) { g_panelbase.closepanel(noanimation); } /** * set the panel opened state */ this.setopenedstate = function (originalpos) { g_panelbase.setopenedstate(originalpos); } /** * set the panel that it's in closed state, and set original pos for opening later */ this.setclosedstate = function (originalpos) { g_panelbase.setclosedstate(originalpos); } /** * set custom thumbs of the strip */ this.setcustomthumbs = function (funcsethtml) { g_objstrip.setcustomthumbs(funcsethtml); } /** * set panel disabled at start */ this.setdisabledatstart = function (timeout) { g_panelbase.setdisabledatstart(timeout); } } /** * grid panel class * addon to grid gallery */ function uggridpanel() { var t = this, g_objthis = jquery(this); var g_gallery = new unitegallerymain(), g_objgallery, g_objwrapper, g_objpanel; var g_functions = new ugfunctions(); var g_objgrid = new ugthumbsgrid(); var g_panelbase = new ugpanelsbase(); var g_objarrownext, g_objarrowprev; this.events = { finish_move: "gridpanel_move_finish", //called after close or open panel (slide finish). open_panel: "open_panel", //called before opening the panel. close_panel: "close_panel" //called before closing the panel. }; var g_options = { gridpanel_vertical_scroll: true, //vertical or horizontal grid scroll and arrows gridpanel_grid_align: "middle", //top , middle , bottom, left, center, right - the align of the grid panel in the gallery gridpanel_padding_border_top: 10, //padding between the top border of the panel gridpanel_padding_border_bottom: 4, //padding between the bottom border of the panel gridpanel_padding_border_left: 10, //padding between the left border of the panel gridpanel_padding_border_right: 10, //padding between the right border of the panel gridpanel_arrows_skin: "", //skin of the arrows, if empty inherit from gallery skin gridpanel_arrows_align_vert: "middle", //borders, grid, middle - vertical align of arrows, to the top and bottom botders, to the grid, or in the middle space. gridpanel_arrows_padding_vert: 4, //padding between the arrows and the grid, in case of middle align, it will be minimal padding gridpanel_arrows_align_hor: "center", //borders, grid, center - horizontal align of arrows, to the left and right botders, to the grid, or in the center space. gridpanel_arrows_padding_hor: 10, //in case of horizontal type only, minimal size from the grid in case of "borders" and size from the grid in case of "grid" gridpanel_space_between_arrows: 20, //space between arrows on horizontal grids only gridpanel_arrows_always_on: false, //always show arrows even if the grid is one pane only gridpanel_enable_handle: true, //enable grid handle gridpanel_handle_align: "top", //top, middle, bottom , left, right, center - close handle tip align on the handle bar according panel orientation gridpanel_handle_offset: 0, //offset of handle bar according the valign gridpanel_handle_skin: "", //skin of the handle, if empty inherit from gallery skin gridpanel_background_color: "" //background color of the grid wrapper, if not set, it will be taken from the css }; //default options for vertical scroll var g_defaultsvertical = { gridpanel_grid_align: "middle", //top , middle , bottom gridpanel_padding_border_top: 2, //padding between the top border of the panel gridpanel_padding_border_bottom: 2 //padding between the bottom border of the panel }; //default options for horizontal type panel var g_defaultshortype = { gridpanel_grid_align: "center" //left, center, right }; var g_temp = { paneltype: "grid", ishortype: false, arrowsvisible: false, panelheight: 0, panelwidth: 0, originalposx: null, iseventsinited: false, isclosed: false, orientation: null }; /** * init the grid panel */ function initgridpanel(gallery, customoptions) { g_gallery = gallery; validateorientation(); //set defaults and custom options if (customoptions && customoptions.vertical_scroll) { g_options.gridpanel_vertical_scroll = customoptions.vertical_scroll; } g_options = jquery.extend(g_options, customoptions); //set defautls for horizontal panel type if (g_temp.ishortype == true) { g_options = jquery.extend(g_options, g_defaultshortype); g_options = jquery.extend(g_options, customoptions); } else if (g_options.gridpanel_vertical_scroll == true) { //set defaults for vertical scroll g_options = jquery.extend(g_options, g_defaultsvertical); g_options = jquery.extend(g_options, customoptions); g_options.grid_panes_direction = "bottom"; } //set arrows skin: var galleryoptions = g_gallery.getoptions(); var globalskin = galleryoptions.gallery_skin; if (g_options.gridpanel_arrows_skin == "") g_options.gridpanel_arrows_skin = globalskin; //get the gallery wrapper var objects = gallery.getobjects(); g_objwrapper = objects.g_objwrapper; //init the base panel object: g_panelbase.init(g_gallery, g_temp, t, g_options, g_objthis); //init the grid g_objgrid = new ugthumbsgrid(); g_objgrid.init(g_gallery, g_options); } /** * validate the orientation if exists */ function validateorientation() { if (g_temp.orientation == null) throw new error("wrong orientation, please set panel orientation before run"); } /** * run the rid panel */ function runpanel() { //validate orientation validateorientation(); processoptions(); g_objgrid.run(); setarrows(); setpanelsize(); placeelements(); initevents(); } /** * set html of the grid panel */ function sethtmlpanel() { //add panel wrapper g_objwrapper.append("
"); g_objpanel = g_objwrapper.children('.ug-grid-panel'); //add arrows: if (g_temp.ishortype) { g_objpanel.append("
"); g_objpanel.append("
"); g_objarrowprev = g_objpanel.children(".grid-arrow-left-hortype"); g_objarrownext = g_objpanel.children(".grid-arrow-right-hortype"); } else if (g_options.gridpanel_vertical_scroll == false) { //horizonatl arrows g_objpanel.append("
"); g_objpanel.append("
"); g_objarrowprev = g_objpanel.children(".grid-arrow-left"); g_objarrownext = g_objpanel.children(".grid-arrow-right"); } else { //vertical arrows g_objpanel.append("
"); g_objpanel.append("
"); g_objarrowprev = g_objpanel.children(".grid-arrow-up"); g_objarrownext = g_objpanel.children(".grid-arrow-down"); } g_panelbase.sethtml(g_objpanel); //hide the arrows g_objarrowprev.fadeto(0, 0); g_objarrownext.fadeto(0, 0); g_objgrid.sethtml(g_objpanel); sethtmlproperties(); } /** * set html properties according the options */ function sethtmlproperties() { //set panel background color if (g_options.gridpanel_background_color != "") g_objpanel.css("background-color", g_options.gridpanel_background_color); } /** * process and fix certain options, avoid arrows and validate options */ function processoptions() { if (g_options.gridpanel_grid_align == "center") g_options.gridpanel_grid_align = "middle"; } /** * place panel with some animation */ function placepanelanimation(panelx, functiononcomplete) { var objcss = { left: panelx + "px" }; g_objpanel.stop(true).animate(objcss, { duration: 300, easing: "easeinoutquad", queue: false, complete: function () { if (functiononcomplete) functiononcomplete(); } }); } /** * get max height of the grid according the arrows size */ function getgridmaxheight() { //check space taken without arrows for one pane grids var spacetaken = g_options.gridpanel_padding_border_top + g_options.gridpanel_padding_border_bottom; var maxgridheight = g_temp.panelheight - spacetaken; if (g_options.gridpanel_arrows_always_on == false) { var numpanes = g_objgrid.getnumpanesestimationbyheight(maxgridheight); if (numpanes == 1) return (maxgridheight); } //count the size with arrows var arrowssize = g_functions.getelementsize(g_objarrownext); var arrowsheight = arrowssize.height; var spacetaken = arrowsheight + g_options.gridpanel_arrows_padding_vert; if (g_options.gridpanel_vertical_scroll == true) //in case of 2 arrows multiply by 2 spacetaken *= 2; spacetaken += g_options.gridpanel_padding_border_top + g_options.gridpanel_padding_border_bottom; maxgridheight = g_temp.panelheight - spacetaken; return (maxgridheight); } /** * get grid maximum width */ function getgridmaxwidth() { //check space taken without arrows for one pane grids var spacetaken = g_options.gridpanel_padding_border_left + g_options.gridpanel_padding_border_right; var maxgridwidth = g_temp.panelwidth - spacetaken; if (g_options.gridpanel_arrows_always_on == false) { var numpanes = g_objgrid.getnumpanesestimationbywidth(maxgridwidth); if (numpanes == 1) return (maxgridwidth); } //count the size with arrows var arrowssize = g_functions.getelementsize(g_objarrownext); var arrowswidth = arrowssize.width; spacetaken += (arrowswidth + g_options.gridpanel_arrows_padding_hor) * 2; maxgridwidth = g_temp.panelwidth - spacetaken; return (maxgridwidth); } /** * enable / disable arrows according the grid */ function setarrows() { var showarrows = false; if (g_options.gridpanel_arrows_always_on == true) { showarrows = true; } else { var numpanes = g_objgrid.getnumpanes(); if (numpanes > 1) showarrows = true; } if (showarrows == true) { //show arrows g_objarrownext.show().fadeto(0, 1); g_objarrowprev.show().fadeto(0, 1); g_temp.arrowsvisible = true; } else { //hide arrows g_objarrownext.hide(); g_objarrowprev.hide(); g_temp.arrowsvisible = false; } } /** * set panel size by the given height and grid width */ function setpanelsize() { var gridsize = g_objgrid.getsize(); //set panel size if (g_temp.ishortype == true) g_temp.panelheight = gridsize.height + g_options.gridpanel_padding_border_top + g_options.gridpanel_padding_border_bottom; else g_temp.panelwidth = gridsize.width + g_options.gridpanel_padding_border_left + g_options.gridpanel_padding_border_right; g_functions.setelementsize(g_objpanel, g_temp.panelwidth, g_temp.panelheight); } /** * place the panel without animation * @param paneldest */ function placepanelnoanimation(paneldest) { switch (g_temp.orientation) { case "right": //vertical case "left": g_functions.placeelement(g_objpanel, paneldest, null); break; } } function __________events___________() { }; /** * event on panel slide finish */ function onpanelslidefinish() { g_objthis.trigger(t.events.finish_move); } /** * init panel events */ function initevents() { if (g_temp.iseventsinited == true) return (false); g_temp.iseventsinited = true; if (g_objarrowprev) { g_functions.addclassonhover(g_objarrowprev); g_objgrid.attachprevpanebutton(g_objarrowprev); } if (g_objarrownext) { g_functions.addclassonhover(g_objarrownext); g_objgrid.attachnextpanebutton(g_objarrownext); } g_panelbase.initevents(); } /** * destroy the events */ this.destroy = function () { if (g_objarrowprev) g_functions.destroybutton(g_objarrowprev); if (g_objarrownext) g_functions.destroybutton(g_objarrownext); g_panelbase.destroy(); g_objgrid.destroy(); } function ______place_elements___________() { }; /** * get padding left of the grid */ function getgridpaddingleft() { var gridpanelleft = g_options.gridpanel_padding_border_left; return (gridpanelleft); } /** * place elements vertical - grid only */ function placeelements_noarrows() { //place grid var gridy = g_options.gridpanel_grid_align, gridpaddingy = 0; switch (gridy) { case "top": gridpaddingy = g_options.gridpanel_padding_border_top; break; case "bottom": gridpaddingy = g_options.gridpanel_padding_border_bottom; break; } var gridpanelleft = getgridpaddingleft(); var gridelement = g_objgrid.getelement(); g_functions.placeelement(gridelement, gridpanelleft, gridy, 0, gridpaddingy); } /** * place elements vertical - with arrows */ function placeelementsvert_arrows() { //place grid var gridy, prevarrowy, nextarrowy, nextarrowpaddingy; var objarrowsize = g_functions.getelementsize(g_objarrowprev); var objgridsize = g_objgrid.getsize(); switch (g_options.gridpanel_grid_align) { default: case "top": gridy = g_options.gridpanel_padding_border_top + objarrowsize.height + g_options.gridpanel_arrows_padding_vert; break; case "middle": gridy = "middle"; break; case "bottom": gridy = g_temp.panelheight - objgridsize.height - objarrowsize.height - g_options.gridpanel_padding_border_bottom - g_options.gridpanel_arrows_padding_vert; break; } //place the grid var gridpanelleft = getgridpaddingleft(); var gridelement = g_objgrid.getelement(); g_functions.placeelement(gridelement, gridpanelleft, gridy); var objgridsize = g_objgrid.getsize(); //place arrows switch (g_options.gridpanel_arrows_align_vert) { default: case "center": case "middle": prevarrowy = (objgridsize.top - objarrowsize.height) / 2; nextarrowy = objgridsize.bottom + (g_temp.panelheight - objgridsize.bottom - objarrowsize.height) / 2; nextarrowpaddingy = 0; break; case "grid": prevarrowy = objgridsize.top - objarrowsize.height - g_options.gridpanel_arrows_padding_vert_vert nextarrowy = objgridsize.bottom + g_options.gridpanel_arrows_padding_vert; nextarrowpaddingy = 0; break; case "border": case "borders": prevarrowy = g_options.gridpanel_padding_border_top; nextarrowy = "bottom"; nextarrowpaddingy = g_options.gridpanel_padding_border_bottom; break; } g_functions.placeelement(g_objarrowprev, "center", prevarrowy); g_functions.placeelement(g_objarrownext, "center", nextarrowy, 0, nextarrowpaddingy); } /** * place elements vertical */ function placeelementsvert() { if (g_temp.arrowsvisible == true) placeelementsvert_arrows(); else placeelements_noarrows(); } /** * place elements horizontal with arrows */ function placeelementshor_arrows() { var arrowsy, prevarrowpadding, arrowspaddingy, nextarrowpadding; var objarrowsize = g_functions.getelementsize(g_objarrowprev); var objgridsize = g_objgrid.getsize(); //place grid var gridy = g_options.gridpanel_padding_border_top; switch (g_options.gridpanel_grid_align) { case "middle": switch (g_options.gridpanel_arrows_align_vert) { default: var elementsheight = objgridsize.height + g_options.gridpanel_arrows_padding_vert + objarrowsize.height; gridy = (g_temp.panelheight - elementsheight) / 2; break; case "border": case "borders": var remainheight = g_temp.panelheight - objarrowsize.height - g_options.gridpanel_padding_border_bottom; gridy = (remainheight - objgridsize.height) / 2; break; } break; case "bottom": var elementsheight = objgridsize.height + objarrowsize.height + g_options.gridpanel_arrows_padding_vert; gridy = g_temp.panelheight - elementsheight - g_options.gridpanel_padding_border_bottom; break; } var gridelement = g_objgrid.getelement(); var gridpanelleft = getgridpaddingleft(); g_functions.placeelement(gridelement, gridpanelleft, gridy); var objgridsize = g_objgrid.getsize(); switch (g_options.gridpanel_arrows_align_vert) { default: case "center": case "middle": arrowsy = objgridsize.bottom + (g_temp.panelheight - objgridsize.bottom - objarrowsize.height) / 2; arrowspaddingy = 0; break; case "grid": arrowsy = objgridsize.bottom + g_options.gridpanel_arrows_padding_vert; arrowspaddingy = 0; break; case "border": case "borders": arrowsy = "bottom"; arrowspaddingy = g_options.gridpanel_padding_border_bottom; break; } prevarrowpadding = -objarrowsize.width / 2 - g_options.gridpanel_space_between_arrows / 2; g_functions.placeelement(g_objarrowprev, "center", arrowsy, prevarrowpadding, arrowspaddingy); //place next arrow var nextarrowpadding = math.abs(prevarrowpadding); //make positive g_functions.placeelement(g_objarrownext, "center", arrowsy, nextarrowpadding, arrowspaddingy); } /** * place elements horizonatal */ function placeelementshor() { if (g_temp.arrowsvisible == true) placeelementshor_arrows(); else placeelements_noarrows(); } /** * place elements horizontal type with arrows */ function placeelementshortype_arrows() { //place grid var gridx, prevarrowx, nextarrowx, arrowsy; var objarrowsize = g_functions.getelementsize(g_objarrowprev); var objgridsize = g_objgrid.getsize(); switch (g_options.gridpanel_grid_align) { default: case "left": gridx = g_options.gridpanel_padding_border_left + g_options.gridpanel_arrows_padding_hor + objarrowsize.width; break; case "middle": case "center": gridx = "center"; break; case "right": gridx = g_temp.panelwidth - objgridsize.width - objarrowsize.width - g_options.gridpanel_padding_border_right - g_options.gridpanel_arrows_padding_hor; break; } //place the grid var gridelement = g_objgrid.getelement(); g_functions.placeelement(gridelement, gridx, g_options.gridpanel_padding_border_top); objgridsize = g_objgrid.getsize(); //place arrows, count y switch (g_options.gridpanel_arrows_align_vert) { default: case "center": case "middle": arrowsy = (objgridsize.height - objarrowsize.height) / 2 + objgridsize.top; break; case "top": arrowsy = g_options.gridpanel_padding_border_top + g_options.gridpanel_arrows_padding_vert; break; case "bottom": arrowsy = g_temp.panelheight - g_options.gridpanel_padding_border_bottom - g_options.gridpanel_arrows_padding_vert - objarrowsize.height; break; } //get arrows x switch (g_options.gridpanel_arrows_align_hor) { default: case "borders": prevarrowx = g_options.gridpanel_padding_border_left; nextarrowx = g_temp.panelwidth - g_options.gridpanel_padding_border_right - objarrowsize.width; break; case "grid": prevarrowx = objgridsize.left - g_options.gridpanel_arrows_padding_hor - objarrowsize.width; nextarrowx = objgridsize.right + g_options.gridpanel_arrows_padding_hor; break; case "center": prevarrowx = (objgridsize.left - objarrowsize.width) / 2; nextarrowx = objgridsize.right + (g_temp.panelwidth - objgridsize.right - objarrowsize.width) / 2; break; } g_functions.placeelement(g_objarrowprev, prevarrowx, arrowsy); g_functions.placeelement(g_objarrownext, nextarrowx, arrowsy); } /** * place elements horizontal type without arrows */ function placeelementhortype_noarrows() { var gridx; var objgridsize = g_objgrid.getsize(); switch (g_options.gridpanel_grid_align) { default: case "left": gridx = g_options.gridpanel_padding_border_left; break; case "middle": case "center": gridx = "center"; break; case "right": gridx = g_temp.panelwidth - objgridsize.width - g_options.gridpanel_padding_border_right; break; } //place the grid var gridelement = g_objgrid.getelement(); g_functions.placeelement(gridelement, gridx, g_options.gridpanel_padding_border_top); } /** * place elements when the grid in horizontal position */ function placeelementshortype() { if (g_temp.arrowsvisible == true) placeelementshortype_arrows(); else placeelementhortype_noarrows(); } /** * place the arrows */ function placeelements() { if (g_temp.ishortype == false) { if (g_options.gridpanel_vertical_scroll == true) placeelementsvert(); else placeelementshor(); } else { placeelementshortype(); } g_panelbase.placeelements(); } /** * get panel orientation */ this.getorientation = function () { return (g_temp.orientation); } /** * set panel orientation (left, right, top, bottom) */ this.setorientation = function (orientation) { g_temp.orientation = orientation; //set ishortype temp variable for ease of use switch (orientation) { case "right": case "left": g_temp.ishortype = false; break; case "top": case "bottom": g_temp.ishortype = true; break; default: throw new error("wrong grid panel orientation: " + orientation); break; } } /** * set panel height */ this.setheight = function (height) { if (g_temp.ishortype == true) throw new error("setheight is not appliable to this orientatio (" + g_temp.orientation + "). please use setwidth"); g_temp.panelheight = height; var gridmaxheight = getgridmaxheight(); g_objgrid.setmaxheight(gridmaxheight); } /** * set panel width */ this.setwidth = function (width) { if (g_temp.ishortype == false) throw new error("setwidth is not appliable to this orientatio (" + g_temp.orientation + "). please use setheight"); g_temp.panelwidth = width; var gridmaxwidth = getgridmaxwidth(); g_objgrid.setmaxwidth(gridmaxwidth); } /** * init the panel */ this.init = function (gallery, customoptions) { initgridpanel(gallery, customoptions); } /** * place panel html */ this.sethtml = function () { sethtmlpanel(); } /** * run the panel */ this.run = function () { runpanel(); } /** * get the panel element */ this.getelement = function () { return (g_objpanel); } /** * get panel size object */ this.getsize = function () { var objsize = g_functions.getelementsize(g_objpanel); return (objsize); } this.__________functions_from_base_____ = function () { } /** * tells if the panel is closed */ this.ispanelclosed = function () { return (g_panelbase.ispanelclosed()); } /** * get closed panel destanation */ this.getclosedpaneldest = function () { return g_panelbase.getclosedpaneldest(); } /** * open the panel */ this.openpanel = function (noanimation) { g_panelbase.openpanel(noanimation); } /** * close the panel (slide in) */ this.closepanel = function (noanimation) { g_panelbase.closepanel(noanimation); } /** * set the panel opened state */ this.setopenedstate = function (originalpos) { g_panelbase.setopenedstate(originalpos); } /** * set the panel that it's in closed state, and set original pos for opening later */ this.setclosedstate = function (originalpos) { g_panelbase.setclosedstate(originalpos); } /** * set panel disabled at start */ this.setdisabledatstart = function (timeout) { g_panelbase.setdisabledatstart(timeout); } } /** * 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_min_cols: 2, //minimum number of columns (for horizontal type) - the tile size is dynamic 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_space_between_mobile: 10, //space between rows and cols mobile 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", tilemaxwidth: null, tilemaxheight: null, spacebetweencols: null, spacebetweenrows: null }; function __________general_________() { }; /** * init the gallery */ function init(gallery, customoptions, istilesmode) { g_objects = gallery.getobjects(); g_gallery = gallery; g_gallery.attachthumbspanel("grid", t); 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); if (g_temp.istilesmode == true) { g_tilesdesign.setfixedmode(); g_tilesdesign.setapproveclickfunction(isapprovetileclick); g_tilesdesign.init(gallery, g_options); var options_td = g_tilesdesign.getoptions(); g_temp.tilemaxheight = options_td.tile_height; g_temp.tilemaxwidth = options_td.tile_width; g_thumbs = g_tilesdesign.getobjthumbs(); } else { //disable the dynamic size in thumbs customoptions.thumb_fixed_size = true; g_thumbs.init(gallery, customoptions); } } /** * 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) { initevents(); if (g_temp.istilesmode == true) { initgriddynamicsize(); initsizeparams(); g_tilesdesign.run(); } else { g_thumbs.sethtmlproperties(); initsizeparams(); g_thumbs.loadthumbsimages(); } } else { if (g_temp.istilesmode == true) { //check if dynamic size changed. if do, run the thumbs again var ischanged = initgriddynamicsize(); if (ischanged == true) { initsizeparams(); g_tilesdesign.run(); } } } 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; } /** * get thumb size object */ function getthumbssize() { if (g_temp.istilesmode == true) var objthumbsize = g_tilesdesign.getglobaltilesize(); else var objthumbsize = g_thumbs.getglobalthumbsize(); return (objthumbsize); } /** * init grid dynamic size (tiles mode) */ function initgriddynamicsize() { if (g_temp.istilesmode == false) throw new error("dynamic size can be set only in tiles mode"); var ischanged = false; var ismobile = g_gallery.ismobilemode(); //--- set space between cols and rows var spaceold = g_temp.spacebetweencols; if (ismobile == true) { g_temp.spacebetweencols = g_options.grid_space_between_mobile; g_temp.spacebetweenrows = g_options.grid_space_between_mobile; } else { g_temp.spacebetweencols = g_options.grid_space_between_cols; g_temp.spacebetweenrows = g_options.grid_space_between_rows; } if (g_temp.spacebetweencols != spaceold) ischanged = true; //set tile size var lastthumbsize = getthumbssize(); var lastthumbwidth = lastthumbsize.width; var tilewidth = g_temp.tilemaxwidth; var numcols = g_functions.getnumitemsinspace(g_temp.gridwidth, g_temp.tilemaxwidth, g_temp.spacebetweencols); if (numcols < g_options.grid_min_cols) { tilewidth = g_functions.getitemsizeinspace(g_temp.gridwidth, g_options.grid_min_cols, g_temp.spacebetweencols); } g_tilesdesign.settilesizeoptions(tilewidth); if (tilewidth != lastthumbwidth) ischanged = true; return (ischanged); } /** * init grid size horizontal * get height param */ function initsizeparamshor() { var objthumbsize = getthumbssize(); var thumbsheight = objthumbsize.height; //set grid size var gridwidth = g_temp.gridwidth; var gridheight = g_options.grid_num_rows * thumbsheight + (g_options.grid_num_rows - 1) * g_temp.spacebetweenrows + 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() { var objthumbsize = getthumbssize(); var thumbswidth = objthumbsize.width; //set grid size var gridwidth = g_options.grid_num_cols * thumbswidth + (g_options.grid_num_cols - 1) * g_temp.spacebetweencols + 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); //set vertical or horizon g_temp.isnavigationvertical = (g_options.grid_panes_direction == "top" || g_options.grid_panes_direction == "bottom") g_temp.spacebetweencols = g_options.grid_space_between_cols; g_temp.spacebetweenrows = g_options.grid_space_between_rows; } /** * 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_temp.spacebetweencols; //next row counter++; if (counter >= g_options.grid_num_cols) { posy += thumbheight + g_temp.spacebetweenrows; 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_temp.spacebetweencols; 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_temp.spacebetweencols; var endy = (posy + thumbheight); if (endy > maxy) maxy = endy; //next row counter++; if (counter >= g_options.grid_num_cols) { posy += thumbheight + g_temp.spacebetweenrows; 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_temp.spacebetweenrows; 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, gridmaxy = 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; posy = basey; panemaxy = 0; //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.gridheight = gridmaxy + g_options.grid_padding; g_objgrid.height(g_temp.gridheight); } g_temp.numpanes++; g_temp.arrpanes.push(basex - g_options.grid_padding); } else { //start new line in existing pane posx = basex; posy = panemaxy + g_temp.spacebetweenrows; } } //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) //pane height panemaxy = endy; if (endy > gridmaxy) //total height gridmaxy = 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_temp.spacebetweencols; //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_options.grid_padding; g_temp.innerheight = gridmaxy + g_options.grid_padding; 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 = gridmaxy + 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() { if (g_options.grid_vertical_scroll_ondrag == false) return (false); if (g_temp.isnavigationvertical == true) return (false); var scrolldir = g_functions.handlescrolltop(g_temp.storedeventid); if (scrolldir === "vert") return (true); return (false); } /** * 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); //check if was vertical scroll var isscroll = handlescrolltop(); 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_temp.spacebetweenrows; 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_temp.spacebetweencols; 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_temp.spacebetweencols); 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_temp.spacebetweenrows); 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); } } /** * tiles class */ function ugtiles() { var t = this, g_objthis = jquery(this); var g_gallery = new unitegallerymain(), g_objgallery, g_objwrapper, g_objparent; var g_functions = new ugfunctions(), g_arritems, g_objtiledesign = new ugtiledesign(); var g_thumbs = new ugthumbsgeneral(), g_vars = {}; var g_arrnestedgridrow, g_arrnesteditems; var g_options = { tiles_type: "columns", //columns / justified - tiles layout type tiles_col_width: 250, //column width - exact or base according the settings tiles_align: "center", //align of the tiles in the space tiles_exact_width: false, //exact width of column - disables the min and max columns tiles_space_between_cols: 3, //space between images tiles_space_between_cols_mobile: 3, //space between cols for mobile type tiles_include_padding: true, //include padding at the sides of the columns, equal to current space between cols tiles_min_columns: 2, //min columns tiles_max_columns: 0, //max columns (0 for unlimited) tiles_keep_order: false, //keep order - slower algorytm tiles_set_initial_height: true, //set some estimated height before images show tiles_justified_row_height: 150, //base row height of the justified type tiles_justified_space_between: 3, //space between the tiles justified type tiles_nested_optimal_tile_width: 250, // tiles optimal width tiles_nested_col_width: null, // nested tiles column width tiles_nested_debug: false, tiles_enable_transition: true //enable transition when screen width change }; this.events = { thumb_size_change: "thumb_size_change", tiles_first_placed: "tiles_first_placed", //only in case of justified all_tiles_loaded: "all_tiles_loaded" }; var g_temp = { isfirsttimerun: true, //if run once handle: null, //interval handle istransactive: false, //is transition active istransinited: false, //if the transition function is set isfirstplaced: true, //is first time placed isallloaded: false }; var g_nestedwork = { colwidth: null, nestedoptimalcols: 5, gridy: 0, maxcolumns: 0, //maxcolumns columnsvaluetoenableheightresize: 3, //columns value to enable height resize resizeleftrighttocolumn: true, currentitem: 0, currentgap: null, optimaltilewidth: null, maxgridy: 0 } 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); modifyoptions(); g_objtiledesign.init(gallery, g_options); g_thumbs = g_objtiledesign.getobjthumbs(); } /** * modify options */ function modifyoptions() { if (g_options.tiles_min_columns < 1) g_options.tiles_min_columns = 1; //protection of max columns, can't be more then min columns if (g_options.tiles_max_columns != 0 && g_options.tiles_max_columns < g_options.tiles_min_columns) { g_options.tiles_max_columns = g_options.tiles_min_columns; } } /** * set the grid panel html */ function sethtml(objparent) { if (!objparent) { if (g_objparent) objparent = g_objparent; else var objparent = g_objwrapper; } g_objparent = objparent; var tilestype = g_options.tiles_type; objparent.addclass("ug-tiletype-" + tilestype); g_objtiledesign.sethtml(objparent); objparent.children(".ug-thumb-wrapper").hide(); } /** * set class that enables transition */ function settransition() { //set the tiles in resting mode, to activate their own transitions g_objparent.addclass("ug-tiles-rest-mode"); g_temp.istransinited = true; //add css tansition if (g_options.tiles_enable_transition == true) { g_objparent.addclass("ug-tiles-transit"); //add image overlay transition var optionstile = g_objtiledesign.getoptions(); if (optionstile.tile_enable_image_effect == true && optionstile.tile_image_effect_reverse == false) g_objparent.addclass("ug-tiles-transit-overlays"); g_temp.istransactive = true; } } /** * get parent width */ function getparentwidth() { return g_functions.getelementsize(g_objparent).width; } /** * do some actions before transition */ function dobeforetransition() { if (g_temp.istransinited == false) return (false); g_objparent.addclass("ug-tiles-transition-active"); g_objparent.removeclass("ug-tiles-rest-mode"); //prepare for transition if (g_temp.istransactive == false) return (false); g_objtiledesign.disableevents(); } /** * set after transition classes */ function doaftertransition_setclasses() { if (g_temp.istransinited == false) return (false); g_objparent.removeclass("ug-tiles-transition-active"); g_objparent.addclass("ug-tiles-rest-mode"); } /** * do some actions after transition */ function doaftertransition() { if (g_temp.istransactive == true) { //trigger size change after transition settimeout(function () { g_objtiledesign.enableevents(); g_objtiledesign.triggersizechangeeventalltiles(); doaftertransition_setclasses(); }, 800); //control size change if (g_temp.handle) cleartimeout(g_temp.handle); g_temp.handle = settimeout(function () { doaftertransition_setclasses(); g_objtiledesign.triggersizechangeeventalltiles(); g_temp.handle = null; }, 2000); } else { g_objtiledesign.triggersizechangeeventalltiles(); doaftertransition_setclasses(); } } function __________column_type_related_________() { }; /** * count width by number of columns */ function filltilesvars_countwidthbycols() { g_vars.colwidth = (g_vars.availwidth - g_vars.colgap * (g_vars.numcols - 1)) / g_vars.numcols; g_vars.colwidth = math.floor(g_vars.colwidth); g_vars.totalwidth = g_functions.getspacebynumitems(g_vars.numcols, g_vars.colwidth, g_vars.colgap); } /** * fill common tiles vars */ function filltilesvars() { g_vars.colwidth = g_options.tiles_col_width; g_vars.mincols = g_options.tiles_min_columns; g_vars.maxcols = g_options.tiles_max_columns; if (g_gallery.ismobilemode() == false) { g_vars.colgap = g_options.tiles_space_between_cols; } else { g_vars.colgap = g_options.tiles_space_between_cols_mobile; } //set gallery width g_vars.gallerywidth = getparentwidth(); g_vars.availwidth = g_vars.gallerywidth; if (g_options.tiles_include_padding == true) g_vars.availwidth = g_vars.gallerywidth - g_vars.colgap * 2; //set the column number by exact width if (g_options.tiles_exact_width == true) { g_vars.numcols = g_functions.getnumitemsinspace(g_vars.availwidth, g_vars.colwidth, g_vars.colgap); if (g_vars.maxcols > 0 && g_vars.numcols > g_vars.maxcols) g_vars.numcols = g_vars.maxcols; //if less then min cols count width by cols if (g_vars.numcols < g_vars.mincols) { g_vars.numcols = g_vars.mincols; filltilesvars_countwidthbycols(); } else { g_vars.totalwidth = g_vars.numcols * (g_vars.colwidth + g_vars.colgap) - g_vars.colgap; } } else { //set dynamic column number var numcols = g_functions.getnumitemsinspaceround(g_vars.availwidth, g_vars.colwidth, g_vars.colgap); if (numcols < g_vars.mincols) numcols = g_vars.mincols; else if (g_vars.maxcols != 0 && numcols > g_vars.maxcols) numcols = g_vars.maxcols; g_vars.numcols = numcols; filltilesvars_countwidthbycols(); } switch (g_options.tiles_align) { case "center": default: //add x to center point g_vars.addx = math.round((g_vars.gallerywidth - g_vars.totalwidth) / 2); break; case "left": g_vars.addx = 0; break; case "right": g_vars.addx = g_vars.gallerywidth - g_vars.totalwidth; break; } //get posx array (constact to all columns) g_vars.arrposx = []; for (col = 0; col < g_vars.numcols; col++) { var colx = g_functions.getcolx(col, g_vars.colwidth, g_vars.colgap); g_vars.arrposx[col] = colx + g_vars.addx; } } /** * init col heights */ function initcolheights() { g_vars.maxcolheight = 0; //empty heights array g_vars.colheights = [0]; } /** * get column with minimal height */ function gettilesmincol() { var numcol = 0; var minheight = 999999999; for (col = 0; col < g_vars.numcols; col++) { if (g_vars.colheights[col] == undefined || g_vars.colheights[col] == 0) return col; if (g_vars.colheights[col] < minheight) { numcol = col; minheight = g_vars.colheights[col]; } } return (numcol); } /** * place tile as it loads */ function placetile(objtile, toshow, setgalleryheight, numcol) { if (numcol === null || typeof numcol == "undefined") var numcol = gettilesmincol(); //set posy var posy = 0; if (g_vars.colheights[numcol] !== undefined) posy = g_vars.colheights[numcol]; var itemheight = g_objtiledesign.gettileheightbywidth(g_vars.colwidth, objtile); if (itemheight === null) { //for custom html tile if (g_options.tiles_enable_transition == true) throw new error("can't know tile height, please turn off transition"); var itemsize = g_functions.getelementsize(objtile); itemheight = itemsize.height; } var posx = g_vars.arrposx[numcol]; g_functions.placeelement(objtile, posx, posy); var realheight = posy + itemheight; g_vars.colheights[numcol] = realheight + g_vars.colgap; //set max height if (g_vars.maxcolheight < realheight) g_vars.maxcolheight = realheight; if (toshow == true) objtile.show().fadeto(0, 1); if (setgalleryheight == true) { g_objparent.height(g_vars.maxcolheight); } } /** * place the tiles */ function placetiles(toshow) { if (!toshow) toshow = false; filltilesvars(); initcolheights(); var objthumbs = g_thumbs.getthumbs(g_thumbs.type.get_thumbs_ratio); //do some operation before the transition dobeforetransition(); //resize all thumbs g_objtiledesign.resizealltiles(g_vars.colwidth, g_objtiledesign.resizemode.visible_elements, objthumbs); //place elements for (var index = 0; index < objthumbs.length; index++) { var objtile = jquery(objthumbs[index]); var col = undefined; if (g_options.tiles_keep_order == true) col = g_functions.getcolbyindex(g_vars.numcols, index); placetile(objtile, toshow, false, col); } //bring back the state after transition doaftertransition(); //set gallery height, according the transition var galleryheight = g_objparent.height(); if (g_temp.istransactive == true && galleryheight > g_vars.maxcolheight) settimeout(function () { g_objparent.height(g_vars.maxcolheight); }, 700); else g_objparent.height(g_vars.maxcolheight); } /** * check if alowed to place ordered tile */ function isorderedtileplacealowed(objtile) { var index = objtile.index(); //don't allow double put items var currentitem = g_gallery.getitem(index); if (currentitem.ordered_placed === true) return (false); var previndex = g_functions.getprevrowsamecolindex(index, g_vars.numcols); //put first item in the column if (previndex < 0) return (true); //check if previous tile in column is placed var objprevitem = g_gallery.getitem(previndex); if (objprevitem.ordered_placed === true) return (true); return (false); } /** * place ordered tile */ function placeorderedtile(objtile, isforce) { if (isforce !== true) { var isalowed = isorderedtileplacealowed(objtile); if (isalowed == false) return (false); } var index = objtile.index(); var col = g_functions.getcolbyindex(g_vars.numcols, index); var objitem = g_gallery.getitem(index); g_objtiledesign.resizetile(objtile, g_vars.colwidth); placetile(objtile, true, true, col); objitem.ordered_placed = true; //check by recursion and place next items in column var numitems = g_gallery.getnumitems(); var nextindex = g_functions.getnextrowsamecolindex(index, g_vars.numcols); if (nextindex >= numitems) return (false); var nexttile = g_thumbs.getthumbbyindex(nextindex); var nextitem = g_gallery.getitem(nextindex); var isloaded = g_thumbs.isthumbloaded(nexttile); if (g_thumbs.isthumbloaded(nexttile) && !nextitem.ordered_placed) placeorderedtile(nexttile, true); } /** * on single image load */ function onsingleimageload(objimage, iserror) { if (iserror == true) return (false); objimage = jquery(objimage); var objtile = jquery(objimage).parent(); g_thumbs.triggerimageloadedevent(objtile, objimage); if (g_options.tiles_keep_order == true) { placeorderedtile(objtile); } else { g_objtiledesign.resizetile(objtile, g_vars.colwidth); placetile(objtile, true, true); } } /** * run columns type - place tiles that are not loaded yet */ function runcolumnstype() { //get thumbs only when the ratio not set var objthumbs = g_thumbs.getthumbs(g_thumbs.type.get_thumbs_no_ratio); if (!objthumbs || objthumbs.length == 0) return (false); g_temp.isallloaded = false; if (g_temp.isfirstplaced == true) { filltilesvars(); initcolheights(); var diffwidth = math.abs(g_vars.gallerywidth - g_vars.totalwidth); //set initial height of the parent by estimation if (g_options.tiles_set_initial_height == true && g_functions.isscrollbarexists() == false && diffwidth < 25) { var numthumbs = objthumbs.length; var numrows = math.ceil(objthumbs.length / g_vars.numcols); var estimateheight = numrows * g_options.tiles_col_width * 0.75; g_objparent.height(estimateheight); filltilesvars(); } } objthumbs.fadeto(0, 0); var objimages = objthumbs.find("img.ug-thumb-image"); var initnumcols = g_vars.numcols; var initwidth = g_vars.gallerywidth; //on place the tile as it loads. after all tiles loaded,check position again. g_functions.checkimagesloaded(objimages, function () { filltilesvars(); if (initnumcols != g_vars.numcols || initwidth != g_vars.gallerywidth) { placetiles(false); } settransition(); g_objthis.trigger(t.events.all_tiles_loaded); }, function (objimage, iserror) { if (g_temp.isfirstplaced == true) g_gallery.triggerevent(t.events.tiles_first_placed); //set to false onsingleimageload(objimage, iserror); }); } function __________justified_type_related_________() { }; /** * ------------ justified type related functions ---------------- */ function getjustifieddata() { var gallerywidth = getparentwidth(); var objtiles = g_thumbs.getthumbs(true); var rowheightopt = g_options.tiles_justified_row_height; var arrwidths = []; var totalwidth = 0; var gap = g_options.tiles_justified_space_between; var numtiles = objtiles.length; //get arr widths and total width jquery.each(objtiles, function (index, objtile) { objtile = jquery(objtile); var objitem = g_thumbs.getitembythumb(objtile); var tilewidth = objitem.thumbwidth; var tileheight = objitem.thumbheight; if (tileheight !== rowheightopt) tilewidth = math.floor(objitem.thumbratiobywidth * rowheightopt); arrwidths[index] = tilewidth; totalwidth += tilewidth; }); var numrows = math.ceil(totalwidth / gallerywidth); if (numrows > numtiles) numrows = numtiles; var finalrowwidth = totalwidth / numrows; //fill rows array, break tiles to rows var arrrows = [], eachrowwidth = 0; var rowswidths = [], rowstiles = [], row = []; var progresswidth = 0, numrow = 0; jquery.each(objtiles, function (index, objtile) { var tilewidth = arrwidths[index]; if ((progresswidth + tilewidth / 2) > (numrow + 1) * finalrowwidth) { rowswidths[arrrows.length] = eachrowwidth; arrrows.push(row); row = []; eachrowwidth = 0; numrow++; } progresswidth += tilewidth; eachrowwidth += tilewidth; row.push(objtile); }); rowswidths[arrrows.length] = eachrowwidth; arrrows.push(row); //set heights and position images: var arrrowwidths = []; var arrrowheights = []; var totalheight = 0; jquery.each(arrrows, function (index, row) { var numtiles = row.length; var rowwidth = rowswidths[index]; var gapwidth = (row.length - 1) * gap; var ratio = (gallerywidth - gapwidth) / rowwidth; var rowheight = math.round(rowheightopt * ratio); //count total height totalheight += rowheight; if (index > 0) totalheight += gap; arrrowheights.push(rowheight); //ratio between 2 heights for fixing image width: var ratioheights = rowheight / rowheightopt; //set tiles sizes: var arrrowtilewidths = []; var actualrowwidth = gapwidth; jquery.each(row, function (indexinrow, tile) { var objtile = jquery(tile); var tileindex = objtile.index(); var tilewidth = arrwidths[tileindex]; var newwidth = math.round(tilewidth * ratioheights); arrrowtilewidths[indexinrow] = newwidth; actualrowwidth += newwidth; }); //fix images widths by adding or reducing 1 pixel var diff = actualrowwidth - gallerywidth; var newtotal = 0; jquery.each(arrrowtilewidths, function (indexinrow, width) { if (diff == 0) return (false); if (diff < 0) { arrrowtilewidths[indexinrow] = width + 1; diff++; } else { arrrowtilewidths[indexinrow] = width - 1; diff--; } //if at last item diff stays, add all diff if (indexinrow == (arrrowtilewidths.length - 1) && diff != 0) arrrowtilewidths[indexinrow] -= diff; }); arrrowwidths[index] = arrrowtilewidths; }); var objdata = { arrrows: arrrows, arrrowwidths: arrrowwidths, arrrowheights: arrrowheights, gap: gap, totalheight: totalheight }; return (objdata); } /** * put justified images */ function placejustified(toshow) { if (!toshow) var toshow = false; var parentwidth = getparentwidth(); var objdata = getjustifieddata(); //if the width changed after height change (because of scrollbar), recalculate g_objparent.height(objdata.totalheight); var parentwidthafter = getparentwidth(); if (parentwidthafter != parentwidth) objdata = getjustifieddata(); dobeforetransition(); var posy = 0; var totalwidth = 0; //just count total widht for check / print jquery.each(objdata.arrrows, function (index, row) { var arrrowtilewidths = objdata.arrrowwidths[index]; var rowheight = objdata.arrrowheights[index]; //resize and place tiles var posx = 0; jquery.each(row, function (indexinrow, tile) { var objtile = jquery(tile); var tileheight = rowheight; var tilewidth = arrrowtilewidths[indexinrow]; g_objtiledesign.resizetile(objtile, tilewidth, tileheight, g_objtiledesign.resizemode.visible_elements); g_functions.placeelement(objtile, posx, posy); posx += tilewidth; if (posx > totalwidth) totalwidth = posx; posx += objdata.gap; if (toshow == true) jquery(tile).show(); }); posy += (rowheight + objdata.gap); }); doaftertransition(); } /** * run justified type gallery */ function runjustifiedtype() { var objimages = jquery(g_objwrapper).find("img.ug-thumb-image"); var objtiles = g_thumbs.getthumbs(); g_temp.isallloaded = false; objtiles.fadeto(0, 0); g_functions.checkimagesloaded(objimages, function () { settimeout(function () { placejustified(true); objtiles.fadeto(0, 1); g_gallery.triggerevent(t.events.tiles_first_placed); settransition(); g_objthis.trigger(t.events.all_tiles_loaded); }); }, function (objimage, iserror) { objimage = jquery(objimage); var objtile = jquery(objimage).parent(); g_thumbs.triggerimageloadedevent(objtile, objimage); }); } function __________nested_type_related_________() { }; /** * ------------ nested type related functions ---------------- */ function runnestedtype() { var objimages = jquery(g_objwrapper).find("img.ug-thumb-image"); var objtiles = g_thumbs.getthumbs(); g_temp.isallloaded = false; objtiles.fadeto(0, 0); g_functions.checkimagesloaded(objimages, function () { if (g_gallery.ismobilemode() == true) { placetiles(true); } else placenestedimages(true); g_gallery.triggerevent(t.events.tiles_first_placed); settransition(); g_objthis.trigger(t.events.all_tiles_loaded); }, function (objimage, iserror) { objimage = jquery(objimage); var objtile = jquery(objimage).parent(); g_thumbs.triggerimageloadedevent(objtile, objimage); }); } /** * fill nested vars */ function fillnestedvars() { var gallerywidth = getparentwidth(); g_nestedwork.gallerywidth = gallerywidth; g_arrnestedgridrow = {}; g_nestedwork.colwidth = g_options.tiles_nested_col_width; g_nestedwork.optimaltilewidth = g_options.tiles_nested_optimal_tile_width; g_nestedwork.currentgap = g_options.tiles_space_between_cols; if (g_gallery.ismobilemode() == true) g_nestedwork.currentgap = g_options.tiles_space_between_cols_mobile; if (g_nestedwork.colwidth == null) { g_nestedwork.colwidth = math.floor(g_nestedwork.optimaltilewidth / g_nestedwork.nestedoptimalcols); } else if (g_nestedwork.optimaltilewidth > g_nestedwork.colwidth) { g_nestedwork.nestedoptimalcols = math.ceil(g_nestedwork.optimaltilewidth / g_nestedwork.colwidth); } else { g_nestedwork.nestedoptimalcols = 1; } g_nestedwork.maxcolumns = g_functions.getnumitemsinspace(gallerywidth, g_nestedwork.colwidth, g_nestedwork.currentgap); //fix col width - justify tiles g_nestedwork.colwidth = g_functions.getitemsizeinspace(gallerywidth, g_nestedwork.maxcolumns, g_nestedwork.currentgap); g_nestedwork.gridy = 0; g_arrnesteditems = [] var objtiles = g_thumbs.getthumbs(true); objtiles.each(function () { var objtile = jquery(this); var sizes = setnestedsize(objtile); g_arrnesteditems.push(sizes); }); if (g_nestedwork.optimaltilewidth > g_nestedwork.colwidth) { g_nestedwork.nestedoptimalcols = math.ceil(g_nestedwork.optimaltilewidth / g_nestedwork.colwidth); } else { g_nestedwork.nestedoptimalcols = 1; } g_nestedwork.totalwidth = g_nestedwork.maxcolumns * (g_nestedwork.colwidth + g_nestedwork.currentgap) - g_nestedwork.currentgap; switch (g_options.tiles_align) { case "center": default: //add x to center point g_nestedwork.addx = math.round((g_nestedwork.gallerywidth - g_nestedwork.totalwidth) / 2); break; case "left": g_nestedwork.addx = 0; break; case "right": g_nestedwork.addx = g_nestedwork.gallerywidth - g_nestedwork.totalwidth; break; } g_nestedwork.maxgridy = 0; } /** * place nested type images */ function placenestedimages(toshow) { var parentwidth = getparentwidth(); fillnestedvars(); placenestedimagescycle(); var totalheight = g_nestedwork.maxgridy * (g_nestedwork.colwidth + g_nestedwork.currentgap) - g_nestedwork.currentgap; //if the width changed after height change (because of scrollbar), recalculate g_objparent.height(totalheight); var parentwidthafter = getparentwidth(); if (parentwidthafter != parentwidth) { fillnestedvars(); placenestedimagescycle(); } if (g_options.tiles_nested_debug == false) drawnestedimages(toshow); } /** * set nested size */ function setnestedsize(objtile) { var dimwidth, dimheight; var output = {}; var colwidth = g_nestedwork.colwidth; var gapwidth = g_nestedwork.currentgap; var objimagesize = g_objtiledesign.gettileimagesize(objtile); var index = objtile.index(); var maxdim = math.ceil(getpresettedrandombywidth(index) * (g_nestedwork.nestedoptimalcols * 1 / 3) + g_nestedwork.nestedoptimalcols * 2 / 3); var imgwidth = objimagesize.width; var imgheight = objimagesize.height; var ratio = imgwidth / imgheight; if (imgwidth > imgheight) { dimwidth = maxdim; dimheight = math.round(dimwidth / ratio); if (dimheight == 0) { dimheight = 1; } } else { dimheight = maxdim; dimwidth = math.round(dimheight * ratio); if (dimwidth == 0) { dimwidth = 1; } } output.dimwidth = dimwidth; output.dimheight = dimheight; output.width = dimwidth * colwidth + gapwidth * (dimwidth - 1); output.height = dimheight * colwidth + gapwidth * (dimheight - 1); output.imgwidth = imgwidth; output.imgheight = imgheight; output.left = 0; output.top = 0; return output; } /** * get presetted random [0,1] from int */ function getpresettedrandombywidth(index) { return math.abs(math.sin(math.abs(math.sin(index) * 1000))); } /** * place nested images debug */ function placenestedimagesdebug(toshow, placeone) { if (placeone == false) { for (var i = g_nestedwork.currentitem; i < g_arrnesteditems.length; i++) { placenestedimage(i, true); } g_nestedwork.currentitem = g_arrnesteditems.length - 1; } else { placenestedimage(g_nestedwork.currentitem, true); } for (var i = 0; i <= g_nestedwork.currentitem; i++) { drawnestedimage(i, true); } g_nestedwork.currentitem++; } /** * start cycle of placing imgaes */ function placenestedimagescycle(placeone) { if (g_options.tiles_nested_debug == true) { if (typeof placeone === 'undefined') placeone = true; placenestedimagesdebug(true, placeone); return (false); } for (var i = 0; i < g_arrnesteditems.length; i++) placenestedimage(i, true); } /** * place nested image */ function placenestedimage(tileid, toshow) { if (!toshow) var toshow = false; g_nestedwork.maxcolheight = 0; var rowsvalue = g_functions.getobjectlength(g_arrnestedgridrow); for (var row = g_nestedwork.gridy; row <= rowsvalue + 1; row++) { for (var column = 0; column < g_nestedwork.maxcolumns; column++) { if (isgridrowexists(g_nestedwork.gridy) == false || isgridcelltaken(g_nestedwork.gridy, column) == false) { var totalfree = gettotalfreefromposition(column); calculateoptimalstretchandposition(tileid, totalfree, column); return; } } g_nestedwork.gridy++; } } /** * calculate optimal stretch of tile */ function calculateoptimalstretchandposition(tileid, totalfree, column) { var sizes = jquery.extend(true, {}, g_arrnesteditems[tileid]); var currentwidth = sizes.dimwidth; var placefornextimage = totalfree - sizes.dimwidth; var optimalwidth = g_nestedwork.nestedoptimalcols; var onlycurrentimage = (totalfree <= sizes.dimwidth || placefornextimage <= 0.33 * optimalwidth || totalfree <= optimalwidth); //width stretching if needed if (onlycurrentimage) { // if free space is smaller than image width - place to this space anyway resizetonewwidth(tileid, totalfree); } else if (placefornextimage <= optimalwidth) { // if there are place for 2 images if (optimalwidth >= 4) { if (isgridimagealigned(math.floor(totalfree / 2), column) == true) { resizetonewwidth(tileid, math.floor(totalfree / 2) + 1); } else { resizetonewwidth(tileid, math.floor(totalfree / 2)); } } else { resizetonewwidth(objimage, totalfree); } } else { if (isgridimagealigned(currentwidth, column) == true) { switch (currentwidth >= optimalwidth) { case true: resizetonewwidth(tileid, currentwidth - 1); break case false: resizetonewwidth(tileid, currentwidth + 1); break } } } //height stretching if needed sizes = jquery.extend(true, {}, g_arrnesteditems[tileid]); var columninfo = getgridcolumnheight(tileid, sizes.dimwidth, column); // [columnheight, imagesids] if (g_nestedwork.columnsvaluetoenableheightresize <= columninfo[0] && g_nestedwork.maxcolumns >= 2 * g_nestedwork.nestedoptimalcols) { var sidehelper = getgridimageverticaldifference(column, sizes); var columnsizes = resizetonewheight(tileid, sidehelper.newheight, true); g_arrnesteditems[tileid].dimheight = columnsizes.dimheight; var columnresizes = redistributecolumnitems(columninfo, columnsizes.dimwidth, column); var columncrosshairs = getcolumncrosshairscount(columnresizes); var disablecolumnresizes = false; if (columncrosshairs >= 2) { disablecolumnresizes = true; } if (sidehelper.newheight >= sizes.dimheight) { sizes = resizetonewheight(tileid, sidehelper.newheight, true); } var sideresizes = getsideresizeinfo(sidehelper.idtoresize, sidehelper.newheight, sizes.dimheight); sizes.top = g_nestedwork.gridy; sizes.left = column; sideresizes.push({ "tileid": tileid, "sizes": sizes }); var sideresizesval = calcresizeratio(sideresizes); var columnresizesval = calcresizeratio(columnresizes); if (sideresizesval < columnresizesval || disablecolumnresizes == true) { applyresizes(sideresizes); return; } else { applyresizes(columnresizes); return; } } sizes.left = column; sizes.top = g_nestedwork.gridy; g_arrnesteditems[tileid] = sizes; putimagetogridrow(tileid, sizes, column, g_nestedwork.gridy); g_nestedwork.maxgridy = sizes.top + sizes.dimheight; } /** * check columns crosshairs */ function getcolumncrosshairscount(tilesandsizes) { var crosshairscountr = 0; var crosshairscountl = 0; for (var i = 0; i < tilesandsizes.length - 1; i++) { var sizes = tilesandsizes[i].sizes; var topitem = -1; var bottomitem = -1; if (isgridrowexists(sizes.top + sizes.dimheight) && g_nestedwork.maxcolumns > sizes.left + sizes.dimwidth) { topitem = g_arrnestedgridrow[sizes.top + sizes.dimheight - 1][sizes.left + sizes.dimwidth]; bottomitem = g_arrnestedgridrow[sizes.top + sizes.dimheight][sizes.left + sizes.dimwidth]; } if (topitem != bottomitem) { crosshairscountr++; } } for (var i = 0; i < tilesandsizes.length - 1; i++) { var sizes = tilesandsizes[i].sizes; var topitem = -1; var bottomitem = -1; if (isgridrowexists(sizes.top + sizes.dimheight) && sizes.left - 1 >= 0) { topitem = g_arrnestedgridrow[sizes.top + sizes.dimheight - 1][sizes.left - 1]; bottomitem = g_arrnestedgridrow[sizes.top + sizes.dimheight][sizes.left - 1]; } if (topitem != bottomitem) { crosshairscountl++; } } return math.max(crosshairscountl, crosshairscountr); } /** * get size resize info */ function getsideresizeinfo(idtoresize, newheight, dimheight) { var currenttile = g_arrnesteditems[idtoresize]; var tileheight = currenttile.dimheight; var tilewidth = currenttile.dimwidth; var tileleft = currenttile.left; var tiletop = currenttile.top; var tiledimtop = parseint(tiletop / (g_nestedwork.colwidth + g_nestedwork.currentgap)); var tiledimleft = parseint(tileleft / (g_nestedwork.colwidth + g_nestedwork.currentgap)); var newsideheight = tileheight - newheight + dimheight; var sidesizes = resizetonewheight(idtoresize, newsideheight, true); var output = []; output.push({ "tileid": idtoresize, "sizes": sidesizes }); return output; } /** * apply resizes to fix column */ function applyresizes(resizetilesandsizes) { for (var i = 0; i < resizetilesandsizes.length; i++) { var sizes = resizetilesandsizes[i].sizes; var tileid = resizetilesandsizes[i].tileid; g_arrnesteditems[tileid] = jquery.extend(true, {}, sizes); putimagetogridrow(tileid, sizes, sizes.left, sizes.top); } } /** * redistribute heights in column * returns current item sizes */ function redistributecolumnitems(columninfo, columnwidth) { var originalheight = 0; var columnheight = 0; var objtiles = []; var cordx = 0, cordy = 0; for (var i = 0; i < columninfo[1].length; i++) { var tileid = columninfo[1][i]; var currenttile = g_arrnesteditems[columninfo[1][i]]; columnheight += currenttile.dimheight; if (i == 0) { var sizes = resizetonewwidth(tileid, columnwidth, true); originalheight += sizes.dimheight; objtiles.push([columninfo[1][i], sizes.dimheight]); continue; } originalheight += currenttile.dimheight; objtiles.push([tileid, currenttile.dimheight]); } cordx = currenttile.left; cordy = currenttile.top; var tempheight = columnheight; var output = []; for (var i = objtiles.length - 1; i >= 0; i--) { var tileid = objtiles[i][0]; var newheight; if (i != 0) { newheight = math.max(math.round(columnheight * 1 / 3), math.floor(objtiles[i][1] * (columnheight / originalheight))); tempheight = tempheight - newheight; sizes = resizetonewheight(tileid, newheight, true); sizes.left = cordx; sizes.top = cordy; output.push({ "tileid": tileid, "sizes": sizes }); cordy += sizes.dimheight; } else { newheight = tempheight; sizes = resizetonewheight(tileid, newheight, true); sizes.left = cordx; sizes.top = cordy; output.push({ "tileid": tileid, "sizes": sizes }); } } return output; } /** * calculate num of objects in current column and return they are id's */ function getgridcolumnheight(tileid, dimwidth, column) { var tempy = g_nestedwork.gridy - 1; var curimage = 0; var previmage = 0; var columnheight = 1; var imagesids = []; var toreturn = []; imagesids.push(tileid); if (tempy >= 0) { previmage = 0; while (tempy >= 0) { curimage = g_arrnestedgridrow[tempy][column]; if ((typeof g_arrnestedgridrow[tempy][column - 1] === 'undefined' || g_arrnestedgridrow[tempy][column - 1] != g_arrnestedgridrow[tempy][column]) && (typeof g_arrnestedgridrow[tempy][column + dimwidth] === 'undefined' || g_arrnestedgridrow[tempy][column + dimwidth - 1] != g_arrnestedgridrow[tempy][column + dimwidth]) && (g_arrnestedgridrow[tempy][column] == g_arrnestedgridrow[tempy][column + dimwidth - 1])) { if (previmage != curimage) { columnheight++; imagesids.push(curimage); } } else { toreturn.push(columnheight); toreturn.push(imagesids); return toreturn; } tempy--; previmage = curimage; } toreturn.push(columnheight); toreturn.push(imagesids); return toreturn; } return [0, []]; } /** * get new height based on left and right difference */ function getgridimageverticaldifference(column, sizes) { var newheightr = 0; var newheightl = 0; var dimwidth = sizes.dimwidth; var dimheight = sizes.dimheight; var leftid = 0; var rightid = 0; var array = jquery.map(g_arrnestedgridrow, function (value, index) { return [value]; }); if (typeof array[g_nestedwork.gridy] === 'undefined' || typeof array[g_nestedwork.gridy][column - 1] === 'undefined') { newheightl = 0; } else { var tempy = 0; while (true) { if (typeof g_arrnestedgridrow[g_nestedwork.gridy + tempy] !== 'undefined' && g_arrnestedgridrow[g_nestedwork.gridy + tempy][column - 1] != -1) { leftid = g_arrnestedgridrow[g_nestedwork.gridy + tempy][column - 2]; tempy++; newheightl++; } else { break; } } } if (typeof array[g_nestedwork.gridy] === 'undefined' || typeof array[g_nestedwork.gridy][column + dimwidth] === 'undefined') { newheightr = 0; } else { tempy = 0; while (true) { if (typeof g_arrnestedgridrow[g_nestedwork.gridy + tempy] !== 'undefined' && g_arrnestedgridrow[g_nestedwork.gridy + tempy][column + dimwidth] != -1) { rightid = g_arrnestedgridrow[g_nestedwork.gridy + tempy][column + dimwidth + 1]; tempy++; newheightr++; } else { break; } } } var newheight = 0; var idtoresize = 0; if (math.abs(dimheight - newheightl) < math.abs(dimheight - newheightr) && newheightl != 0) { newheight = newheightl; idtoresize = leftid; } else if (newheightr != 0) { newheight = newheightr; idtoresize = rightid; } else { newheight = dimheight; //malo li } var output = { "newheight": newheight, "idtoresize": idtoresize }; return output; } /** * resize to new dim width */ function resizetonewwidth(tileid, newdimwidth, toreturn) { if (!toreturn) { toreturn = false; } var colwidth = g_nestedwork.colwidth; var gapwidth = g_nestedwork.currentgap; var currenttile = g_arrnesteditems[tileid]; var imgwidth = currenttile.imgwidth; var imgheight = currenttile.imgheight; var ratio = imgwidth / imgheight; dimwidth = newdimwidth; dimheight = math.round(dimwidth / ratio); if (toreturn == true) { var sizes = jquery.extend(true, {}, currenttile); sizes.dimwidth = dimwidth; sizes.dimheight = dimheight; sizes.width = dimwidth * colwidth + gapwidth * (dimwidth - 1); sizes.height = dimheight * colwidth + gapwidth * (dimheight - 1); return sizes; } currenttile.dimwidth = dimwidth; currenttile.dimheight = dimheight; currenttile.width = dimwidth * colwidth + gapwidth * (dimwidth - 1); currenttile.height = dimheight * colwidth + gapwidth * (dimheight - 1); } /** * resize to new height without width changing */ function resizetonewheight(tileid, newdimheight, toreturn) { if (!toreturn) { toreturn = false; } var currenttile = g_arrnesteditems[tileid]; var dimwidth = currenttile.dimwidth; var colwidth = g_nestedwork.colwidth; var gapwidth = g_nestedwork.currentgap; if (toreturn == true) { var sizes = jquery.extend(true, {}, currenttile); sizes.dimheight = newdimheight; sizes.width = dimwidth * colwidth + gapwidth * (dimwidth - 1); sizes.height = newdimheight * colwidth + gapwidth * (newdimheight - 1); return sizes; } currenttile.dimheight = newdimheight; currenttile.width = dimwidth * colwidth + gapwidth * (dimwidth - 1); currenttile.height = newdimheight * colwidth + gapwidth * (newdimheight - 1); } /** * calc resize koef */ function calcresizeratio(objtilesandsizes) { var tempresizes = 0; var tempnum = 0; for (var i = 0; i < objtilesandsizes.length; i++) { var sizes = g_arrnesteditems[objtilesandsizes[i].tileid]; if ((sizes.dimheight != 0) && (sizes.height != 0)) { resizeval = (sizes.dimwidth / sizes.dimheight) / (sizes.imgwidth / sizes.imgheight); } else { return; } if (resizeval < 1) { resizeval = 1 / resizeval; } tempresizes += resizeval; tempnum++; } return tempresizes / tempnum; } /** * check for column break */ function isgridimagealigned(dimwidth, column) { var y = g_nestedwork.gridy - 1; if (y <= 0 || isgridrowexists(y) == false) { return false; } if (g_arrnestedgridrow[y][column + dimwidth - 1] != g_arrnestedgridrow[y][column + dimwidth]) { return true; } return false; } /** * get free line length in gridrow */ function gettotalfreefromposition(column) { var x = column; var totalfree = 0; if (isgridrowexists(g_nestedwork.gridy) == true) { while (isgridcelltaken(g_nestedwork.gridy, x) == false) { totalfree++; x++; } } else { totalfree = g_nestedwork.maxcolumns; } return totalfree; } /** * is nestedgridrow row exists */ function isgridrowexists(y) { if (typeof g_arrnestedgridrow[y] === 'undefined') { return false; } return true; } /** * put image to grid row */ function putimagetogridrow(id, sizes, gridx, gridy) { for (var y = 0; y < sizes.dimheight; y++) { for (var x = 0; x < sizes.dimwidth; x++) { if (isgridrowexists(gridy + y) == 0) { addgridrow(gridy + y); } setgridcellvalue(gridy + y, gridx + x, id); } } } /** * add grid with y index */ function addgridrow(y) { g_arrnestedgridrow[y] = new object; for (var t = 0; t < g_nestedwork.maxcolumns; t++) { g_arrnestedgridrow[y][t] = -1; } } /** * isgridrowcelltaken */ function isgridcelltaken(y, x) { return (g_arrnestedgridrow[y][x] != -1); } /** * set nestedgridrow cell value */ function setgridcellvalue(y, x, value) { g_arrnestedgridrow[y][x] = value; } /** * draw nested images */ function drawnestedimages(toshow) { if (!toshow) var toshow = false; dobeforetransition(); for (var i = 0; i < g_arrnesteditems.length; i++) { drawnestedimage(i, toshow); } g_objparent.height(g_nestedwork.maxcolheight); doaftertransition(); } /** * draw nested image */ function drawnestedimage(i, toshow) { var objtile = g_thumbs.getthumbbyindex(i); var sizes = g_arrnesteditems[i]; var newy = sizes.top * (g_nestedwork.colwidth + g_nestedwork.currentgap); var newx = g_nestedwork.addx + sizes.left * (g_nestedwork.colwidth + g_nestedwork.currentgap); g_objtiledesign.resizetile(objtile, sizes.width, sizes.height, g_objtiledesign.resizemode.visible_elements); g_functions.placeelement(objtile, newx, newy); if (newy + sizes.height > g_nestedwork.maxcolheight) { g_nestedwork.maxcolheight = newy + sizes.height; }; if (toshow == true) { objtile.fadeto(0, 1); } } function __________common_and_events_______() { }; /** * on resize event */ function onresize() { if (g_temp.isfirsttimerun == true) return (true); if (g_temp.isallloaded == false) return (false); switch (g_options.tiles_type) { case "columns": placetiles(false); break; case "justified": placejustified(false); break; case "nested": var ismobilemode = g_gallery.ismobilemode(); if (ismobilemode == true) { placetiles(false); } else placenestedimages(false); break; } } /** * init panel events */ function initevents() { g_objthis.on(t.events.all_tiles_loaded, function () { g_temp.isallloaded = true; }); g_objgallery.on(g_gallery.events.size_change, onresize); g_objgallery.on(t.events.tiles_first_placed, function () { g_temp.isfirstplaced = false; }); g_objtiledesign.initevents(); } /** * run the gallery after init and set html */ function run() { //show tiles g_objwrapper.children(".ug-tile").show(); if (g_temp.isfirsttimerun == true) { initevents(); } g_objtiledesign.run(); switch (g_options.tiles_type) { default: case "columns": runcolumnstype(); break; case "justified": runjustifiedtype(); break; case "nested": runnestedtype(); break; } g_temp.isfirsttimerun = false; } /** * destroy the events */ this.destroy = function () { g_objgallery.off(g_gallery.events.size_change); g_objtiledesign.destroy(); g_objgallery.off(t.events.tiles_first_placed); } /** * init function for avia controls */ this.init = function (gallery, customoptions) { init(gallery, customoptions); } /** * set html */ this.sethtml = function (objparent) { sethtml(objparent); } /** * get tile design object */ this.getobjtiledesign = function () { return (g_objtiledesign); } /** * set html and properties */ this.run = function () { run(); } /** * run the new items */ this.runnewitems = function () { if (!g_objparent) throw new error("can't run new items - parent not set"); g_objtiledesign.sethtml(g_objparent, true); g_objtiledesign.run(true); switch (g_options.tiles_type) { case "columns": runcolumnstype(); break; default: case "justified": case "nested": throw new error("tiles type: " + g_options.tiles_type + " not support load more yet"); break; } } } /** * tiles design class */ function ugtiledesign() { var t = this, g_objthis = jquery(this); var g_gallery = new unitegallerymain(), g_objgallery; var g_functions = new ugfunctions(), g_objparentwrapper, g_objwrapper; var g_thumbs = new ugthumbsgeneral(), g_items; this.resizemode = { //modes constants for resize tile full: "full", wrapper_only: "wrapper_only", visible_elements: "visible_elements" }; this.sizeby = { //sizeby option constants global_ratio: "global_ratio", tile_ratio: "tile_ratio", image_ratio: "image_ratio", custom: "custom" }; this.events = { tile_click: "tile_click" }; var g_options = { tile_width: 250, //in case of fixed size: tile width tile_height: 200, //in case of fixed size: tile height tile_size_by: t.sizeby.image_ratio, //image ratio, tile ratio , global_ratio - decide by what parameter resize the tile tile_visible_before_image: false, //tile visible before image load tile_enable_background: true, //enable backgruond of the tile tile_background_color: "#f0f0f0", //tile background color tile_enable_border: false, //enable border of the tile tile_border_width: 3, //tile border width tile_border_color: "#f0f0f0", //tile border color tile_border_radius: 0, //tile border radius (applied to border only, not to outline) tile_enable_outline: false, //enable outline of the tile (works only together with the border) tile_outline_color: "#8b8b8b", //tile outline color tile_enable_shadow: false, //enable shadow of the tile tile_shadow_h: 1, //position of horizontal shadow tile_shadow_v: 1, //position of vertical shadow tile_shadow_blur: 3, //shadow blur tile_shadow_spread: 2, //shadow spread tile_shadow_color: "#8b8b8b", //shadow color tile_enable_action: true, //enable tile action on click like lightbox tile_as_link: false, //act the tile as link, no lightbox will appear tile_link_newpage: true, //open the tile link in new page tile_enable_overlay: true, //enable tile color overlay (on mouseover) tile_overlay_opacity: 0.4, //tile overlay opacity tile_overlay_color: "#000000", //tile overlay color tile_enable_icons: true, //enable icons in mouseover mode tile_show_link_icon: false, //show link icon (if the tile has a link). in case of tile_as_link this option not enabled tile_videoplay_icon_always_on: 'never', //'always', 'never', 'mobile_only', 'desktop_only' always show video play icon tile_space_between_icons: 26, //initial space between icons, (on small tiles it may change) tile_enable_image_effect: false, //enable tile image effect tile_image_effect_type: "bw", //bw, blur, sepia - tile effect type tile_image_effect_reverse: false, //reverce the image, set only on mouseover state tile_enable_textpanel: false, //enable textpanel tile_textpanel_source: "title", //title,desc,desc_title,title_and_desc. source of the textpanel. desc_title - if description empty, put title tile_textpanel_always_on: false, //textpanel always visible - for inside type tile_textpanel_appear_type: "slide", //slide, fade - appear type of the textpanel on mouseover tile_textpanel_position: "inside_bottom", //inside_bottom, inside_top, inside_center, top, bottom the position of the textpanel tile_textpanel_offset: 0 //vertical offset of the textpanel }; var g_defaults = { thumb_color_overlay_effect: true, thumb_overlay_reverse: true, thumb_image_overlay_effect: false, tile_textpanel_enable_description: false, tile_textpanel_bg_opacity: 0.6, tile_textpanel_padding_top: 8, tile_textpanel_padding_bottom: 8 }; var g_temp = { ratiobyheight: 0, ratiobywidth: 0, eventsizechange: "thumb_size_change", funccustomtilehtml: null, funccustompositionelements: null, funcparentapproveclick: null, issaparateicons: false, tileinnerreduce: 0, //how much reduce from the tile inner elements from border mostly istextpaneloutside: false, //is the textpanel is out of tile image border hasimagecontainer: false, isvideoplayiconalwayson: false, istextpanelhidden: false }; /** * init the tile object */ function init(gallery, customoptions) { g_gallery = gallery; g_objgallery = jquery(gallery); var objects = g_gallery.getobjects(); g_objwrapper = objects.g_objwrapper; g_items = g_gallery.getarritems(); g_options = jquery.extend(g_options, g_defaults); g_options = jquery.extend(g_options, customoptions); modifyoptions(); g_thumbs.init(gallery, g_options); var objcustomoptions = { allow_onresize: false }; var customthumbsadd = ["overlay"]; if (g_temp.funccustomtilehtml) customthumbsadd = []; g_thumbs.setcustomthumbs(sethtmlthumb, customthumbsadd, objcustomoptions); //get thumb default options too: var thumboptions = g_thumbs.getoptions(); g_options = jquery.extend(g_options, thumboptions); //set ratios of fixed mode g_temp.ratiobywidth = g_options.tile_width / g_options.tile_height; g_temp.ratiobyheight = g_options.tile_height / g_options.tile_width; //set if tile has image container if (g_options.tile_size_by == t.sizeby.global_ratio && g_temp.istextpaneloutside) g_temp.hasimagecontainer = true; } /** * set thumb and textpanel options according tile options */ function modifyoptions() { //set overlay related options if (g_options.tile_enable_overlay == true) { g_options.thumb_overlay_opacity = g_options.tile_overlay_opacity; g_options.thumb_overlay_color = g_options.tile_overlay_color; } else if (g_options.tile_enable_icons == false) { //if nothing on overlay - turn it off g_options.thumb_color_overlay_effect = false; } else { //if icons enabled - make it transparent g_options.thumb_overlay_opacity = 0; } //set item as link if (g_options.tile_as_link) { g_options.thumb_wrapper_as_link = true; g_options.thumb_link_newpage = g_options.tile_link_newpage; } //outline cannot appear without border if (g_options.tile_enable_outline == true && g_options.tile_enable_border == false) g_options.tile_enable_outline = false; //set inner reduce value - in case of the border g_temp.tileinnerreduce = 0; if (g_options.tile_enable_border) { g_temp.tileinnerreduce = g_options.tile_border_width * 2; g_thumbs.setthumbinnerreduce(g_temp.tileinnerreduce); } //check if saparate icons g_temp.issaparateicons = !g_functions.isrgbasupported(); //set if the textpanel is enabled and outside if (g_options.tile_enable_textpanel == true) { //optimize for touch device switch (g_options.tile_textpanel_position) { case "top": g_options.tile_textpanel_align = "top"; case "bottom": g_temp.istextpaneloutside = true; g_options.tile_textpanel_always_on = true; g_options.tile_textpanel_offset = 0; break; case "inside_top": g_options.tile_textpanel_align = "top"; break; case "middle": g_options.tile_textpanel_align = "middle"; g_options.tile_textpanel_appear_type = "fade"; break; } //if text panel oppearing with the overlay, icons should be saparated if (g_options.tile_textpanel_always_on == false) g_temp.issaparateicons = true; } //if the textpanel offset is not from the border, it's always fade. if (g_options.tile_textpanel_offset != 0) { g_options.tile_textpanel_appear_type = "fade"; g_options.tile_textpanel_margin = g_options.tile_textpanel_offset; } //enable description if needed if (g_options.tile_textpanel_source == "title_and_desc") { g_options.tile_textpanel_enable_description = true; g_options.tile_textpanel_desc_style_as_title = true; } } /** * set options before render */ function modifyoptionsbeforerender() { var ismobile = g_gallery.ismobilemode(); //set text panel show / hide g_temp.istextpanelhidden = false; if (ismobile == true && g_options.tile_textpanel_always_on == false) g_temp.istextpanelhidden = true; //set video icon always on true / false g_temp.isvideoplayiconalwayson = g_options.tile_videoplay_icon_always_on; switch (g_options.tile_videoplay_icon_always_on) { case "always": g_temp.isvideoplayiconalwayson = true; break; case "never": g_temp.isvideoplayiconalwayson = false; break; case "mobile_only": g_temp.isvideoplayiconalwayson = (ismobile == true) ? true : false; break; case "desktop_only": g_temp.isvideoplayiconalwayson = (ismobile == false) ? true : false; break; } } /** * set thumb html */ function sethtmlthumb(objthumbwrapper, objitem) { objthumbwrapper.addclass("ug-tile"); if (g_temp.funccustomtilehtml) { g_temp.funccustomtilehtml(objthumbwrapper, objitem); return (false); } var html = ""; //add image container if (g_temp.hasimagecontainer == true) { html += "
"; } //add thumb image: var classimage = "ug-thumb-image"; if (g_options.tile_enable_image_effect == false || g_options.tile_image_effect_reverse == true) classimage += " ug-trans-enabled"; var imagealt = g_functions.striptags(objitem.title); imagealt = g_functions.htmlentitles(imagealt); html += "" + imagealt + ""; if (g_temp.hasimagecontainer == true) { html += "
"; } objthumbwrapper.append(html); if (g_options.tile_size_by == t.sizeby.global_ratio) { objthumbwrapper.fadeto(0, 0); //turn on in thumbsgeneral } //---- set thumb styles ---- //set border: var objcss = {}; if (g_options.tile_enable_background == true) { objcss["background-color"] = g_options.tile_background_color; } if (g_options.tile_enable_border == true) { objcss["border-width"] = g_options.tile_border_width + "px"; objcss["border-style"] = "solid"; objcss["border-color"] = g_options.tile_border_color; if (g_options.tile_border_radius) objcss["border-radius"] = g_options.tile_border_radius + "px"; } //set outline: if (g_options.tile_enable_outline == true) { objcss["outline"] = "1px solid " + g_options.tile_outline_color; } //set shadow if (g_options.tile_enable_shadow == true) { var htmlshadow = g_options.tile_shadow_h + "px "; htmlshadow += g_options.tile_shadow_v + "px "; htmlshadow += g_options.tile_shadow_blur + "px "; htmlshadow += g_options.tile_shadow_spread + "px "; htmlshadow += g_options.tile_shadow_color; objcss["box-shadow"] = htmlshadow; } objthumbwrapper.css(objcss); //----- add icons var htmladd = ""; if (g_options.tile_enable_icons) { //add zoom icon if (g_options.tile_as_link == false && g_options.tile_enable_action == true) { var iconplayclass = "ug-button-play ug-icon-zoom"; if (objitem.type != "image") iconplayclass = "ug-button-play ug-icon-play"; htmladd += ""; } //add link icon if (objitem.link && g_options.tile_show_link_icon == true || g_options.tile_as_link == true) { if (g_options.tile_as_link == false) { var linktarget = ""; if (g_options.tile_link_newpage == true) linktarget = " target='_blank'"; htmladd += ""; } else { htmladd += ""; } } var tosaparateicon = g_temp.issaparateicons; if (tosaparateicon == false && objitem.type != "image" && g_temp.isvideoplayiconalwayson == true) tosaparateicon = true; if (tosaparateicon) //put the icons on the thumb var objoverlay = objthumbwrapper; else var objoverlay = objthumbwrapper.children(".ug-thumb-overlay"); objoverlay.append(htmladd); var objbuttonzoom = objoverlay.children("." + iconplayclass); if (objbuttonzoom.length == 0) objbuttonzoom = null; else objbuttonzoom.hide(); var objbuttonlink = objoverlay.children(".ug-icon-link"); if (objbuttonlink.length == 0) objbuttonlink = null; else objbuttonlink.hide(); //if only zoom icon, make the tile clickable for lightbox open if (!objbuttonlink && g_options.tile_enable_action == true) objthumbwrapper.addclass("ug-tile-clickable"); } //if icons enabled else { //if the icons don't enabled, set the tile clickable if (g_options.tile_enable_action == true) objthumbwrapper.addclass("ug-tile-clickable"); } //add image overlay if (g_options.tile_enable_image_effect == true) { var imageeffectclassadd = ""; if (g_options.tile_image_effect_reverse == false) imageeffectclassadd = " ug-trans-enabled"; var imageoverlayhtml = "
"; var imageeffectclass = " ug-" + g_options.tile_image_effect_type + "-effect"; imageoverlayhtml += "" + objitem.title + ""; imageoverlayhtml += "
"; objthumbwrapper.append(imageoverlayhtml); //hide the image overlay if reversed if (g_options.tile_image_effect_reverse == true) { objthumbwrapper.children(".ug-tile-image-overlay").fadeto(0, 0); } } //add text panel if (g_options.tile_enable_textpanel == true) { var objtextpanel = new ugtextpanel(); objtextpanel.init(g_gallery, g_options, "tile"); //set transition class var textpaneladdclass = ""; if (g_options.tile_textpanel_always_on == true || g_temp.istextpaneloutside == true) textpaneladdclass = "ug-trans-enabled"; objtextpanel.appendhtml(objthumbwrapper, textpaneladdclass); var paneltitle = objitem.title; var paneldesc = ""; switch (g_options.tile_textpanel_source) { case "desc": case "description": paneltitle = objitem.description; break; case "desc_title": if (objitem.description != "") paneltitle = objitem.description; break; case "title_and_desc": paneltitle = objitem.title; paneldesc = objitem.description; break; } objtextpanel.settextplain(paneltitle, paneldesc); if (g_options.tile_textpanel_always_on == false) objtextpanel.getelement().fadeto(0, 0); objthumbwrapper.data("objtextpanel", objtextpanel); //if textpanel always on, it has to be under the overlay if (g_options.tile_textpanel_always_on == true) { var textpanelelement = gettextpanelelement(objthumbwrapper); textpanelelement.css("z-index", 2); } //if text panel is outside, clone textpanel if (g_temp.istextpaneloutside == true) { var htmlclone = "
"; objthumbwrapper.append(htmlclone); var objclonewrapper = objthumbwrapper.children(".ug-tile-cloneswrapper"); var objtextpanelclone = new ugtextpanel(); objtextpanelclone.init(g_gallery, g_options, "tile"); objtextpanelclone.appendhtml(objclonewrapper); objtextpanelclone.settextplain(paneltitle, paneldesc); objthumbwrapper.data("objtextpanelclone", objtextpanelclone); } } //add additional html if (objitem.addhtml !== null) objthumbwrapper.append(objitem.addhtml); } /** * load tile image, place the image on load */ this.loadtileimage = function (objtile) { var objimage = t.gettileimage(objtile); g_functions.checkimagesloaded(objimage, null, function (objimage, iserror) { onplaceimage(null, objtile, jquery(objimage)); }); } function _________________getters________________() { }; /** * get image overlay */ function gettileoverlayimage(objtile) { var objoverlayimage = objtile.children(".ug-tile-image-overlay"); return (objoverlayimage); } /** * get tile color overlay */ function gettileoverlay(objtile) { var objoverlay = objtile.children(".ug-thumb-overlay"); return (objoverlay); } /** * get image container */ function gettileimagecontainer(objtile) { if (g_temp.hasimagecontainer == false) return (null); var objimagecontainer = objtile.children(".ug-image-container"); return (objimagecontainer); } /** * get image effect */ function gettileimageeffect(objtile) { var objimageeffect = objtile.find(".ug-tile-image-overlay img"); return (objimageeffect); } /** * get text panel */ function gettextpanel(objtile) { var objtextpanel = objtile.data("objtextpanel"); return (objtextpanel); } /** * get cloned text panel */ function gettextpanelclone(objtile) { var objtextpanelclone = objtile.data("objtextpanelclone"); return (objtextpanelclone); } /** * get text panel element from the tile */ function gettextpanelelement(objtile) { var objtextpanel = objtile.children(".ug-textpanel"); return (objtextpanel); } /** * get text panel element cloned */ function gettextpanelcloneelement(objtile) { var objtextpanel = objtile.find(".ug-tile-cloneswrapper .ug-textpanel"); if (objtextpanel.length == 0) throw new error("text panel cloned element not found"); return (objtextpanel); } /** * get text panel height */ function gettextpanelheight(objtile) { if (g_temp.istextpaneloutside == true) var objtextpanel = gettextpanelcloneelement(objtile); else var objtextpanel = gettextpanelelement(objtile); if (!objtextpanel) return (0); var objsize = g_functions.getelementsize(objtextpanel); return (objsize.height); } /** * get button link */ function getbuttonlink(objtile) { var objbutton = objtile.find(".ug-icon-link"); if (objbutton.length == 0) return (null); return objbutton; } /** * get tile ratio */ function gettileratio(objtile) { //global ratio var ratio = g_temp.ratiobyheight; switch (g_options.tile_size_by) { default: //global ratio ratio = g_temp.ratiobyheight; break; case t.sizeby.image_ratio: if (!objtile) throw new error("tile should be given for tile ratio"); var item = t.getitembytile(objtile); if (typeof item.thumbratiobyheight != "undefined") { if (item.thumbratiobyheight == 0) { trace(item); throw new error("the item ratio not inited yet"); } ratio = item.thumbratiobyheight; } break; case t.sizeby.custom: return null; break; } return (ratio); } /** * get button zoom */ function getbuttonzoom(objtile) { var objbutton = objtile.find(".ug-button-play"); if (objbutton.length == 0) return (null); return objbutton; } /** * tells if the tile is over style */ function isoverstyle(objtile) { if (objtile.hasclass("ug-thumb-over")) return (true); return (false); } /** * check if the tile is clickable */ function istileclickable(objtile) { return objtile.hasclass("ug-tile-clickable"); } /** * return if the items icon always on */ function isitemiconalwayson(objitem) { if (g_options.tile_enable_icons == true && g_temp.isvideoplayiconalwayson == true && objitem.type != "image") return (true); return (false); } function _________________setters________________() { }; /** * position tile images elements * width, height - tile width height */ function positionelements_images(objtile, width, height, visibleonly) { var objimageoverlay = gettileoverlayimage(objtile); var objthumbimage = t.gettileimage(objtile); var objimageeffect = gettileimageeffect(objtile); //reduce borders width -= g_temp.tileinnerreduce; height -= g_temp.tileinnerreduce; var imageposy = null; //reduce textpanel height if (g_temp.istextpaneloutside == true) { var textheight = gettextpanelheight(objtile); height -= textheight; if (g_options.tile_textpanel_position == "top") { imageposy = textheight; } /** * if has image container */ if (g_temp.hasimagecontainer == true) { var objimagecontainer = gettileimagecontainer(objtile); g_functions.setelementsize(objimagecontainer, width, height); if (imageposy !== null) g_functions.placeelement(objimagecontainer, 0, imageposy); } } //scale image if (g_options.tile_enable_image_effect == false) { g_functions.scaleimagecoverparent(objthumbimage, width, height); if (g_temp.hasimagecontainer == false && imageposy !== null) g_functions.placeelement(objthumbimage, 0, imageposy); } else { //width the effect //set what to resize var dontresize = "nothing"; if (visibleonly === true && g_temp.istextpaneloutside == false) { if (g_options.tile_image_effect_reverse == true) { dontresize = "effect"; } else { dontresize = "image"; } } //resize image effect if (dontresize != "effect") { g_functions.setelementsize(objimageoverlay, width, height); if (imageposy !== null) g_functions.placeelement(objimageoverlay, 0, imageposy); g_functions.scaleimagecoverparent(objimageeffect, width, height); } //resize image if (dontresize != "image") { if (g_temp.hasimagecontainer == true) { g_functions.scaleimagecoverparent(objthumbimage, width, height); } else { //if can't clone, resize if (dontresize == "effect") { g_functions.scaleimagecoverparent(objthumbimage, width, height); if (imageposy !== null) g_functions.placeelement(objthumbimage, 0, imageposy); } else g_functions.cloneelementsizeandpos(objimageeffect, objthumbimage, false, null, imageposy); } } } } /** * position text panel * paneltype - default or clone */ function positionelements_textpanel(objtile, paneltype, tilewidth, tileheight) { var panelwidth = null; if (tilewidth) panelwidth = tilewidth - g_temp.tileinnerreduce; if (tileheight) tileheight -= g_temp.tileinnerreduce; if (paneltype == "clone") { var objtextpanelclone = gettextpanelclone(objtile); objtextpanelclone.refresh(true, true, panelwidth); var objitem = t.getitembytile(objtile); objitem.textpanelclonesizeset = true; return (false); } var objtextpanel = gettextpanel(objtile); if (!objtextpanel) return (false); var panelheight = null; //set panel height also if (g_temp.istextpaneloutside == true) panelheight = gettextpanelheight(objtile); objtextpanel.refresh(false, true, panelwidth, panelheight); var isposition = (g_options.tile_textpanel_always_on == true || g_options.tile_textpanel_appear_type == "fade"); if (isposition) { if (g_temp.istextpaneloutside == true && tileheight && g_options.tile_textpanel_position == "bottom") { var posy = tileheight - panelheight; objtextpanel.positionpanel(posy); } else objtextpanel.positionpanel(); } } /** * position the elements */ function positionelements(objtile) { var objitem = t.getitembytile(objtile); var objbuttonzoom = getbuttonzoom(objtile); var objbuttonlink = getbuttonlink(objtile); var sizetile = g_functions.getelementsize(objtile); positionelements_images(objtile, sizetile.width, sizetile.height); //position text panel: if (g_options.tile_enable_textpanel == true) positionelements_textpanel(objtile, "regular", sizetile.width, sizetile.height); //position overlay: var overlaywidth = sizetile.width - g_temp.tileinnerreduce; var overlayheight = sizetile.height - g_temp.tileinnerreduce; var overlayy = 0; if (g_temp.istextpaneloutside == true) { var textheight = gettextpanelheight(objtile); overlayheight -= textheight; if (g_options.tile_textpanel_position == "top") overlayy = textheight; } var objoverlay = gettileoverlay(objtile); g_functions.setelementsizeandposition(objoverlay, 0, overlayy, overlaywidth, overlayheight); //set vertical gap for icons if (objbuttonzoom || objbuttonlink) { var gapvert = 0; if (g_options.tile_enable_textpanel == true && g_temp.istextpanelhidden == false && g_temp.istextpaneloutside == false) { var objtextpanelelement = gettextpanelelement(objtile); var texpanelsize = g_functions.getelementsize(objtextpanelelement); if (texpanelsize.height > 0) gapvert = math.floor((texpanelsize.height / 2) * -1); } } if (objbuttonzoom && objbuttonlink) { var sizezoom = g_functions.getelementsize(objbuttonzoom); var sizelink = g_functions.getelementsize(objbuttonlink); var spacebetween = g_options.tile_space_between_icons; var buttonswidth = sizezoom.width + spacebetween + sizelink.width; var buttonsx = math.floor((sizetile.width - buttonswidth) / 2); //trace("x: "+buttonsx+" "+"space: " + spacebetween); //if space more then padding, calc even space. if (buttonsx < spacebetween) { spacebetween = math.floor((sizetile.width - sizezoom.width - sizelink.width) / 3); buttonswidth = sizezoom.width + spacebetween + sizelink.width; buttonsx = math.floor((sizetile.width - buttonswidth) / 2); } g_functions.placeelement(objbuttonzoom, buttonsx, "middle", 0, gapvert); g_functions.placeelement(objbuttonlink, buttonsx + sizezoom.width + spacebetween, "middle", 0, gapvert); } else { if (objbuttonzoom) g_functions.placeelement(objbuttonzoom, "center", "middle", 0, gapvert); if (objbuttonlink) g_functions.placeelement(objbuttonlink, "center", "middle", 0, gapvert); } if (objbuttonzoom) objbuttonzoom.show(); if (objbuttonlink) objbuttonlink.show(); } /** * set tiles htmls */ this.sethtml = function (objparent, isappend) { g_objparentwrapper = objparent; if (isappend !== true) modifyoptionsbeforerender(); g_thumbs.sethtmlthumbs(objparent, isappend); } /** * set the overlay effect */ function setimageoverlayeffect(objtile, isactive) { var objitem = t.getitembytile(objtile); var objoverlayimage = gettileoverlayimage(objtile); var animationduration = g_options.thumb_transition_duration; if (g_options.tile_image_effect_reverse == false) { var objthumbimage = t.gettileimage(objtile); if (isactive) { objthumbimage.fadeto(0, 1); objoverlayimage.stop(true).fadeto(animationduration, 0); } else objoverlayimage.stop(true).fadeto(animationduration, 1); } else { if (isactive) { objoverlayimage.stop(true).fadeto(animationduration, 1); } else { objoverlayimage.stop(true).fadeto(animationduration, 0); } } } /** * set textpanel effect */ function settextpaneleffect(objtile, isactive) { var animationduration = g_options.thumb_transition_duration; var objtextpanel = gettextpanelelement(objtile); if (!objtextpanel) return (true); if (g_options.tile_textpanel_appear_type == "slide") { var panelsize = g_functions.getelementsize(objtextpanel); if (panelsize.width == 0) return (false); var startpos = -panelsize.height; var endpos = 0; var startclass = {}, endclass = {}; var posname = "bottom"; if (g_options.tile_textpanel_position == "inside_top") posname = "top"; startclass[posname] = startpos + "px"; endclass[posname] = endpos + "px"; if (isactive == true) { objtextpanel.fadeto(0, 1); if (objtextpanel.is(":animated") == false) objtextpanel.css(startclass); endclass["opacity"] = 1; objtextpanel.stop(true).animate(endclass, animationduration); } else { objtextpanel.stop(true).animate(startclass, animationduration); } } else { //fade effect if (isactive == true) { objtextpanel.stop(true).fadeto(animationduration, 1); } else { objtextpanel.stop(true).fadeto(animationduration, 0); } } } /** * set thumb border effect */ function seticonseffect(objtile, isactive, noanimation) { var animationduration = g_options.thumb_transition_duration; if (noanimation && noanimation === true) animationduration = 0; var g_objiconzoom = getbuttonzoom(objtile); var g_objiconlink = getbuttonlink(objtile); var opacity = isactive ? 1 : 0; if (g_objiconzoom) g_objiconzoom.stop(true).fadeto(animationduration, opacity); if (g_objiconlink) g_objiconlink.stop(true).fadeto(animationduration, opacity); } /** * set tile over style */ function setoverstyle(data, objtile) { objtile = jquery(objtile); if (g_options.tile_enable_image_effect) setimageoverlayeffect(objtile, true); if (g_options.tile_enable_textpanel == true && g_options.tile_textpanel_always_on == false && g_temp.istextpanelhidden == false) settextpaneleffect(objtile, true); //show/hide icons - if saparate (if not, they are part of the overlay) //if the type is video and icon always on - the icon should stay if (g_temp.issaparateicons && g_options.tile_enable_icons == true) { var isset = (g_options.thumb_overlay_reverse == true); var objitem = t.getitembytile(objtile); if (isitemiconalwayson(objitem) == false) seticonseffect(objtile, isset, false); } } /** * set normal style */ function setnormalstyle(data, objtile) { objtile = jquery(objtile); if (g_options.tile_enable_image_effect) setimageoverlayeffect(objtile, false); if (g_options.tile_enable_textpanel == true && g_options.tile_textpanel_always_on == false) settextpaneleffect(objtile, false); //show/hide icons - if saparate (if not, they are part of the overlay) if (g_temp.issaparateicons == true && g_options.tile_enable_icons == true) { var isset = (g_options.thumb_overlay_reverse == true) ? false : true; var objitem = t.getitembytile(objtile); if (isitemiconalwayson(objitem) == false) seticonseffect(objtile, isset, false); else { //make icon always appear seticonseffect(objtile, true, true); } } } /** * set all tiles normal style */ function setalltilesnormalstyle(objtileexcept) { var objtiles = g_thumbs.getthumbs().not(objtileexcept); objtiles.each(function (index, objtile) { g_thumbs.setthumbnormalstyle(jquery(objtile)); }); } function _________________events________________() { }; /** * on tile size change, place elements */ function onsizechange(data, objtile, forceposition) { objtile = jquery(objtile); //position elements only if the image loaded (placed) if (g_options.tile_visible_before_image == true && objtile.data("image_placed") !== true && forceposition !== true) return (true); positionelements(objtile); g_thumbs.setthumbnormalstyle(objtile); } /** * on place image event after images loaded */ function onplaceimage(data, objtile, objimage) { positionelements(objtile); objimage.fadeto(0, 1); objtile.data("image_placed", true); } /** * on tile click on mobile devices on normal state * set the tile over state */ function onmobileclick(objtile) { if (istileclickable(objtile) == true) { g_objthis.trigger(t.events.tile_click, objtile); return (true); } if (isoverstyle(objtile) == false) { setalltilesnormalstyle(objtile); g_thumbs.setthumboverstyle(objtile); } } /** * on tile click event */ function ontileclick(event) { var objtile = jquery(this); var tagname = objtile.prop("tagname").tolowercase(); var isapproved = true; if (g_temp.funcparentapproveclick && g_temp.funcparentapproveclick() == false) isapproved = false; if (tagname == "a") { if (isapproved == false) event.preventdefault(); } else { //in case of div if (isoverstyle(objtile) == false) { //mobile click version if (isapproved == true) onmobileclick(objtile); } else { if (istileclickable(objtile) == false) return (true); if (isapproved == true) g_objthis.trigger(t.events.tile_click, objtile); } } } /** * click on zoom button (as tile click) */ function onzoombuttonclick(event) { event.stoppropagation(); var objtile = jquery(this).parents(".ug-tile"); var isapproved = true; if (g_temp.funcparentapproveclick && g_temp.funcparentapproveclick() == false) isapproved = false; if (isoverstyle(objtile) == false) { onmobileclick(objtile); return (true); } if (isapproved == true) { g_objthis.trigger(t.events.tile_click, objtile); return (false); } } /** * on link icon click */ function onlinkbuttonclick(event) { var objtile = jquery(this).parents(".ug-tile"); if (g_temp.funcparentapproveclick && g_temp.funcparentapproveclick() == false) event.preventdefault(); //allow click only from over style if (isoverstyle(objtile) == false && g_options.tile_as_link == false) { event.preventdefault(); onmobileclick(objtile); } } /** * init events */ this.initevents = function () { g_thumbs.initevents(); //connect the over and normal style of the regular thumbs jquery(g_thumbs).on(g_thumbs.events.setoverstyle, setoverstyle); jquery(g_thumbs).on(g_thumbs.events.setnormalstyle, setnormalstyle); jquery(g_thumbs).on(g_thumbs.events.placeimage, onplaceimage); g_objwrapper.on(g_temp.eventsizechange, onsizechange); g_objparentwrapper.on("click", ".ug-tile", ontileclick); g_objparentwrapper.on("click", ".ug-tile .ug-button-play", onzoombuttonclick); g_objparentwrapper.on("click", ".ug-tile .ug-icon-link", onlinkbuttonclick); } /** * destroy the element events */ this.destroy = function () { g_objparentwrapper.off("click", ".ug-tile"); g_objparentwrapper.off("click", ".ug-tile .ug-button-play"); g_objparentwrapper.off("click", ".ug-tile .ug-icon-link"); jquery(g_thumbs).off(g_thumbs.events.setoverstyle); jquery(g_thumbs).off(g_thumbs.events.setnormalstyle); jquery(g_thumbs).off(g_thumbs.events.placeimage); g_objwrapper.off(g_temp.eventsizechange); if (g_options.tile_enable_textpanel == true) { var objthumbs = g_thumbs.getthumbs(); jquery.each(objthumbs, function (index, thumb) { var textpanel = gettextpanel(jquery(thumb)); if (textpanel) textpanel.destroy(); }); } g_thumbs.destroy(); } /** * external init */ this.init = function (gallery, g_thumbs, customoptions) { init(gallery, g_thumbs, customoptions); } /** * set fixed mode */ this.setfixedmode = function () { g_options.tile_size_by = t.sizeby.global_ratio; g_options.tile_visible_before_image = true; } /** * set parent approve click function */ this.setapproveclickfunction = function (funcapprove) { g_temp.funcparentapproveclick = funcapprove; } /** * resize tile. if no size given, resize to original size * the resize mode taken from resize modes constants, default is full */ this.resizetile = function (objtile, newwidth, newheight, resizemode) { //if textpanel outside - refresh the textpanel first if (g_temp.istextpaneloutside == true) positionelements_textpanel(objtile, "clone", newwidth); if (!newwidth) { var newwidth = g_options.tile_width; var newheight = g_options.tile_height; } else { //only height is missing if (!newheight) { var newheight = t.gettileheightbywidth(newwidth, objtile); } } g_functions.setelementsize(objtile, newwidth, newheight); switch (resizemode) { default: case t.resizemode.full: t.triggersizechangeevent(objtile, true); break; case t.resizemode.wrapper_only: return (true); break; case t.resizemode.visible_elements: if (g_temp.funccustomtilehtml) { t.triggersizechangeevent(objtile, true); return (true); } //resize images positionelements_images(objtile, newwidth, newheight, true); //resize text panel, if visible if (g_options.tile_enable_textpanel == true && g_options.tile_textpanel_always_on == true && newwidth) { positionelements_textpanel(objtile, "regular", newwidth, newheight); } break; } } /** * resize all tiles */ this.resizealltiles = function (newwidth, resizemode, objtiles) { modifyoptionsbeforerender(); var newheight = null; if (g_options.tile_size_by == t.sizeby.global_ratio) newheight = t.gettileheightbywidth(newwidth); if (!objtiles) var objtiles = g_thumbs.getthumbs(); objtiles.each(function (index, objtile) { t.resizetile(jquery(objtile), newwidth, newheight, resizemode); }); } /** * trigger size change events * the force is only for fixed size mode */ this.triggersizechangeevent = function (objtile, isforce) { if (!objtile) return (false); if (!isforce) var isforce = false; g_objwrapper.trigger(g_temp.eventsizechange, [objtile, isforce]); } /** * trigger size change event to all tiles * the force is only for fixed mode */ this.triggersizechangeeventalltiles = function (isforce) { var objthumbs = g_thumbs.getthumbs(); objthumbs.each(function () { var objtile = jquery(this); t.triggersizechangeevent(objtile, isforce); }); } /** * disable all events */ this.disableevents = function () { var objthumbs = g_thumbs.getthumbs(); objthumbs.css("pointer-events", "none"); } /** * enable all events */ this.enableevents = function () { var objthumbs = g_thumbs.getthumbs(); objthumbs.css("pointer-events", "auto"); } /** * set new options */ this.setoptions = function (newoptions) { g_options = jquery.extend(g_options, newoptions); g_thumbs.setoptions(newoptions); } /** * set new tile size, this function will not resize, and keep ratio */ this.settilesizeoptions = function (newtilewidth) { if (g_options.tile_size_by !== t.sizeby.global_ratio) throw new error("setnewtileoptions works with global ration only"); g_options.tile_width = newtilewidth; g_options.tile_height = math.floor(newtilewidth * g_temp.ratiobyheight); } /** * set custom tile html function */ this.setcustomfunctions = function (funccustomhtml, funcpositionelements) { g_temp.funccustomtilehtml = funccustomhtml; g_temp.funccustompositionelements = funcpositionelements; } /** * run the tile design */ this.run = function (newonly) { //resize all tiles var getmode = g_thumbs.type.get_thumbs_all; if (newonly === true) getmode = g_thumbs.type.get_thumbs_new; var objthumbs = g_thumbs.getthumbs(getmode); if (g_options.tile_size_by == t.sizeby.global_ratio) { t.resizealltiles(g_options.tile_width, t.resizemode.wrapper_only, objthumbs); } //hide original image if image effect active if (g_options.tile_enable_image_effect == true && g_options.tile_image_effect_reverse == false) objthumbs.children(".ug-thumb-image").fadeto(0, 0); g_thumbs.sethtmlproperties(objthumbs); if (g_options.tile_visible_before_image == true) { //if textpanel outside - refresh the textpanel first objthumbs.children(".ug-thumb-image").fadeto(0, 0); g_thumbs.loadthumbsimages(); } } this._____________external_getters____________ = function () { }; /** * get thumbs general option */ this.getobjthumbs = function () { return g_thumbs; } /** * get options */ this.getoptions = function () { return g_options; } /** * get tile image */ this.gettileimage = function (objtile) { var objimage = objtile.find("img.ug-thumb-image"); return (objimage); } /** * get item from tile */ this.getitembytile = function (objtile) { return g_thumbs.getitembythumb(objtile); } /** * get tile height by width */ this.gettileheightbywidth = function (newwidth, objtile) { var ratio = gettileratio(objtile); if (ratio === null) return (null); var height = math.floor((newwidth - g_temp.tileinnerreduce) * ratio) + g_temp.tileinnerreduce; if (objtile && g_temp.istextpaneloutside == true && g_options.tile_size_by == t.sizeby.image_ratio) height += gettextpanelheight(objtile); return (height); } /** * get tile original size */ this.gettileimagesize = function (objtile) { var objitem = t.getitembytile(objtile); if (!objitem.thumbwidth || !objitem.thumbheight) throw new error("can't get image size - image not inited."); var objsize = { width: objitem.thumbwidth, height: objitem.thumbheight }; return (objsize); } /** * get tile size */ this.getglobaltilesize = function () { if (g_options.tile_size_by != t.sizeby.global_ratio) throw new error("the size has to be global ratio"); var objsize = { width: g_options.tile_width, height: g_options.tile_height }; return (objsize); } } /** * avia control class * addon to strip gallery */ function ugaviacontrol() { var g_parent, g_gallery, g_objects, g_objstrip, g_objstripinner, g_options; var g_isvertical; var g_temp = { touchenabled: false, //variable that tells if touch event was before move event ismouseinsidestrip: false, strip_finalpos: 0, handle_timeout: "", isstripmoving: false, iscontrolenabled: true }; /** * enable the control */ this.enable = function () { g_temp.iscontrolenabled = true; } /** * disable the control */ this.disable = function () { g_temp.iscontrolenabled = false; } /** * init function for avia controls */ this.init = function (objparent) { g_parent = objparent; g_objects = objparent.getobjects(); g_gallery = g_objects.g_gallery; g_objstrip = g_objects.g_objstrip; g_objstripinner = g_objects.g_objstripinner; g_options = g_objects.g_options; g_isvertical = g_objects.isvertical; initevents(); } /** * get mouse position from event according the orientation */ function getmousepos(event) { if (g_isvertical == false) return (event.pagex); return (event.pagey); } /** * handle avia strip control event on body mouse move */ function initevents(event) { //make sure that the avia control will not work on touch devices jquery("body").on("touchstart", function (event) { if (g_temp.iscontrolenabled == false) return (true); g_temp.touchenabled = true; }); //on body move jquery("body").mousemove(function (event) { if (g_temp.iscontrolenabled == false) return (true); //protection for touch devices, disable the avia events if (g_temp.touchenabled == true) { jquery("body").off("mousemove"); return (true); } g_temp.ismouseinsidestrip = g_objstrip.ismouseover(); var strip_touch_active = g_parent.istouchmotionactive(); if (g_temp.ismouseinsidestrip == true && strip_touch_active == false) { var mousepos = getmousepos(event); movestriptomouseposition(mousepos); } else { stopstripmovingloop(); } }); } /** * destroy the avia control events */ this.destroy = function () { jquery("body").off("touchstart"); jquery("body").off("mousemove"); } /** * get inner y position according mouse y position on the strip */ function getinnerposy(mousey) { var inneroffsettop = g_options.strip_padding_top; var inneroffsetbottom = g_options.strip_padding_bottom; var stripheight = g_objstrip.height(); var innerheight = g_objstripinner.height(); //if all thumbs visible, no need to move if (stripheight > innerheight) return (null); //find y position inside the strip var stripoffset = g_objstrip.offset(); var offsety = stripoffset.top; var posy = mousey - offsety - inneroffsettop; if (posy < 0) return (null); //set measure line parameters var mlinestart = g_options.thumb_height; var mlineend = stripheight - g_options.thumb_height; var mlinesize = mlineend - mlinestart; //fix position borders on the measure line if (posy < mlinestart) posy = mlinestart; if (posy > mlineend) posy = mlineend; //count the ratio of the position on the measure line var ratio = (posy - mlinestart) / mlinesize; var innerposy = (innerheight - stripheight) * ratio; innerposy = math.round(innerposy) * -1 + inneroffsettop; return (innerposy); } /** * get inner x position according mouse x position on the strip */ function getinnerposx(mousex) { var inneroffsetleft = g_options.strip_padding_left; var inneroffsetright = g_options.strip_padding_right; var stripwidth = g_objstrip.width() - inneroffsetleft - inneroffsetright; var innerwidth = g_objstripinner.width(); //if all thumbs visible, no need to move if (stripwidth > innerwidth) return (null); var stripoffset = g_objstrip.offset(); var offsetx = stripoffset.left; var posx = mousex - offsetx - inneroffsetleft; //set measure line parameters var mlinestart = g_options.thumb_width; var mlineend = stripwidth - g_options.thumb_width; var mlinesize = mlineend - mlinestart; //fix position borders on the measure line if (posx < mlinestart) posx = mlinestart; if (posx > mlineend) posx = mlineend; //count the ratio of the position on the measure line var ratio = (posx - mlinestart) / mlinesize; var innerposx = (innerwidth - stripwidth) * ratio; innerposx = math.round(innerposx) * -1 + inneroffsetleft; return (innerposx); } /** * move strip stap to final position */ function movestripstep() { if (g_temp.is_strip_moving == false) { return (false); } var innerpos = g_parent.getinnerstrippos(); if (math.floor(innerpos) == math.floor(g_temp.strip_finalpos)) { stopstripmovingloop(); } //calc step var diff = math.abs(g_temp.strip_finalpos - innerpos); var dpos; if (diff < 1) { dpos = diff; } else { dpos = diff / 4; if (dpos > 0 && dpos < 1) dpos = 1; } if (g_temp.strip_finalpos < innerpos) dpos = dpos * -1; var newpos = innerpos + dpos; g_parent.positioninnerstrip(newpos); } /** * start loop of strip moving */ function startstripmovingloop() { if (g_temp.isstripmoving == true) return (false); g_temp.isstripmoving = true; g_temp.handle_timeout = setinterval(movestripstep, 10); } /** * stop loop of strip moving */ function stopstripmovingloop() { if (g_temp.isstripmoving == false) return (false); g_temp.isstripmoving = false; g_temp.handle_timeout = clearinterval(g_temp.handle_timeout); } /** * get inner position according the orientation * taken by the mouse position */ function getinnerpos(mousepos) { if (g_isvertical == false) return getinnerposx(mousepos); else return getinnerposy(mousepos); } /** * move the strip to mouse position on it * mousex - mouse position relative to the document */ function movestriptomouseposition(mousepos) { var innerpos = getinnerpos(mousepos); if (innerpos === null) return (false); g_temp.is_strip_moving = true; g_temp.strip_finalpos = innerpos; startstripmovingloop(); } } /** * slider class * addon to strip gallery */ function ugslider() { var t = this, g_objthis = jquery(t); var g_gallery = new unitegallerymain(), g_objgallery, g_objwrapper, g_objthumbs; //the video arrows is independent arrows that is not sitting on the controls var g_objslider, g_objinner, g_objslide1, g_objslide2, g_objslide3, g_objarrowleft, g_objarrowright; var g_objtouchslider, g_objzoomslider, g_objzoompanel, g_objbuttonplay = null, g_objbuttonfullscreen = null, g_objbullets = null; var g_objvideoplayer = new ugvideoplayer(), g_optionsprefix; var g_functions = new ugfunctions(), g_objprogress = null, g_objtextpanel = null; this.events = { item_changed: "item_changed", //on item changed before_switch_slides: "before_switch", //before slides switching before_return: "before_return", //before return from pan or from zoom after_return: "after_return", //after return from pan or from zoom zoom_start: "slider_zoom_start", //on zoom start zoom_end: "slider_zoom_end", //on zoom move zooming: "slider_zooming", //on zooming zoom_change: "slider_zoom_change", //on slide image image zoom change start_drag: "start_drag", //on slider drag start after_drag_change: "after_drag_change", //after finish drag chagne transition action_start: "action_start", //on slide action start action_end: "action_end", //on slide action stop click: "slider_click", //on click event transition_start: "slider_transition_start", //before transition start event transition_end: "slider_transition_end", //on transition end event after_put_image: "after_put_image", //after put slide image image_mouseenter: "slider_image_mouseenter", //on slide image mouseonter image_mouseleave: "slider_image_mouseleave", //on slide image mouseleave currentslide_load_start: "slider_current_loadstart", //on current slide load image start currentslide_load_end: "slider_current_loadend" //on finish load current slide image } var g_options = { slider_scale_mode: "fill", //fit: scale down and up the image to always fit the slider //down: scale down only, smaller images will be shown, don't enlarge images (scale up) //fill: fill the entire slider space by scaling, cropping and centering the image //fitvert: make the image always fill the vertical slider area slider_scale_mode_media: "fill", //fill, fit, down, fitvert - scale mode on media items slider_scale_mode_fullscreen: "down", //fill, fit, down, fitvert - scale mode on fullscreen. slider_item_padding_top: 0, //padding top of the slider item slider_item_padding_bottom: 0, //padding bottom of the slider item slider_item_padding_left: 0, //padding left of the slider item slider_item_padding_right: 0, //padding right of the slider item slider_background_color: "", //slider background color, set if you want to change default slider_background_opacity: 1, //slider background opacity slider_image_padding_top: 0, //padding top of the image inside the item slider_image_padding_bottom: 0, //padding bottom of the image inside the item slider_image_padding_left: 0, //padding left of the image inside the item slider_image_padding_right: 0, //padding right of the image inside the item slider_image_border: false, //enable border around the image slider_image_border_width: 10, //image border width slider_image_border_color: "#ffffff", //image border color slider_image_border_radius: 0, //image border radius slider_image_border_maxratio: 0.35, //max ratio that the border can take from the image slider_image_shadow: false, //enable border shadow the image slider_video_constantsize: false, //constant video size mode for video items slider_video_constantsize_scalemode: "fit", //fit,down: constant video size scale mode slider_video_constantsize_width: 854, //constant video size width slider_video_constantsize_height: 480, //constant video size height slider_video_padding_top: 0, //padding top of the video player inside the item slider_video_padding_bottom: 0, //padding bottom of the video player inside the item slider_video_padding_left: 0, //padding left of the video player inside the item slider_video_padding_right: 0, //padding right of the video player inside the item slider_video_enable_closebutton: true, //enable video close button slider_transition: "slide", //fade, slide - the transition of the slide change slider_transition_speed: 300, //transition duration of slide change slider_transition_easing: "easeinoutquad", //transition easing function of slide change slider_control_swipe: true, //true,false - enable swiping control slider_control_zoom: true, //true, false - enable zooming control slider_zoom_mousewheel: true, //enable zoom on mousewheel slider_vertical_scroll_ondrag: false, //vertical scroll on slider area drag slider_loader_type: 1, //shape of the loader (1-7) slider_loader_color: "white", //color of the loader: (black , white) slider_enable_links: true, //enable slide as link functionality slider_links_newpage: false, //open the slide link in new page slider_enable_bullets: false, //enable the bullets onslider element slider_bullets_skin: "", //skin of the bullets, if empty inherit from gallery skin slider_bullets_space_between: -1, //set the space between bullets. if -1 then will be set default space from the skins slider_bullets_align_hor: "center", //left, center, right - bullets horizontal align slider_bullets_align_vert: "bottom", //top, middle, bottom - bullets vertical algin slider_bullets_offset_hor: 0, //bullets horizontal offset slider_bullets_offset_vert: 10, //bullets vertical offset slider_enable_arrows: true, //enable arrows onslider element slider_arrows_skin: "", //skin of the slider arrows, if empty inherit from gallery skin slider_arrow_left_align_hor: "left", //left, center, right - left arrow horizonal align slider_arrow_left_align_vert: "middle", //top, middle, bottom - left arrow vertical align slider_arrow_left_offset_hor: 20, //left arrow horizontal offset slider_arrow_left_offset_vert: 0, //left arrow vertical offset slider_arrow_right_align_hor: "right", //left, center, right - right arrow horizontal algin slider_arrow_right_align_vert: "middle", //top, middle, bottom - right arrow vertical align slider_arrow_right_offset_hor: 20, //right arrow horizontal offset slider_arrow_right_offset_vert: 0, //right arrow vertical offset slider_enable_progress_indicator: true, //enable progress indicator element slider_progress_indicator_type: "pie", //pie, pie2, bar (if pie not supported, it will switch to bar automatically) slider_progress_indicator_align_hor: "right", //left, center, right - progress indicator horizontal align slider_progress_indicator_align_vert: "top", //top, middle, bottom - progress indicator vertical align slider_progress_indicator_offset_hor: 10, //progress indicator horizontal offset slider_progress_indicator_offset_vert: 10, //progress indicator vertical offset slider_enable_play_button: true, //true,false - enable play / pause button onslider element slider_play_button_skin: "", //skin of the slider play button, if empty inherit from gallery skin slider_play_button_align_hor: "left", //left, center, right - play button horizontal align slider_play_button_align_vert: "top", //top, middle, bottom - play button vertical align slider_play_button_offset_hor: 40, //play button horizontal offset slider_play_button_offset_vert: 8, //play button vertical offset slider_play_button_mobilehide: false, //hide the play button on mobile slider_enable_fullscreen_button: true, //true,false - enable fullscreen button onslider element slider_fullscreen_button_skin: "", //skin of the slider fullscreen button, if empty inherit from gallery skin slider_fullscreen_button_align_hor: "left", //left, center, right - fullscreen button horizonatal align slider_fullscreen_button_align_vert: "top", //top, middle, bottom - fullscreen button vertical align slider_fullscreen_button_offset_hor: 11, //fullscreen button horizontal offset slider_fullscreen_button_offset_vert: 9, //fullscreen button vertical offset slider_fullscreen_button_mobilehide: false, //hide the button on mobile slider_enable_zoom_panel: true, //true,false - enable the zoom buttons, works together with zoom control. slider_zoompanel_skin: "", //skin of the slider zoom panel, if empty inherit from gallery skin slider_zoompanel_align_hor: "left", //left, center, right - zoom panel horizontal align slider_zoompanel_align_vert: "top", //top, middle, bottom - zoom panel vertical align slider_zoompanel_offset_hor: 12, //zoom panel horizontal offset slider_zoompanel_offset_vert: 92, //zoom panel vertical offset slider_zoompanel_mobilehide: false, //hide the zoom panel on mobile slider_controls_always_on: false, //true,false - controls are always on, false - show only on mouseover slider_controls_appear_ontap: true, //true,false - appear controls on tap event on touch devices slider_controls_appear_duration: 300, //the duration of appearing controls slider_enable_text_panel: true, //true,false - enable the text panel slider_textpanel_always_on: true, //true,false - text panel are always on, false - show only on mouseover slider_videoplay_button_type: "square" //square, round - the videoplay button type, square or round }; //default options for bar progress incicator var g_defaultsprogressbar = { slider_progress_indicator_align_hor: "left", //left, center, right slider_progress_indicator_align_vert: "bottom", //top, middle, bottom slider_progress_indicator_offset_hor: 0, //horizontal offset slider_progress_indicator_offset_vert: 0 //vertical offset }; var g_temp = { isrunonce: false, istextpanelsaparatehover: false, //if the panel need to be appeared without the controls object on mouseover numprev: 1, numcurrent: 2, numnext: 3, iscontrolsvisible: true, currentcontrolsmode: "image" }; function __________general___________() { }; /** * init the slider */ function initslider(objgallery, objoptions, optionsprefix) { g_gallery = objgallery; //change options by prefix if (optionsprefix) { g_optionsprefix = optionsprefix; objoptions = g_functions.convertcustomprefixoptions(objoptions, g_optionsprefix, "slider"); } g_objgallery = jquery(objgallery); var objects = g_gallery.getobjects(); g_objwrapper = objects.g_objwrapper; g_objthumbs = objects.g_objthumbs; //set progress indicator bar defaults if type bar if (objoptions.hasownproperty("slider_progress_indicator_type")) g_options.slider_progress_indicator_type = objoptions.slider_progress_indicator_type; if (g_options.slider_progress_indicator_type == "bar") { g_options = jquery.extend(g_options, g_defaultsprogressbar); } if (objoptions) t.setoptions(objoptions); processoptions(); //init bullets: if (g_options.slider_enable_bullets == true) { g_objbullets = new ugbullets(); var bulletsoptions = { bullets_skin: g_options.slider_bullets_skin, bullets_space_between: g_options.slider_bullets_space_between } g_objbullets.init(g_gallery, bulletsoptions); } //init text panel if (g_options.slider_enable_text_panel) { g_objtextpanel = new ugtextpanel(); g_objtextpanel.init(g_gallery, g_options, "slider"); } if (g_options.slider_enable_zoom_panel) { g_objzoompanel = new ugzoombuttonspanel(); g_objzoompanel.init(t, g_options); } var galleryid = g_gallery.getgalleryid(); //init video player g_objvideoplayer.init(g_options, false, galleryid); } /** * run the slider functionality */ function runslider() { if (g_temp.isrunonce == true) return (false); g_temp.isrunonce = true; //set background color if (g_options.slider_background_color) { var bgcolor = g_options.slider_background_color; if (g_options.slider_background_opacity != 1) bgcolor = g_functions.converthextorgb(bgcolor, g_options.slider_background_opacity); g_objslider.css("background-color", bgcolor); } else if (g_options.slider_background_opacity != 1) { //set opacity with default color bgcolor = g_functions.converthextorgb("#000000", g_options.slider_background_opacity); g_objslider.css("background-color", bgcolor); } //init touch slider control if (g_options.slider_control_swipe == true) { g_objtouchslider = new ugtouchslidercontrol(); g_objtouchslider.init(t, g_options); } //init zoom slider control if (g_options.slider_control_zoom == true) { g_objzoomslider = new ugzoomslidercontrol(); g_objzoomslider.init(t, g_options); } //run the text panel if (g_objtextpanel) g_objtextpanel.run(); initevents(); } /** * process the options */ function processoptions() { var galleryoptions = g_gallery.getoptions(); //set skins: var globalskin = galleryoptions.gallery_skin; if (g_options.slider_bullets_skin == "") g_options.slider_bullets_skin = globalskin; if (g_options.slider_arrows_skin == "") g_options.slider_arrows_skin = globalskin; if (g_options.slider_zoompanel_skin == "") g_options.slider_zoompanel_skin = globalskin; if (g_options.slider_play_button_skin == "") g_options.slider_play_button_skin = globalskin; if (g_options.slider_fullscreen_button_skin == "") g_options.slider_fullscreen_button_skin = globalskin; g_options.video_enable_closebutton = g_options.slider_video_enable_closebutton; //set mousewheel option depends on the gallery option if (galleryoptions.gallery_mousewheel_role != "zoom") g_options.slider_zoom_mousewheel = false; } /** * * get html slide */ function gethtmlslide(loaderclass, numslide) { var classvideoplay = "ug-type-square"; if (g_options.slider_videoplay_button_type == "round") classvideoplay = "ug-type-round"; var html = ""; html += "
"; html += "
"; html += "
"; html += ""; html += "
"; return (html); } /** * set the slider html */ function sethtmlslider(objparent) { if (objparent) g_objwrapper = objparent; //get if the slide has controls var loaderclass = getloaderclass(); var galleryoptions = g_gallery.getoptions(); var html = "
"; html += "
"; html += gethtmlslide(loaderclass, 1); html += gethtmlslide(loaderclass, 2); html += gethtmlslide(loaderclass, 3); html += "
"; //end inner //---------------- //add arrows if (g_options.slider_enable_arrows == true) { html += "
"; html += "
"; } //add play button if (g_options.slider_enable_play_button == true) { html += "
"; } //add fullscreen button if (g_options.slider_enable_fullscreen_button == true) { html += "
"; } html += "
"; //end slider g_objwrapper.append(html); //---------------- //set objects g_objslider = g_objwrapper.children(".ug-slider-wrapper"); g_objinner = g_objslider.children(".ug-slider-inner"); g_objslide1 = g_objinner.children(".ug-slide1"); g_objslide2 = g_objinner.children(".ug-slide2"); g_objslide3 = g_objinner.children(".ug-slide3"); //set slides data g_objslide1.data("slidenum", 1); g_objslide2.data("slidenum", 2); g_objslide3.data("slidenum", 3); //add bullets if (g_objbullets) g_objbullets.appendhtml(g_objslider); //---------------- //get arrows object if (g_options.slider_enable_arrows == true) { g_objarrowleft = g_objslider.children(".ug-arrow-left"); g_objarrowright = g_objslider.children(".ug-arrow-right"); } //get play button if (g_options.slider_enable_play_button == true) { g_objbuttonplay = g_objslider.children(".ug-button-play"); } //get fullscreen button if (g_options.slider_enable_fullscreen_button == true) { g_objbuttonfullscreen = g_objslider.children(".ug-button-fullscreen"); } //---------------- //add progress indicator if (g_options.slider_enable_progress_indicator == true) { g_objprogress = g_functions.initprogressindicator(g_options.slider_progress_indicator_type, g_options, g_objslider); var finaltype = g_objprogress.gettype(); //change options in case of type change if (finaltype == "bar" && g_options.slider_progress_indicator_type == "pie") { g_options.slider_progress_indicator_type = "bar"; g_options = jquery.extend(g_options, g_defaultsprogressbar); } g_gallery.setprogressindicator(g_objprogress); } //---------------- //add text panel (hidden) if (g_options.slider_enable_text_panel == true) { g_objtextpanel.appendhtml(g_objslider); //hide panel saparatelly from the controls object if (g_options.slider_textpanel_always_on == false) { //hide the panel var panelelement = g_objtextpanel.getelement(); panelelement.hide().data("ishidden", true); g_temp.istextpanelsaparatehover = true; } } //---------------- //add zoom buttons panel: if (g_options.slider_enable_zoom_panel == true) { g_objzoompanel.appendhtml(g_objslider); } //add video player g_objvideoplayer.sethtml(g_objinner); } /** * position elements that related to slide */ function positionslideelements(objslide) { //position preloader var objpreloader = getslidepreloader(objslide); g_functions.placeelementinparentcenter(objpreloader); //position video play button var objvideoplaybutton = getslidevideoplaybutton(objslide); g_functions.placeelementinparentcenter(objvideoplaybutton); } /** * position elements */ function positionelements() { //place bullets if (g_objbullets) { objbullets = g_objbullets.getelement(); //strange bug fix (bullets width: 20) by double placing g_functions.placeelement(objbullets, g_options.slider_bullets_align_hor, g_options.slider_bullets_align_vert, g_options.slider_bullets_offset_hor, g_options.slider_bullets_offset_vert); g_functions.placeelement(objbullets, g_options.slider_bullets_align_hor, g_options.slider_bullets_align_vert, g_options.slider_bullets_offset_hor, g_options.slider_bullets_offset_vert); } //place arrows if (g_options.slider_enable_arrows == true) { g_functions.placeelement(g_objarrowleft, g_options.slider_arrow_left_align_hor, g_options.slider_arrow_left_align_vert, g_options.slider_arrow_left_offset_hor, g_options.slider_arrow_left_offset_vert); g_functions.placeelement(g_objarrowright, g_options.slider_arrow_right_align_hor, g_options.slider_arrow_left_align_vert, g_options.slider_arrow_right_offset_hor, g_options.slider_arrow_right_offset_vert); } //hide controls if (g_options.slider_controls_always_on == false) hidecontrols(true); //place progress indicator if (g_objprogress) { var objprogresselement = g_objprogress.getelement(); if (g_options.slider_progress_indicator_type == "bar") { var sliderwidth = g_objslider.width(); g_objprogress.setsize(sliderwidth); g_functions.placeelement(objprogresselement, "left", g_options.slider_progress_indicator_align_vert, 0, g_options.slider_progress_indicator_offset_vert); } else { g_functions.placeelement(objprogresselement, g_options.slider_progress_indicator_align_hor, g_options.slider_progress_indicator_align_vert, g_options.slider_progress_indicator_offset_hor, g_options.slider_progress_indicator_offset_vert); } } //position text panel if (g_objtextpanel) g_objtextpanel.positionpanel(); //position controls elements placecontrolselements(); //place slide elements positionslideelements(g_objslide1); positionslideelements(g_objslide2); positionslideelements(g_objslide3); checkmobilemodify(); } /** * place elements that located on "controls" div */ function placecontrolselements() { if (g_objbuttonplay) g_functions.placeelement(g_objbuttonplay, g_options.slider_play_button_align_hor, g_options.slider_play_button_align_vert, g_options.slider_play_button_offset_hor, g_options.slider_play_button_offset_vert); //position fullscreen button if (g_objbuttonfullscreen) g_functions.placeelement(g_objbuttonfullscreen, g_options.slider_fullscreen_button_align_hor, g_options.slider_fullscreen_button_align_vert, g_options.slider_fullscreen_button_offset_hor, g_options.slider_fullscreen_button_offset_vert); //position zoom panel if (g_objzoompanel) { var zoompanelelement = g_objzoompanel.getelement(); g_functions.placeelement(zoompanelelement, g_options.slider_zoompanel_align_hor, g_options.slider_zoompanel_align_vert, g_options.slider_zoompanel_offset_hor, g_options.slider_zoompanel_offset_vert); } } /** * position slides by their order */ function positionslides() { var slides = t.getslidesreference(); var posx = 0, posy = 0, innerwidth; var posxprev = 0, posxcurrent = 0, posxnext, nexthasitem, prevhasitem; nexthasitem = t.isslidehasitem(slides.objnextslide); prevhasitem = t.isslidehasitem(slides.objprevslide); if (prevhasitem) { posxcurrent = slides.objprevslide.outerwidth(); slides.objprevslide.css("z-index", 1); } else slides.objprevslide.hide(); posxnext = posxcurrent + slides.objcurrentslide.outerwidth(); innerwidth = posxnext; if (nexthasitem) { innerwidth = posxnext + slides.objnextslide.outerwidth(); slides.objprevslide.css("z-index", 2); } else slides.objnextslide.hide(); slides.objcurrentslide.css("z-index", 3); //set inner size and position g_functions.placeelement(slides.objcurrentslide, posxcurrent, posy); g_objinner.css({ "left": -posxcurrent + "px", width: innerwidth + "px" }); //position prev if (prevhasitem) { g_functions.placeelement(slides.objprevslide, posxprev, posy); g_functions.showelement(slides.objprevslide); } if (nexthasitem) { g_functions.showelement(slides.objnextslide); g_functions.placeelement(slides.objnextslide, posxnext, posy); } } /** * resize the slide image inside item */ function resizeslideitem(objslide) { var index = objslide.data("index"); if (index === undefined || index == null) return (false); var objitem = g_gallery.getitem(index); if (!objitem) return (false); setitemtoslide(objslide, objitem); } /** * show the preloader * show the index, so only the current index load will hide. */ function showpreloader(objpreloader) { objpreloader.stop(true).show(100); } /** * hide the preloader */ function hidepreloader(objpreloader) { objpreloader.stop(true).hide(100); } /** * get proper image border width */ function getimageborderwidth(objimage, imagedata) { var borderwidth = g_options.slider_image_border_width; if (borderwidth <= 10) return (borderwidth); //set image size var imagesize = g_functions.getelementsize(objimage); var imagewidth = imagesize.width; var imageheight = imagesize.height; if (imagedata) { if (imagedata.hasownproperty("imagewidth")) imagewidth = imagedata.imagewidth; if (imagedata.hasownproperty("imageheight")) imageheight = imagedata.imageheight; } if (imagewidth <= 0) return (borderwidth); //take the less size var totalsize = (imagewidth < imageheight) ? imagewidth : imageheight; var bordersize = borderwidth * 2; var borderratio = bordersize / totalsize; if (borderratio < g_options.slider_image_border_maxratio) return (borderwidth); //change border width var borderwidth = (totalsize * g_options.slider_image_border_maxratio) / 2; borderwidth = math.round(borderwidth); return (borderwidth); } /** * set slider image css design according the settings */ function setimagedesign(objimage, slidetype, imagedata) { var css = {}; if (g_options.slider_image_border == true) { css["border-style"] = "solid"; var borderwidth = getimageborderwidth(objimage, imagedata); css["border-width"] = borderwidth + "px"; css["border-color"] = g_options.slider_image_border_color; css["border-radius"] = g_options.slider_image_border_radius; } if (slidetype != "image" && g_options.slider_video_constantsize == true) css["background-color"] = "#000000"; if (g_options.slider_image_shadow == true) { css["box-shadow"] = "3px 3px 10px 0px #353535"; } objimage.css(css); } /** * scale image constant size (for video items) */ function scaleimageconstantsize(objimage, objitem) { var constantwidth = g_options.slider_video_constantsize_width; var constantheight = g_options.slider_video_constantsize_height; var scalemode = g_options.slider_video_constantsize_scalemode; var objsize = g_functions.scaleimageexactsizeinparent(objimage, objitem.imagewidth, objitem.imageheight, constantwidth, constantheight, scalemode); return (objsize); } /** * * set item to slide */ function setimagetoslide(objslide, objitem, isforce) { var objitemwrapper = objslide.children(".ug-item-wrapper"); var objpreloader = getslidepreloader(objslide); if (typeof objitem.urlimage == "undefined" || objitem.urlimage == "") throw new error("the slide don't have big image defined ( data-image='imageurl' ). please check gallery items.", "showbig"); var urlimage = objitem.urlimage; var currentimage = objslide.data("urlimage"); objslide.data("urlimage", urlimage); var scalemode = t.getscalemode(objslide); var slidetype = t.getslidetype(objslide); objpadding = t.getobjimagepadding(); if (currentimage == urlimage && isforce !== true) { var objimage = objitemwrapper.children("img"); if (objitem.imagewidth == 0 || objitem.imageheight == 0) { g_gallery.checkfillimagesize(objimage, objitem); } var objimagedata = {}; if (slidetype != "image" && g_options.slider_video_constantsize == true) { objimagedata = scaleimageconstantsize(objimage, objitem); } else { objimagedata = g_functions.scaleimagefitparent(objimage, objitem.imagewidth, objitem.imageheight, scalemode, objpadding); } setimagedesign(objimage, slidetype, objimagedata); g_objthis.trigger(t.events.after_put_image, objslide); } else { //place the image inside parent first time objimage = g_functions.placeimageinsideparent(urlimage, objitemwrapper, objitem.imagewidth, objitem.imageheight, scalemode, objpadding); //set image loaded on load: if (objitem.isbigimageloaded == true) { objimage.fadeto(0, 1); hidepreloader(objpreloader); if (slidetype != "image" && g_options.slider_video_constantsize == true) var objimagedata = scaleimageconstantsize(objimage, objitem); else var objimagedata = g_functions.getimageinsideparentdata(objitemwrapper, objitem.imagewidth, objitem.imageheight, scalemode, objpadding); //set missing css width objimage.css("width", objimagedata.imagewidth + "px"); setimagedesign(objimage, slidetype, objimagedata); g_objthis.trigger(t.events.after_put_image, objslide); } else { //if the image not loaded, load the image and show it after. objimage.fadeto(0, 0); showpreloader(objpreloader); objslide.data("isloading", true); if (t.isslidecurrent(objslide)) g_objthis.trigger(t.events.currentslide_load_start); objimage.data("itemindex", objitem.index); objimage.on("load", function () { //place the image normally with coordinates var objimage = jquery(this); var itemindex = objimage.data("itemindex"); objimage.fadeto(0, 1); //get and hide preloader var objslide = objimage.parent().parent(); var slidetype = t.getslidetype(objslide); var objpreloader = getslidepreloader(objslide); var objpadding = t.getobjimagepadding(); var scalemode = t.getscalemode(objslide); hidepreloader(objpreloader); objslide.data("isloading", false); if (t.isslidecurrent(objslide)) g_objthis.trigger(t.events.currentslide_load_end); g_gallery.onitembigimageloaded(null, objimage); var objitem = g_gallery.getitem(itemindex); var objimagedata = {}; if (slidetype != "image" && g_options.slider_video_constantsize == true) scaleimageconstantsize(objimage, objitem); else { objimagedata = g_functions.scaleimagefitparent(objimage, objitem.imagewidth, objitem.imageheight, scalemode, objpadding); } objimage.fadeto(0, 1); setimagedesign(objimage, slidetype, objimagedata); g_objthis.trigger(t.events.after_put_image, objslide); }); } } } /** * set slider image by url * if item not set, get current slide item */ function setitemtoslide(objslide, objitem) { try { var objitemwrapper = objslide.children(".ug-item-wrapper"); //if the item is empty, remove the image from slide if (objitem == null) { objitemwrapper.html(""); objslide.removedata("index"); objslide.removedata("type"); objslide.removedata("urlimage"); return (false); } var currentindex = objslide.data("index"); objslide.data("index", objitem.index); objslide.data("type", objitem.type); //set link class if (g_options.slider_enable_links == true && objitem.type == "image") { if (objitem.link) objslide.addclass("ug-slide-clickable"); else objslide.removeclass("ug-slide-clickable"); } setimagetoslide(objslide, objitem); //show type related elements var objvideoplaybutton = getslidevideoplaybutton(objslide); switch (objitem.type) { case "image": objvideoplaybutton.hide(); break; default: //video objvideoplaybutton.show(); break; } } catch (error) { if (typeof error.filename != "undefined" && error.filename == "showbig") g_gallery.showerrormessagereplacegallery(error.message); objitemwrapper.html(""); throw new error(error); return (true); } } /** * hide the panel */ function hidetextpanel() { if (!g_objtextpanel) return (false); if (istextpanelhidden() == true) return (false); var panelelement = g_objtextpanel.getelement(); var animationtime = 0; if (g_temp.istextpanelsaparatehover == true || g_options.slider_textpanel_always_on == true) { animationtime = g_options.slider_controls_appear_duration; } panelelement.stop().fadeto(animationtime, 0); panelelement.data("ishidden", true); } /** * show the text panel */ function showtextpanel() { if (!g_objtextpanel) return (false); if (istextpanelhidden() == false) return (false); var panelelement = g_objtextpanel.getelement(); var animationtime = 0; if (g_temp.istextpanelsaparatehover == true || g_options.slider_textpanel_always_on == true) { panelelement.show(); g_objtextpanel.positionelements(); animationtime = g_options.slider_controls_appear_duration; } panelelement.stop().show().fadeto(animationtime, 1); panelelement.data("ishidden", false); } /** * check if the text panel is hidden or not */ function istextpanelhidden() { var panelelement = g_objtextpanel.getelement(); var ishidden = panelelement.data("ishidden"); if (ishidden === false) return (false); return (true); } /** * validate that the slide is certain type, if not, throw error */ function validateslidetype(type, objslide) { if (objslide == undefined) var objslide = t.getcurrentslide(); var slidetype = t.getslidetype(objslide); if (slidetype != type) { throw new error("wrong slide type: " + slidetype + ", should be: " + type); return (false); } return (true); } function __________video_player_______() { }; /** * set video player position */ function setvideoplayerposition() { var objcurrentslide = t.getcurrentslide(); var objimage = t.getslideimage(objcurrentslide); var slidesize = g_functions.getelementsize(objcurrentslide); var left = slidesize.left; var top = slidesize.top; //set by image position if (g_options.slider_video_constantsize == true) { var imagesize = g_functions.getelementsize(objimage); left += imagesize.left; top += imagesize.top; } else { //set video padding left += g_options.slider_video_padding_left; top += g_options.slider_video_padding_top; } g_objvideoplayer.setposition(left, top); } /** * set video player constant size */ function setvideoplayerconstantsize() { var videowidth = g_options.slider_video_constantsize_width; var videoheight = g_options.slider_video_constantsize_height; g_objvideoplayer.setsize(videowidth, videoheight); //set video design var videoelement = g_objvideoplayer.getobject(); setimagedesign(videoelement, "video"); } function __________transition_______() { }; /** * do the transition between the current and the next */ function dotransition(direction, objitem, forcetransition) { g_objthis.trigger(t.events.transition_start); var transition = g_options.slider_transition; if (forcetransition) transition = forcetransition; //stop current slide action t.stopslideaction(null, true); switch (transition) { default: case "fade": transitionfade(objitem); break; case "slide": transitionslide(direction, objitem); break; case "lightbox_open": //fade transition without animation transitionfade(objitem, false, true); break; } } /** * switch slide numbers after transition (by direction) * */ this.switchslidenums = function (direction) { //trigger item changed effect g_objthis.trigger(t.events.before_switch_slides); switch (direction) { case "left": var currentnum = g_temp.numcurrent; g_temp.numcurrent = g_temp.numnext; g_temp.numnext = g_temp.numprev; g_temp.numprev = currentnum; break; case "right": var currentnum = g_temp.numcurrent; g_temp.numcurrent = g_temp.numprev; g_temp.numprev = g_temp.numnext; g_temp.numnext = currentnum; break; default: throw new error("wrong direction: " + direction); break; } //trace(g_temp.numcurrent); //trigger item changed effect g_objthis.trigger(t.events.item_changed); } /** * do slide transition */ function transitionslide(direction, objitem) { var animating = t.isanimating(); if (animating == true) { g_temp.itemwaiting = objitem; return (true); } //always clear next item on transition start // next item can be only in the middle of the transition. if (g_temp.itemwaiting != null) g_temp.itemwaiting = null; var slides = t.getslidesreference(); switch (direction) { case "right": //change to prev item setitemtoslide(slides.objprevslide, objitem); positionslides(); var posprev = g_functions.getelementsize(slides.objprevslide); var destx = -posprev.left; t.switchslidenums("right"); break; case "left": //change to next item setitemtoslide(slides.objnextslide, objitem); positionslides(); var posnext = g_functions.getelementsize(slides.objnextslide); var destx = -posnext.left; t.switchslidenums("left"); break; default: throw new error("wrong direction: " + direction); break; } var transspeed = g_options.slider_transition_speed; var transeasing = g_options.slider_transition_easing; var animateparams = { duration: transspeed, easing: transeasing, queue: false, always: function () { t.stopslideaction(); g_objvideoplayer.hide(); //transit next item if waiting if (g_temp.itemwaiting != null) { var direction = getslidedirection(g_temp.itemwaiting); transitionslide(direction, g_temp.itemwaiting); } else { //if no item waiting, please neighbour items in places t.placenabouritems(); g_objthis.trigger(t.events.transition_end); } } }; g_objinner.animate({ left: destx + "px" }, animateparams); } /** * * animate opacity in and out */ function animateopacity(objitem, opacity, completefunction) { if (completefunction) objitem.fadeto(g_options.slider_transition_speed, opacity, completefunction); else objitem.fadeto(g_options.slider_transition_speed, opacity); } /** * do fade transition */ function transitionfade(objitem, noanimation, nohideplayer) { if (!noanimation) var noanimation = false; var slides = t.getslidesreference(); setitemtoslide(slides.objnextslide, objitem); var objcurrentpos = g_functions.getelementsize(slides.objcurrentslide); g_functions.placeelement(slides.objnextslide, objcurrentpos.left, objcurrentpos.top); //switch slide nums var currentnum = g_temp.numcurrent; g_temp.numcurrent = g_temp.numnext; g_temp.numnext = currentnum; g_objthis.trigger(t.events.item_changed); slides.objnextslide.stop(true); slides.objcurrentslide.stop(true); if (noanimation == true) { slides.objcurrentslide.fadeto(0, 0); slides.objnextslide.fadeto(0, 1); t.placenabouritems(); g_objthis.trigger(t.events.transition_end); if (nohideplayer !== true) g_objvideoplayer.hide(); } else { slides.objnextslide.fadeto(0, 0); animateopacity(slides.objcurrentslide, 0, function () { t.placenabouritems(); g_objthis.trigger(t.events.transition_end); if (nohideplayer !== true) g_objvideoplayer.hide(); }); if (g_objvideoplayer.isvisible() == true) { var videoelement = g_objvideoplayer.getobject(); animateopacity(videoelement, 0); } //animate to next show next animateopacity(slides.objnextslide, 1); } } function __________controls_object_______() { }; /** * modify the slider for mobile */ function modifyformobile() { if (g_options.slider_fullscreen_button_mobilehide == true && g_objbuttonfullscreen) g_objbuttonfullscreen.hide(); if (g_options.slider_play_button_mobilehide == true && g_objbuttonplay) g_objbuttonplay.hide(); if (g_options.slider_zoompanel_mobilehide == true && g_objzoompanel) g_objzoompanel.getelement().hide(); } /** * modify for no mobile */ function modifyfordesctop() { if (g_options.slider_fullscreen_button_mobilehide == true && g_objbuttonfullscreen) g_objbuttonfullscreen.show(); if (g_options.slider_play_button_mobilehide == true && g_objbuttonplay) g_objbuttonplay.show(); if (g_options.slider_zoompanel_mobilehide == true && g_objzoompanel) g_objzoompanel.getelement().show(); } /** * check and modify for mobile or desctop */ function checkmobilemodify() { var ismobile = g_gallery.ismobilemode(); if (ismobile) modifyformobile(); else modifyfordesctop(); } /** * get a jquery set of the controls objects */ function getcontrolsobjects() { var objcontrol = g_objslider.children(".ug-slider-control"); return (objcontrol); } /** * hide the controls */ function hidecontrols(noanimation) { if (g_functions.istimepassed("slidercontrolstoggle") == false) return (false); if (g_temp.iscontrolsvisible == false) return (false); if (!noanimation) var noanimation = false; var objcontrols = getcontrolsobjects(); if (noanimation === true) objcontrols.stop().fadeto(0, 0).hide(); else { objcontrols.stop().fadeto(g_options.slider_controls_appear_duration, 0, function () { objcontrols.hide() }); } g_temp.iscontrolsvisible = false; } /** * show controls only if they meaned to be shown * @param noanimation */ function checkandshowcontrols(noanimation) { if (g_options.slider_controls_always_on == true) showcontrols(noanimation); } /** * hide the controls */ function showcontrols(noanimation) { //validate for short time pass if (g_functions.istimepassed("slidercontrolstoggle") == false) return (false); if (g_temp.iscontrolsvisible == true) return (true); if (!noanimation) var noanimation = false; var objcontrols = getcontrolsobjects(); if (noanimation === true) objcontrols.stop().show(); else { objcontrols.stop().show().fadeto(0, 0); objcontrols.fadeto(g_options.slider_controls_appear_duration, 1); } g_temp.iscontrolsvisible = true; } /** * toggle the controls (show, hide) */ function togglecontrols() { if (g_temp.iscontrolsvisible == false) showcontrols(); else hidecontrols(); } /** * set controls mode * modes: image, video */ function setcontrolsmode(mode) { if (mode == g_temp.currentcontrolsmode) return (false); switch (mode) { case "image": if (g_objzoompanel) g_objzoompanel.getelement().show(); break; case "video": if (g_objzoompanel) g_objzoompanel.getelement().hide(); break; default: throw new error("wrong controld mode: " + mode); break; } g_temp.currentcontrolsmode = mode; } function __________events___________() { }; /** * on item change event */ function onitemchange(data, arg_objitem, role) { //trace("slider on change"); var objitem = g_gallery.getselecteditem(); t.setitem(objitem, false, role); var itemindex = objitem.index; //set active bullet if (g_objbullets) g_objbullets.setactive(itemindex); //handle text panel if (g_objtextpanel) { if (g_temp.istextpanelsaparatehover == false) showtextpanel(); } if (objitem.type == "image") { setcontrolsmode("image"); //placecontrolselements(); } else { setcontrolsmode("video"); } } /** * on bullet click - change the item to selected */ function onbulletclick(event, bulletindex) { g_gallery.selectitem(bulletindex); } /** * on touch end * toggle controls */ function onclick(event) { //double tap action if (g_objtouchslider && g_objtouchslider.istapeventoccured(event) == false) return (true); g_objthis.trigger(t.events.click, event); } /** * on actual click event */ function onactualclick() { //check link var currentslide = t.getcurrentslide(); var isclickable = currentslide.hasclass("ug-slide-clickable"); var objitem = t.getcurrentitem(); if (isclickable) { //redirect to link if (g_options.slider_links_newpage == false) { location.href = objitem.link; } else { window.open(objitem.link, '_blank'); } return (true); } //check toggle controls if (g_options.slider_controls_always_on == false && g_options.slider_controls_appear_ontap == true && t.iscurrentslidetype("image") == true) { togglecontrols(); //show text panel if hidden if (g_objtextpanel && g_options.slider_textpanel_always_on == true && t.iscurrentslidetype("image") && t.iscurrentslideimagefit()) showtextpanel(); } } /** * on zoom start event */ function onzoomchange(event) { if (g_objtextpanel && t.iscurrentslidetype("image") && t.iscurrentslideimagefit() == false) hidetextpanel(); } /** * on mouse enter */ function onmouseenter() { showcontrols(); } /** * on mouse leave */ function onmouseleave() { hidecontrols(); } /** * on slide video play button click */ function objvideoplayclick(objbutton) { var objslide = objbutton.parent(); t.startslideaction(objslide); } /** * on video player show event */ function onvideoplayershow() { if (g_gallery.isplaymode()) { g_gallery.pauseplaying(); } g_objthis.trigger(t.events.action_start); } /** * on video player hide event */ function onvideoplayerhide() { if (g_gallery.isplaymode()) { g_gallery.continueplaying(); } g_objthis.trigger(t.events.action_end); } /** * on item image update, update the image inside the slider if relevant */ function onitemimageupdate(event, index, urlimage) { if (g_objslide1.data("index") == index) { objitem = g_gallery.getitem(index); setimagetoslide(g_objslide1, objitem, true); //force } if (g_objslide2.data("index") == index) { objitem = g_gallery.getitem(index); setimagetoslide(g_objslide2, objitem, true); } if (g_objslide3.data("index") == index) { objitem = g_gallery.getitem(index); setimagetoslide(g_objslide3, objitem, true); } } /** * after image loaded. position video play button */ function onslideimageloaded(data, objslide) { objslide = jquery(objslide); var objimage = t.getslideimage(objslide); var objbuttonvideoplay = getslidevideoplaybutton(objslide); var objsize = g_functions.getelementsize(objimage); g_functions.placeelement(objbuttonvideoplay, "center", "middle", objsize.left, objsize.top, objimage); } /** * init event of current slide */ function initslideevents(objslide) { //set video player events var objvideoplaybutton = getslidevideoplaybutton(objslide); g_functions.addclassonhover(objvideoplaybutton); g_functions.setbuttononclick(objvideoplaybutton, objvideoplayclick); } /** * init events */ function initevents() { //on item image update, update the image inside the slider if relevant g_objgallery.on(g_gallery.events.item_image_updated, onitemimageupdate); //on item change, change the item in the slider. g_objgallery.on(g_gallery.events.item_change, onitemchange); if (g_objbullets) jquery(g_objbullets).on(g_objbullets.events.bullet_click, onbulletclick); //arrows events if (g_options.slider_enable_arrows == true) { g_functions.addclassonhover(g_objarrowright, "ug-arrow-hover"); g_functions.addclassonhover(g_objarrowleft, "ug-arrow-hover"); g_gallery.setnextbutton(g_objarrowright); g_gallery.setprevbutton(g_objarrowleft); } //show / hide controls if (g_options.slider_controls_always_on == false) { //assign hover evens only if no touch device g_objslider.hover(onmouseenter, onmouseleave); } //touch events appear on tap event g_objslider.on("touchend click", onclick); //actual click event g_objthis.on(t.events.click, onactualclick); //show / hide text panel, if it's saparate from controls if (g_objtextpanel && g_temp.istextpanelsaparatehover == true) { g_objslider.hover(showtextpanel, hidetextpanel); } //init play / pause button if (g_objbuttonplay) { g_functions.addclassonhover(g_objbuttonplay, "ug-button-hover"); g_gallery.setplaybutton(g_objbuttonplay); } //init fullscreen button if (g_objbuttonfullscreen) { g_functions.addclassonhover(g_objbuttonfullscreen, "ug-button-hover"); g_gallery.setfullscreentogglebutton(g_objbuttonfullscreen); } //on zoom start / end events if (g_objzoomslider) { g_objthis.on(t.events.zoom_change, onzoomchange); } if (g_objzoompanel) g_objzoompanel.initevents(); //init video player related events g_objvideoplayer.initevents(); //video api events jquery(g_objvideoplayer).on(g_objvideoplayer.events.show, onvideoplayershow); jquery(g_objvideoplayer).on(g_objvideoplayer.events.hide, onvideoplayerhide); //add slide events initslideevents(g_objslide1); initslideevents(g_objslide2); initslideevents(g_objslide3); //on image loaded g_objthis.on(t.events.after_put_image, onslideimageloaded); //image mouseenter / mouseleave event //set mouseover events on the images g_objslider.on("mouseenter", ".ug-item-wrapper img", function (event) { g_objthis.trigger(t.events.image_mouseenter); }); g_objslider.on("mouseleave", ".ug-item-wrapper img", function (event) { var ismouseover = t.ismouseinsideslideimage(event); if (ismouseover == false) g_objthis.trigger(t.events.image_mouseleave); }); } /** * destroy slider events */ this.destroy = function () { g_objthis.off(t.events.after_put_image); g_objgallery.off(g_gallery.events.item_image_updated); g_objgallery.off(g_gallery.events.item_change); if (g_objbullets) jquery(g_objbullets).on(g_objbullets.events.bullet_click); g_objslider.off("mouseenter"); g_objslider.off("mouseleave"); g_objslider.off("touchend"); g_objslider.off("click"); g_objthis.off(t.events.click); if (g_objzoomslider) g_objthis.off(t.events.zoom_change); g_objthis.off(t.events.before_switch_slides); jquery(g_objvideoplayer).off(g_objvideoplayer.events.show); jquery(g_objvideoplayer).off(g_objvideoplayer.events.hide); g_objvideoplayer.destroy(); g_objslider.off("mouseenter", ".ug-item-wrapper img"); g_objslider.off("mouseleave", ".ug-item-wrapper img"); } function __________getters___________() { }; /** * get loader class by loader type */ function getloaderclass() { var loaderclass; switch (g_options.slider_loader_type) { default: case 1: loaderclass = "ug-loader1"; break; case 2: loaderclass = "ug-loader2"; break; case 3: loaderclass = "ug-loader3"; break; case 4: loaderclass = "ug-loader4"; break; case 5: loaderclass = "ug-loader5"; break; case 6: loaderclass = "ug-loader6"; break; case 7: loaderclass = "ug-loader7"; break; case 8: loaderclass = "ug-loader8"; break; case 9: loaderclass = "ug-loader9"; break; } if (g_options.slider_loader_color == "black") loaderclass += " ug-loader-black"; return (loaderclass); } /** * * get slide by number */ function getslidebynum(num) { switch (num) { case 1: return (g_objslide1); break; case 2: return (g_objslide2); break; case 3: return (g_objslide3); break; default: throw new error("wrong num: " + num); break; } } /** * * get slide direction of current item */ function getslidedirection(objitem) { var slides = t.getslidesreference(); //validate if the item is not selected already var currentindex = slides.objcurrentslide.data("index"); var nextindex = objitem.index; var direction = "left"; if (currentindex > nextindex) direction = "right"; return (direction); } /** * get slide preloader */ function getslidepreloader(objslide) { if (!objslide) var objslide = t.getcurrentslide(); var objpreloader = objslide.children(".ug-slider-preloader"); return (objpreloader); } /** * get slide videoplay button */ function getslidevideoplaybutton(objslide) { var objbutton = objslide.children(".ug-button-videoplay"); return (objbutton); } /** * get slide item */ function getslideitem(objslide) { if (!objslide) var objslide = t.getcurrentslide(); var index = objslide.data("index"); if (index == undefined) return (null); var objitem = g_gallery.getitem(index); return (objitem); } /** * get slide number */ function getnumslide(objslide) { var numslide = objslide.data("slidenum"); return (numslide); } this.________external_general___________ = function () { }; /** * init function for avia controls * options: width / height */ this.init = function (objgallery, objoptions, optionsprefix) { initslider(objgallery, objoptions, optionsprefix); } /** * get slide image */ this.getslideimage = function (objslide) { if (!objslide) var objslide = t.getcurrentslide(); var objimage = objslide.find(".ug-item-wrapper img"); return (objimage); } /** * set slider html */ this.sethtml = function (objparent) { sethtmlslider(objparent); } /** * run the slider */ this.run = function () { runslider(); } /** * check if the inner object in place, for panning znd zooming posibility check */ this.isinnerinplace = function () { var slides = t.getslidesreference(); var poscurrent = g_functions.getelementsize(slides.objcurrentslide); var inplacex = -poscurrent.left; var objinnersize = g_functions.getelementsize(g_objinner); if (inplacex == objinnersize.left) return (true); else return (false); } /** * is animating */ this.isanimating = function () { var isanimated = g_objinner.is(":animated"); return (isanimated); } /** * check if the slide is current */ this.isslidecurrent = function (objslide) { var numslide = objslide.data("slidenum"); if (g_temp.numcurrent == numslide) return (true); return (false); } /** * * tells if the slide has item */ this.isslidehasitem = function (objslide) { var index = objslide.data("index"); if (index === undefined || index === null) return (false); return (true); } /** * get image padding object for scaling the image */ this.getobjimagepadding = function () { var objpadding = { padding_top: g_options.slider_image_padding_top, padding_bottom: g_options.slider_image_padding_bottom, padding_left: g_options.slider_image_padding_left, padding_right: g_options.slider_image_padding_right }; return (objpadding); } /** * get items reference by their order */ this.getslidesreference = function () { var obj = { objprevslide: getslidebynum(g_temp.numprev), objnextslide: getslidebynum(g_temp.numnext), objcurrentslide: getslidebynum(g_temp.numcurrent) }; return (obj); } /** * get current slide */ this.getcurrentslide = function () { var slides = t.getslidesreference(); return (slides.objcurrentslide); } /** * get index of current item */ this.getcurrentitemindex = function () { var slides = t.getslidesreference(); var currentindex = slides.objcurrentslide.data("index"); if (currentindex === null || currentindex === undefined) currentindex = -1; return (currentindex); } /** * get current slide item */ this.getcurrentitem = function () { var currentindex = t.getcurrentitemindex(); if (currentindex == -1) return (null); var objitem = g_gallery.getitem(currentindex); return (objitem); } /** * get type of some slide */ this.getslidetype = function (objslide) { if (objslide == undefined) objslide = t.getcurrentslide(); var type = objslide.data("type"); return (type); } /** * is mouse inside slide image * get mouse position from event */ this.ismouseinsideslideimage = function (event) { var objimage = t.getslideimage(); var point = g_functions.getmouseposition(event); if (point.pagex === undefined) point = g_objtouchslider.getlastmousepos(); var pointimg = g_functions.getmouseelementpoint(point, objimage); var objsize = g_functions.getelementsize(objimage); ismouseinside = g_functions.ispointinsideelement(pointimg, objsize); return (ismouseinside); } /** * check if current slide type is certain type */ this.iscurrentslidetype = function (type) { var currentslidetype = t.getslidetype(); if (currentslidetype == type) return (true); return (false); } /** * check if current slide is loading image */ this.iscurrentslideloadingimage = function () { var currentslide = t.getcurrentslide(); var isloading = currentslide.data("isloading"); if (isloading === true) return (true); return (false); } /** * change the slider to some item content */ this.setitem = function (objitem, forsetransition, role) { var slides = t.getslidesreference(); //validate if the item is not selected already var currentindex = slides.objcurrentslide.data("index"); var nextindex = objitem.index; if (nextindex == currentindex) { return (true); } var isfirstslide = (currentindex == undefined); if (isfirstslide) { setitemtoslide(slides.objcurrentslide, objitem); t.placenabouritems(); } else { var direction = "left"; //move foreward var numitems = g_gallery.getnumitems(); if (role == "next") direction = "left"; else if (role == "prev" || currentindex > nextindex) direction = "right"; else if (currentindex > nextindex) direction = "right"; dotransition(direction, objitem, forsetransition); } } /** * when the transition complete, put the next / prev items at their place */ this.placenabouritems = function () { var slides = t.getslidesreference(); var currentindex = slides.objcurrentslide.data("index"); var itemprev = g_gallery.getprevitem(currentindex); var itemnext = g_gallery.getnextitem(currentindex); //trace(itemprev); //trace(itemnext); //trace("place " + currentindex, "next: "+); setitemtoslide(slides.objnextslide, itemnext); setitemtoslide(slides.objprevslide, itemprev); positionslides(); } this.________external_api___________ = function () { }; /** * stop some slide action if active */ this.stopslideaction = function (objslide, ispause) { if (!objslide) objslide = t.getcurrentslide(); if (ispause === true) g_objvideoplayer.pause(); else g_objvideoplayer.hide(); // trace("stop action"); } /** * start some slide action if exists */ this.startslideaction = function (objslide) { // trace("start action"); if (!objslide) objslide = t.getcurrentslide(); var objitem = getslideitem(objslide); if (objitem.type == "image") return (true) if (g_options.slider_video_constantsize == true) setvideoplayerconstantsize(); setvideoplayerposition(); g_objvideoplayer.show(); switch (objitem.type) { case "youtube": g_objvideoplayer.playyoutube(objitem.videoid); break; case "vimeo": g_objvideoplayer.playvimeo(objitem.videoid); break; case "html5video": g_objvideoplayer.playhtml5video(objitem.videoogv, objitem.videowebm, objitem.videomp4, objitem.urlimage); break; case "soundcloud": g_objvideoplayer.playsoundcloud(objitem.trackid); break; case "wistia": g_objvideoplayer.playwistia(objitem.videoid); break; } } /** * get the scale mode according the state (normal, fullscreen). */ this.getscalemode = function (objslide) { if (!objslide) var objslide = t.getcurrentslide(); var slidetype = t.getslidetype(objslide); //return media scale mode if (slidetype != "image") return (g_options.slider_scale_mode_media); if (g_options.slider_scale_mode == g_options.slider_scale_mode_fullscreen) return (g_options.slider_scale_mode); if (g_gallery.isfullscreen() == true) return (g_options.slider_scale_mode_fullscreen); else return (g_options.slider_scale_mode); } /** * get slider objects */ this.getobjects = function () { var obj = { g_objslider: g_objslider, g_objinner: g_objinner, g_options: g_options, g_objzoomslider: g_objzoomslider }; return (obj); } /** * get zoom object */ this.getobjzoom = function () { return (g_objzoomslider); } /** * get slider options */ this.getoptions = function () { return (g_options); } /** * get slider element */ this.getelement = function () { return (g_objslider); } /** * get video object */ this.getvideoobject = function () { return (g_objvideoplayer); } /** * return true if current slider image fit the slider * @returns */ this.iscurrentslideimagefit = function () { var objslide = t.getcurrentslide(); var slidetype = t.getslidetype(objslide); validateslidetype("image", objslide); var objimage = t.getslideimage(objslide); //if image don't yet added to dom, return false if (objimage.length == 0) return (false); var isfit = g_functions.isimagefitparent(objimage); return (isfit); } /** * check if current image in place */ this.iscurrentimageinplace = function () { var objimage = t.getslideimage(); if (objimage.length == 0) return (false); var scalemode = t.getscalemode(); var objpadding = t.getobjimagepadding(); var objitem = getslideitem(); var objparent = objimage.parent(); var objfitsize = g_functions.getimageinsideparentdata(objparent, objitem.imagewidth, objitem.imageheight, scalemode, objpadding); var objsize = g_functions.getelementsize(objimage); var output = false; if (objfitsize.imagewidth == objsize.width) output = true; return (output); } /** * if slide is bussy in some action */ this.isslideactionactive = function () { return g_objvideoplayer.isvisible(); } /** * return if swipe action active */ this.isswiping = function () { if (!g_objtouchslider) return (false); var isactive = g_objtouchslider.istouchactive(); return (isactive); } /** * if slider preloading image (if preloader visible) */ this.ispreloading = function () { var objpreloader = getslidepreloader(); if (objpreloader.is(":visible")) return (true); return (false); } /** * set the options */ this.setoptions = function (objoptions) { //change options by prefix if (g_optionsprefix) objoptions = g_functions.convertcustomprefixoptions(objoptions, g_optionsprefix, "slider"); g_options = jquery.extend(g_options, objoptions); } /** * set the slider size * works well on resize too. */ this.setsize = function (width, height) { if (width < 0 || height < 0) return (true); var objcssslider = {}; objcssslider["width"] = width + "px"; objcssslider["height"] = height + "px"; g_objslider.css(objcssslider); //set inner: var objcssinner = {}; objcssinner["height"] = height + "px"; objcssinner["top"] = "0px"; objcssinner["left"] = "0px"; g_objinner.css(objcssinner); //set slide wrapper var objcssslide = {}; objcssslide["height"] = height + "px"; objcssslide["width"] = width + "px"; g_objslide1.css(objcssslide); g_objslide2.css(objcssslide); g_objslide3.css(objcssslide); var itemwidth = width - g_options.slider_item_padding_left - g_options.slider_item_padding_right; var itemheight = height - g_options.slider_item_padding_top - g_options.slider_item_padding_bottom; //set item wrapper var objcssitemwrapper = {}; objcssitemwrapper["width"] = itemwidth + "px"; objcssitemwrapper["height"] = itemheight + "px"; objcssitemwrapper["top"] = g_options.slider_item_padding_top + "px"; objcssitemwrapper["left"] = g_options.slider_item_padding_left + "px"; g_objslider.find(".ug-item-wrapper").css(objcssitemwrapper); //set text panel size if (g_objtextpanel) { g_objtextpanel.setsizebyparent(); } positionelements(); //set image to slides resizeslideitem(g_objslide1); resizeslideitem(g_objslide2); resizeslideitem(g_objslide3); positionslides(); //set video player size var currentslidetype = t.getslidetype(); if (currentslidetype != "image" && g_options.slider_video_constantsize == true) { setvideoplayerconstantsize(); } else { var videowidth = width - g_options.slider_video_padding_left - g_options.slider_video_padding_right; var videoheight = height - g_options.slider_video_padding_top - g_options.slider_video_padding_bottom; //set video player size g_objvideoplayer.setsize(videowidth, videoheight); } setvideoplayerposition(); } /** * refresh slide items after options change */ this.refreshslideitems = function () { if (t.isanimating() == true) return (true); resizeslideitem(g_objslide1); resizeslideitem(g_objslide2); resizeslideitem(g_objslide3); positionslides(); } /** * is mouse over the slider */ this.ismouseover = function () { return g_objslider.ismouseover(); } /** * set slider position */ this.setposition = function (left, top) { g_functions.placeelement(g_objslider, left, top); } /** * zoom in */ this.zoomin = function () { if (!g_objzoomslider) return (true); g_objzoomslider.zoomin(); } /** * zoom out */ this.zoomout = function () { if (!g_objzoomslider) return (true); g_objzoomslider.zoomout(); } /** * zoom back to original */ this.zoomback = function () { if (!g_objzoomslider) return (true); g_objzoomslider.zoomback(); } } /** -------------- textpanel class ---------------------*/ function ugtextpanel() { var t = this; var g_objpanel, g_objparent, g_objtitle, g_objdesc; var g_objbg, g_objtextwrapper, g_gallery; var g_functions = new ugfunctions(), g_optionsprefix = ""; var g_options = { textpanel_align: "bottom", //(top , bottom), textpanel align according the parent textpanel_margin: 0, //margin from the textpanel position according the textpanel_align textpanel_text_valign: "middle", //middle, top, bottom - text vertical align textpanel_padding_top: 10, //textpanel padding top textpanel_padding_bottom: 10, //textpanel padding bottom textpanel_height: null, //textpanel height. if null it will be set dynamically textpanel_padding_title_description: 5, //the space between the title and the description textpanel_padding_right: 11, //cut some space for text from right textpanel_padding_left: 11, //cut some space for text from left textpanel_fade_duration: 200, //the fade duration of textpanel appear textpanel_enable_title: true, //enable the title text textpanel_enable_description: true, //enable the description text textpanel_enable_bg: true, //enable the textpanel background textpanel_bg_color: "#000000", //textpanel background color textpanel_bg_opacity: 0.4, //textpanel background opacity textpanel_title_color: null, //textpanel title color. if null - take from css textpanel_title_font_family: null, //textpanel title font family. if null - take from css textpanel_title_text_align: null, //textpanel title text align. if null - take from css textpanel_title_font_size: null, //textpanel title font size. if null - take from css textpanel_title_bold: null, //textpanel title bold. if null - take from css textpanel_css_title: {}, //textpanel additional css of the title textpanel_desc_color: null, //textpanel description font family. if null - take from css textpanel_desc_font_family: null, //textpanel description font family. if null - take from css textpanel_desc_text_align: null, //textpanel description text align. if null - take from css textpanel_desc_font_size: null, //textpanel description font size. if null - take from css textpanel_desc_bold: null, //textpanel description bold. if null - take from css textpanel_css_description: {}, //textpanel additional css of the description textpanel_desc_style_as_title: false, //set that the description style will be as title textpanel_bg_css: {} //textpanel background css }; var g_temp = { isfirsttime: true, setinternalheight: true, //flag if set internal height or not lasttitlebottom: 0, lastdescheight: 0 }; /** * position elements from top */ function positionelementstop(animateheight, starty) { if (!starty) var starty = g_options.textpanel_padding_top; //place title var maxy = starty; //place title if (g_objtitle) { var titley = maxy; g_functions.placeelement(g_objtitle, 0, titley); var istitlevisible = g_objtitle.is(":visible"); if (istitlevisible == true) { var objtitlesize = g_functions.getelementsize(g_objtitle); var maxy = objtitlesize.bottom; if (maxy > 0) g_temp.lasttitlebottom = maxy; } else { var maxy = 20; //get last or assumed maxy if (g_temp.lasttitlebottom > 0) maxy = g_temp.lasttitlebottom; } } //place description var textdesc = ""; if (g_objdesc) textdesc = jquery.trim(g_objdesc.text()); if (textdesc != "") { var descy = maxy; if (g_objtitle) descy += g_options.textpanel_padding_title_description; g_functions.placeelement(g_objdesc, 0, descy); var isvisible = jquery(g_objdesc).is(":visible"); if (isvisible == true) { var objdescsize = g_functions.getelementsize(g_objdesc); maxy = objdescsize.bottom; if (objdescsize.height > 0) g_temp.lastdescheight = objdescsize.height; } else { var descheight = 16; //take from last saved if (g_temp.lastdescheight > 0) descheight = g_temp.lastdescheight; maxy = descy + descheight; } } //change panel height if (!g_options.textpanel_height && g_temp.setinternalheight == true) { var panelheight = maxy + g_options.textpanel_padding_bottom; setheight(panelheight, animateheight); } } /** * get total text and description height */ function gettotaltextheight() { var totalheight = 0; if (g_objtitle) totalheight += g_objtitle.outerheight(); if (g_objdesc) { var textdesc = ""; if (g_objdesc) textdesc = jquery.trim(g_objdesc.text()); if (textdesc != "") { if (g_objtitle) totalheight += g_options.textpanel_padding_title_description; totalheight += g_objdesc.outerheight(); } } return (totalheight); } /** * position elements to center */ function positionelementsmiddle() { var totaltextheight = gettotaltextheight(); var starty = (g_objtextwrapper.height() - totaltextheight) / 2; positionelementstop(false, starty); } /** * position elements to bottom */ function positionelementbottom() { var totaltextheight = gettotaltextheight(); var starty = g_objtextwrapper.height() - totaltextheight - g_options.textpanel_padding_bottom; positionelementstop(false, starty); } /** * position elements inside the panel */ this.positionelements = function (animateheight) { //if(g_objpanel.is(":visible") == false) //trace("the text panel is hidden. can't position elements") //if height not set, position only top if (!g_options.textpanel_height || g_options.textpanel_text_valign == "top") { positionelementstop(animateheight); return (false); } switch (g_options.textpanel_text_valign) { default: case "top": positionelementstop(false); //no animation in this case break; case "bottom": positionelementbottom(); break; case "center": case "middle": positionelementsmiddle(); break; } } /** * set new panel height */ function setheight(height, animateheight) { if (!animateheight) var animateheight = false; if (animateheight == true) { if (g_objbg) { //avoid background jumps var currentheight = g_objbg.height(); if (height > currentheight) g_objbg.height(height); } var objcss = { height: height + "px" }; g_objpanel.add(g_objtextwrapper).animate(objcss, g_options.textpanel_fade_duration); } else { if (g_objbg) g_objbg.height(height); g_objpanel.add(g_objtextwrapper).height(height); } } /** * init the panel */ this.init = function (objgallery, customoptions, optionsprefix) { g_gallery = objgallery; //change options by prefix if (optionsprefix) { g_optionsprefix = optionsprefix; customoptions = g_functions.convertcustomprefixoptions(customoptions, g_optionsprefix, "textpanel"); } if (customoptions) g_options = jquery.extend(g_options, customoptions); //validation: if (g_options.textpanel_enable_title == false && g_options.textpanel_enable_description == false) throw new error("textpanel error: the title or description must be enabled"); if (g_options.textpanel_height && g_options.textpanel_height < 0) g_options.textpanel_height = null; //copy desc style from title if (g_options.textpanel_desc_style_as_title == true) { if (!g_options.textpanel_desc_color) g_options.textpanel_desc_color = g_options.textpanel_title_color; if (!g_options.textpanel_desc_bold) g_options.textpanel_desc_bold = g_options.textpanel_title_bold; if (!g_options.textpanel_desc_font_family) g_options.textpanel_desc_font_family = g_options.textpanel_title_font_family; if (!g_options.textpanel_desc_font_size) g_options.textpanel_desc_font_size = g_options.textpanel_title_font_size; if (!g_options.textpanel_desc_text_align) g_options.textpanel_desc_text_align = g_options.textpanel_title_text_align; } } /** * append the bullets html to some parent */ this.appendhtml = function (objparent, addclass) { g_objparent = objparent; if (addclass) { addclass = " " + addclass; } else addclass = ""; var html = "
"; if (g_options.textpanel_enable_bg == true) html += "
"; html += "
"; if (g_options.textpanel_enable_title == true) html += "
"; if (g_options.textpanel_enable_description == true) html += "
"; html += "
"; objparent.append(html); g_objpanel = objparent.children(".ug-textpanel"); g_objtextwrapper = g_objpanel.children(".ug-textpanel-textwrapper"); setcss(); } /** * set panel css according the options */ function setcss() { //set background css if (g_options.textpanel_enable_bg == true) { g_objbg = g_objpanel.children(".ug-textpanel-bg"); g_objbg.fadeto(0, g_options.textpanel_bg_opacity); var objcssbg = { "background-color": g_options.textpanel_bg_color }; objcssbg = jquery.extend(objcssbg, g_options.textpanel_bg_css); g_objbg.css(objcssbg); } //set title css from options if (g_options.textpanel_enable_title == true) { g_objtitle = g_objtextwrapper.children(".ug-textpanel-title"); var objcsstitle = {}; if (g_options.textpanel_title_color !== null) objcsstitle["color"] = g_options.textpanel_title_color; if (g_options.textpanel_title_font_family !== null) objcsstitle["font-family"] = g_options.textpanel_title_font_family; if (g_options.textpanel_title_text_align !== null) objcsstitle["text-align"] = g_options.textpanel_title_text_align; if (g_options.textpanel_title_font_size !== null) objcsstitle["font-size"] = g_options.textpanel_title_font_size + "px"; if (g_options.textpanel_title_bold !== null) { if (g_options.textpanel_title_bold === true) objcsstitle["font-weight"] = "bold"; else objcsstitle["font-weight"] = "normal"; } //set additional css if (g_options.textpanel_css_title) objcsstitle = jquery.extend(objcsstitle, g_options.textpanel_css_title); g_objtitle.css(objcsstitle); } //set description css if (g_options.textpanel_enable_description == true) { g_objdesc = g_objtextwrapper.children(".ug-textpanel-description"); var objcssdesc = {}; if (g_options.textpanel_desc_color !== null) objcssdesc["color"] = g_options.textpanel_desc_color; if (g_options.textpanel_desc_font_family !== null) objcssdesc["font-family"] = g_options.textpanel_desc_font_family; if (g_options.textpanel_desc_text_align !== null) objcssdesc["text-align"] = g_options.textpanel_desc_text_align; if (g_options.textpanel_desc_font_size !== null) objcssdesc["font-size"] = g_options.textpanel_desc_font_size + "px"; if (g_options.textpanel_desc_bold !== null) { if (g_options.textpanel_desc_bold === true) objcssdesc["font-weight"] = "bold"; else objcssdesc["font-weight"] = "normal"; } //set additional css if (g_options.textpanel_css_title) objcssdesc = jquery.extend(objcssdesc, g_options.textpanel_css_description); g_objdesc.css(objcssdesc); } } /** * on item change, set the text */ function onitemchange() { var objitem = g_gallery.getselecteditem(); t.settext(objitem.title, objitem.description); } /** * init events */ function initevents() { //on item change, set the text in the slider. jquery(g_gallery).on(g_gallery.events.item_change, onitemchange); } /** * destroy the events */ this.destroy = function () { jquery(g_gallery).off(g_gallery.events.item_change); } /** * run the text panel */ this.run = function () { t.setsizebyparent(); initevents(); } /** * set panel size */ this.setpanelsize = function (panelwidth, panelheight) { g_temp.setinternalheight = true; if (!panelheight) var panelheight = 80; //some default number else g_temp.setinternalheight = false; if (g_options.textpanel_height) panelheight = g_options.textpanel_height; g_objpanel.width(panelwidth); g_objpanel.height(panelheight); //set background size if (g_objbg) { g_objbg.width(panelwidth); g_objbg.height(panelheight); } //set textwrapper size and position var textwrapperwidth = panelwidth - g_options.textpanel_padding_left - g_options.textpanel_padding_right; var textwrapperleft = g_options.textpanel_padding_left; g_functions.setelementsizeandposition(g_objtextwrapper, textwrapperleft, 0, textwrapperwidth, panelheight); //set text width if (g_objtitle) g_objtitle.width(textwrapperwidth); //set description height if (g_objdesc) g_objdesc.width(textwrapperwidth); if (g_temp.isfirsttime == false) t.positionelements(false); } /** * set size by parent. the height is set to default meanwhile */ this.setsizebyparent = function () { var objsize = g_functions.getelementsize(g_objparent); t.setpanelsize(objsize.width); } /** * set plain sext without other manipulations */ this.settextplain = function (title, description) { if (g_objtitle) g_objtitle.html(title); if (g_objdesc) g_objdesc.html(description); } /** * set html text */ this.settext = function (title, description) { if (g_temp.isfirsttime == true) { t.settextplain(title, description); g_temp.isfirsttime = false; t.positionelements(false); } else { //width animation g_objtextwrapper.stop().fadeto(g_options.textpanel_fade_duration, 0, function () { t.settextplain(title, description); t.positionelements(true); jquery(this).fadeto(g_options.textpanel_fade_duration, 1); }); } } /** * position the panel */ this.positionpanel = function (customtop, customleft) { var objcss = {}; if (customtop !== undefined && customtop !== null) { objcss.top = customtop; objcss.bottom = "auto"; } else { switch (g_options.textpanel_align) { case "top": objcss.top = g_options.textpanel_margin + "px"; break; case "bottom": objcss.top = "auto"; objcss.bottom = g_options.textpanel_margin + "px"; break; case "middle": objcss.top = g_functions.getelementrelativepos(g_objpanel, "middle", g_options.textpanel_margin); break; } } if (customleft !== undefined && customleft !== null) objcss.left = customleft; g_objpanel.css(objcss); } /** * set custom options */ this.setoptions = function (objoptions) { if (g_optionsprefix) objoptions = g_functions.convertcustomprefixoptions(objoptions, g_optionsprefix, "textpanel"); g_options = jquery.extend(g_options, objoptions); } /** * get html element */ this.getelement = function () { return (g_objpanel); } /** * get element size */ this.getsize = function () { var objsize = g_functions.getelementsize(g_objpanel); return (objsize); } /** * refresh panel size, position and contents */ this.refresh = function (toshow, noposition, panelwidth, panelheight) { setcss(); if (!panelwidth) t.setsizebyparent(); else t.setpanelsize(panelwidth, panelheight); t.positionelements(false); if (noposition !== true) t.positionpanel(); if (toshow === true) t.show(); } /** * hide the panel */ this.hide = function () { g_objpanel.hide(); } /** * show the panel */ this.show = function () { g_objpanel.show(); } /** * get options */ this.getoptions = function () { return (g_options); } /** * get text panel option */ this.getoption = function (optionname) { if (g_options.hasownproperty(optionname) == false) return (null); return (g_options[optionname]); } } /** -------------- ugzoombuttonspanel class ---------------------*/ /** * zoom buttons panel class */ function ugzoombuttonspanel() { var t = this; var g_objpanel, g_objparent, g_objbuttonplus, g_objbuttonminus, g_objbuttonreturn; var g_slider = new ugslider; var g_functions = new ugfunctions(); var g_options = { slider_zoompanel_skin: "" //skin of the zoom panel, if empty inherit from gallery skin }; var g_temp = { }; /** * init the panel */ this.init = function (objslider, customoptions) { g_slider = objslider; if (customoptions) g_options = jquery.extend(g_options, customoptions); } /** * append the bullets html to some parent */ this.appendhtml = function (objparent) { g_objparent = objparent; var html = "
"; html += "
"; html += "
"; html += "
"; html += "
"; objparent.append(html); g_objpanel = objparent.children(".ug-zoompanel"); g_objbuttonplus = g_objpanel.children(".ug-zoompanel-plus"); g_objbuttonminus = g_objpanel.children(".ug-zoompanel-minus"); g_objbuttonreturn = g_objpanel.children(".ug-zoompanel-return"); } /** * set objects - use it instead insert html */ this.setobjects = function (objbuttonplus, objbuttonminus, objbuttonreturn) { g_objbuttonplus = objbuttonplus; g_objbuttonminus = objbuttonminus; g_objbuttonreturn = objbuttonreturn; if (g_objbuttonminus) g_objbuttonminus.addclass("ug-zoompanel-button-disabled"); if (g_objbuttonreturn) g_objbuttonreturn.addclass("ug-zoompanel-button-disabled"); } /** * get buttons element */ this.getelement = function () { return (g_objpanel); } /** * check if the button disabled */ function isbuttondisabled(objbutton) { if (!objbutton) return (true); if (objbutton.hasclass("ug-zoompanel-button-disabled")) return (true); return (false); } /** * disable some button */ function disablebutton(objbutton) { if (objbutton) objbutton.addclass("ug-zoompanel-button-disabled"); } /** * enable some button */ function enablebutton(objbutton) { if (objbutton) objbutton.removeclass("ug-zoompanel-button-disabled"); } /** * on zoom change */ function onzoomchange() { //skip not image types if (g_slider.iscurrentslidetype("image") == false) return (true); var isfit = g_slider.iscurrentslideimagefit(); if (isfit == true) { //if fit, disable buttons if (isbuttondisabled(g_objbuttonminus) == false) { disablebutton(g_objbuttonminus); disablebutton(g_objbuttonreturn); } } else { //if not fit, enable minus buttons if (isbuttondisabled(g_objbuttonminus) == true) { enablebutton(g_objbuttonminus); enablebutton(g_objbuttonreturn); } } } /** * init zoompanel events */ t.initevents = function () { //add hover class on buttons g_functions.addclassonhover(g_objbuttonplus, "ug-button-hover"); g_functions.addclassonhover(g_objbuttonminus, "ug-button-hover"); g_functions.addclassonhover(g_objbuttonreturn, "ug-button-hover"); //set buttons click events g_functions.setbuttononclick(g_objbuttonplus, function () { if (isbuttondisabled(g_objbuttonplus) == true) return (true); g_slider.zoomin(); }); g_functions.setbuttononclick(g_objbuttonminus, function () { if (isbuttondisabled(g_objbuttonminus) == true) return (true); g_slider.zoomout(); }); g_functions.setbuttononclick(g_objbuttonreturn, function () { if (isbuttondisabled(g_objbuttonreturn) == true) return (true); g_slider.zoomback(); }); //on zoom change event jquery(g_slider).on(g_slider.events.zoom_change, onzoomchange); jquery(g_slider).on(g_slider.events.item_changed, onzoomchange); } } /** -------------- ugbullets class ---------------------*/ function ugbullets() { var t = this, g_numbullets = 0, g_gallery = new unitegallerymain(); var g_objbullets, g_objparent, g_activeindex = -1, g_bulletwidth; var g_functions = new ugfunctions(); var g_temp = { isinited: false }; var g_options = { bullets_skin: "", //bullets_skin: "" //skin of the bullets, if empty inherit from gallery skin bullets_addclass: "", //bullets object class addition bullets_space_between: -1 //set the space between bullets. if -1 then will be set default space from the skins } /** * the events */ this.events = { bullet_click: "bullet_click" }; /** * init the bullets */ this.init = function (gallery, customoptions, numbullets) { g_gallery = gallery; if (numbullets) g_numbullets = numbullets; else g_numbullets = g_gallery.getnumitems(); g_temp.isinited = true; g_options = jquery.extend(g_options, customoptions); if (g_options.bullets_skin == "") g_options.bullets_skin = g_options.gallery_skin; } /** * add bullets to the html */ function sethtmlbullets() { var html = ""; var addhtml = ""; if (g_options.bullets_space_between != -1) addhtml = " style='margin-left:" + g_options.bullets_space_between + "px'"; for (var i = 0; i < g_numbullets; i++) { if (i == 0) html += "
"; else html += "
"; } g_objbullets.html(html); //set bullet width value if (!g_bulletwidth) { var objbullet = g_objbullets.find(".ug-bullet:first-child"); if (objbullet.length) g_bulletwidth = objbullet.width(); } } /** * get total bullets width */ this.getbulletswidth = function () { if (g_numbullets == 0) return (0); if (!g_bulletwidth) return (0); var totalwidth = g_numbullets * g_bulletwidth + (g_numbullets - 1) * g_options.bullets_space_between; return (totalwidth); } /** * append the bullets html to some parent */ this.appendhtml = function (objparent) { g_objparent = objparent; validateinited(); var addclass = ""; if (g_options.bullets_addclass != "") addclass = " " + g_options.bullets_addclass; var html = "
"; html += "
"; g_objbullets = jquery(html); objparent.append(g_objbullets); sethtmlbullets(); initevents(); } /** * update number of bullets */ this.updatenumbullets = function (numbullets) { g_numbullets = numbullets; sethtmlbullets(); initevents(); } /** * * on bullet click */ function onbulletclick(objbullet) { //filter not active only if (t.isactive(objbullet) == true) return (true); var index = objbullet.index(); jquery(t).trigger(t.events.bullet_click, index); } /** * init the bullets events * trigger bullet click event */ function initevents() { var objbullets = g_objbullets.children(".ug-bullet"); g_functions.setbuttononclick(objbullets, onbulletclick); objbullets.on("mousedown mouseup", function (event) { //event.preventdefault(); return (false); }); } /** * get the bullets element */ this.getelement = function () { return g_objbullets; } /** * set some item active */ this.setactive = function (index) { validateinited(); validateindex(index); var children = g_objbullets.children(".ug-bullet"); children.removeclass("ug-bullet-active"); var bullet = jquery(children[index]); bullet.addclass("ug-bullet-active"); g_activeindex = index; } /** * check if the bullet is active */ this.isactive = function (index) { validateindex(index); if (typeof index != "number") var objbullet = index; else { var objbullet = g_objbullets.children(".ug-bullet")[index]; } if (objbullet.hasclass("ug-bullet-active")) return (true); return (false); } /** * get bullets number */ this.getnumbullets = function () { return (g_numbullets); } /** * validate bullets index */ function validateindex(index) { if (index < 0 || index >= g_numbullets) throw new error("wrong bullet index: " + index); } /** * validate that the bullets are inited */ function validateinited() { if (g_temp.isinited == true) return (true); throw new error("the bullets are not inited!"); } } /** -------------- ugprogressbar class ---------------------*/ function ugprogressbar() { var t = this, g_isinited = false; var g_percent = 0, g_objbar, g_objinner, g_functions = new ugfunctions(); var g_options = { slider_progressbar_color: "#ffffff", //progress bar color slider_progressbar_opacity: 0.6, //progress bar opacity slider_progressbar_line_width: 5 //progress bar line width } /** * put progress pie to some wrapper */ this.put = function (g_objwrapper, useroptions) { if (useroptions) g_options = jquery.extend(g_options, useroptions); g_objwrapper.append("
"); g_objbar = g_objwrapper.children(".ug-progress-bar"); g_objinner = g_objbar.children(".ug-progress-bar-inner"); //init the objects g_objinner.css("background-color", g_options.slider_progressbar_color); g_objbar.height(g_options.slider_progressbar_line_width); g_objinner.height(g_options.slider_progressbar_line_width); g_objinner.width("0%"); //set opacity old way (because ie bug) var opacity = g_options.slider_progressbar_opacity; var objinnerhtml = g_objinner[0]; objinnerhtml.style.opacity = opacity; objinnerhtml.style.filter = 'alpha(opacity=' + opacity * 100 + ')'; } /** * put the pie hidden */ this.puthidden = function (g_objwrapper, useroptions) { t.put(g_objwrapper, useroptions); g_objbar.hide(); } /** * get the bar object */ this.getelement = function () { return (g_objbar); } /** * set progress bar size */ this.setsize = function (width) { g_objbar.width(width); g_objinner.width(width); t.draw(); } /** * set position */ this.setposition = function (left, top, offsetleft, offsettop) { g_functions.placeelement(g_objbar, left, top, offsetleft, offsettop); } /** * draw the progress bar */ this.draw = function () { var innerwidth = g_percent * 100; g_objinner.width(innerwidth + "%"); } /** * set and draw the progress */ this.setprogress = function (percent) { g_percent = g_functions.normalizepercent(percent); //debugline(g_percent, true); t.draw(); } /** * get type string */ this.gettype = function () { return ("bar"); } } /** -------------- ugprogresspie class ---------------------*/ function ugprogresspie() { var t = this, g_isinited = false; var g_percent, g_objpie, g_functions = new ugfunctions(); var g_options = { slider_progresspie_type_fill: false, //false is stroke, true is fill - the progress pie type, stroke of fill slider_progresspie_color1: "#b5b5b5", //the first color of the progress pie slider_progresspie_color2: "#e5e5e5", //progress pie second color slider_progresspie_stroke_width: 6, //progress pie stroke width slider_progresspie_width: 30, //progess pie width slider_progresspie_height: 30 //progress pie height } /** * put progress pie to some wrapper */ this.put = function (g_objwrapper, useroptions) { if (useroptions) g_options = jquery.extend(g_options, useroptions); g_objwrapper.append(""); g_objpie = g_objwrapper.children(".ug-canvas-pie"); } /** * put the pie hidden */ this.puthidden = function (g_objwrapper, useroptions) { t.put(g_objwrapper, useroptions); draw(0.1); g_objpie.hide(); } /** * get jquery object */ this.getelement = function () { return (g_objpie); } /** * set position */ this.setposition = function (left, top) { g_functions.placeelement(g_objpie, left, top); } /** * get the height and width of the object */ this.getsize = function () { var obj = { width: g_options.slider_progresspie_width, height: g_options.slider_progresspie_height }; return (obj); } /** * draw the progress pie */ function draw(percent) { if (!percent) var percent = 0; var radius = math.min(g_options.slider_progresspie_width, g_options.slider_progresspie_height) / 2; var ctx = g_objpie[0].getcontext('2d'); //init the context if (g_isinited == false) { g_isinited = true; ctx.rotate(math.pi * (3 / 2)); ctx.translate(-2 * radius, 0); } ctx.clearrect(0, 0, g_options.slider_progresspie_width, g_options.slider_progresspie_height); var centerx = g_options.slider_progresspie_width / 2; var centery = g_options.slider_progresspie_height / 2; //draw main arc var startpoint = 0; var endpoint = percent * math.pi * 2; if (g_options.slider_progresspie_type_fill == true) { //fill ctx.beginpath(); ctx.moveto(centerx, centery); ctx.arc(centerx, centery, radius, startpoint, endpoint); ctx.lineto(centerx, centery); ctx.fillstyle = g_options.slider_progresspie_color1; ctx.fill(); ctx.closepath(); } else { //stroke ctx.globalcompositeoperation = "source-over"; ctx.beginpath(); ctx.moveto(centerx, centery); ctx.arc(centerx, centery, radius, startpoint, endpoint); ctx.lineto(centerx, centery); ctx.fillstyle = g_options.slider_progresspie_color1; ctx.fill(); ctx.closepath(); ctx.globalcompositeoperation = "destination-out"; var radius2 = radius - g_options.slider_progresspie_stroke_width; ctx.beginpath(); ctx.moveto(centerx, centery); ctx.arc(centerx, centery, radius2, startpoint, endpoint); ctx.lineto(centerx, centery); ctx.fillstyle = g_options.slider_progresspie_color1; ctx.fill(); ctx.closepath(); } //draw rest arc (only on fill type): if (g_options.slider_progresspie_type_fill == true) { startpoint = endpoint; endpoint = math.pi * 2; ctx.beginpath(); ctx.arc(centerx, centery, radius, startpoint, endpoint); ctx.lineto(centerx, centery); ctx.fillstyle = g_options.slider_progresspie_color2; ctx.fill(); ctx.closepath(); } } /** * set progress (0-1) */ this.setprogress = function (percent) { percent = g_functions.normalizepercent(percent); g_percent = percent; draw(percent); } /** * get type string */ this.gettype = function () { return ("pie"); } } /**f * touch thumbs control class * addon to strip gallery */ function ugtouchslidercontrol() { var g_objslider, g_objinner, g_parent = new ugslider(); var g_objparent, g_options, t = this; var g_functions = new ugfunctions(); var g_options = { slider_transition_continuedrag_speed: 250, //the duration of continue dragging after drag end slider_transition_continuedrag_easing: "linear", //easing function of continue dragging animation slider_transition_return_speed: 300, //the duration of the "return to place" animation slider_transition_return_easing: "easeinoutquad" //easing function of the "return to place" animation }; var g_temp = { touch_active: false, startmousex: 0, startmousey: 0, lastmousex: 0, lastmousey: 0, startposx: 0, starttime: 0, isinitdatavalid: false, slides: null, lastnumtouches: 0, isdragging: false, storedeventid: "touchslider", videostartx: 0, isdragvideo: false, videoobject: null }; /** * get diff inner object position from current item pos */ function getdiffposfromcurrentitem(slides) { if (!slides) var slides = g_parent.getslidesreference(); var poscurrent = g_functions.getelementsize(slides.objcurrentslide); var inplacex = -poscurrent.left; var objinnersize = g_functions.getelementsize(g_objinner); var diffpos = inplacex - objinnersize.left; return (diffpos); } /** * check if the movement that was held is valid for slide change */ function ismovementvalidforchange() { var slides = g_parent.getslidesreference(); //check position, if more then half, move var diffpos = getdiffposfromcurrentitem(slides); var breaksize = math.round(slides.objcurrentslide.width() * 3 / 8); if (math.abs(diffpos) >= breaksize) return (true); //check gesture, if vertical mostly then not move var diffx = math.abs(g_temp.lastmousex - g_temp.startmousex); var diffy = math.abs(g_temp.lastmousey - g_temp.startmousey); //debugline("diffx: " + diffx, true, true); if (diffx < 20) return (false); //if(diffy >= diffx) //return(false); //check time. short time always move var endtime = jquery.now(); var difftime = endtime - g_temp.starttime; //debugline("time: " + difftime, true); if (difftime < 500) return (true); return (false); } /** * check tab event occured * invokes on touchend event on the slider object */ this.istapeventoccured = function (event) { //validate one touch var arrtouches = g_functions.getarrtouches(event); var numtouches = arrtouches.length; if (numtouches != 0 || g_temp.lastnumtouches != 0) { g_temp.lastnumtouches = numtouches; return (false); } g_temp.lastnumtouches = numtouches; var slides = g_parent.getslidesreference(); //check position, if more then half, move var diffpos = getdiffposfromcurrentitem(slides); //check gesture, if vertical mostly then not move var diffx = math.abs(g_temp.lastmousex - g_temp.startmousex); var diffy = math.abs(g_temp.lastmousey - g_temp.startmousey); //check by time var endtime = jquery.now(); var difftime = endtime - g_temp.starttime; //combine move and time if (diffx < 20 && diffy < 50 && difftime < 500) return (true); return (false); } /** * return the item to place */ function returntoplace(slides) { if (g_parent.isinnerinplace() == true) return (false); //trigger before return event g_objparent.trigger(g_parent.events.before_return); if (!slides) var slides = g_parent.getslidesreference(); var poscurrent = g_functions.getelementsize(slides.objcurrentslide); var destx = -poscurrent.left; //animate objects g_objinner.animate({ left: destx + "px" }, { duration: g_options.slider_transition_return_speed, easing: g_options.slider_transition_continuedrag_easing, queue: false, progress: function (animation, number, remainingms) { //check drag video if (g_temp.isdragvideo == true) { var objsize = g_functions.getelementsize(g_objinner); var innerx = objsize.left; var posdiff = innerx - destx; var videoposx = g_temp.videostartx + posdiff; g_temp.videoobject.css("left", videoposx); } }, complete: function () { g_objparent.trigger(g_parent.events.after_return); } }); } /** * * change the item to given direction */ function changeitem(direction) { g_parent.getvideoobject().hide(); g_parent.switchslidenums(direction); g_parent.placenabouritems(); } /** * continue the dragging by changing the slides to the right place. */ function continueslidedragchange() { //get data var slides = g_parent.getslidesreference(); var diffpos = getdiffposfromcurrentitem(slides); if (diffpos == 0) return (false); var direction = (diffpos > 0) ? "left" : "right"; var isreturn = false; switch (direction) { case "right": //change to prev item if (g_parent.isslidehasitem(slides.objprevslide)) { var posprev = g_functions.getelementsize(slides.objprevslide); var destx = -posprev.left; } else //return current item isreturn = true; break; case "left": //change to next item if (g_parent.isslidehasitem(slides.objnextslide)) { var posnext = g_functions.getelementsize(slides.objnextslide); var destx = -posnext.left; } else isreturn = true; break; } if (isreturn == true) { returntoplace(slides); } else { //animate objects g_objinner.stop().animate({ left: destx + "px" }, { duration: g_options.slider_transition_continuedrag_speed, easing: g_options.slider_transition_continuedrag_easing, queue: false, progress: function () { //check drag video if (g_temp.isdragvideo == true) { var objsize = g_functions.getelementsize(g_objinner); var innerx = objsize.left; var posdiff = innerx - g_temp.startposx; var videoposx = g_temp.videostartx + posdiff; g_temp.videoobject.css("left", videoposx); } }, always: function () { changeitem(direction); g_objparent.trigger(g_parent.events.after_drag_change); } }); } } /** * handle slider drag on mouse drag */ function handlesliderdrag(event) { var diff = g_temp.lastmousex - g_temp.startmousex; if (diff == 0) return (true); var direction = (diff < 0) ? "left" : "right"; var objzoomslider = g_parent.getobjzoom(); //don't drag if the zoom panning enabled //store init position after image zoom pan end if (objzoomslider) { var ispanenabled = objzoomslider.ispanenabled(event, direction); if (ispanenabled == true) { g_temp.isinitdatavalid = false; return (true); } else { if (g_temp.isinitdatavalid == false) { storeinittouchdata(event); return (true); } } } //set inner div position var currentposx = g_temp.startposx + diff; //check out of borders and slow down the motion: if (diff > 0 && currentposx > 0) currentposx = currentposx / 3; else if (diff < 0) { var innerend = currentposx + g_objinner.width(); var sliderwidth = g_objslider.width(); if (innerend < sliderwidth) { currentposx = g_temp.startposx + diff / 3; } } if (g_temp.isdragging == false) { g_temp.isdragging = true; g_objparent.trigger(g_parent.events.start_drag); } g_objinner.css("left", currentposx + "px"); //drag video if (g_temp.isdragvideo == true) { var posdiff = currentposx - g_temp.startposx; var videoposx = g_temp.videostartx + posdiff; g_temp.videoobject.css("left", videoposx); } } /** * store init touch position */ function storeinittouchdata(event) { var mousepos = g_functions.getmouseposition(event); g_temp.startmousex = mousepos.pagex; //debugline("startx:" + g_temp.startmousex, true, true); g_temp.startmousey = mousepos.pagey; g_temp.lastmousex = g_temp.startmousex; g_temp.lastmousey = g_temp.startmousey; g_temp.starttime = jquery.now(); var arrtouches = g_functions.getarrtouches(event); g_temp.startarrtouches = g_functions.getarrtouchpositions(arrtouches); var objpos = g_functions.getelementsize(g_objinner); g_temp.startposx = objpos.left; g_temp.isinitdatavalid = true; //check if video object need to be dragged g_temp.isdragvideo = false; g_functions.storeeventdata(event, g_temp.storedeventid); } /** * disable touch active */ function disabletouchactive(who) { g_temp.touch_active = false; //debugline("disable: " + who, true, true); } /** * enable the touch active */ function enabletouchactive(who, event) { g_temp.touch_active = true; storeinittouchdata(event); //debugline("enable: " + who, true, true); } /** * on touch slide start * */ function ontouchstart(event) { event.preventdefault(); g_temp.isdragging = false; //debugline("touchstart", true, true); //check if the slides are changing from another event. if (g_parent.isanimating() == true) { g_objinner.stop(true, true); } //check num touches var arrtouches = g_functions.getarrtouches(event); if (arrtouches.length > 1) { if (g_temp.touch_active == true) { disabletouchactive("1"); } return (true); } if (g_temp.touch_active == true) { return (true); } enabletouchactive("1", event); } /** * * on touch move event */ function ontouchmove(event) { if (g_temp.touch_active == false) return (true); //detect moving without button press if (event.buttons == 0) { disabletouchactive("2"); continueslidedragchange(); return (true); } g_functions.updatestoredeventdata(event, g_temp.storedeventid); event.preventdefault(); var mousepos = g_functions.getmouseposition(event); g_temp.lastmousex = mousepos.pagex; g_temp.lastmousey = mousepos.pagey; //debugline("lastx:" + g_temp.lastmousex, true, true); var scrolldir = null; if (g_options.slider_vertical_scroll_ondrag == true) scrolldir = g_functions.handlescrolltop(g_temp.storedeventid); if (scrolldir !== "vert") handlesliderdrag(event); } /** * on touch end event */ function ontouchend(event) { //debugline("touchend", true, true); var arrtouches = g_functions.getarrtouches(event); var numtouches = arrtouches.length; var isparentinplace = g_parent.isinnerinplace(); if (isparentinplace == true && g_temp.touch_active == false && numtouches == 0) { return (true); } if (numtouches == 0 && g_temp.touch_active == true) { disabletouchactive("3"); var isvalid = false; var wasverticalscroll = g_functions.wasverticalscroll(g_temp.storedeventid); if (wasverticalscroll == false) isvalid = ismovementvalidforchange(); if (isvalid == true) continueslidedragchange(); //change the slide else returntoplace(); //return the inner object to place (if not in place) } else { if (numtouches == 1 && g_temp.touch_active == false) { enabletouchactive("2", event); } } } /** * init touch events */ function initevents() { //slider mouse down - drag start g_objslider.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); } /** * init function for avia controls */ this.init = function (objslider, customoptions) { g_parent = objslider; g_objparent = jquery(g_parent); g_objects = objslider.getobjects(); g_objslider = g_objects.g_objslider; g_objinner = g_objects.g_objinner; g_options = jquery.extend(g_options, customoptions); initevents(); } /** * get last mouse position */ this.getlastmousepos = function () { var obj = { pagex: g_temp.lastmousex, pagey: g_temp.lastmousey }; return (obj); } /** * is touch active */ this.istouchactive = function () { return (g_temp.touch_active); } } /** * touch thumbs control class * addon to strip gallery */ function ugzoomslidercontrol() { var g_objslider, g_objinner, g_parent = new ugslider(), g_objparent; var g_functions = new ugfunctions(); var t = this; var g_options = { slider_zoom_step: 1.2, //the step of zooming with mouse wheel or zoom button slider_zoom_max_ratio: 6, //max zoom ratio slider_zoom_return_pan_duration: 400, //the return from pan animation duration slider_zoom_return_pan_easing: "easeoutcubic" //the return from pan wasing function }; var g_temp = { ispanactive: false, startmousex: 0, startmousey: 0, lastmousex: 0, lastmousey: 0, startimagex: 0, startimagey: 0, panxactive: false, panyactive: false, objimage: null, objimagesize: null, objparent: null, objparentsize: null, objslide: null, storeimagelasttime: 0, iszoomactive: false, startdistance: 0, startmiddlepoint: null, imageorientpoint: null, objfitimagesize: null, iszoomedonce: false }; /** * init the object */ function initobject(objslider, customoptions) { g_parent = objslider; g_objparent = jquery(g_parent); g_objects = objslider.getobjects(); g_objslider = g_objects.g_objslider; g_objinner = g_objects.g_objinner; g_options = jquery.extend(g_options, customoptions); initevents(); } /** * get fit image to slider scale mode * the fill become fit */ function getfitscalemode() { var scalemode = g_parent.getscalemode(); if (scalemode != "down") scalemode = "fit"; return (scalemode); } /** * cache current slide and image */ function storecurrentimage() { //prevent continious image storring var currenttime = jquery.now(); var diff = currenttime - g_temp.storeimagelasttime; if (diff < 20) return (false); var slides = g_parent.getslidesreference(); g_temp.objslide = slides.objcurrentslide; g_temp.objimage = slides.objcurrentslide.find("img"); if (g_temp.objimage.length == 0) return (false); g_temp.objimagesize = g_functions.getelementsize(g_temp.objimage); g_temp.objparent = g_temp.objimage.parent(); g_temp.objparentsize = g_functions.getelementsize(g_temp.objparent); var scalemode = getfitscalemode(); objpadding = g_parent.getobjimagepadding(); g_temp.objfitimagesize = g_functions.getimageinsideparentdatabyimage(g_temp.objimage, scalemode, objpadding); var currenttime = jquery.now(); g_temp.storeimagelasttime = currenttime; return (true); } /** * zoom current image * mode: in, out, back */ function zoomcurrentimage(mode, mousepos) { var slides = g_parent.getslidesreference(); var objimage = slides.objcurrentslide.find("img"); var scalemode = getfitscalemode(); g_objparent.trigger(g_parent.events.zoom_start); //flag if the images zoomed var iszoomed = true; var objpadding = g_parent.getobjimagepadding(); if (mode == "back") { var objoriginalsize = g_functions.getimageoriginalsize(objimage); g_functions.scaleimagefitparent(objimage, objoriginalsize.width, objoriginalsize.height, scalemode, objpadding); } else { var zoomin = (mode == "in") ? true : false; iszoomed = g_functions.zoomimageinsideparent(objimage, zoomin, g_options.slider_zoom_step, mousepos, scalemode, g_options.slider_zoom_max_ratio, objpadding); } if (iszoomed == true) { g_objparent.trigger(g_parent.events.zooming); g_objparent.trigger(g_parent.events.zoom_change); g_objparent.trigger(g_parent.events.zoom_end); } } function ____________pan_____________() { }; /** * check if pan is posible for the current image * check if the image is bigger then the parent */ function ispanposible(objimage, event, sticttouchescheck) { //check num touches, strict means that even if 0 - pan not posible var arrtouches = g_functions.getarrtouches(event); if (sticttouchescheck === true) { if (arrtouches.length != 1) return (false); } else { if (arrtouches.length > 1) return (false); } if (g_functions.iselementbiggerthenparent(objimage)) return (true); return (false); } /** * store pan values */ function storepaninitvalues(event) { var mousepos = g_functions.getmouseposition(event); g_temp.startmousex = mousepos.pagex; g_temp.startmousey = mousepos.pagey; g_temp.lastmousex = g_temp.startmousex; g_temp.lastmousey = g_temp.startmousey; g_temp.startimagex = g_temp.objimagesize.left; g_temp.startimagey = g_temp.objimagesize.top; g_temp.panxactive = (g_temp.objimagesize.width > g_temp.objparentsize.width); g_temp.panyactive = (g_temp.objimagesize.height > g_temp.objparentsize.height); } /** * check pan start, and start if posible */ function startpan(event) { g_temp.ispanactive = true; storepaninitvalues(event); } /** * pan the image */ function panimage(event) { if (g_temp.objimage == undefined || g_temp.objimage.length == 0) return (true); var mousepos = g_functions.getmouseposition(event); var diffx = mousepos.pagex - g_temp.startmousex; var diffy = mousepos.pagey - g_temp.startmousey; //get active direction var difflastx = mousepos.pagex - g_temp.lastmousex; var difflasty = mousepos.pagey - g_temp.lastmousey; var directionx = (difflastx < 0) ? "left" : "right"; var directiony = (difflasty < 0) ? "up" : "down"; g_temp.lastmousex = mousepos.pagex; g_temp.lastmousey = mousepos.pagey; var posimage = g_functions.getelementsize(g_temp.objimage); //var imagex = g_temp.startimagex + diffx; //var imagey = g_temp.startimagey + diffy; //slow down if no pan available in this point //slow down y if (g_temp.panyactive == false) { difflasty = 0; } else { //zoom enabled if (directiony == "down" && posimage.top > 0) { difflasty = difflasty / 3; } else if (directiony == "up" && posimage.bottom < g_temp.objparentsize.height) { difflasty = difflasty / 3; } } //slow down x (only if the pan enabled) if (g_temp.panxactive == false || g_parent.isinnerinplace() == false) { difflastx = 0; } else { //zoom enabled if (directionx == "right" && posimage.left > 0) { difflastx = difflastx / 3; } else if (directionx == "left" && posimage.right < g_temp.objparentsize.width) { difflastx = difflastx / 3; } } var imagex = posimage.left + difflastx; var imagey = posimage.top + difflasty; g_functions.placeelement(g_temp.objimage, imagex, imagey); } /** * return the image to place if it's out of borders */ function checkreturnafterpan() { var isreturnx = false, isreturny = false, newx = 0, newy = 0; var objsize = g_functions.getelementsize(g_temp.objimage); var objimagepadding = g_parent.getobjimagepadding(); var objcenterpos = g_functions.getelementcenterposition(g_temp.objimage, objimagepadding); g_temp.panxactive = (g_temp.objimagesize.width > g_temp.objparentsize.width); g_temp.panyactive = (g_temp.objimagesize.height > g_temp.objparentsize.height); if (g_temp.panyactive == true) { if (objsize.top > 0) { //off limit top newy = 0; isreturny = true; } else if (objsize.bottom < g_temp.objparentsize.height) { //off limit bottom newy = g_temp.objparentsize.height - objsize.height; isreturny = true; } } else { //pan not active y - return to center if (objsize.top != objcenterpos.top) { isreturny = true; newy = objcenterpos.top; } } //check return x to place if (g_temp.panxactive == true) { if (objsize.left > 0) { //off limit left newx = 0; isreturnx = true; } else if (objsize.right < g_temp.objparentsize.width) { //off limit right newx = g_temp.objparentsize.width - objsize.width; isreturnx = true; } } else { //pan not active x - return to center // debugline("not active", true); if (objsize.left != objcenterpos.left) { isreturnx = true; newx = objcenterpos.left; } } //do the animation var objcss = {}; if (isreturny == true) objcss.top = newy + "px"; if (isreturnx == true) objcss.left = newx + "px"; if (isreturny == true || isreturnx == true) { g_temp.objimage.animate(objcss, { duration: g_options.slider_zoom_return_pan_duration, easing: g_options.slider_zoom_return_pan_easing, queue: false }); } } /** * check if the image animating or not */ function isimageanimating() { if (g_temp.objimage && g_temp.objimage.is(":animated")) return (true); return (false); } function ____________end_pan_____________() { }; function ________touch_zoom_____________() { }; /** * start touch zoom */ function starttouchzoom(arrtouches) { g_temp.iszoomactive = true; //store init diff g_temp.startdistance = g_functions.getdistance(arrtouches[0].pagex, arrtouches[0].pagey, arrtouches[1].pagex, arrtouches[1].pagey); if (g_temp.startdistance == 0) g_temp.startdistance = 1; //store init positions g_temp.startmiddlepoint = g_functions.getmiddlepoint(arrtouches[0].pagex, arrtouches[0].pagey, arrtouches[1].pagex, arrtouches[1].pagey); g_temp.objimagesize = g_functions.getelementsize(g_temp.objimage); g_temp.startimagex = g_temp.objimagesize.left; g_temp.startimagey = g_temp.objimagesize.top; //set orient point g_temp.imageorientpoint = g_functions.getelementlocalpoint(g_temp.startmiddlepoint, g_temp.objimage); var isinsideimage = g_functions.ispointinsideelement(g_temp.imageorientpoint, g_temp.objimagesize); if (isinsideimage == false) { g_temp.imageorientpoint = g_functions.getelementcenterpoint(g_temp.objimage); } //trigger start zoom event g_objparent.trigger(g_parent.events.zoom_start); } /** * check num touches, if not 2 - end zoom */ function checktouchzoomend(event) { if (g_temp.iszoomactive == false) return (false); var arrtouches = g_functions.getarrtouches(event); if (arrtouches.length != 2) { //end touch zoom g_temp.iszoomactive = false; //trigger end zoom event g_objparent.trigger(g_parent.events.zoom_end); } } /** * check start touch zoom */ function checktouchzoomstart(event) { if (g_temp.iszoomactive == true) return (true); var arrtouches = g_functions.getarrtouches(event); if (arrtouches.length != 2) return (true); starttouchzoom(arrtouches); } /** * do touch zoom on touch devices */ function dotouchzoom(event) { var arrtouches = g_functions.getarrtouches(event); var distance = g_functions.getdistance(arrtouches[0].pagex, arrtouches[0].pagey, arrtouches[1].pagex, arrtouches[1].pagey); var zoomratio = distance / g_temp.startdistance; var middlepoint = g_functions.getmiddlepoint(arrtouches[0].pagex, arrtouches[0].pagey, arrtouches[1].pagex, arrtouches[1].pagey); //set zoom data: var newwidth = g_temp.objimagesize.width * zoomratio; var newheight = g_temp.objimagesize.height * zoomratio; //check max zoom ratio: var objoriginalsize = g_functions.getimageoriginalsize(g_temp.objimage); var expectedzoomratio = 1; if (objoriginalsize.width > 0) expectedzoomratio = newwidth / objoriginalsize.width; if (expectedzoomratio > g_options.slider_zoom_max_ratio) return (true); //set pan data: panx = -(g_temp.imageorientpoint.x * zoomratio - g_temp.imageorientpoint.x); pany = -(g_temp.imageorientpoint.y * zoomratio - g_temp.imageorientpoint.y); var diffmiddlex = (middlepoint.x - g_temp.startmiddlepoint.x); var diffmiddley = (middlepoint.y - g_temp.startmiddlepoint.y); var posx = g_temp.startimagex + panx + diffmiddlex; var posy = g_temp.startimagey + pany + diffmiddley; //resize and place: g_functions.setelementsizeandposition(g_temp.objimage, posx, posy, newwidth, newheight); //trigger zooming event g_objparent.trigger(g_parent.events.zooming); g_objparent.trigger(g_parent.events.zoom_change); /* debugline({ middlestartx: g_temp.startmiddlepoint.x, middlex: middlepoint.x, diffmiddlex: diffmiddlex }); */ } /** * check return the image from zoom */ function checkreturnfromzoom() { if (g_temp.objimage == undefined || g_temp.objimage.length == 0) return (true); var objsize = g_functions.getelementsize(g_temp.objimage); if (objsize.width < g_temp.objfitimagesize.imagewidth) { g_temp.objimage.css({ position: "absolute", margin: "none" }); var objcss = { top: g_temp.objfitimagesize.imagetop + "px", left: g_temp.objfitimagesize.imageleft + "px", width: g_temp.objfitimagesize.imagewidth + "px", height: g_temp.objfitimagesize.imageheight + "px" }; g_temp.objimage.animate(objcss, { duration: g_options.slider_zoom_return_pan_duration, easing: g_options.slider_zoom_return_pan_easing, queue: false }); } else { checkreturnafterpan(); } } function ________end_touch_zoom_____________() { }; /** * * touch start event - start pan, remember start pan data */ function ontouchstart(event) { //if no image type, exit if (g_parent.iscurrentslidetype("image") == false) return (true); var isstored = storecurrentimage(); if (g_temp.objimage == undefined || g_temp.objimage.length == 0) return (true); event.preventdefault(); //stop animation if exists if (isimageanimating() == true) { g_temp.objimage.stop(true); } if (g_temp.iszoomactive == true) { checktouchzoomend(event); } else { checktouchzoomstart(event); } //if zoom started stop panning, if not, start panning if (g_temp.iszoomactive == true) { g_temp.ispanactive = false; } else if (ispanposible(g_temp.objimage, event) == true && g_temp.iszoomedonce == true) { startpan(event); } /* debugline({ pan: g_temp.ispanactive, zoom: g_temp.iszoomactive, event: "start" }, true); */ } /** * touch end event - bring the image to place */ function ontouchend(event) { if (g_parent.iscurrentslidetype("image") == false) return (true); //check if some gallery button clicked var objtarget = jquery(event.target); if (objtarget.data("ug-button") == true) { //event.preventdefault(); return (false); } var isstored = storecurrentimage(); if (g_temp.objimage == undefined || g_temp.objimage.length == 0) return (true); var panwasactive = g_temp.ispanactive; var zoomwasactive = g_temp.iszoomactive; //if the inner not in place, don't return noting, let the slide change if (g_parent.isinnerinplace() == false) { g_temp.iszoomactive = false; g_temp.ispanactive = false; return (true); } //check end zoom if (g_temp.iszoomactive == true) { checktouchzoomend(event); } else { checktouchzoomstart(event); } if (g_temp.iszoomactive == true) { g_temp.ispanactive = false; } else { var panposible = ispanposible(g_temp.objimage, event, true); if (g_temp.ispanactive == true) { g_temp.ispanactive = false; } else if (panposible == true) { startpan(event); } } /* debugline({ pan:g_temp.ispanactive, zoom: g_temp.iszoomactive }, true); */ if ((panwasactive || zoomwasactive) && g_temp.iszoomactive == false && g_temp.ispanactive == false) { checkreturnfromzoom(); } } /** * * touch move event - pan */ function ontouchmove(event) { if (g_parent.iscurrentslidetype("image") == false) return (true); //check touch zoom (pinch gesture) if (g_temp.iszoomactive == true) { dotouchzoom(event); } else if (g_temp.ispanactive == true) { panimage(event); } } /** * on slider mousewheel event */ function onslidermousewheel(event, delta, deltax, deltay) { if (g_options.slider_zoom_mousewheel == false) return (true); if (g_parent.iscurrentslidetype("image") == false) return (true); event.preventdefault(); //prevent default only if needed //if(zoomin == true || zoomin == false && g_functions.iselementbiggerthenparent(objimage)) //event.preventdefault(); var zoomin = (delta > 0); var mousepos = g_functions.getmouseposition(event); var mode = (zoomin == true) ? "in" : "out"; zoomcurrentimage(mode, mousepos); } /** * init touch events */ function initevents() { //debugline("init"); g_objslider.on("mousewheel", onslidermousewheel); //slider mouse down - pan start g_objslider.bind("mousedown touchstart", ontouchstart); //on body move jquery("body").bind("mousemove touchmove", ontouchmove); //on body mouse up - pan end jquery(window).add("body").bind("mouseup touchend", ontouchend); //event before image returned to init position g_objparent.bind(g_parent.events.before_return, function () { checkreturnfromzoom(); }); //on item change update iszoomedonce event. allow panning only if zoomed once g_objparent.bind(g_parent.events.item_changed, function () { g_temp.iszoomedonce = false; }); g_objparent.bind(g_parent.events.zoom_change, function () { g_temp.iszoomedonce = true; }); } this.________external_____________ = function () { }; /** * check if the image is zoomed, and there is a place for left panning */ this.ispanenabled = function (event, direction) { storecurrentimage(); if (g_temp.objimage == undefined || g_temp.objimage.length == 0) return (false); if (g_temp.iszoomedonce == false) return (false); if (ispanposible(g_temp.objimage, event) == false) return (false); if (g_parent.isinnerinplace() == false) return (false); if (direction == "left") { if (g_temp.objimagesize.right <= g_temp.objparentsize.width) return (false); } else { //right direction if (g_temp.objimagesize.left >= 0) return (false); } return (true); } /** * init function for avia controls */ this.init = function (objslider, customoptions) { initobject(objslider, customoptions); } /** * zoom in */ this.zoomin = function () { zoomcurrentimage("in"); } /** * zoom out */ this.zoomout = function () { zoomcurrentimage("out"); } /** * zoom back */ this.zoomback = function () { zoomcurrentimage("back"); } } /** -------------- wistia api ---------------------*/ function ugwistiaapi() { this.isapiloaded = false; var t = this, g_objthis = jquery(this), g_inthandle; var g_player, g_isplayerready = false; this.events = { start_playing: "start_playing", stop_playing: "stop_playing", video_ended: "video_ended" }; /** * check if sound cloud active */ function iswistiaactive() { return (typeof wistia != "undefined"); } /** * load vimeo api */ this.loadapi = function () { if (g_ugwistiaapi.isapiloaded == true) return (true); if (iswistiaactive()) { g_ugwistiaapi.isapiloaded = true; return (true); } g_ugfunctions.loadjs("fast.wistia.com/assets/external/e-v1.js", true); g_ugwistiaapi.isapiloaded = true; } /** * actually put the video */ function putvideoactually(divid, videoid, width, height, isautoplay) { g_player = null; g_isplayerready = false; var htmlid = divid + "_video"; var html = "
 
"; jquery("#" + divid).html(html); g_player = wistia.embed(videoid, { version: "v1", videowidth: width, videoheight: height, container: htmlid, autoplay: isautoplay }); g_isplayerready = true; initevents(); } /** * init events */ function initevents() { //set "play" event g_player.bind('play', function () { g_objthis.trigger(t.events.start_playing); }); //set "pause event" g_player.bind('pause', function () { g_objthis.trigger(t.events.stop_playing); }); g_player.bind('end', function () { g_objthis.trigger(t.events.stop_playing); g_objthis.trigger(t.events.video_ended); }); } /** * do some command */ this.docommand = function (command) { if (g_player == null) return (false); if (g_isplayerready == false) return (false); switch (command) { case "play": g_player.play(); break; case "pause": g_player.pause(); break; } } /** * do pause command */ this.pause = function () { t.docommand("pause"); } /** * do play command */ this.play = function () { t.docommand("play"); } /** * put the vimeo video */ this.putvideo = function (divid, videoid, width, height, isautoplay) { if (iswistiaactive()) { putvideoactually(divid, videoid, width, height, isautoplay); return (true); } //if no api present, wait for the api being ready this.loadapi(); g_inthandle = setinterval(function () { if (iswistiaactive()) { putvideoactually(divid, videoid, width, height, isautoplay); clearinterval(g_inthandle); } }, 500); } /** * get if the player is ready */ this.isplayerready = function () { if (g_isplayerready && g_player) return (true); return (false); } } /** -------------- sound cloud api ---------------------*/ function ugsoundcloudapi() { this.isapiloaded = false; var t = this, g_objthis = jquery(this), g_inthandle; var g_player, g_lastcontainerid; this.events = { start_playing: "start_playing", stop_playing: "stop_playing", video_ended: "video_ended" }; /** * check if sound cloud active */ function isscactive() { return (typeof sc != "undefined"); } /** * load vimeo api */ this.loadapi = function () { if (g_ugsoundcloudapi.isapiloaded == true) return (true); if (isscactive()) { g_ugsoundcloudapi.isapiloaded = true; return (true); } g_ugfunctions.loadjs("w.soundcloud.com/player/api.js", true); g_ugsoundcloudapi.isapiloaded = true; } /** * actually put the video */ function putsoundactually(divid, trackid, width, height, isautoplay) { g_player = null; g_isplayerready = false; var iframeid = divid + "_iframe"; var url = location.protocol + "//w.soundcloud.com/player/?url=http://api.soundcloud.com/tracks/" + trackid; url += "&buying=false&liking=false&download=false&sharing=false&show_artwork=true&show_comments=false&show_playcount=true&show_user=false&hide_related=true&visual=true&start_track=0&callback=true"; if (isautoplay === true) url += "&auto_play=true"; else url += "&auto_play=false"; var html = ""; jquery("#" + divid).html(html); //get the player object g_player = sc.widget(iframeid); g_player.bind(sc.widget.events.ready, function () { if (g_player) { g_isplayerready = true; initevents(); } }); g_lastcontainerid = divid; } /** * init events */ function initevents() { //set "play" event g_player.bind(sc.widget.events.play, function () { g_objthis.trigger(t.events.start_playing); }); //set "pause event" g_player.bind(sc.widget.events.pause, function () { g_objthis.trigger(t.events.stop_playing); }); g_player.bind(sc.widget.events.finish, function () { g_objthis.trigger(t.events.stop_playing); g_objthis.trigger(t.events.video_ended); }); } /** * put the youtube video */ this.putsound = function (divid, trackid, width, height, isautoplay) { if (isscactive()) { putsoundactually(divid, trackid, width, height, isautoplay); return (true); } //if no api present, wait for the api being ready this.loadapi(); g_inthandle = setinterval(function () { if (isscactive()) { putsoundactually(divid, trackid, width, height, isautoplay); clearinterval(g_inthandle); } }, 500); } /** * do some command */ this.docommand = function (command) { if (g_player == null) return (false); if (g_isplayerready == false) return (false); switch (command) { case "play": g_player.play(); break; case "pause": g_player.pause(); break; } } /** * pause video */ this.pause = function () { t.docommand("pause"); } /** * play video */ this.play = function () { t.docommand("play"); } /** * destroy the player */ this.destroy = function () { g_isplayerready = false; g_player = null; if (g_lastcontainerid) { jquery("#" + g_lastcontainerid).html(""); g_lastcontainerid = null; } } } /** -------------- html5 video api ---------------------*/ function ughtml5mediaapi() { this.isapiloaded = false; var t = this, g_objthis = jquery(this), g_inthandle; var g_player; this.events = { start_playing: "start_playing", stop_playing: "stop_playing", video_ended: "video_ended" }; /** * load vimeo api */ this.loadapi = function () { if (g_ughtml5mediaapi.isapiloaded == true) return (true); if (ismediaelementactive()) { g_ughtml5mediaapi.isapiloaded = true; return (true); } g_ugfunctions.loadjs("cdnjs.cloudflare.com/ajax/libs/mediaelement/2.18.1/mediaelement.min.js", true); g_ugfunctions.loadcss("cdnjs.cloudflare.com/ajax/libs/mediaelement/2.18.1/mediaelementplayer.min.css", true); g_ughtml5mediaapi.isapiloaded = true; } /** * return true if the mediaelement is active */ function ismediaelementactive() { return (typeof mejs != "undefined"); } /** * actually put the video */ function putvideoactually(divid, data, width, height, isautoplay) { g_player = null; g_isplayerready = false; var urlflash = location.protocol + "//cdnjs.cloudflare.com/ajax/libs/mediaelement/2.18.1/flashmediaelement-cdn.swf"; var urlsilverlight = location.protocol + "//cdnjs.cloudflare.com/ajax/libs/mediaelement/2.18.1/silverlightmediaelement.xap"; var htmlid = divid + "_video"; var htmlautoplay = ""; if (isautoplay && isautoplay === true) htmlautoplay = "autoplay='autoplay'" var htmlposter = ""; if (data.posterimage) htmlposter = "poster='" + data.posterimage + "'"; var html = ""; jquery("#" + divid).html(html); new mediaelement(htmlid, { enableplugindebug: false, flashname: urlflash, silverlightname: urlsilverlight, success: function (mediaelement, domobject) { g_isplayerready = true; g_player = mediaelement; if (isautoplay == false) g_player.pause(); initevents(); }, error: function (objerror) { trace(objerror); } }); } /** * init player events function */ function initevents() { g_ugfunctions.addevent(g_player, "play", function () { g_objthis.trigger(t.events.start_playing); }); g_ugfunctions.addevent(g_player, "pause", function () { g_objthis.trigger(t.events.stop_playing); }); g_ugfunctions.addevent(g_player, "ended", function () { g_objthis.trigger(t.events.stop_playing); g_objthis.trigger(t.events.video_ended); }); } /** * put the vimeo video */ this.putvideo = function (divid, data, width, height, isautoplay) { if (ismediaelementactive()) { putvideoactually(divid, data, width, height, isautoplay); return (true); } //if no api present, wait for the api being ready this.loadapi(); g_inthandle = setinterval(function () { if (ismediaelementactive()) { putvideoactually(divid, data, width, height, isautoplay); clearinterval(g_inthandle); } }, 500); } /** * do some command */ this.docommand = function (command) { if (g_player == null) return (false); if (g_isplayerready == false) return (false); switch (command) { case "play": g_player.play(); break; case "pause": g_player.pause(); break; } } /** * pause video */ this.pause = function () { t.docommand("pause"); } /** * play video */ this.play = function () { t.docommand("play"); } } /** -------------- vimeo api class ---------------------*/ function ugvimeoapi() { this.isapiloaded = false; var t = this, g_objthis = jquery(this), g_inthandle; var g_player = null, g_isplayerready = false, g_lastcotnainerid, g_cuechangeautoplay = false; this.events = { start_playing: "start_playing", stop_playing: "stop_playing", video_ended: "video_ended" }; /** * load vimeo api */ this.loadapi = function () { if (g_ugvimeoapi.isapiloaded == true) return (true); if (isfroogaloopactive()) { g_ugvimeoapi.isapiloaded = true; return (true); } g_ugfunctions.loadjs("f.vimeocdn.com/js/froogaloop2.min.js", true); g_ugvimeoapi.isapiloaded = true; } /** * tells if the froogaloop library active */ function isfroogaloopactive() { return (typeof froogaloop != "undefined"); } /** * actually put the video */ function putvideoactually(divid, videoid, width, height, isautoplay) { g_player = null; g_isplayerready = false; var url = location.protocol + "//player.vimeo.com/video/" + videoid + "?api=1"; if (isautoplay === true) url += "&byline=0&autoplay=1&title=0&portrait=0"; var html = ""; jquery("#" + divid).html(html); //get the player object var iframe = jquery("#" + divid + " iframe")[0]; g_player = froogaloop(iframe); g_player.addevent('ready', function () { if (g_player) { g_isplayerready = true; initevents(); } }); g_lastcotnainerid = divid; } /** * init events */ function initevents() { if (!g_player) return (false); //set "cuechange" event g_player.addevent('cuechange', function () { if (g_cuechangeautoplay == true) t.play(); }); //set "play" event g_player.addevent('play', function () { g_objthis.trigger(t.events.start_playing); }); //set "pause event" g_player.addevent('pause', function () { g_objthis.trigger(t.events.stop_playing); }); g_player.addevent('finish', function () { g_objthis.trigger(t.events.stop_playing); g_objthis.trigger(t.events.video_ended); }); } /** * do some command */ this.docommand = function (command) { if (g_player == null) return (false); if (g_isplayerready == false) return (false); switch (command) { default: g_player.api(command); break; } } /** * do pause command */ this.pause = function () { t.docommand("pause"); } /** * do play command */ this.play = function () { t.docommand("play"); } /** * desrtoy the player and empty the div */ this.destroy = function () { if (g_player) { g_player.api("unload"); g_player = null; g_isplayerready = false; } if (g_lastcotnainerid) { jquery("#" + g_lastcotnainerid).html(""); } } /** * put the vimeo video */ this.putvideo = function (divid, videoid, width, height, isautoplay) { if (isfroogaloopactive()) { putvideoactually(divid, videoid, width, height, isautoplay); return (true); } //if no api present, wait for the api being ready this.loadapi(); g_inthandle = setinterval(function () { if (isfroogaloopactive()) { putvideoactually(divid, videoid, width, height, isautoplay); clearinterval(g_inthandle); } }, 500); } /** * get if the player is ready */ this.isplayerready = function () { if (g_isplayerready && g_player) return (true); return (false); } /** * change the video */ this.changevideo = function (videoid, isautoplay) { if (t.isplayerready() == false) return (false); g_cuechangeautoplay = isautoplay; g_player.api("loadvideo", videoid); } /** * get video images */ this.getvideoimages = function (videoid, itemindex, onsuccessfunction) { var url = location.protocol + "//vimeo.com/api/v2/video/" + videoid + ".json"; jquery.get(url, {}, function (data) { var obj = {}; obj.preview = data[0].thumbnail_large; obj.thumb = data[0].thumbnail_medium; onsuccessfunction(itemindex, obj); }); } } /** -------------- youtube api class ---------------------*/ function ugyoutubeapi() { this.isapiloaded = false; var t = this, g_player = null, g_inthandle, g_isplayerready = false; var g_objthis = jquery(this), g_prevstate = -1, g_lastcontainerid; //unstarted var g_options = { video_youtube_showinfo: true } this.events = { start_playing: "start_playing", stop_playing: "stop_playing", video_ended: "video_ended" }; /** * actually put the video */ function putvideoactually(divid, videoid, width, height, isautoplay) { if (g_player && g_isplayerready) { g_player.destroy(); } var playervars = { controls: 2, showinfo: g_options.video_youtube_showinfo, rel: 0 }; if (isautoplay === true) playervars.autoplay = 1; g_isplayerready = false; g_player = new yt.player(divid, { height: height, width: width, videoid: videoid, playervars: playervars, events: { 'onready': onplayerready, 'onstatechange': onplayerstatechange } }); g_lastcontainerid = divid; } /** * check if yt active */ function isytactive() { if (typeof yt != "undefined" && typeof yt.player != "undefined") return (true); return (false); } /** * set options */ this.setoptions = function (objoptions) { g_options = jquery.extend(g_options, objoptions); } /** * put the youtube video */ this.putvideo = function (divid, videoid, width, height, isautoplay) { if (isytactive()) { putvideoactually(divid, videoid, width, height, isautoplay); return (true); } //if no api present, wait for the api being ready this.loadapi(); g_inthandle = setinterval(function () { if (isytactive()) { putvideoactually(divid, videoid, width, height, isautoplay); clearinterval(g_inthandle); } }, 500); } /** * on player ready event */ function onplayerready() { g_isplayerready = true; } /** * on player state change event * trigger events */ function onplayerstatechange() { if (typeof g_player.getplayerstate != "function") { trace("youtube api error: can't get player state"); return (false); } var state = g_player.getplayerstate(); switch (state) { case yt.playerstate.playing: g_objthis.trigger(t.events.start_playing); break; case yt.playerstate.ended: g_objthis.trigger(t.events.stop_playing); g_objthis.trigger(t.events.video_ended); break; default: if (g_prevstate == yt.playerstate.playing) g_objthis.trigger(t.events.stop_playing); break; } g_prevstate = state; } /** * load youtube api */ this.loadapi = function () { if (g_ugyoutubeapi.isapiloaded == true) return (true); if (typeof yt != "undefined") { g_ugyoutubeapi.isapiloaded = true; return (true); } g_ugfunctions.loadjs("https://www.youtube.com/player_api", false); g_ugyoutubeapi.isapiloaded = true; } /** * do some command */ this.docommand = function (command, opt1) { if (!g_player) return (true); if (g_isplayerready == false) return (false); switch (command) { case "play": if (typeof g_player.playvideo != "function") return (false); g_player.playvideo(); break; case "pause": if (typeof g_player.pausevideo != "function") return (false); g_player.pausevideo(); break; case "seek": if (typeof g_player.seekto != "function") return (false); g_player.seekto(opt1); break; case "stoptobeginning": var state = g_player.getplayerstate(); g_player.pausevideo(); switch (state) { case yt.playerstate.playing: case yt.playerstate.ended: case yt.playerstate.paused: g_player.seekto(0); break; } break; } } /** * play video */ this.play = function () { t.docommand("play"); } /** * stop the video */ this.pause = function () { t.docommand("pause"); } /** * destroy player */ this.destroy = function () { try { if (g_player) { g_isplayerready = false; g_player.clearvideo(); g_player.destroy(); } } catch (objerror) { jquery("#" + g_lastcontainerid).html(""); } } /** * stop the video and seek to start */ this.stoptobeginning = function () { t.docommand("stoptobeginning"); } /** * change the video */ this.changevideo = function (videoid, isautoplay) { if (t.isplayerready() == false) return (false); if (isautoplay && isautoplay == true) g_player.loadvideobyid(videoid, 0, "large"); else g_player.cuevideobyid(videoid, 0, "large"); } /** * get if the player is ready */ this.isplayerready = function () { if (g_isplayerready && g_player) return (true); return (false); } /** * get preview and thumbs images according the id */ this.getvideoimages = function (videoid) { var obj = {}; obj.preview = "https://i.ytimg.com/vi/" + videoid + "/sddefault.jpg"; obj.thumb = "https://i.ytimg.com/vi/" + videoid + "/default.jpg"; return (obj); } } /** -------------- video player class ---------------------*/ function ugvideoplayer() { var t = this, g_galleryid, g_objthis = jquery(this), g_functions = new ugfunctions(); var g_youtubeapi = new ugyoutubeapi(), g_vimeoapi = new ugvimeoapi(); var g_html5api = new ughtml5mediaapi(), g_soundcloudapi = new ugsoundcloudapi(), g_wistiaapi = new ugwistiaapi(); var g_objplayer, g_objyoutube, g_objvimeo, g_objhtml5, g_objbuttonclose, g_objsoundcloud, g_objwistia; var g_activeplayertype = null; var g_options = { video_enable_closebutton: true }; this.events = { show: "video_show", hide: "video_hide", play_start: "video_play_start", play_stop: "video_play_stop", video_ended: "video_ended" }; var g_temp = { standalonemode: false, youtubeinnerid: "", vimeoplayerid: "", html5playerid: "", wistiaplayerid: "", soundcloudplayerid: "" }; /** * init the object */ this.init = function (optoptions, isstandalonemode, galleryid) { g_galleryid = galleryid; if (!g_galleryid) throw new error("missing gallery id for video player, it's a must!"); g_options = jquery.extend(g_options, optoptions); g_youtubeapi.setoptions(g_options); if (isstandalonemode && isstandalonemode == true) g_temp.standalonemode = true; } /** * set the player html */ this.sethtml = function (objparent) { g_temp.youtubeinnerid = g_galleryid + "_youtube_inner"; g_temp.vimeoplayerid = g_galleryid + "_videoplayer_vimeo"; g_temp.html5playerid = g_galleryid + "_videoplayer_html5"; g_temp.wistiaplayerid = g_galleryid + "_videoplayer_wistia"; g_temp.soundcloudplayerid = g_galleryid + "_videoplayer_soundcloud"; var html = ""; objparent.append(html); g_objplayer = objparent.children(".ug-videoplayer"); g_objyoutube = g_objplayer.children(".ug-videoplayer-youtube"); g_objvimeo = g_objplayer.children(".ug-videoplayer-vimeo"); g_objhtml5 = g_objplayer.children(".ug-videoplayer-html5"); g_objsoundcloud = g_objplayer.children(".ug-videoplayer-soundcloud"); g_objwistia = g_objplayer.children(".ug-videoplayer-wistia"); if (g_temp.standalonemode == false && g_options.video_enable_closebutton == true) g_objbuttonclose = g_objplayer.children(".ug-videoplayer-button-close") } function __________events___________() { }; /** * on close button click event */ function onclosebuttonclick() { t.hide(); } /** * on some video play start */ function onplaystart() { g_objthis.trigger(t.events.play_start); if (g_objbuttonclose) g_objbuttonclose.hide(); } /** * on some video play stop */ function onplaystop() { g_objthis.trigger(t.events.play_stop); if (g_objbuttonclose) g_objbuttonclose.show(); } /** * on video ended */ function onvideoended() { g_objthis.trigger(t.events.video_ended); } /** * init events */ function initevents() { //close button events if (g_objbuttonclose) { g_functions.setbuttonmobileready(g_objbuttonclose); g_functions.setbuttononclick(g_objbuttonclose, onclosebuttonclick); } //youtube events jquery(g_youtubeapi).on(g_youtubeapi.events.start_playing, onplaystart); jquery(g_youtubeapi).on(g_youtubeapi.events.stop_playing, onplaystop); jquery(g_youtubeapi).on(g_youtubeapi.events.video_ended, onvideoended); //vimeo events jquery(g_vimeoapi).on(g_vimeoapi.events.start_playing, onplaystart); jquery(g_vimeoapi).on(g_vimeoapi.events.stop_playing, onplaystop); jquery(g_vimeoapi).on(g_vimeoapi.events.video_ended, onvideoended); //html5 video events jquery(g_html5api).on(g_html5api.events.start_playing, onplaystart); jquery(g_html5api).on(g_html5api.events.stop_playing, onplaystop); jquery(g_html5api).on(g_html5api.events.video_ended, onvideoended); jquery(g_soundcloudapi).on(g_soundcloudapi.events.start_playing, onplaystart); jquery(g_soundcloudapi).on(g_soundcloudapi.events.stop_playing, onplaystop); jquery(g_soundcloudapi).on(g_soundcloudapi.events.video_ended, onvideoended); jquery(g_wistiaapi).on(g_wistiaapi.events.start_playing, onplaystart); jquery(g_wistiaapi).on(g_wistiaapi.events.stop_playing, onplaystop); jquery(g_wistiaapi).on(g_wistiaapi.events.video_ended, onvideoended); } /** * destroy the video player events */ this.destroy = function () { if (g_objbuttonclose) { g_objbuttonclose.off("click"); g_objbuttonclose.off("touchend"); } //youtube events jquery(g_youtubeapi).off(g_youtubeapi.events.start_playing); jquery(g_youtubeapi).off(g_youtubeapi.events.stop_playing); //vimeo events jquery(g_vimeoapi).off(g_vimeoapi.events.start_playing); jquery(g_vimeoapi).off(g_vimeoapi.events.stop_playing); //html5 video events jquery(g_html5api).off(g_html5api.events.start_playing); jquery(g_html5api).off(g_html5api.events.stop_playing); jquery(g_soundcloudapi).off(g_soundcloudapi.events.start_playing, onplaystart); jquery(g_soundcloudapi).off(g_soundcloudapi.events.stop_playing, onplaystop); jquery(g_wistiaapi).off(g_wistiaapi.events.start_playing, onplaystart); jquery(g_wistiaapi).off(g_wistiaapi.events.stop_playing, onplaystop); g_activeplayertype = null; } /** * init events */ this.initevents = function () { initevents(); } /** * set element size and position the button */ this.setsize = function (width, height) { g_functions.setelementsize(g_objplayer, width, height); if (g_objbuttonclose) g_functions.placeelement(g_objbuttonclose, "right", "top"); } /** * set video player position */ this.setposition = function (left, top) { g_functions.placeelement(g_objplayer, left, top); } /** * get video player object for placing */ this.getobject = function () { return (g_objplayer); } /** * show the player */ this.show = function () { if (t.isvisible() == true) return (true); g_objplayer.show(); g_objplayer.fadeto(0, 1); if (g_objbuttonclose) g_objbuttonclose.show(); g_objthis.trigger(t.events.show); } /** * hide the player */ this.hide = function () { if (t.isvisible() == false) return (true); //pause all players stopandhideplayers(); g_activeplayertype = null; g_objplayer.hide(); g_objthis.trigger(t.events.hide); } /** * get active player */ this.getactiveapi = function () { switch (g_activeplayertype) { case "youtube": return g_youtubeapi; break; case "vimeo": return g_vimeoapi; break; case "wistia": return g_wistiaapi; break; case "soundcloud": return g_soundcloudapi; break; case "html5": return g_html5api; break; default: return null; break; } } /** * pause active player if playing */ this.pause = function () { var activeapi = t.getactiveapi(); if (activeapi == null) return (false); if (typeof activeapi.pause == "function") activeapi.pause(); } /** * return if the player is visible */ this.isvisible = function () { return g_objplayer.is(":visible"); } /** * stop and hide other elements except some */ function stopandhideplayers(except) { var arrplayers = ["youtube", "vimeo", "html5", "soundcloud", "wistia"]; for (var index in arrplayers) { var player = arrplayers[index]; if (player == except) continue; switch (player) { case "youtube": g_youtubeapi.pause(); g_youtubeapi.destroy(); g_objyoutube.hide(); break; case "vimeo": g_vimeoapi.pause(); g_vimeoapi.destroy(); g_objvimeo.hide(); break; case "html5": g_html5api.pause(); g_objhtml5.hide(); break; case "soundcloud": g_soundcloudapi.pause(); g_soundcloudapi.destroy(); g_objsoundcloud.hide(); break; case "wistia": g_wistiaapi.pause(); g_objwistia.hide(); break; } } } /** * play youtube inside the video, isautoplay - true by default */ this.playyoutube = function (videoid, isautoplay) { if (typeof isautoplay == "undefined") var isautoplay = true; stopandhideplayers("youtube"); g_objyoutube.show(); var objyoutubeinner = g_objyoutube.children("#" + g_temp.youtubeinnerid); if (objyoutubeinner.length == 0) g_objyoutube.append("
"); if (g_youtubeapi.isplayerready() == true && g_temp.standalonemode == true) g_youtubeapi.changevideo(videoid, isautoplay); else { g_youtubeapi.putvideo(g_temp.youtubeinnerid, videoid, "100%", "100%", isautoplay); } g_activeplayertype = "youtube"; } /** * play vimeo */ this.playvimeo = function (videoid, isautoplay) { if (typeof isautoplay == "undefined") var isautoplay = true; stopandhideplayers("vimeo"); g_objvimeo.show(); g_vimeoapi.putvideo(g_temp.vimeoplayerid, videoid, "100%", "100%", isautoplay); /* if(g_vimeoapi.isplayerready() && g_temp.standalonemode == true){ g_vimeoapi.changevideo(videoid, isautoplay); } else g_vimeoapi.putvideo(g_temp.vimeoplayerid, videoid, "100%", "100%", isautoplay); */ g_activeplayertype = "vimeo"; } /** * play html5 video */ this.playhtml5video = function (ogv, webm, mp4, posterimage, isautoplay) { if (typeof isautoplay == "undefined") var isautoplay = true; stopandhideplayers("html5"); g_objhtml5.show(); //trace(posterimage); var data = { ogv: ogv, webm: webm, mp4: mp4, posterimage: posterimage }; g_html5api.putvideo(g_temp.html5playerid, data, "100%", "100%", isautoplay); g_activeplayertype = "html5"; } /** * play sound cloud */ this.playsoundcloud = function (trackid, isautoplay) { if (typeof isautoplay == "undefined") var isautoplay = true; stopandhideplayers("soundcloud"); g_objsoundcloud.show(); g_soundcloudapi.putsound(g_temp.soundcloudplayerid, trackid, "100%", "100%", isautoplay); g_activeplayertype = "soundcloud"; } /** * play sound cloud */ this.playwistia = function (videoid, isautoplay) { if (typeof isautoplay == "undefined") var isautoplay = true; stopandhideplayers("wistia"); g_objwistia.show(); g_wistiaapi.putvideo(g_temp.wistiaplayerid, videoid, "100%", "100%", isautoplay); g_activeplayertype = "wistia"; } } var g_ugyoutubeapi = new ugyoutubeapi(); var g_ugvimeoapi = new ugvimeoapi(); var g_ughtml5mediaapi = new ughtml5mediaapi(); var g_ugsoundcloudapi = new ugsoundcloudapi(); var g_ugwistiaapi = new ugwistiaapi(); /** * prototype gallery funciton */ jquery.fn.unitegallery = function (options) { var element = jquery(this); var galleryid = "#" + element.attr("id"); if (!options) var options = {}; var objgallery = new unitegallerymain(); objgallery.run(galleryid, options); var api = new ug_api(objgallery); return (api); } /** * check for min jquery version */ function ugcheckforminjqueryversion() { var isminjquery = g_ugfunctions.checkminjqueryversion("1.8.0"); if (isminjquery == false) throw new error("the gallery can run from jquery 1.8 you have jquery " + jquery.fn.jquery + " please update your jquery library."); } /** * check for errors function */ function ugcheckforerrors(galleryid, type) { /** * check for jquery presents */ function checkforjquerypresents() { if (typeof jquery == "undefined") throw new error("jquery library not included"); } /** * check for double jquery error */ function checkfordoublejquery() { if (typeof jquery.fn.unitegallery == "function") return (true); var errormessage = "you have some jquery.js library include that comes after the gallery files js include."; errormessage += "
this include eliminates the gallery libraries, and make it not work."; if (type == "cms") { errormessage += "

to fix it you can:
    1. in the gallery settings -> troubleshooting set option: put js includes to body option to true."; errormessage += "
    2. find the double jquery.js include and remove it."; } else { errormessage += "

please find and remove this jquery.js include and the gallery will work.
* there should be only one jquery.js include before all other js includes in the page."; } throw new error(errormessage); } try { if (type == "jquery") { checkforjquerypresents(); ugcheckforminjqueryversion(); } else { ugcheckforminjqueryversion(); checkfordoublejquery(); } } catch (objerror) { var message = objerror.message; message = "unite gallery error: " + message; message = "
" + message + "
" if (type == "jquery") { var objgallery = document.getelementbyid(galleryid); objgallery.innerhtml = message; objgallery.style.display = "block"; } else jquery(galleryid).show().html(message); return (false); } return (true); } function unitegallerymain() { var t = this; var g_galleryid; var g_objgallery = jquery(t), g_objwrapper, g_objparent; var g_objthumbs, g_objslider, g_functions = new ugfunctions(), g_objtabs, g_objloadmore; var g_arritems = [], g_numitems, g_selecteditem = null, g_selecteditemindex = -1; var g_objtheme, g_objcache = {}; this.events = { item_change: "item_change", size_change: "size_change", enter_fullscreen: "enter_fullscreen", exit_fullscreen: "exit_fullscreen", start_play: "start_play", stop_play: "stop_play", pause_playing: "pause_playing", continue_playing: "continue_playing", slider_action_start: "slider_action_start", slider_action_end: "slider_action_end", item_image_updated: "item_image_updated", gallery_keypress: "gallery_keypress", gallery_before_request_items: "gallery_before_request_items", //before ajax load items open_lightbox: "open_lightbox", close_lightbox: "close_lightbox" }; var gallery_width = $("#gallery").parent().width(); //set the default gallery options var g_options = { gallery_width: gallery_width, //gallery width gallery_height: (gallery_width + smallimgheight * imgzoom) / imgzoom, //gallery height gallery_min_width: 300, //gallery minimal width when resizing gallery_min_height: (300 + smallimgheight * imgzoom) / imgzoom, //gallery minimal height when resizing gallery_theme: "default", //default,compact,grid,slider - select your desired theme from the list of themes. gallery_skin: "default", //default, alexis etc... - the global skin of the gallery. will change all gallery items by default. gallery_images_preload_type: "minimal", //all , minimal , visible - preload type of the images. //minimal - only image nabours will be loaded each time. //visible - visible thumbs images will be loaded each time. //all - load all the images first time. gallery_autoplay: false, //true / false - begin slideshow autoplay on start gallery_play_interval: 3000, //play interval of the slideshow gallery_pause_on_mouseover: true, //true,false - pause on mouseover when playing slideshow true/false gallery_mousewheel_role: "zoom", //none, zoom, advance gallery_control_keyboard: true, //true,false - enable / disble keyboard controls gallery_carousel: true, //true,false - next button on last image goes to first image. gallery_preserve_ratio: true, //true, false - preserver ratio when on window resize gallery_background_color: "", //set custom background color. if not set it will be taken from css. gallery_debug_errors: false, //show error message when there is some error on the gallery area. gallery_shuffle: false, //randomise position of items at start. gallery_urlajax: null, //ajax url for requesting new items etc. gallery_enable_tabs: false, //enable/disable category tabs gallery_enable_loadmore: false, //enable / disable loadmore button gallery_enable_cache: true, //enable caching items gallery_initial_catid: "" //initial category id (for caching) }; //gallery_control_thumbs_mousewheel var g_temp = { //temp variables objcustomoptions: {}, isallitemspreloaded: false, //flag that tells that all items started preloading isfreestylemode: false, //no special html additions lastwidth: 0, lastheigh: 0, handleresize: null, isinited: false, isplaymode: false, isplaymodepaused: false, playtimepassed: 0, playtimelaststep: 0, playhandle: "", playstepinterval: 33, objprogress: null, isfakefullscreen: false, thumbstype: null, isyoutubepresent: false, //flag if present youtube items isvimeopresent: false, //flag if present vimeo items ishtml5videopresent: false, //flag if present html5 video items issoundcloudpresent: false, //flag if present soundcloud items iswistiapresent: false, //flag if some wistia movie present resizedelay: 100, isrunfirsttime: true, originaloptions: {}, funccustomheight: null //custom height function, set by the theme if needed }; function __________init_gallery_______() { }; /** * get theme function from theme name */ function getthemefunction(themename) { var themefunction = themename; if (themefunction.indexof("ugtheme_") == -1) themefunction = "ugtheme_" + themefunction; return (themefunction); } /** * init the theme */ function inittheme(objcustomoptions) { //set theme function: if (objcustomoptions.hasownproperty("gallery_theme")) g_options.gallery_theme = objcustomoptions.gallery_theme; else { var defaulttheme = g_options.gallery_theme; if (g_ugfunctions.isthemeregistered(defaulttheme) == false) g_options.gallery_theme = g_ugfunctions.getfirstregisteredtheme(); } var themefunction = getthemefunction(g_options.gallery_theme); try { g_options.gallery_theme = eval(themefunction); } catch (e) { //check registered themes }; g_options.gallery_theme = eval(themefunction); //init the theme g_objtheme = new g_options.gallery_theme(); g_objtheme.init(t, objcustomoptions); } /** * reset all the options for the second time run */ function resetoptions() { g_options = jquery.extend({}, g_temp.originaloptions); g_selecteditemindex = -1; g_selecteditem = null; g_objslider = undefined; g_objthumbs = undefined; g_objslider = undefined; } /** * check for some errors and fire error if needed */ function checkforstartuperrors() { //protection agains old jquery version try { ugcheckforminjqueryversion(); } catch (e) { throwerrorshowmessage(e.message); } //protection against some jquery ui function change if (typeof g_objwrapper.outerwidth() == "object") throwerrorshowmessage("you have some buggy script. most chances jquery-ui.js that destroy jquery outerwidth, outerheight functions. the gallery can't run. please update jquery-ui.js to latest version."); //check for late jquery include settimeout(function () { ugcheckforerrors(g_galleryid, "cms") }, 5000); } /** * the gallery */ function rungallery(galleryid, objcustomoptions, htmlitems, cacheid) { var iscustomoptions = (typeof objcustomoptions == "object"); if (iscustomoptions) g_temp.objcustomoptions = objcustomoptions; if (g_temp.isrunfirsttime == true) { g_galleryid = galleryid; g_objwrapper = jquery(g_galleryid); if (g_objwrapper.length == 0) { trace("div with id: " + g_galleryid + " not found"); return (false); } g_objparent = g_objwrapper.parent(); checkforstartuperrors(); g_temp.originaloptions = jquery.extend({}, g_options); //merge options if (iscustomoptions) g_options = jquery.extend(g_options, objcustomoptions); //cache items if (g_options.gallery_enable_cache == true && g_options.gallery_initial_catid) cacheitems(g_options.gallery_initial_catid); //set size class t.setsizeclass(); //fill arritems var objitems = g_objwrapper.children(); fillitemsarray(objitems); loadapis(); //hide images: g_objwrapper.find("img").fadeto(0, 0).hide(); g_objwrapper.show(); clearinitdata(); } else { //reset options - not first time run t.destroy(); resetoptions(); g_options = jquery.extend(g_options, g_temp.objcustomoptions); if (htmlitems) { //cache items if (cacheid && g_options.gallery_enable_cache == true) cacheitems(cacheid, htmlitems); if (htmlitems == "noitems") { showerrormessage("no items in this category", ""); return (false); } g_objwrapper.html(htmlitems); var objitems = g_objwrapper.children(); fillitemsarray(objitems); loadapis(); g_objwrapper.children().fadeto(0, 0).hide(); g_objwrapper.show(); clearinitdata(); } } //init tabs if (g_temp.isrunfirsttime == true && g_options.gallery_enable_tabs == true) { g_objtabs = new ugtabs(); g_objtabs.init(t, g_options); } //init loadmore button if (g_temp.isrunfirsttime == true && g_options.gallery_enable_loadmore == true) { g_objloadmore = new ugloadmore(); g_objloadmore.init(t, g_options); } //modify and verify the params if (iscustomoptions) modifyinitparams(g_temp.objcustomoptions); validateparams(); //shuffle items if (g_options.gallery_shuffle == true) t.shuffleitems(); //init the theme inittheme(g_temp.objcustomoptions); //set gallery html elements setgalleryhtml(); //set html properties to all elements sethtmlobjectsproperties(); var gallerywidth = g_objwrapper.width(); if (gallerywidth == 0) { g_functions.waitforwidth(g_objwrapper, rungalleryactually); } else rungalleryactually(); } /** * actually run the gallery */ function rungalleryactually() { t.setsizeclass(); if (g_temp.isfreestylemode == false) { if (g_options.gallery_preserve_ratio == true) setheightbyoriginalratio(); } g_objtheme.run(); if (g_objtabs && g_temp.isrunfirsttime) g_objtabs.run(); preloadbigimages(); initevents(); //select first item if (g_numitems > 0) t.selectitem(0); //set autoplay if (g_options.gallery_autoplay == true) t.startplaymode(); g_temp.isrunfirsttime = false; } /** * * show error message */ function showerrormessage(message, prefix) { if (typeof prefix == "undefined") var prefix = "unite gallery error: "; else prefix = "" + prefix + ": "; message = prefix + message; var html = "
" + message + "
"; g_objwrapper.children().remove(); g_objwrapper.html(html); g_objwrapper.show(); } /** * show error message and throw error */ function throwerrorshowmessage(message) { showerrormessage(message); throw new error(message); } /** * * @param objparams */ function modifyinitparams() { //set default for preloading if (!g_options.gallery_images_preload_type) g_options.gallery_images_preload_type = "minimal"; //normalize gallery min height and width if (g_options.gallery_min_height == undefined || g_options.gallery_height < g_options.gallery_min_height) { g_options.gallery_min_height = 0; } if (g_options.gallery_min_width == undefined || g_options.gallery_width < g_options.gallery_min_width) { g_options.gallery_min_width = 0; } } /** * validate the init parameters */ function validateparams() { //validate theme: if (!g_options.gallery_theme) throw new error("the gallery can't run without theme"); //if(typeof g_options.theme != "function") //throw new error("wrong theme function: " + g_options.theme.tostring()); //validate height and width if (jquery.isnumeric(g_options.gallery_height) && g_options.gallery_height < g_options.gallery_min_height) throw new error("the gallery_height option must be bigger then gallery_min_height option"); if (g_options.gallery_width < g_options.gallery_min_width) throw new error("the gallery_width option must be bigger then gallery_min_width option"); } /** * set gallery html */ function setgalleryhtml() { //add classes and divs g_objwrapper.addclass("ug-gallery-wrapper"); g_objwrapper.append(""); t.setsizeclass(); } /** * if the thumbs panel don't exists, delete initial images from dom */ function clearinitdata() { var objitems = g_objwrapper.children().remove(); } /** * store last gallery size */ function storelastsize() { var objsize = t.getsize(); g_temp.lastwidth = objsize.width; g_temp.lastheight = objsize.height; } /** * set gallery height by original ratio */ function setheightbyoriginalratio() { var objsize = t.getsize(); var ratio = objsize.width / objsize.height; if (ratio != objsize.orig_ratio) { var newheight = objsize.width / objsize.orig_ratio; newheight = math.round(newheight); if (newheight < g_options.gallery_min_height) newheight = g_options.gallery_min_height; g_objwrapper.height(newheight); } } /** * set properties of the html objects */ function sethtmlobjectsproperties() { var optionwidth = g_functions.getcsssizeparam(g_options.gallery_width); //set size var objcss = { //"width":optionwidth, //make it work within tabs "max-width": optionwidth, "min-width": g_functions.getcsssizeparam(g_options.gallery_min_width) }; if (g_temp.isfreestylemode == false) { var galleryheight = g_functions.getcsssizeparam(g_options.gallery_height); objcss["height"] = galleryheight; } else { objcss["overflow"] = "visible"; } //set background color if (g_options.gallery_background_color) objcss["background-color"] = g_options.gallery_background_color; g_objwrapper.css(objcss); } /** * fill item by html child */ function fillitembychild(objchild) { var ismobile = t.ismobilemode(); var tagname = objchild.prop("tagname").tolowercase(); //handle link wrapper var itemlink = ""; if (tagname == "a") { itemlink = objchild.attr("href"); objchild = objchild.children(); var tagname = objchild.prop("tagname").tolowercase(); } var itemtype = objchild.data("type"); if (itemtype == undefined) itemtype = "image"; var objitem = {}; objitem.type = itemtype; if (tagname == "img") { //protection agains lasy load var lasyloadsrc = objchild.data("lazyload-src"); if (lasyloadsrc && lasyloadsrc != "") { objchild.attr("src", lasyloadsrc); jquery.removedata(objchild, "lazyload-src"); } //src is thumb var urlimage = objchild.data("image"); var urlthumb = objchild.data("thumb"); if (typeof (urlimage) == "undefined") urlimage = null; if (typeof (urlthumb) == "undefined") urlthumb = null; var imagesrc = objchild.attr("src"); if (!urlimage) urlimage = imagesrc; if (!urlthumb) urlthumb = imagesrc; if (!urlthumb) urlthumb = urlimage; if (!urlimage) urlimage = urlthumb; objitem.urlthumb = urlthumb; objitem.urlimage = urlimage; objitem.title = objchild.attr("alt"); //always set thumb image to object objitem.objthumbimage = objchild; objitem.objthumbimage.attr("src", objitem.urlthumb); } else { if (itemtype == "image") { trace("problematic gallery item found:"); trace(objchild); trace("please look for some third party js script that could add this item to the gallery"); throw new error("the item should not be image type"); } objitem.urlthumb = objchild.data("thumb"); objitem.title = objchild.data("title"); objitem.objthumbimage = null; objitem.urlimage = objchild.data("image"); } //trace(ismobile); //check mobile version images if (ismobile == true) { var urlthumbmobile = objchild.data("thumb-mobile"); if (typeof urlthumbmobile != "undefined" && urlthumbmobile != "") { objitem.urlthumb = urlthumbmobile; if (tagname == "img") objchild.attr("src", objitem.urlthumb); } var urlimagemobile = objchild.data("image-mobile"); if (typeof urlimagemobile != "undefined" && urlimagemobile != "") objitem.urlimage = urlimagemobile; } objitem.link = itemlink; //get description: objitem.description = objchild.attr("title"); if (!objitem.description) objitem.description = objchild.data("description"); if (!objitem.description) objitem.description = ""; objitem.isnewadded = false; //fill outside objitem.isloaded = false; objitem.isthumbimageloaded = false; //if the image loaded or error load objitem.objpreloadimage = null; objitem.isbigimageloadstarted = false; objitem.isbigimageloaded = false; objitem.isbigimageloaderror = false; objitem.imagewidth = 0; objitem.imageheight = 0; //set thumb size objitem.thumbwidth = 0; objitem.thumbheight = 0; objitem.thumbratiobywidth = 0; objitem.thumbratiobyheight = 0; var datawidth = objchild.data("width"); var dataheight = objchild.data("height"); if (datawidth && typeof datawidth == "number" && dataheight && typeof dataheight == "number") { objitem.thumbwidth = datawidth; objitem.thumbheight = dataheight; objitem.thumbratiobywidth = datawidth / dataheight; objitem.thumbratiobyheight = dataheight / datawidth; } objitem.addhtml = null; var isimagemissing = (objitem.urlimage == undefined || objitem.urlimage == ""); var isthumbmissing = (objitem.urlthumb == undefined || objitem.urlthumb == ""); switch (objitem.type) { case "youtube": objitem.videoid = objchild.data("videoid"); if (isimagemissing || isthumbmissing) { var objimages = g_ugyoutubeapi.getvideoimages(objitem.videoid); //set preview image if (isimagemissing) objitem.urlimage = objimages.preview; //set thumb image if (isthumbmissing) { objitem.urlthumb = objimages.thumb; if (tagname == "img") objchild.attr("src", objitem.urlthumb); } } g_temp.isyoutubepresent = true; break; case "vimeo": objitem.videoid = objchild.data("videoid"); g_temp.isvimeopresent = true; break; case "html5video": objitem.videoogv = objchild.data("videoogv"); objitem.videowebm = objchild.data("videowebm"); objitem.videomp4 = objchild.data("videomp4"); g_temp.ishtml5videopresent = true; break; case "soundcloud": objitem.trackid = objchild.data("trackid"); g_temp.issoundcloudpresent = true; break; case "wistia": objitem.videoid = objchild.data("videoid"); g_temp.iswistiapresent = true; break; case "custom": var objchildimage = objchild.children("img"); if (objchildimage.length) { objchildimage = jquery(objchildimage[0]); objitem.urlthumb = objchildimage.attr("src"); objitem.title = objchildimage.attr("alt"); objitem.objthumbimage = objchildimage; } //add additional html var objchildren = objchild.children().not("img:first-child"); if (objchildren.length) objitem.addhtml = objchildren.clone(); break; } //clear not needed attributes if (objitem.objthumbimage) { objitem.objthumbimage.removeattr("data-description", ""); objitem.objthumbimage.removeattr("data-image", ""); objitem.objthumbimage.removeattr("data-thumb", ""); objitem.objthumbimage.removeattr("title", ""); } return (objitem); } /** * fill items array from images object */ function fillitemsarray(arrchildren, isappend) { if (isappend !== true) { g_arritems = []; } else { //append //clear last new added items for (var i = 0; i < g_numitems; i++) g_arritems[i].isnewadded = false; } for (var i = 0; i < arrchildren.length; i++) { var objchild = jquery(arrchildren[i]); var objitem = fillitembychild(objchild); numindex = g_arritems.length; objitem.index = numindex; if (isappend === true) { objitem.isnewadded = true; } g_arritems.push(objitem); } g_numitems = g_arritems.length; } /** * load api's according presented item types */ function loadapis() { //load youtube api if (g_temp.isyoutubepresent) g_ugyoutubeapi.loadapi(); if (g_temp.isvimeopresent) g_ugvimeoapi.loadapi(); if (g_temp.ishtml5videopresent) g_ughtml5mediaapi.loadapi(); if (g_temp.issoundcloudpresent) g_ugsoundcloudapi.loadapi(); if (g_temp.iswistiapresent) g_ugwistiaapi.loadapi(); } /** * preload big images */ function preloadbigimages() { //check and fix preload type if (g_options.gallery_images_preload_type == "visible" && !g_objthumbs) g_options.gallery_images_preload_type = "minimal"; if (g_temp.isallitemspreloaded == true) return (true); switch (g_options.gallery_images_preload_type) { default: case "minimal": break; case "all": jquery(g_arritems).each(function () { preloaditemimage(this); }); break; case "visible": jquery(g_arritems).each(function () { var objitem = this; var isvisible = g_objthumbs.isitemthumbvisible(objitem); if (isvisible == true) preloaditemimage(objitem); }); break; } } /** * check if item needed to preload and preload it */ function checkpreloaditemimage(objitem) { if (objitem.isbigimageloadstarted == true || objitem.isbigimageloaded == true || objitem.isbigimageloaderror == true) { return (false); } switch (g_options.gallery_images_preload_type) { default: case "minimal": break; case "all": preloaditemimage(objitem); break; case "visible": var isvisible = g_objthumbs.isitemthumbvisible(objitem); if (isvisible == true) preloaditemimage(objitem); break; } } /** * preload item image */ function preloaditemimage(objitem) { if (objitem.isbigimageloadstarted == true || objitem.isbigimageloaded == true || objitem.isbigimageloaderror == true) { return (true); } var imageurl = objitem.urlimage; if (imageurl == "" || imageurl == undefined) { objitem.isbigimageloaderror = true; return (false); } objitem.isbigimageloadstarted = true; objitem.objpreloadimage = jquery('').attr("src", imageurl); objitem.objpreloadimage.data("itemindex", objitem.index); //set image load event (not that reliable) objitem.objpreloadimage.on("load", t.onitembigimageloaded); //set load error event objitem.objpreloadimage.on("error", function () { var objimage = jquery(this); var itemindex = objimage.data("itemindex"); var objitem = g_arritems[itemindex]; //update error: objitem.isbigimageloaderror = true; objitem.isbigimageloaded = false; //print error var imageurl = jquery(this).attr("src"); console.log("can't load image: " + imageurl); //try to load the image again g_objgallery.trigger(t.events.item_image_updated, [itemindex, objitem.urlimage]); objitem.objthumbimage.attr("src", objitem.urlthumb); }); //check the all items started preloading flag checkallitemsstartedpreloading(); } /** * on item big image loaded event function. * update image size and that the image has been preloaded * can be called from another objects like the slider */ this.onitembigimageloaded = function (event, objimage) { if (!objimage) var objimage = jquery(this); var itemindex = objimage.data("itemindex"); var objitem = g_arritems[itemindex]; objitem.isbigimageloaded = true; //get size with fallback function var objsize = g_functions.getimageoriginalsize(objimage); objitem.imagewidth = objsize.width; objitem.imageheight = objsize.height; } /** * check and fill image size in item object */ this.checkfillimagesize = function (objimage, objitem) { if (!objitem) { var itemindex = objimage.data("itemindex"); if (itemindex === undefined) throw new error("wrong image given to gallery.checkfillimagesize"); var objitem = g_arritems[itemindex]; } var objsize = g_functions.getimageoriginalsize(objimage); objitem.imagewidth = objsize.width; objitem.imageheight = objsize.height; } /** * preload next images near current item */ function preloadnearbigimages(objitem) { if (g_temp.isallitemspreloaded == true) return (false); if (!objitem) var objitem = g_selecteditem; if (!objitem) return (true); var currentindex = objitem.index; var lastitemindex = currentindex - 1; var nextitemindex = currentindex + 1; if (lastitemindex > 0) preloaditemimage(g_arritems[lastitemindex]); if (nextitemindex < g_numitems) preloaditemimage(g_arritems[nextitemindex]); } /** * check that all items started preloading, if do, set * flag g_temp.isallitemspreloaded to true */ function checkallitemsstartedpreloading() { if (g_temp.isallitemspreloaded == true) return (false); //if some of the items not started, exit function: for (var index in g_arritems) { if (g_arritems[index].isbigimageloadstarted == false) return (false); } //if all started, set flag to true g_temp.isallitemspreloaded = true; } /** * set freestyle mode */ this.setfreestylemode = function () { g_temp.isfreestylemode = true; } /** * attach thumbs panel to the gallery */ this.attachthumbspanel = function (type, objthumbs) { g_temp.thumbstype = type; g_objthumbs = objthumbs; } /** * init the slider */ this.initslider = function (customoptions, optionsprefix) { //mix options with user options if (!customoptions) var customoptions = {}; customoptions = jquery.extend(g_temp.objcustomoptions, customoptions); g_objslider = new ugslider(); g_objslider.init(t, customoptions, optionsprefix); } function __________end_init_gallery_______() { }; function __________events_____________() { }; /** * on gallery mousewheel event handler, advance the thumbs */ this.ongallerymousewheel = function (event, delta, deltax, deltay) { event.preventdefault(); if (delta > 0) t.previtem(); else t.nextitem(); } /** * on mouse enter event */ function onslidermouseenter(event) { if (g_options.gallery_pause_on_mouseover == true && t.isfullscreen() == false && g_temp.isplaymode == true && g_objslider && g_objslider.isslideactionactive() == false) t.pauseplaying(); } /** * on mouse move event */ function onslidermouseleave(event) { if (g_options.gallery_pause_on_mouseover == true && g_temp.isplaymode == true && g_objslider && g_objslider.isslideactionactive() == false) { var isstillloading = g_objslider.iscurrentslideloadingimage(); if (isstillloading == false) t.continueplaying(); } } /** * on keypress - keyboard control */ function onkeypress(event) { var obj = jquery(event.target); if (obj.is("textarea") || obj.is("select") || obj.is("input")) return (true); var keycode = (event.charcode) ? event.charcode : ((event.keycode) ? event.keycode : ((event.which) ? event.which : 0)); var wasaction = true; switch (keycode) { case 39: //right key t.nextitem(); break; case 37: //left key t.previtem(); break; default: wasaction = false; break; } //only first page gallery affected if (wasaction == true) { event.preventdefault(); event.stoppropagation(); event.stopimmediatepropagation(); } g_objgallery.trigger(t.events.gallery_keypress, [keycode, event]); } /** * check that the gallery resized, if do, trigger onresize event */ function ongalleryresized() { var objsize = t.getsize(); if (objsize.width == 0) //fix hidden gallery change return (true); t.setsizeclass(); var objsize = t.getsize(); if (objsize.width != g_temp.lastwidth || (g_temp.isfreestylemode == false && objsize.height != g_temp.lastheight)) { var heightwasset = false; //set height with custom function (if exists) if (g_temp.funccustomheight) { var newheight = g_temp.funccustomheight(objsize); if (newheight) { g_objwrapper.height(newheight); heightwasset = true; } } if (heightwasset == false && g_options.gallery_preserve_ratio == true && g_temp.isfreestylemode == false) setheightbyoriginalratio(); storelastsize(); g_objgallery.trigger(t.events.size_change); } } /** * on strip move event * preload visible images if that option selected */ function onthumbschange(event) { //preload visible images if (g_options.gallery_images_preload_type == "visible" && g_temp.isallitemspreloaded == false) { preloadbigimages(); } } /** * on full screen change event */ function onfullscreenchange() { var isfullscreen = g_functions.isfullscreen(); var event = isfullscreen ? t.events.enter_fullscreen : t.events.exit_fullscreen; var fullscreenid = g_functions.getglobaldata("fullscreenid"); //check if this gallery was affected if (g_galleryid !== fullscreenid) return (true); //add classes for the gallery if (isfullscreen) { g_objwrapper.addclass("ug-fullscreen"); } else { g_objwrapper.removeclass("ug-fullscreen"); } g_objgallery.trigger(event); ongalleryresized(); } /** * on big image updated, if needed - preload this item image */ function onitemimageupdated(event, index) { var objitem = t.getitem(index); checkpreloaditemimage(objitem); } /** * on current slide image load end. if playing mode, begin playing again */ function oncurrentslideimageloadend() { if (t.isplaymode() == true) t.continueplaying(); } /** * init all events */ function initevents() { //avoid annoyong firefox image dragging g_objwrapper.on("dragstart", function (event) { event.preventdefault(); }); //on big image updated, if needed - preload this item image g_objgallery.on(t.events.item_image_updated, onitemimageupdated); //init custom event on strip moving if (g_objthumbs) { switch (g_temp.thumbstype) { case "strip": jquery(g_objthumbs).on(g_objthumbs.events.strip_move, onthumbschange); break; case "grid": jquery(g_objthumbs).on(g_objthumbs.events.pane_change, onthumbschange); break; } } //init mouse wheel if (g_options.gallery_mousewheel_role == "advance" && g_temp.isfreestylemode == false) g_objwrapper.on("mousewheel", t.ongallerymousewheel); //on resize event storelastsize(); jquery(window).resize(function () { g_objwrapper.css("width", "auto"); g_functions.whencontiniouseventover("gallery_resize", ongalleryresized, g_temp.resizedelay); }); //check resize once in a time, start from 10 seconds settimeout(function () { setinterval(ongalleryresized, 2000); }, 10000); //fullscreen: g_functions.addfullscreenchangeevent(onfullscreenchange); //on slider item changed event if (g_objslider) { jquery(g_objslider).on(g_objslider.events.item_changed, function () { var sliderindex = g_objslider.getcurrentitemindex(); if (sliderindex != -1) t.selectitem(sliderindex); }); //add slider onmousemove event if (g_options.gallery_pause_on_mouseover == true) { var sliderelement = g_objslider.getelement(); sliderelement.hover(onslidermouseenter, onslidermouseleave); //on full screen, run on mouse leave g_objgallery.on(t.events.enter_fullscreen, function () { onslidermouseleave(); }); } //retrigger slider events retriggerevent(g_objslider, g_objslider.events.action_start, t.events.slider_action_start); retriggerevent(g_objslider, g_objslider.events.action_end, t.events.slider_action_end); jquery(g_objslider).on(g_objslider.events.currentslide_load_end, oncurrentslideimageloadend); } //add keyboard events if (g_options.gallery_control_keyboard == true) jquery(document).keydown(onkeypress); } /** * destroy all gallery events */ this.destroy = function () { g_objwrapper.off("dragstart"); g_objgallery.off(t.events.item_image_updated); //init custom event on strip moving if (g_objthumbs) { switch (g_temp.thumbstype) { case "strip": jquery(g_objthumbs).off(g_objthumbs.events.strip_move); break; case "grid": jquery(g_objthumbs).off(g_objthumbs.events.pane_change); break; } } g_objwrapper.off("mousewheel"); jquery(window).off("resize"); //fullscreen: g_functions.destroyfullscreenchangeevent(); //on slider item changed event if (g_objslider) { jquery(g_objslider).off(g_objslider.events.item_changed); //add slider onmousemove event var sliderelement = g_objslider.getelement(); sliderelement.off("mouseenter"); sliderelement.off("mouseleave"); g_objgallery.off(t.events.enter_fullscreen); jquery(g_objslider).off(g_objslider.events.action_start); jquery(g_objslider).off(g_objslider.events.action_end); jquery(g_objslider).off(g_objslider.events.currentslide_load_end); } //add keyboard events if (g_options.gallery_control_keyboard == true) jquery(document).off("keydown"); //destroy theme if (g_objtheme && typeof g_objtheme.destroy == "function") { g_objtheme.destroy(); } g_objwrapper.html(""); } function __________general_______() { }; /** * get items array */ this.getarritems = function () { return g_arritems; } /** * get gallery objects */ this.getobjects = function () { var objects = { g_galleryid: g_galleryid, g_objwrapper: g_objwrapper, g_objthumbs: g_objthumbs, g_objslider: g_objslider, g_options: g_options, g_arritems: g_arritems, g_numitems: g_numitems }; return (objects); } /** * get slider object */ this.getobjslider = function () { return (g_objslider); } /** * * get item by index, if the index don't fit, trace error */ this.getitem = function (index) { if (index < 0) { throw new error("item with index: " + index + " not found"); return (null); } if (index >= g_numitems) { throw new error("item with index: " + index + " not found"); return (null); } return (g_arritems[index]); } /** * get gallery width */ this.getwidth = function () { var objsize = t.getsize(); return (objsize.width); } /** * get gallery height */ this.getheight = function () { var objsize = t.getsize(); return (objsize.height); } /** * get gallery size */ this.getsize = function () { var objsize = g_functions.getelementsize(g_objwrapper); objsize.orig_width = g_options.gallery_width; objsize.orig_height = g_options.gallery_height; objsize.orig_ratio = objsize.orig_width / objsize.orig_height; return (objsize); } /** * get gallery id */ this.getgalleryid = function () { var id = g_galleryid.replace("#", ""); return (id); } /** * get next item by current index (or current object) */ this.getnextitem = function (index, forcecarousel) { if (typeof index == "object") index = index.index; var nextindex = index + 1; if (forcecarousel !== true && g_numitems == 1) return (null); if (nextindex >= g_numitems) { if (g_options.gallery_carousel == true || forcecarousel === true) nextindex = 0; else return (null); } var objitem = g_arritems[nextindex]; return (objitem); } /** * get previous item by index (or item object) */ this.getprevitem = function (index) { if (typeof index == "object") index = index.index; var previndex = index - 1; if (previndex < 0) { if (g_options.gallery_carousel == true || forcecarousel === true) previndex = g_numitems - 1; else return (null); } var objitem = g_arritems[previndex]; return (objitem); } /** * get selected item */ this.getselecteditem = function () { return (g_selecteditem); } /** * get selected item index */ this.getselecteditemindex = function () { return (g_selecteditemindex); } /** * get number of items */ this.getnumitems = function () { return g_numitems; } /** * get true if the current item is last */ this.islastitem = function () { if (g_selecteditemindex == g_numitems - 1) return (true); return (false); } /** * get true if the current item is first */ this.isfirstitem = function () { if (g_selecteditemindex == 0) return (true); return (false); } /** * get gallery options */ this.getoptions = function () { return g_options; } /** * get the gallery wrapper element */ this.getelement = function () { return (g_objwrapper); } this.___________set_controls___________ = function () { } /** * set next button element * set onclick event */ this.setnextbutton = function (objbutton) { //register button as a unite gallery belong objbutton.data("ug-button", true); g_functions.setbuttononclick(objbutton, t.nextitem); } /** * set prev button element * set onclick event */ this.setprevbutton = function (objbutton) { //register button as a unite gallery belong objbutton.data("ug-button", true); g_functions.setbuttononclick(objbutton, t.previtem); } /** * set fullscreen button to enter / exit fullscreen. * on fullscreen mode ug-fullscreenmode class wil be added */ this.setfullscreentogglebutton = function (objbutton) { //register button as a unite gallery belong objbutton.data("ug-button", true); g_functions.setbuttonontap(objbutton, t.togglefullscreen); g_objgallery.on(t.events.enter_fullscreen, function () { objbutton.addclass("ug-fullscreenmode"); }); g_objgallery.on(t.events.exit_fullscreen, function () { objbutton.removeclass("ug-fullscreenmode"); }); } /** * destroy full screen button */ this.destroyfullscreenbutton = function (objbutton) { g_functions.destroybutton(objbutton); g_objgallery.off(t.events.enter_fullscreen); g_objgallery.off(t.events.exit_fullscreen); } /** * set play button event */ this.setplaybutton = function (objbutton) { //register button as a unite gallery belong objbutton.data("ug-button", true); g_functions.setbuttononclick(objbutton, t.toggleplaymode); g_objgallery.on(t.events.start_play, function () { objbutton.addclass("ug-stop-mode"); }); g_objgallery.on(t.events.stop_play, function () { objbutton.removeclass("ug-stop-mode"); }); } /** * destroy the play button */ this.destroyplaybutton = function (objbutton) { g_functions.destroybutton(objbutton); g_objgallery.off(t.events.start_play); g_objgallery.off(t.events.stop_play); } /** * set playing progress indicator */ this.setprogressindicator = function (objprogress) { g_temp.objprogress = objprogress; } /** * set title and descreiption containers */ this.settextcontainers = function (objtitle, objdescription) { g_objgallery.on(t.events.item_change, function () { var objitem = t.getselecteditem(); objtitle.html(objitem.title); objdescription.html(objitem.description); }); } /** * show overlay disabled */ this.showdisabledoverlay = function () { g_objwrapper.children(".ug-overlay-disabled").show(); } /** * show overlay disabled */ this.hidedisabledoverlay = function () { g_objwrapper.children(".ug-overlay-disabled").hide(); } this.___________end_set_controls___________ = function () { } /** * cache items, put to cache array by id * the items must be unprocessed yet */ function cacheitems(cacheid, htmlitemsarg) { if (htmlitemsarg) { var htmlitems = htmlitemsarg; if (htmlitems != "noitems") htmlitems = jquery(htmlitemsarg).clone(); } else { var htmlitems = g_objwrapper.children().clone(); } g_objcache[cacheid] = htmlitems; } /** * remove all size classes */ function removeallsizeclasses(objwrapper) { if (!objwrapper) objwrapper = g_objwrapper; objwrapper.removeclass("ug-under-480"); objwrapper.removeclass("ug-under-780"); objwrapper.removeclass("ug-under-960"); } /** * retrigger event from another objects * the second parameter will be the second object */ function retriggerevent(object, originalevent, newevent) { jquery(object).on(originalevent, function (event) { g_objgallery.trigger(newevent, [this]); }); } /** * advance next play step */ function advancenextstep() { var timenow = jquery.now(); var timediff = timenow - g_temp.playtimelaststep; g_temp.playtimelaststep = timenow; var isvisible = t.isgalleryvisible(); if (isvisible == false) { return (false); } g_temp.playtimepassed += timediff; //set the progress if (g_temp.objprogress) { var percent = g_temp.playtimepassed / g_options.gallery_play_interval; g_temp.objprogress.setprogress(percent); } //if interval passed - proceed to next item if (g_temp.playtimepassed >= g_options.gallery_play_interval) { t.nextitem(); g_temp.playtimepassed = 0; } } this.___________play_mode___________ = function () { } /** * start play mode */ this.startplaymode = function () { g_temp.isplaymode = true; g_temp.isplaymodepaused = false; g_temp.playtimepassed = 0; g_temp.playtimelaststep = jquery.now(); g_temp.playhandle = setinterval(advancenextstep, g_temp.playstepinterval); //show and reset progress indicator if (g_temp.objprogress) { var objelement = g_temp.objprogress.getelement(); g_temp.objprogress.setprogress(0); objelement.show(); } g_objgallery.trigger(t.events.start_play); //check if there is a need to pause if (g_objslider && g_objslider.iscurrentslideloadingimage() == true) { t.pauseplaying(); } } /** * reset playing - set the timer to 0 */ this.resetplaying = function () { if (g_temp.isplaymode == false) return (true); g_temp.playtimepassed = 0; g_temp.playtimelaststep = jquery.now(); } /** * pause playing slideshow */ this.pauseplaying = function () { if (g_temp.isplaymodepaused == true) return (true); g_temp.isplaymodepaused = true; clearinterval(g_temp.playhandle); g_objgallery.trigger(t.events.pause_playing); } /** * continue playing slideshow */ this.continueplaying = function () { if (g_temp.isplaymodepaused == false) return (true); g_temp.isplaymodepaused = false; g_temp.playtimelaststep = jquery.now(); g_temp.playhandle = setinterval(advancenextstep, g_temp.playstepinterval); } /** * stop play mode */ this.stopplaymode = function () { g_temp.isplaymode = false; clearinterval(g_temp.playhandle); g_temp.playtimepassed = 0; //hide progress indicator if (g_temp.objprogress) { var objelement = g_temp.objprogress.getelement(); objelement.hide(); } g_objgallery.trigger(t.events.stop_play); } /** * tells if the play mode are active */ this.isplaymode = function () { return (g_temp.isplaymode); } /** * start / stop play mode */ this.toggleplaymode = function () { if (t.isplaymode() == false) t.startplaymode(); else t.stopplaymode(); } /** * unselect all items */ function unselectseleteditem() { if (g_selecteditem == null) return (true); if (g_objthumbs) g_objthumbs.setthumbunselected(g_selecteditem.objthumbwrapper); g_selecteditem = null; g_selecteditemindex = -1; } this.___________general_external___________ = function () { } /** * shuffle items - usually before theme start */ this.shuffleitems = function () { g_arritems = g_functions.arrayshuffle(g_arritems); for (var index in g_arritems) //fix index g_arritems[index].index = parseint(index); } /** * set main gallery params, extend current params */ this.setoptions = function (customoptions) { g_options = jquery.extend(g_options, customoptions); } /** * select some item * the input can be index or object * role - the role of the object who selected the item */ this.selectitem = function (objitem, role) { if (typeof objitem == "number") objitem = t.getitem(objitem); var itemindex = objitem.index; if (itemindex == g_selecteditemindex) return (true); unselectseleteditem(); //set selected item g_selecteditem = objitem; g_selecteditemindex = itemindex; g_objgallery.trigger(t.events.item_change, [objitem, role]); //reset playback, if playing if (g_temp.isplaymode == true) { t.resetplaying(); var stillloading = g_objslider.iscurrentslideloadingimage(); if (stillloading == true) t.pauseplaying(); } } /** * go to next item */ this.nextitem = function () { var newitemindex = g_selecteditemindex + 1; if (g_numitems == 0) return (true); if (g_options.gallery_carousel == false && newitemindex >= g_numitems) return (true); if (newitemindex >= g_numitems) newitemindex = 0; //debugline(newitemindex,true); t.selectitem(newitemindex, "next"); } /** * go to previous item */ this.previtem = function () { var newitemindex = g_selecteditemindex - 1; if (g_selecteditemindex == -1) newitemindex = 0; if (g_numitems == 0) return (true); if (g_options.gallery_carousel == false && newitemindex < 0) return (true); if (newitemindex < 0) newitemindex = g_numitems - 1; t.selectitem(newitemindex, "prev"); } /** * expand gallery to body size */ function tofakefullscreen() { jquery("body").addclass("ug-body-fullscreen"); g_objwrapper.addclass("ug-fake-fullscreen"); g_temp.isfakefullscreen = true; g_objgallery.trigger(t.events.enter_fullscreen); g_objgallery.trigger(t.events.size_change); } /** * exit fake fullscreen */ function exitfakefullscreen() { jquery("body").removeclass("ug-body-fullscreen"); g_objwrapper.removeclass("ug-fake-fullscreen"); g_temp.isfakefullscreen = false; g_objgallery.trigger(t.events.exit_fullscreen); g_objgallery.trigger(t.events.size_change); } /** * return if the fullscreen mode is available */ this.isfullscreen = function () { if (g_temp.isfakefullscreen == true) return (true); if (g_functions.isfullscreen() == true) return (true); return (false); } /** * tells if it's fake fullscreen */ this.isfakefullscreen = function () { return (g_temp.isfakefullscreen); } /** * go to fullscreen mode */ this.tofullscreen = function () { g_functions.setglobaldata("fullscreenid", g_galleryid); var divgallery = g_objwrapper.get(0); var issupported = g_functions.tofullscreen(divgallery); if (issupported == false) tofakefullscreen(); } /** * exit full screen */ this.exitfullscreen = function () { if (g_temp.isfakefullscreen == true) exitfakefullscreen(); else g_functions.exitfullscreen(); } /** * toggle fullscreen */ this.togglefullscreen = function () { if (t.isfullscreen() == false) { t.tofullscreen(); } else { t.exitfullscreen(); } } /** * resize the gallery * noevent - initally false */ this.resize = function (newwidth, newheight, noevent) { g_objwrapper.css("width", "auto"); g_objwrapper.css("max-width", newwidth + "px"); if (newheight) g_objwrapper.height(newheight); if (!noevent && noevent !== true) ongalleryresized(); } /** * set size class to the wrapper * this can work to any other wrapper too */ this.setsizeclass = function (objwrapper, width) { if (!objwrapper) var objwrapper = g_objwrapper; if (!width) { var objsize = t.getsize(); var width = objsize.width; } if (width == 0) var width = jquery(window).width(); var addclass = ""; if (width <= 480) { addclass = "ug-under-480"; } else if (width <= 780) { addclass = "ug-under-780"; } else if (width < 960) { addclass = "ug-under-960"; } if (objwrapper.hasclass(addclass) == true) return (true); removeallsizeclasses(objwrapper); if (addclass != "") objwrapper.addclass(addclass); } /** * return if the size is suited for mobile */ this.ismobilemode = function () { if (g_objwrapper.hasclass("ug-under-480")) return (true); return (false); } /** * get if small screen */ this.issmallwindow = function () { var windowwidth = jquery(window).width(); if (!windowwidth) return (true); if (windowwidth <= 480) return (true); return (false); } /** * check if the gallery is visible */ this.isgalleryvisible = function () { var isvisible = g_objwrapper.is(":visible"); return (isvisible); } /** * change gallery items */ this.changeitems = function (itemscontent, cacheid) { if (!itemscontent) var itemscontent = "noitems"; rungallery(g_galleryid, "nochange", itemscontent, cacheid); } /** * add items */ this.additems = function (itemscontent) { if (!itemscontent || itemscontent.length == 0) return (false); //add new items wrapper var objnewitemswrapper = g_objwrapper.children(".ug-newitems-wrapper"); if (objnewitemswrapper.length == 0) g_objwrapper.append(""); objnewitemswrapper = g_objwrapper.children(".ug-newitems-wrapper"); //add the items objnewitemswrapper.append(itemscontent); var objchildren = jquery(objnewitemswrapper.children()); fillitemsarray(objchildren, true); loadapis(); if (!g_objtheme || typeof g_objtheme.additems != "function") throw new error("additems function not found in the theme"); objnewitemswrapper.remove(); g_objtheme.additems(); } /** * get new added items indexes array */ this.getnewaddeditemsindexes = function () { var arrindexes = []; jquery.each(g_arritems, function (index, objitem) { if (objitem.isnewadded == true) arrindexes.push(index); }); return (arrindexes); } /** * show error message, replace whole gallery div */ this.showerrormessagereplacegallery = function (message) { showerrormessage(message); } /** * set custom height function by width */ this.setfunccustomheight = function (func) { g_temp.funccustomheight = func; } this.__________external_events_______ = function () { }; /** * trigger event */ this.triggerevent = function (event, arrparams) { if (!arrparams) g_objgallery.trigger(event); else { if (jquery.type(arrparams) != "array") arrparams = [arrparams]; g_objgallery.trigger(event, arrparams); } } /** * on event */ this.onevent = function (event, func) { g_objgallery.on(event, func); } /** * destroy event */ this.destroyevent = function (event) { g_objgallery.off(event); } this.__________ajax_request_______ = function () { }; /** * ajax request */ this.ajaxrequest = function (action, data, successfunction, errorfunction) { if (!successfunction || typeof successfunction != "function") throw new error("ajaxrequest error: success function should be passed"); var urlajax = g_options.gallery_urlajax; if (!urlajax || urlajax == "") throw new error("ajaxrequest error: ajax url don't passed"); if (typeof data == "undefined") var data = {}; //add galleryid to data var objdata = { action: "unitegallery_ajax_action", client_action: action, galleryid: g_galleryid, data: data }; jquery.ajax({ type: "post", url: g_options.gallery_urlajax, datatype: 'json', data: objdata, success: function (response) { if (!response) { throw new error("empty ajax response!"); } if (response == -1 || response === 0) throw new error("ajax error!!!"); if (typeof response.success == "undefined") throw new error("ajax error!!!"); if (response.success == false) { showerrormessage(response.message, "ajax error"); return (false); } successfunction(response); }, error: function (jqxhr, textstatus, errorthrown) { console.log("ajax error!!! " + textstatus); responsetext = jqxhr.responsetext; if (errorfunction && typeof errorfunction == "function") { errorfunction(responsetext); } else trace(responsetext); } }); } /** * request new items * isforce - don't take from cache */ this.requestnewitems = function (catid, isforce, cacheid) { var checkcache = g_options.gallery_enable_cache; if (!cacheid) cacheid = catid; if (isforce == true) checkcache = false; //get items from cache if (checkcache == true && g_objcache.hasownproperty(cacheid)) { var htmlitems = g_objcache[cacheid]; t.changeitems(htmlitems, cacheid); } else { g_objgallery.trigger(t.events.gallery_before_request_items); t.ajaxrequest("front_get_cat_items", { catid: catid }, function (response) { var htmlitems = response.html; t.changeitems(htmlitems, cacheid); }); } } /** * run the gallery */ this.run = function (galleryid, objparams) { var debug_errors = g_options.gallery_debug_errors; if (objparams && objparams.hasownproperty("gallery_debug_errors")) g_options.gallery_debug_errors = objparams.gallery_debug_errors; if (g_options.gallery_debug_errors == true) { try { rungallery(galleryid, objparams); } catch (objerror) { if (typeof objerror == "object") { var message = objerror.message; var linenumber = objerror.linenumber; var filename = objerror.filename; var stack = objerror.stack; message += "

in file: " + filename; message += " line " + linenumber + ""; trace(objerror); } else { var message = objerror; } //remove double "error:" text message = message.replace("error:", ""); showerrormessage(message); } } else { rungallery(galleryid, objparams); } } } //unitegallery object end /** * tiles class */ function uglightbox() { var t = this, g_objthis = jquery(this); var g_gallery = new unitegallerymain(), g_objgallery, g_objwrapper; var g_objslider = new ugslider(), g_objoverlay, g_objarrowleft, g_objarrowright, g_objbuttonclose; var g_functions = new ugfunctions(), g_objtextpanel = new ugtextpanel(), g_objnumbers; var g_objtoppanel; var g_options = { lightbox_type: "wide", //compact / wide - lightbox type lightbox_show_textpanel: true, //show the text panel lightbox_textpanel_width: 550, //the width of the text panel. lightbox_hide_arrows_onvideoplay: true, //hide the arrows when video start playing and show when stop lightbox_arrows_position: "sides", //sides, inside: position of the arrows, used on compact type lightbox_arrows_offset: 10, //the horizontal offset of the arrows lightbox_arrows_inside_offset: 10, //the offset from the image border if the arrows placed inside lightbox_arrows_inside_alwayson: false, //show the arrows on mouseover, or always on. lightbox_overlay_color: null, //the color of the overlay. if null - will take from css lightbox_overlay_opacity: 1, //the opacity of the overlay. if null - will take from css lightbox_top_panel_opacity: null, //the opacity of the top panel lightbox_show_numbers: true, //show numbers on the right side lightbox_numbers_size: null, //the size of the numbers string lightbox_numbers_color: null, //the color of the numbers lightbox_numbers_padding_top: null, //the top padding of the numbers (used in compact mode) lightbox_numbers_padding_right: null, //the right padding of the numbers (used in compact mode) lightbox_compact_closebutton_offsetx: 1, //the offsetx of the close button. valid only for compact mode lightbox_compact_closebutton_offsety: 1, //the offsetx of the close button. valid only for compact mode lightbox_close_on_emptyspace: true //close the lightbox on empty space }; this.events = { lightbox_init: "lightbox_init" }; var g_temp = { toppanelheight: 44, inittextpanelheight: 26, //init height for compact mode isopened: false, isrightnowopened: false, putslider: true, iscompact: false, fadeduration: 300, positionfrom: null, textpaneltop: null, textpanelleft: null, isarrowsinside: false, isarrowsonhovermode: false, lastmousex: null, lastmousey: null, originaloptions: null, issliderchangedonce: false, istoppanelenabled: true }; var g_defaults = { lightbox_slider_controls_always_on: true, lightbox_slider_enable_bullets: false, lightbox_slider_enable_arrows: false, lightbox_slider_enable_progress_indicator: false, lightbox_slider_enable_play_button: false, lightbox_slider_enable_fullscreen_button: false, lightbox_slider_enable_zoom_panel: false, lightbox_slider_enable_text_panel: false, lightbox_slider_scale_mode_media: "down", lightbox_slider_scale_mode: "down", lightbox_slider_loader_type: 3, lightbox_slider_loader_color: "black", lightbox_slider_transition: "fade", lightbox_slider_image_padding_top: g_temp.toppanelheight, lightbox_slider_image_padding_bottom: 0, lightbox_slider_video_padding_top: 0, lightbox_slider_video_padding_bottom: 0, lightbox_textpanel_align: "middle", lightbox_textpanel_padding_top: 5, lightbox_textpanel_padding_bottom: 5, slider_video_constantsize: false, lightbox_slider_image_border: false, lightbox_textpanel_enable_title: true, lightbox_textpanel_enable_description: false, lightbox_textpanel_desc_style_as_title: true, lightbox_textpanel_enable_bg: false, video_enable_closebutton: false, lightbox_slider_video_enable_closebutton: false, video_youtube_showinfo: false, lightbox_slider_enable_links: false }; var g_defaultscompact = { lightbox_overlay_opacity: 0.6, lightbox_slider_image_border: true, lightbox_slider_image_shadow: true, lightbox_slider_image_padding_top: 30, lightbox_slider_image_padding_bottom: 30, slider_video_constantsize: true, lightbox_textpanel_align: "bottom", lightbox_textpanel_title_text_align: "left", lightbox_textpanel_desc_text_align: "left", lightbox_textpanel_padding_left: 10, //the padding left of the textpanel lightbox_textpanel_padding_right: 10 }; function __________general_________() { }; /** * init the gallery */ function initlightbox(gallery, customoptions) { g_gallery = gallery; g_objgallery = jquery(gallery); g_options = jquery.extend(g_options, g_defaults); g_options = jquery.extend(g_options, customoptions); g_temp.originaloptions = jquery.extend({}, g_options); if (g_options.lightbox_type == "compact") { g_temp.iscompact = true; g_options = jquery.extend(g_options, g_defaultscompact); g_options = jquery.extend(g_options, customoptions); } //modify some options modifyoptions(); if (g_temp.putslider == true) { g_gallery.initslider(g_options, "lightbox"); g_objects = gallery.getobjects(); g_objslider = g_objects.g_objslider; } else { g_objslider = null; } if (g_options.lightbox_show_textpanel == true) { g_objtextpanel.init(g_gallery, g_options, "lightbox"); } else g_objtextpanel = null; } /** * modify some options according user options */ function modifyoptions() { if (g_temp.iscompact == true && g_options.lightbox_show_textpanel == true) { g_options.lightbox_slider_image_padding_bottom = g_temp.inittextpanelheight; } if (g_temp.iscompact == true && g_options.lightbox_arrows_position == "inside") { g_temp.isarrowsinside = true; } if (g_temp.isarrowsinside == true && g_options.lightbox_arrows_inside_alwayson == false) g_temp.isarrowsonhovermode = true; //disable top panel if no text panel enabled if (g_options.lightbox_show_textpanel == false) { g_temp.istoppanelenabled = false; g_temp.toppanelheight = 0; g_options.lightbox_slider_image_padding_top = 0; } //modify slider image border width } /** * put the lightbox html */ function putlightboxhtml() { var html = ""; var classaddition = ""; if (g_temp.iscompact == true) { classaddition = " ug-lightbox-compact"; } html += ""; g_objwrapper = jquery(html); jquery("body").append(g_objwrapper); if (g_objslider) g_objslider.sethtml(g_objwrapper); g_objoverlay = g_objwrapper.children(".ug-lightbox-overlay"); if (g_temp.iscompact == false && g_temp.istoppanelenabled == true) { g_objtoppanel = g_objwrapper.children(".ug-lightbox-top-panel"); if (g_objtoppanel.length == 0) g_objtoppanel = null; } g_objbuttonclose = g_objwrapper.find(".ug-lightbox-button-close"); if (g_options.lightbox_show_numbers) g_objnumbers = g_objwrapper.find(".ug-lightbox-numbers"); g_objarrowleft = g_objwrapper.children(".ug-lightbox-arrow-left"); g_objarrowright = g_objwrapper.children(".ug-lightbox-arrow-right"); if (g_objtextpanel) { if (g_objtoppanel) g_objtextpanel.appendhtml(g_objtoppanel); else g_objtextpanel.appendhtml(g_objwrapper); } } /** * set lightbox properties */ function setproperties() { if (g_options.lightbox_overlay_color !== null) g_objoverlay.css("background-color", g_options.lightbox_overlay_color); if (g_options.lightbox_overlay_opacity !== null) g_objoverlay.fadeto(0, g_options.lightbox_overlay_opacity); if (g_objtoppanel && g_options.lightbox_top_panel_opacity !== null) { g_objtoppanel.children(".ug-lightbox-top-panel-overlay").fadeto(0, g_options.lightbox_top_panel_opacity); } //set numbers properties if (g_objnumbers) { var cssnumbers = {}; if (g_options.lightbox_numbers_size !== null) cssnumbers["font-size"] = g_options.lightbox_numbers_size + "px"; if (g_options.lightbox_numbers_color) cssnumbers["color"] = g_options.lightbox_numbers_color; if (g_options.lightbox_numbers_padding_right !== null) cssnumbers["padding-right"] = g_options.lightbox_numbers_padding_right + "px"; if (g_options.lightbox_numbers_padding_top !== null) cssnumbers["padding-top"] = g_options.lightbox_numbers_padding_top + "px"; g_objnumbers.css(cssnumbers); } } /** * refresh slider item with new height */ function refreshslideritem(newheight) { if (!g_objslider) return (true); //set slider new image position var objoptions = { slider_image_padding_top: newheight }; g_objslider.setoptions(objoptions); g_objslider.refreshslideitems(); } function __________wide_only_________() { }; /** * handle panel height according text height */ function handlepanelheight(fromwhere) { if (!g_objtoppanel) return (false); if (!g_objtextpanel) return (false); //check text panel size, get the panel bigger then var panelheight = g_objtoppanel.height(); if (panelheight == 0) return (false); if (g_objtoppanel.is(":visible") == false) return (false); var newpanelheight = panelheight; var objtextpanelsize = g_objtextpanel.getsize(); var textpanelheight = objtextpanelsize.height; if (panelheight != g_temp.toppanelheight) newpanelheight = g_temp.toppanelheight; if (textpanelheight > newpanelheight) newpanelheight = textpanelheight; if (panelheight != newpanelheight) { g_objtoppanel.height(newpanelheight); if (g_objslider && g_objslider.isanimating() == false) refreshslideritem(newpanelheight); } } /** * position text panel for wide * size - wrapper size */ function positiontextpanelwide(size) { var objoptions = {}; var textwidth = g_options.lightbox_textpanel_width; var minpaddingleft = 47; var minpaddingright = 40; var maxtextpanelwidth = size.width - minpaddingleft - minpaddingright; if (textwidth > maxtextpanelwidth) { //mobile mode objoptions.textpanel_padding_left = minpaddingleft; objoptions.textpanel_padding_right = minpaddingright; objoptions.textpanel_title_text_align = "center"; objoptions.textpanel_desc_text_align = "center"; } else { objoptions.textpanel_padding_left = math.floor((size.width - textwidth) / 2); objoptions.textpanel_padding_right = objoptions.textpanel_padding_left; objoptions.textpanel_title_text_align = "left"; objoptions.textpanel_desc_text_align = "left"; if (g_options.lightbox_textpanel_title_text_align) objoptions.textpanel_title_text_align = g_options.lightbox_textpanel_desc_text_align; if (g_options.lightbox_textpanel_desc_text_align) objoptions.textpanel_desc_text_align = g_options.lightbox_textpanel_desc_text_align; } g_objtextpanel.setoptions(objoptions); g_objtextpanel.refresh(true, true); handlepanelheight("positiontextpanelwide"); g_objtextpanel.positionpanel(); } /** * hide top panel */ function hidetoppanel() { if (!g_objtoppanel) return (false); g_objtoppanel.hide(); } /** * show top panel */ function showtoppanel() { if (!g_objtoppanel) return (false); g_objtoppanel.show(); } function __________compact_only_________() { }; /** * handle slider image height according the textpanel height * refresh the slider if the height is not in place */ function handlecompactheight(objimagesize) { if (g_temp.isopened == false) return (false); if (!g_objtextpanel) return (false); if (!g_objslider) return (false); var wrappersize = g_functions.getelementsize(g_objwrapper); var textpanelsize = g_objtextpanel.getsize(); if (textpanelsize.width == 0 || textpanelsize.height > 120) return (false); if (!objimagesize) { var objimage = g_objslider.getslideimage(); var objimagesize = g_functions.getelementsize(objimage); } if (objimagesize.height == 0 || objimagesize.width == 0) return (false); //check elements end size var totalbottom = objimagesize.bottom + textpanelsize.height; if (totalbottom < wrappersize.height) return (false); var slideroptions = g_objslider.getoptions(); var imagepaddingbottom = textpanelsize.height; if (imagepaddingbottom != slideroptions.slider_image_padding_bottom) { var objoptions = { slider_image_padding_bottom: imagepaddingbottom }; if (g_objslider.isanimating() == false) { g_objslider.setoptions(objoptions); g_objslider.refreshslideitems(); return (true); } } return (false); } /** * set text panel top of compact mode */ function setcompacttextpaneltop(objimagesize, positionpanel) { if (!objimagesize) { var objimage = g_objslider.getslideimage(); var objimagesize = g_functions.getelementsize(objimage); } g_temp.textpaneltop = objimagesize.bottom; if (positionpanel === true) g_objtextpanel.positionpanel(g_temp.textpaneltop, g_temp.textpanelleft); } /** * handle text panel width on compact mode, * run when the image is ready. * set top position of the panel as well * position numbers as well */ function handlecompacttextpanelsizes(showtextpanel) { var wrappersize = g_functions.getelementsize(g_objwrapper); var objimage = g_objslider.getslideimage(); var objimagesize = g_functions.getelementsize(objimage); if (objimagesize.width == 0) return (false); g_temp.textpanelleft = objimagesize.left; g_temp.textpaneltop = objimagesize.bottom; var textpanelwidth = objimagesize.width; if (g_objnumbers) { var objnumberssize = g_functions.getelementsize(g_objnumbers); textpanelwidth -= objnumberssize.width; //place numbers object var numbersleft = objimagesize.right - objnumberssize.width; g_functions.placeelement(g_objnumbers, numbersleft, g_temp.textpaneltop); } if (g_objtextpanel) { g_objtextpanel.show(); g_objtextpanel.refresh(true, true, textpanelwidth); setcompacttextpaneltop(objimagesize); } var ischanged = handlecompactheight(objimagesize); if (ischanged == false) { g_temp.positionfrom = "handlecompacttextpanelsizes"; if (g_objtextpanel) { g_objtextpanel.positionpanel(g_temp.textpaneltop, g_temp.textpanelleft); if (showtextpanel === true) { showtextpanel(); shownumbers(); } } } } /** * return that current slider image is in place */ function issliderimageinplace() { if (g_objslider.iscurrentslidetype("image") == false) return (true); var isimageinplace = (g_objslider.iscurrentimageinplace() == true); return (isimageinplace); } /** * position the arrows inside mode */ function positionarrowsinside(toshow, isanimation) { if (g_temp.isarrowsinside == false) return (false); if (!g_objarrowleft) return (false); var isimageinplace = issliderimageinplace(); g_objarrowleft.show(); g_objarrowright.show(); g_temp.positionfrom = "positionarrowsinside"; if (g_temp.isarrowsonhovermode == true && isimageinplace == true && ismouseinsideimage() == false) hidearrows(true); if (isimageinplace == false) { var leftarrowleft = g_functions.getelementrelativepos(g_objarrowleft, "left", g_options.lightbox_arrows_offset); var leftarrowtop = g_functions.getelementrelativepos(g_objarrowleft, "middle"); var rightarrowleft = g_functions.getelementrelativepos(g_objarrowright, "right", g_options.lightbox_arrows_offset); var rightarrowtop = leftarrowtop; } else { var objimage = g_objslider.getslideimage(); var objimagesize = g_functions.getelementsize(objimage); var objslidersize = g_functions.getelementsize(g_objslider.getelement()); var leftarrowleft = g_functions.getelementrelativepos(g_objarrowleft, "left", 0, objimage) + objimagesize.left + g_options.lightbox_arrows_inside_offset; var leftarrowtop = g_functions.getelementrelativepos(g_objarrowleft, "middle", 0, objimage) + objimagesize.top; var rightarrowleft = g_functions.getelementrelativepos(g_objarrowleft, "right", 0, objimage) + objimagesize.left - g_options.lightbox_arrows_inside_offset; var rightarrowtop = leftarrowtop; } //place the image with animation or not if (isanimation === true) { var objcssleft = { left: leftarrowleft, top: leftarrowtop }; var objcssright = { left: rightarrowleft, top: rightarrowtop }; g_objarrowleft.stop().animate(objcssleft, { duration: g_temp.fadeduration }); g_objarrowright.stop().animate(objcssright, { duration: g_temp.fadeduration }); } else { g_objarrowleft.stop(); g_objarrowright.stop(); g_functions.placeelement(g_objarrowleft, leftarrowleft, leftarrowtop); g_functions.placeelement(g_objarrowright, rightarrowleft, rightarrowtop); } if (toshow == true) showarrows(isanimation); } /** * position close button for compact type */ function positionclosebutton(toshow, isanimation) { g_temp.positionfrom = null; var isimageinplace = issliderimageinplace(); var minbuttontop = 2; var maxbuttonleft = g_functions.getelementrelativepos(g_objbuttonclose, "right", 2, g_objwrapper); if (isimageinplace == false) { //put image to corner var closebuttontop = minbuttontop; var closebuttonleft = maxbuttonleft; } else { var objimage = g_objslider.getslideimage(); var objimagesize = g_functions.getelementsize(objimage); var objslidersize = g_functions.getelementsize(g_objslider.getelement()); var objbuttonsize = g_functions.getelementsize(g_objbuttonclose); //some strange bug if (objslidersize.top == objslidersize.height) objslidersize.top = 0; var closebuttonleft = objslidersize.left + objimagesize.right - objbuttonsize.width / 2 + g_options.lightbox_compact_closebutton_offsetx; var closebuttontop = objslidersize.top + objimagesize.top - objbuttonsize.height / 2 - g_options.lightbox_compact_closebutton_offsety; if (closebuttontop < minbuttontop) closebuttontop = minbuttontop; if (closebuttonleft > maxbuttonleft) closebuttonleft = maxbuttonleft; } //place the image with animation or not if (isanimation === true) { var objcss = { left: closebuttonleft, top: closebuttontop }; g_objbuttonclose.stop().animate(objcss, { duration: g_temp.fadeduration }); } else { g_objbuttonclose.stop(); g_functions.placeelement(g_objbuttonclose, closebuttonleft, closebuttontop); } if (toshow === true) showclosebutton(isanimation); } /** * hide close button */ function hidecompactelements() { if (g_objbuttonclose) g_objbuttonclose.stop().fadeto(g_temp.fadeduration, 0); hidetextpanel(); hidenumbers(); g_temp.positionfrom = "hidecompactelements"; if (g_temp.isarrowsinside == true) hidearrows(); } /** * actual hide all compact type elements */ function actualhidecompactelements() { if (g_objbuttonclose) g_objbuttonclose.hide(); if (g_objarrowleft && g_temp.isarrowsinside == true) { g_objarrowleft.hide(); g_objarrowright.hide(); } if (g_objnumbers) g_objnumbers.hide(); if (g_objtextpanel) g_objtextpanel.hide(); } function __________common_________() { }; /** * position the elements */ function positionelements() { var size = g_functions.getelementsize(g_objwrapper); //position top panel: if (g_objtoppanel) g_functions.setelementsizeandposition(g_objtoppanel, 0, 0, size.width, g_temp.toppanelheight); //position arrows if (g_objarrowleft && g_temp.isarrowsinside == false) { if (g_options.lightbox_hide_arrows_onvideoplay == true) { g_objarrowleft.show(); g_objarrowright.show(); } g_functions.placeelement(g_objarrowleft, "left", "middle", g_options.lightbox_arrows_offset); g_functions.placeelement(g_objarrowright, "right", "middle", g_options.lightbox_arrows_offset); } if (g_temp.iscompact == false) g_functions.placeelement(g_objbuttonclose, "right", "top", 2, 2); //place text panel if (g_objtextpanel) { g_temp.positionfrom = "positionelements"; if (g_temp.iscompact == false) positiontextpanelwide(size); else { showtextpanel(); shownumbers(); } } var sliderwidth = size.width; var sliderheight = size.height; var slidertop = 0; var sliderleft = 0; if (g_objslider) { if (g_objtoppanel) { var toppanelheight = g_objtoppanel.height(); var objoptions = { slider_image_padding_top: toppanelheight }; g_objslider.setoptions(objoptions); } g_objslider.setsize(sliderwidth, sliderheight); g_objslider.setposition(sliderleft, slidertop); } } /** * hide the text panel */ function hidetextpanel() { if (g_objtextpanel) g_objtextpanel.getelement().stop().fadeto(g_temp.fadeduration, 0); } /** * hide the numbers text */ function hidenumbers() { if (g_objnumbers) g_objnumbers.stop().fadeto(g_temp.fadeduration, 0); } /** * is mouse inside image */ function ismouseinsideimage() { if (!g_temp.lastmousex) return (true); var obj = { pagex: g_temp.lastmousex, pagey: g_temp.lastmousey }; var ismouseinside = g_objslider.ismouseinsideslideimage(obj); return (ismouseinside); } /** * hide the arrows */ function hidearrows(noanimation, isforce) { if (!g_objarrowleft) return (false); //don't hide the arrows if mouse inside image if (g_temp.isarrowsonhovermode == true && isforce === false) { if (ismouseinsideimage() == true); return (true); } if (noanimation === true) { g_objarrowleft.stop().fadeto(0, 0); g_objarrowright.stop().fadeto(0, 0); } else { g_objarrowleft.stop().fadeto(g_temp.fadeduration, 0); g_objarrowright.stop().fadeto(g_temp.fadeduration, 0); } } /** * get if the arrows are hidden */ function isarrowshidden() { if (!g_objarrowleft) return (true); if (g_objarrowleft.is(":visible") == false) return (true); var opacity = g_objarrowleft.css("opacity"); if (opacity != 1) return (true); return (false); } /** * show the arrows */ function showarrows(nostop, fromhover) { if (!g_objarrowleft) return (false); //don't show every time on arrowsonhover mode if (g_temp.isarrowsonhovermode == true && fromhover !== true && issliderimageinplace() == true) return (true); //don't show if swiping if (g_objslider.isswiping() == true) return (true); if (nostop !== true) { g_objarrowleft.stop(); g_objarrowright.stop(); } g_objarrowleft.fadeto(g_temp.fadeduration, 1); g_objarrowright.fadeto(g_temp.fadeduration, 1); } /** * show close button */ function showclosebutton(nostop) { if (nostop !== true) g_objbuttonclose.stop(); g_objbuttonclose.fadeto(g_temp.fadeduration, 1); } /** * update text panel text of the curren item */ function updatetextpaneltext(currentitem) { if (!g_objtextpanel) return (false); if (!currentitem) var currentitem = g_objslider.getcurrentitem(); g_objtextpanel.settextplain(currentitem.title, currentitem.description); } /** * update numbers text */ function updatenumberstext(currentitem) { if (!g_objnumbers) return (false); if (!currentitem) var currentitem = g_objslider.getcurrentitem(); var numitems = g_gallery.getnumitems(); var numcurrentitem = currentitem.index + 1; g_objnumbers.html(numcurrentitem + " / " + numitems); } /** * show the text panel */ function showtextpanel() { if (!g_objtextpanel) return (false); g_objtextpanel.getelement().show().stop().fadeto(g_temp.fadeduration, 1); } /** * show the numbers object */ function shownumbers() { if (g_objnumbers) g_objnumbers.stop().fadeto(g_temp.fadeduration, 1); } function __________events_________() { }; /** * on start dragging slider item event. hide the elements */ function onsliderdragstart() { if (g_temp.iscompact == false) return (true); hidecompactelements(); } /** * on zoom change * move the assets of compact to their places */ function onzoomchange() { if (g_temp.iscompact == false) return (true); g_temp.positionfrom = "onzoomchange"; positionclosebutton(false, true); positionarrowsinside(false, true); //handle compact text panel mode if (g_temp.iscompact == true) { var isimageinplace = (g_objslider.iscurrentslidetype("image") && g_objslider.iscurrentimageinplace() == true); if (isimageinplace == false) { hidetextpanel(); hidenumbers(); } else { g_temp.positionfrom = "onzoomchange"; showtextpanel(); shownumbers(); } } } /** * after return slider to it's place * show close button */ function onsliderafterreturn() { if (g_temp.iscompact == false) return (true); g_temp.positionfrom = "onsliderafterreturn"; positionclosebutton(true); positionarrowsinside(true); var ischanged = handlecompactheight(); if (ischanged == false) handlecompacttextpanelsizes(); showtextpanel(); shownumbers(); } /** * after put image to the slide * position compact elements */ function onsliderafterputimage(data, objslide) { objslide = jquery(objslide); if (g_temp.iscompact == false) return (true); if (g_objslider.isslidecurrent(objslide) == false) return (true); g_temp.positionfrom = "onsliderafterputimage"; positionclosebutton(true); positionarrowsinside(true); handlecompacttextpanelsizes(); } /** * on slider transition end, handle panel height */ function onslidertransitionend() { var slideroptions = g_objslider.getoptions(); var imagepaddingtop = slideroptions.slider_image_padding_top; //handle wide if (g_objtoppanel) { var panelheight = g_objtoppanel.height(); if (panelheight != imagepaddingtop) refreshslideritem(panelheight); } //handle compact if (g_temp.iscompact == true) { updatetextpaneltext(); updatenumberstext(); g_temp.positionfrom = "onslidertransitionend"; positionclosebutton(true); positionarrowsinside(true); if (g_objslider.isslideactionactive() == false) { var ischanged = handlecompactheight(); if (ischanged == false) handlecompacttextpanelsizes(); } showtextpanel(); shownumbers(); } } /** * on item change * update numbers text and text panel text/position */ function onitemchange(data, currentitem) { if (g_temp.iscompact == false) { //wide mode if (g_objnumbers) updatenumberstext(currentitem); if (g_objtextpanel) { updatetextpaneltext(currentitem); //update panel height only if the lightbox is already opened, and the items changed within it. if (g_temp.isrightnowopened == false) { g_objtextpanel.positionelements(false); handlepanelheight("onchange"); g_objtextpanel.positionpanel(); } } } else { if (g_objslider.isanimating() == false) { if (g_objtextpanel) updatetextpaneltext(currentitem); if (g_objnumbers) updatenumberstext(currentitem); } } //trigger lightbox init event if (g_temp.issliderchangedonce == false) { g_temp.issliderchangedonce = true; g_objthis.trigger(t.events.lightbox_init); } } /** * on slider click */ function onsliderclick(data, event) { var slidetype = g_objslider.getslidetype(); if (slidetype != "image" && g_temp.iscompact == false && g_objslider.isslideactionactive()) return (true); var ispreloading = g_objslider.ispreloading(); if (ispreloading == true) { t.close("slider"); return (true); } //close the lightbox on empty space click if (g_options.lightbox_close_on_emptyspace == true) { var isinside = g_objslider.ismouseinsideslideimage(event); if (isinside == false) t.close("slider_inside"); } } /** * on lightbox resize */ function onresize() { positionelements(); } /** * on start play - hide the side buttons */ function onplayvideo() { if (g_objtoppanel) { hidetoppanel(); } else { if (g_objnumbers) g_objnumbers.hide(); } if (g_objarrowleft && g_options.lightbox_hide_arrows_onvideoplay == true) { g_objarrowleft.hide(); g_objarrowright.hide(); } } /** * on stop video - show the side buttons */ function onstopvideo() { if (g_objtoppanel) { showtoppanel(); handlepanelheight("onstopvideo"); } else { if (g_objnumbers) g_objnumbers.show(); } if (g_objarrowleft && g_options.lightbox_hide_arrows_onvideoplay == true) { g_objarrowleft.show(); g_objarrowright.show(); } } /** * on gallery keypres, do operations */ function onkeypress(data, key, event) { var isscrollkey = false; switch (key) { case 27: //escape - close lightbox if (g_temp.isopened == true) t.close("keypress"); break; case 38: //up and down arrows case 40: case 33: //page up and down case 34: isscrollkey = true; break; } if (g_temp.isopened == true && isscrollkey == true) event.preventdefault(); } /** * on image mouse enter event */ function onimagemouseenter() { if (g_temp.isarrowsonhovermode == true) showarrows(false, true); } /** * on image mouse leave */ function onimagemouseleave(event) { g_temp.positionfrom = "hidecompactelements"; if (g_temp.isarrowsonhovermode == true && issliderimageinplace() == true) hidearrows(false, true); } /** * on mouse move event * show arrows if inside image */ function onmousemove(event) { g_temp.lastmousex = event.pagex; g_temp.lastmousey = event.pagey; var ishidden = isarrowshidden() if (ishidden == true && ismouseinsideimage() && g_objslider.isanimating() == false) { g_temp.positionfrom = "onmousemove"; if (g_objarrowleft && g_objarrowleft.is(":animated") == false) showarrows(false, true); } } /** * on mouse wheel */ function onmousewheel(event, delta, deltax, deltay) { if (g_temp.isopened == false) return (true); switch (g_options.gallery_mousewheel_role) { default: case "zoom": var slidetype = g_objslider.getslidetype(); if (slidetype != "image") event.preventdefault(); break; case "none": event.preventdefault(); break; case "advance": g_gallery.ongallerymousewheel(event, delta, deltax, deltay); break; } } /** * init events */ function initevents() { g_objoverlay.on("touchstart", function (event) { event.preventdefault(); }); g_objoverlay.on("touchend", function (event) { t.close("overlay"); }); g_functions.addclassonhover(g_objarrowright, "ug-arrow-hover"); g_functions.addclassonhover(g_objarrowleft, "ug-arrow-hover"); g_functions.addclassonhover(g_objbuttonclose); g_gallery.setnextbutton(g_objarrowright); g_gallery.setprevbutton(g_objarrowleft); g_objbuttonclose.click(function () { t.close("button"); }); g_objgallery.on(g_gallery.events.item_change, onitemchange); if (g_objslider) { jquery(g_objslider).on(g_objslider.events.transition_end, onslidertransitionend); //on slider click event jquery(g_objslider).on(g_objslider.events.click, onsliderclick); //on slider video var objvideo = g_objslider.getvideoobject(); jquery(objvideo).on(objvideo.events.play_start, onplayvideo); jquery(objvideo).on(objvideo.events.play_stop, onstopvideo); //handle close button hide / appear jquery(g_objslider).on(g_objslider.events.start_drag, onsliderdragstart); jquery(g_objslider).on(g_objslider.events.transition_start, onsliderdragstart); jquery(g_objslider).on(g_objslider.events.after_drag_change, onsliderafterreturn); jquery(g_objslider).on(g_objslider.events.after_return, onsliderafterreturn); jquery(g_objslider).on(g_objslider.events.after_put_image, onsliderafterputimage); jquery(g_objslider).on(g_objslider.events.zoom_change, onzoomchange); jquery(g_objslider).on(g_objslider.events.image_mouseenter, onimagemouseenter); jquery(g_objslider).on(g_objslider.events.image_mouseleave, onimagemouseleave); } //on resize jquery(window).resize(function () { if (g_temp.isopened == false) return (true); g_functions.whencontiniouseventover("lightbox_resize", onresize, 100); }); g_objgallery.on(g_gallery.events.gallery_keypress, onkeypress); //store last mouse x and y if (g_temp.isarrowsonhovermode == true) { jquery(document).bind('mousemove', onmousemove); } //on mouse wheel - disable functionality if video g_objwrapper.on("mousewheel", onmousewheel); } /** * destroy the lightbox events and the html it created */ this.destroy = function () { jquery(document).unbind("mousemove"); g_objoverlay.off("touchstart"); g_objoverlay.off("touchend"); g_objbuttonclose.off("click"); g_objgallery.off(g_gallery.events.item_change); if (g_objslider) { jquery(g_objslider).off(g_objslider.events.transition_end); jquery(g_objslider).off(g_objslider.events.click); jquery(g_objslider).off(g_objslider.events.start_drag); jquery(g_objslider).off(g_objslider.events.transition_start); jquery(g_objslider).off(g_objslider.events.after_drag_change); jquery(g_objslider).off(g_objslider.events.after_return); var objvideo = g_objslider.getvideoobject(); jquery(objvideo).off(objvideo.events.play_start); jquery(objvideo).off(objvideo.events.play_stop); jquery(g_objslider).on(g_objslider.events.image_mouseenter, onimagemouseenter); jquery(g_objslider).on(g_objslider.events.image_mouseleave, onimagemouseleave); g_objslider.destroy(); } jquery(window).unbind("resize"); g_objgallery.off(g_gallery.events.gallery_keypress, onkeypress); g_objwrapper.off("mousewheel"); //remove the html g_objwrapper.remove(); } /** * open the lightbox with some item index */ this.open = function (index) { var objitem = g_gallery.getitem(index); g_temp.isopened = true; //set if the panel right now opened g_temp.isrightnowopened = true; settimeout(function () { g_temp.isrightnowopened = false }, 100); if (g_objslider) { g_objslider.setitem(objitem, "lightbox_open"); } if (g_objtextpanel) { g_objtextpanel.settextplain(objitem.title, objitem.description); } g_objoverlay.stop().fadeto(0, 0); g_objwrapper.show(); g_objwrapper.fadeto(0, 1); //show the overlay g_objoverlay.stop().fadeto(g_temp.fadeduration, g_options.lightbox_overlay_opacity); positionelements(); if (g_temp.iscompact == true) { var ispreloading = g_objslider.ispreloading(); if (ispreloading == true) { actualhidecompactelements(); } else { //hide only arrows if they are inside if (g_temp.isarrowsinside == true) { g_objarrowleft.hide(); g_objarrowright.hide(); } } } if (g_objslider) g_objslider.startslideaction(); //trigger gallery event g_objgallery.trigger(g_gallery.events.open_lightbox, objitem); } /** * close the lightbox */ this.close = function (fromwhere) { g_temp.isopened = false; if (g_temp.iscompact == true) hidecompactelements(); if (g_objslider) g_objslider.stopslideaction(); var slidetype = g_objslider.getslidetype(); if (slidetype != "image") g_objwrapper.hide(); else { g_objwrapper.fadeto(g_temp.fadeduration, 0, function () { g_objwrapper.hide(); }); } g_objgallery.trigger(g_gallery.events.close_lightbox); } /** * external init function */ this.init = function (gallery, customoptions) { initlightbox(gallery, customoptions); } /** * switch to wide mode from compact mode */ function switchtowide() { g_temp.iscompact = false; modifyoptions(); g_temp.isarrowsinside = false; g_temp.isarrowsonhovermode = false; g_options = jquery.extend({}, g_temp.originaloptions); g_options.lightbox_arrows_position = "sides"; g_objslider.setoptions(g_options); } /** * external put html function */ this.puthtml = function () { //check if switch to wide mode var issmallwindow = g_gallery.issmallwindow(); if (issmallwindow && g_temp.iscompact == true) switchtowide(); putlightboxhtml(); } /** * run lightbox elements */ this.run = function () { setproperties(); if (g_objslider) g_objslider.run(); initevents(); } } /** * 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 carousel_vertical_scroll_ondrag: false //vertical screen scroll on carousel drag }; 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, inittilewidth: 0, inittileheight: 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, storedeventid: "carousel" }; 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.inittilewidth = g_options.tile_width; g_temp.inittileheight = g_options.tile_height; 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); } /** * resize tiles to new width / height */ function resizetiles(newtilewidth, newtileheight) { if (!newtileheight) { var newtileheight = g_temp.inittileheight / g_temp.inittilewidth * newtilewidth; } g_temp.tilewidth = newtilewidth; //update all options var optupdate = { tile_width: newtilewidth, tile_height: newtileheight }; g_objtiledesign.setoptions(optupdate); g_options.tile_width = newtilewidth; g_options.tile_height = newtileheight; //resize all tiles g_objtiledesign.resizealltiles(newtilewidth); //reposition tiles positiontiles(true); //must to position tiles right after size change, for inner size change } /** * 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); } //if the size changed, change it anyway if (g_temp.tilewidth < g_temp.inittilewidth) { var newtilewidth = g_temp.carouselmaxwidth - g_options.carousel_padding * 2; if (newtilewidth > g_temp.inittilewidth) newtilewidth = g_temp.inittilewidth; resizetiles(newtilewidth); var numtiles = g_functions.getnumitemsinspace(g_temp.carouselmaxwidth, newtilewidth, g_options.carousel_space_between_tiles); } else { //check if need to lower tiles size var numtiles = g_functions.getnumitemsinspace(g_temp.carouselmaxwidth, g_temp.tilewidth, g_options.carousel_space_between_tiles); //if no tiles fit, resize the tiles if (numtiles <= 0) { numtiles = 1; var newtilewidth = g_temp.carouselmaxwidth - g_options.carousel_padding * 2; resizetiles(newtilewidth); } } //set wrapper width 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) t.startautoplay(); } else { if (g_options.carousel_autoplay == true) t.pauseautoplay(); scrolltotile(0, false); if (g_options.carousel_autoplay == true) t.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 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 < numclones; i++) { if (dir == "prev") var itemtoadd = g_gallery.getprevitem(index, true); else var itemtoadd = g_gallery.getnextitem(index, true); if (!itemtoadd) { throw new error("the item to add is empty"); } var clonedtile = itemtoadd.objtileoriginal.clone(true, true); index = itemtoadd.index; clonedtile.addclass("cloned"); arrcloneditems.push(clonedtile); } return (arrcloneditems); } /** * get space left from the right */ function getremainspaceright() { var wrappersize = g_functions.getelementsize(g_objcarouselwrapper); var innersize = g_functions.getelementsize(g_objinner); var spacetaken = innersize.width - wrappersize.width + innersize.left; var spaceremain = g_temp.sidespace - spacetaken; return (spaceremain); } /** * get remain space on the left */ function getremainspaceleft() { var spacetaken = -getinnerpos(); var spaceremain = g_temp.sidespace - spacetaken; return (spaceremain); } /** * get carousel width */ function getcarouselwidth() { var objsize = g_functions.getelementsize(g_objcarouselwrapper); return (objsize.width); } /** * get num tiles in the carousel */ function getnumtilesincarousel() { var width = getcarouselwidth(); var numtiles = getnumtilesinspace(width); return (numtiles); } function __________other_methods_______() { }; /** * position existing tiles */ function positiontiles(setheight) { if (!setheight) var setheight = false; var objtiles = gettiles(); var posx = 0; var maxheight = 0, totalwidth; jquery.each(objtiles, function (index, objtile) { objtile = jquery(objtile); g_functions.placeelement(objtile, posx, 0); var tilesize = g_functions.getelementsize(objtile); posx += tilesize.width + g_options.carousel_space_between_tiles; maxheight = math.max(maxheight, tilesize.height); if (index == (objtiles.length - 1)) totalwidth = tilesize.right; }); //set heights and widths g_objinner.width(totalwidth); maxheight += g_options.carousel_padding * 2; if (setheight === true) { g_objinner.height(maxheight); g_objcarouselwrapper.height(maxheight); } scrolltotile(g_temp.numcurrent, false); return (totalwidth); } /** * validate that the num not more then num tiles */ function validatetilenum(numtile) { if (numtile > (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 < numtilestoremove; i++) { if (direction == "left") jquery(arrtiles[i]).remove(); else { jquery(arrtiles[numtiles - 1 - i]).remove(); } } } /** * set inner strip position */ function setinnerpos(pos) { var objcss = { "left": pos + "px" }; g_objinner.css(objcss); } /** * scroll to tile by number */ function scrolltotile(numtile, isanimation, isshort) { if (isanimation === undefined) { var isanimation = true; if (g_objinner.is(":animated")) return (true); } var objtile = gettile(numtile); var objsize = g_functions.getelementsize(objtile); var posscroll = -objsize.left + g_options.carousel_padding; var objcss = { "left": posscroll + "px" }; if (isanimation === true) { var duration = g_options.carousel_scroll_duration; var easing = g_options.carousel_scroll_easing; if (isshort === true) { duration = g_temp.scrollshortduration; easing = g_temp.scrollshorteasing; } g_objinner.stop(true).animate(objcss, { duration: duration, easing: easing, queue: false, //progress:function(){t.triggerstripmoveevent()}, complete: function () { g_temp.numcurrent = numtile; fillsideswithtiles(true); } }); } else { g_temp.numcurrent = numtile; g_objinner.css(objcss); } } /** * get number of neerest tile */ function getneeresttilenum() { var innerpos = -getinnerpos(); var numtiles = getnumtilesinspace(innerpos); var tile1pos = g_functions.getelementsize(gettile(numtiles)).left; var tile2pos = g_functions.getelementsize(gettile(numtiles + 1)).left; if (math.abs(tile1pos - innerpos) < math.abs(tile2pos - innerpos)) return (numtiles); else return (numtiles + 1); } /** * get neerest tile to inner position */ function scrolltoneeresttile() { var tilenum = getneeresttilenum(); scrolltotile(tilenum, true, true); } /** * fill the sides with tiles till it fil the sidespace */ function fillsideswithtiles() { var spaceleft = getremainspaceleft(); var spaceright = getremainspaceright(); var numitemsleft = 0, numitemsright = 0, numitemsremoveleft = 0, numitemsremoveright = 0; //trace("left: " + spaceleft+ " right: " + spaceright); var numtiles = getnumtiles(); //add tiles to left if (spaceleft > 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"); } //small validation if (numitemsremoveright > numtiles) { throw new error("can't remove more then num tiles"); } //trace(numitemsremoveright); //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 */ this.startautoplay = function () { 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 */ this.unpauseautoplay = function () { if (g_temp.isplaymode == false) return (true); if (g_temp.ispaused == false) return (true); t.startautoplay(); } /** * pause the autoplay */ this.pauseautoplay = function () { 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 */ this.stopautoplay = function () { 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; t.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; g_functions.storeeventdata(event, g_temp.storedeventid); } /** * on touch move */ function ontouchmove(event) { if (g_temp.touchactive == false) return (true); g_functions.updatestoredeventdata(event, g_temp.storedeventid); event.preventdefault(); var scrolldir = null; if (g_options.carousel_vertical_scroll_ondrag == true) scrolldir = g_functions.handlescrolltop(g_temp.storedeventid); if (scrolldir === "vert") return (true); 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(); t.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) t.pauseautoplay(); } /** * start the playing again */ function onmouseleave(event) { if (g_options.carousel_autoplay_pause_onhover == false) return (true); t.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) t.startautoplay(); else t.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); } } /** tabs panel class addon to unite gallery */ function ugtabs() { var t = this, g_objthis = jquery(this), g_objgallery; var g_gallery = new unitegallerymain(), g_functions = new ugfunctions(); var g_objtabs, g_objselect; var g_options = { tabs_type: "tabs", //tabs type: tabs, select tabs_container: "#ug_tabs", //tabs container tabs_class_selected: "ug-tab-selected" }; this.events = { }; /** * init tabs function */ function inittabs(gallery, customoptions) { g_gallery = gallery; g_objgallery = jquery(g_gallery); g_options = jquery.extend(g_options, customoptions); if (g_options.tabs_type == "select") g_objselect = jquery(g_options.tabs_container); else g_objtabs = jquery(g_options.tabs_container + " .ug-tab"); } /** * run the tabs */ function runtabs() { initevents(); } /** * request new gallery items */ function requestgalleryitems(catid) { g_gallery.requestnewitems(catid); } /** * on tab click */ function ontabclick() { var classselected = g_options.tabs_class_selected; var objtab = jquery(this); if (objtab.hasclass(classselected)) return (true); g_objtabs.not(objtab).removeclass(classselected); objtab.addclass(classselected); var catid = objtab.data("catid"); if (!catid) return (true); requestgalleryitems(catid); } /** * on select change */ function onselectchange() { var objselect = jquery(this); var catid = objselect.val(); if (!catid) return (true); requestgalleryitems(catid); } /** * init tabs events */ function initevents() { if (g_options.tabs_type == "select") g_objselect.change(onselectchange); else g_objtabs.click(ontabclick); } /** * destroy */ this.destroy = function () { if (g_objselect) g_objselect.off("change"); if (g_objtabs) g_objtabs.off("click"); } /** * outer init function, move to inner init */ this.init = function (gallery, customoptions) { inittabs(gallery, customoptions); } /** * run the tabs */ this.run = function () { runtabs(); } } /** * api class * addon to unite gallery */ function ug_api(gallery) { var t = this, g_objthis = jquery(t); var g_gallery = new unitegallerymain(), g_objgallery; var g_arrevents = []; g_gallery = gallery; g_objgallery = jquery(gallery); this.events = { api_init_functions: "api_init", api_on_event: "api_on_event" } /** * get item data for output */ function convertitemdataforoutput(item) { var output = { index: item.index, title: item.title, description: item.description, urlimage: item.urlimage, urlthumb: item.urlthumb }; //add aditional variables to the output var adddata = item.objthumbimage.data(); for (var key in adddata) { switch (key) { case "image": case "description": continue; break; } output[key] = adddata[key]; } return (output); } /** * event handling function */ this.on = function (event, handlerfunction, notcache) { //remember cache if (notcache !== true) { g_arrevents.push({ event: event, func: handlerfunction }); } switch (event) { case "item_change": g_objgallery.on(g_gallery.events.item_change, function () { var currentitem = g_gallery.getselecteditem(); var output = convertitemdataforoutput(currentitem); handlerfunction(output.index, output); }); break; case "resize": g_objgallery.on(g_gallery.events.size_change, handlerfunction); break; case "enter_fullscreen": g_objgallery.on(g_gallery.events.enter_fullscreen, handlerfunction); break; case "exit_fullscreen": g_objgallery.on(g_gallery.events.exit_fullscreen, handlerfunction); break; case "play": g_objgallery.on(g_gallery.events.start_play, handlerfunction); break; case "stop": g_objgallery.on(g_gallery.events.stop_play, handlerfunction); break; case "pause": g_objgallery.on(g_gallery.events.pause_playing, handlerfunction); break; case "continue": g_objgallery.on(g_gallery.events.continue_playing, handlerfunction); break; case "open_lightbox": g_objgallery.on(g_gallery.events.open_lightbox, handlerfunction); break; case "close_lightbox": g_objgallery.on(g_gallery.events.close_lightbox, handlerfunction); break; default: if (console) console.log("wrong api event: " + event); break; } g_objgallery.trigger(t.events.api_on_event, [event, handlerfunction]); } /** * start playing */ this.play = function () { g_gallery.startplaymode(); } /** * stop playing */ this.stop = function () { g_gallery.stopplaymode(); } /** * toggle playing */ this.toggleplay = function () { g_gallery.toggleplaymode(); } /** * enter fullscreen */ this.enterfullscreen = function () { g_gallery.tofullscreen(); } /** * exit fullscreen */ this.exitfullscreen = function () { g_gallery.exitfullscreen(); } /** * toggle fullscreen */ this.togglefullscreen = function () { g_gallery.togglefullscreen(); } /** * reset zoom */ this.resetzoom = function () { var objslider = g_gallery.getobjslider(); if (!objslider) return (false); objslider.zoomback(); } /** * zoom in */ this.zoomin = function () { var objslider = g_gallery.getobjslider(); if (!objslider) return (false); objslider.zoomin(); } /** * zoom in */ this.zoomout = function () { var objslider = g_gallery.getobjslider(); if (!objslider) return (false); objslider.zoomout(); } /** * next item */ this.nextitem = function () { g_gallery.nextitem(); } /** * prev item */ this.previtem = function () { g_gallery.previtem(); } /** * go to some item by index (0-numitems) */ this.selectitem = function (numitem) { g_gallery.selectitem(numitem); } /** * resize the gallery to some width (height). */ this.resize = function (width, height) { if (height) g_gallery.resize(width, height); else g_gallery.resize(width); } /** * get some item by index */ this.getitem = function (numitem) { var data = g_gallery.getitem(numitem); var output = convertitemdataforoutput(data); return (output); } /** * get number of items in the gallery */ this.getnumitems = function () { var numitems = g_gallery.getnumitems(); return (numitems); } /** * refresh gallery with another options */ this.reloadgallery = function (customoptions) { if (!customoptions) var customoptions = {}; g_gallery.run(null, customoptions); //restore events: g_arrevents.map(function (obj) { t.on(obj.event, obj.func, true); }); } /** * destroy the gallery */ this.destroy = function () { g_gallery.destroy(); } //trigger api on init event g_objgallery.trigger(t.events.api_init_functions, t); } /** loadmore panel class addon to unite gallery */ function ugloadmore() { var t = this, g_objthis = jquery(this), g_objgallery; var g_gallery = new unitegallerymain(), g_functions = new ugfunctions(); var g_objwrapper, g_objbutton, g_objloader, g_objerror; var g_temp = { isinited: false } var g_options = { loadmore_container: "ug_loadmore_wrapper" //tabs container }; this.events = { }; /** * init wrapper */ function initobjects() { g_objwrapper = jquery("#" + g_options.loadmore_container); if (g_objwrapper.length == 0) return (false); g_objbutton = g_objwrapper.find(".ug-loadmore-button"); if (g_objbutton.length == 0) return (false); g_objloader = g_objwrapper.find(".ug-loadmore-loader"); if (g_objloader.length == 0) return (false); g_objerror = g_objwrapper.find(".ug-loadmore-error"); if (g_objerror.length == 0) return (false); g_temp.isinited = true; } /** * show loadmore */ function showloadmore() { g_objwrapper.show(); } /** * on loadore click event */ function onloadmoreclick() { g_objbutton.hide(); g_objloader.show(); var data = { numitems: g_gallery.getnumitems() }; g_gallery.ajaxrequest("front_loadmore", data, function (response) { g_objloader.hide(); var htmlitems = response.html_items; var showloadmore = response.show_loadmore; if (showloadmore == true) { g_objbutton.blur().show(); g_objloader.hide(); } else { g_objwrapper.hide(); } g_gallery.additems(htmlitems); }, function (errortext) { errortext = "ajax error!" + errortext; g_objloader.hide(); g_objerror.show(); g_objerror.html(errortext); }); } /** * init events */ function initevents() { g_gallery.onevent("tiles_first_placed", showloadmore); g_objbutton.click(onloadmoreclick); } /** * destroy */ this.destroy = function () { if (g_temp.isinited == false) return (false); } /** * init the loadmore button */ this.init = function (gallery, customoptions) { g_gallery = gallery; g_objgallery = jquery(g_gallery); g_options = jquery.extend(g_options, customoptions); initobjects(); if (g_temp.isinited == false) { trace("load more not inited, something is wrong"); return (false); } initevents(); } }