/** * By Mikael Sundberg for Generatorhallen AB * * (c) Odd Job Media AB - 2008 - 2012 * (c) Generatorhallen AB - 20012 - 2016 */ function findPosY(obj) { var curtop = 0; if (obj.offsetParent) { while (obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } } else if (obj.y) curtop += obj.y; return curtop; } function findPosX(obj) { var curleft = 0; if (obj.offsetParent) { while (obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } } else if (obj.x) curleft += obj.x; return curleft; } /** * Random rotated images gallery */ var maxZIndex = 0; var randomGalleryImages = new Array(); //var randomGalleryImagesPositions = new Array(); var moveInPositionTimer = 0; /** * fading gallery */ var fadingGalleryThumbWidth = 150; var fadingGalleryImages = new Array(); var fadeInOutTimer = 0; var fadeValue = 0; var fadeCounter = 0; var fadeTimeout = 60; var fadeStep = true; /** * scrolling gallery **/ var scrollerOffsetTo = 8; var scrollerTimer = 0; var scrollerDivider = 2; var scrollInterval = 40; var scrollThumbwidth = 96; var scrollerWidth = 0; var galleryDiv = null; var galleryScroll = null; var autoSelect = 0; var dummyImage = null; var growthInterval = 0; var rules = { '.flashigbild' : function(e) { e.onmouseover = function(e) { if(growthInterval) return; if(dummyImage==null) { dummyImage = document.createElement("IMG"); dummyImage.style.position = "absolute"; dummyImage.style.cursor = "pointer"; dummyImage.style.zIndex = "100000"; document.body.appendChild(dummyImage); dummyImage.onmouseout = function(e) { dummyImage.style.display = "none"; } dummyImage.onclick = function(e) { window.open(dummyImage.relNode.href,"galleryimage",""); } } var x = findPosX(this); var y = findPosY(this); var width = this.width; var height = this.height; dummyImage.src = this.src; dummyImage.relNode = this.parentNode; var growth = 0; growthInterval = setInterval(function() { x -= 2; y -= 2; dummyImage.style.display = "block"; dummyImage.style.left = x + "px"; dummyImage.style.top = y + "px"; dummyImage.width = width + (growth+=3); dummyImage.height = height + (growth+=3); if(growth>=60) { clearInterval(growthInterval); growthInterval = 0; } },20); } } , '.scrollgallery' : function(elm) { var images = elm.getElementsByTagName('div')[1].getElementsByTagName("a"); for(var i = 0; i < images.length; i++) { var img = images[i]; var theImage = img.getElementsByTagName('img')[0]; img.style.display = "block"; } } , '.scrollgalleryright' : function(elm) { elm.onclick = function() { if(scrollerTimer != 0) return; galleryDiv = $(this.parentNode); galleryScroll = $(galleryDiv.getElementsByTagName("div")[0].getElementsByTagName("div")[0]); scrollerWidth = (galleryScroll.getElementsByTagName("a").length * scrollThumbwidth); var scrolloffset = Math.floor(galleryDiv.getWidth() / scrollThumbwidth) * scrollThumbwidth; scrollerOffsetTo = (parseInt(galleryScroll.style.left) - scrolloffset); if(scrollerOffsetTo <= -(scrollerWidth-8)) return; clearInterval(scrollerTimer); scrollerTimer = setInterval(function () { var distance = scrollerOffsetTo - parseInt(galleryScroll.style.left); if(Math.abs(distance) < 3) { galleryScroll.style.left = scrollerOffsetTo + "px"; clearInterval(scrollerTimer); scrollerTimer = 0; } else { galleryScroll.style.left = (parseInt(galleryScroll.style.left) + distance / scrollerDivider ) + "px"; } }, scrollInterval); } } , '.scrollgalleryleft' : function(elm) { elm.onclick = function() { if(scrollerTimer != 0) return; galleryDiv = $(this.parentNode); galleryScroll = $(galleryDiv.getElementsByTagName("div")[0].getElementsByTagName("div")[0]); scrollerWidth = (galleryScroll.getElementsByTagName("a").length * scrollThumbwidth); var scrolloffset = Math.floor(galleryDiv.getWidth() / scrollThumbwidth) * scrollThumbwidth; scollerOffsetTo = (parseInt(galleryScroll.style.left) + scrolloffset); if(scollerOffsetTo > 8) scollerOffsetTo = 8; clearInterval(scrollerTimer); scrollerTimer = setInterval(function () { var distance = scollerOffsetTo - parseInt(galleryScroll.style.left); if(Math.abs(distance) < 3) { galleryScroll.style.left = scollerOffsetTo + "px"; clearInterval(scrollerTimer); scrollerTimer = 0; } else { galleryScroll.style.left = (parseInt(galleryScroll.style.left) + distance / scrollerDivider) + "px"; } }, scrollInterval); } } , '.fadinggallery' : function(elm) { var images = elm.getElementsByTagName("div")[0].getElementsByTagName("a"); var parent = $($(elm).parentNode); var galleryWidth = $(elm.getElementsByTagName("div")[0]).getWidth(); var galleryHeight = $(elm.getElementsByTagName("div")[0]).getHeight(); var galleryText = $(elm).getElementsBySelector(".fadinggallerytext")[0]; var maxThumbWidth = 0; var maxThumbHeight = 0; for(var i = 0; i < images.length; i++) { var img = images[i]; var theImage = img.getElementsByTagName('img')[0]; maxThumbWidth = Math.max(maxThumbWidth, theImage.width); maxThumbHeight = Math.max(maxThumbHeight, theImage.height); } for(var i = 0; i < images.length; i++) { var img = images[i]; var theImage = img.getElementsByTagName('img')[0]; if(i == 0) { img.style.visibility = "visible"; if(galleryText) galleryText.innerHTML = img.getAttribute("title"); } img.style.left = ((galleryWidth / 2) - (theImage.width / 2)) + "px"; img.style.top = ((galleryHeight / 2) - (theImage.height / 2)) + "px"; } fadingGalleryImages.push({galleryContainer : parent, element : elm, images : images, fadingIndex : 0, prevFadeIndex : 0}); maxZIndex = 0; if(galleryText) $(galleryText).show(); setInterval(function() { if(fadeCounter == fadeTimeout) { fadeCounter = 0; clearInterval(fadeInOutTimer); if(lightboxVisible) return; for(var j = 0; j < fadingGalleryImages.length && fadeStep; j++) { fadingGalleryImages[j].prevFadeIndex = fadingGalleryImages[j].fadingIndex; if(fadingGalleryImages[j].fadingIndex == fadingGalleryImages[j].images.length - 1) fadingGalleryImages[j].fadingIndex = -1; fadingGalleryImages[j].fadingIndex++; } fadeStep = true; fadeValue = 0; fadeInOutTimer = setInterval(function() { if(fadeValue > 7) clearInterval(fadeInOutTimer); for(var j = 0; j < fadingGalleryImages.length; j++) { var images = fadingGalleryImages[j].images; for(var i = 0; i < images.length; i++) { var image = images[i]; if(i == fadingGalleryImages[j].fadingIndex) { if(galleryText) galleryText.innerHTML = image.getAttribute("title"); image.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + Math.round(fadeValue * 12.5) + ")"; image.style.opacity = Math.round(fadeValue * 12.5) / 100.0; image.style.visibility = "visible"; image.style.visible = "true"; image.style.display = "block"; image.style.zIndex = maxZIndex++; } else if(i == fadingGalleryImages[j].prevFadeIndex) { image.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + Math.round(100 - fadeValue * 12.5) + ")"; image.style.opacity = 1.0 - (Math.round(fadeValue * 12.5) / 100.0); image.style.visibility = "visible"; image.style.visible = "true"; image.style.display = "block"; } else { image.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (0) + ")"; image.style.visibility = "hidden"; image.style.visible = "false"; image.style.display = "none"; } } } fadeValue++; //alert(fadingGalleryImages[0].fadingIndex + " <= " + fadingGalleryImages[0].prevFadeIndex); }, 40); } fadeCounter++; }, 100); } , '.fadegallerynext' : function(elm) { elm.onclick = function() { var gallery = $($(this).parentNode.parentNode); for(var j = 0; j < fadingGalleryImages.length; j++) { var data = fadingGalleryImages[j]; if(data.element == gallery) { fadeCounter = fadeTimeout; fadeStep = true; } } } } , '.fadegalleryprev' : function(elm) { elm.onclick = function() { var gallery = $($(this).parentNode.parentNode); for(var j = 0; j < fadingGalleryImages.length; j++) { var data = fadingGalleryImages[j]; if(data.element == gallery) { fadingGalleryImages[j].prevFadeIndex = fadingGalleryImages[j].fadingIndex; fadingGalleryImages[j].fadingIndex--; if(fadingGalleryImages[j].fadingIndex < 0) fadingGalleryImages[j].fadingIndex = fadingGalleryImages[j].images.length - 1; fadeCounter = fadeTimeout; fadeStep = false; } } } } , '.randomrotatedimages' : function(elm) { elm = $(elm); var images = elm.getElementsByTagName("a"); var maxThumbWidth = 0; var theImage = images[images.length-1].getElementsByTagName('img')[0]; maxThumbWidth = Math.max(maxThumbWidth, theImage.width); var left = 0; var minHeight = 0; var minX = 0; var maxX = elm.getWidth() - maxThumbWidth - 5; var offsetX = Math.round(maxX / (images.length-1)); var galleryHeight = $(elm.parentNode).getHeight(); maxZIndex = images.length; var zIndex = 0; var pData = new Array(); for(var i=0; i < images.length; i++) { var img = images[i]; var theImage = img.getElementsByTagName('img')[0]; var imgWidthSmall = parseInt(theImage.width * 0.8); var imgHeightSmall = parseInt(theImage.height * 0.8); var imgWidthFull = theImage.width; var imgHeightFull = theImage.height; var imgFullX = left; var imgFullY = Math.max(Math.round((galleryHeight / 2) - (imgHeightFull / 2)), 0); var imgSmallX = (left + (imgWidthFull - imgWidthSmall) * (i<((images.length-1)/2)?1:1) / 2); var imgSmallY = imgFullY + ((imgHeightFull - imgHeightSmall) / 2); img.style.display = "block"; minHeight = Math.max(minHeight , theImage.height); img.style.zIndex = zIndex; theImage.width = parseInt(imgWidthSmall); theImage.height = parseInt(imgHeightSmall); pData.push(new Array(imgSmallX + imgWidthSmall / 2, imgWidthSmall, imgHeightSmall, imgWidthFull, imgHeightFull, imgSmallX, imgSmallY, imgFullX, imgFullY)); zIndex += (i<((images.length-1)/2)?1:-1); left = left + offsetX; } elm.style.height = (minHeight + minHeight / 2) + "px"; randomGalleryImages.push({element : elm, images : images , positionData : pData}); elm.onmousemove = function(e) { if(!e) var e = window.event; var x = (e.clientX ? e.clientX - $(this).cumulativeOffset().left : e.x); for(var j = 0; j < randomGalleryImages.length; j++) { if(randomGalleryImages[j].element == this) { var imgs = randomGalleryImages[j].images; var positionData = randomGalleryImages[j].positionData; var nearestIndex = -1; var lastDistance = 1000000; for(var i = 0; i < imgs.length; i++) { var distance = Math.abs(positionData[i][0] - x); if(distance < lastDistance) nearestIndex = i; lastDistance = distance; } if(nearestIndex != -1) { for(var i = 0; i < imgs.length; i++) { var img = imgs[i]; var pData = positionData[i]; var theImage = img.getElementsByTagName('img')[0]; if(i != nearestIndex) { theImage.width = pData[1]; theImage.height = pData[2]; theImage.parentNode.style.left = pData[5] + "px"; theImage.parentNode.style.top = pData[6] + "px"; } else { theImage.width = pData[3]; theImage.height = pData[4]; theImage.parentNode.style.left = pData[7] + "px"; theImage.parentNode.style.top = pData[8] + "px"; } } images[nearestIndex].style.zIndex = maxZIndex++; } } } } } } /** * circle random images */ var expandingGalleries = new Array(); var expandTimer = 0; var expandedGallery = null; var scrollTimer = 0; var isScrolling = false; var currentScrollIndex = 0; var scrollGalleryImgWidth = 230; var waitingTimer = false; function scrollToImageIndex(index, numImages, elm) { if(isScrolling) { if(!waitingTimer) { setTimeout(function() { scrollToImageIndex(index, numImages, elm); }, 50); waitingTimer = true; } return(false); } waitingTimer = false; elm = $(elm); var images = elm.getElementsBySelector('.galleryimagec'); var dim = $(elm.parentNode).getDimensions(); var numImages = images.length; var startX = (dim.width / 2) - ((numImages * scrollGalleryImgWidth) / 2); // - (index > currentScrollIndex ? 10 : -10); var currX = parseInt(images[0].style.left); var startY = (dim.height / 2) - 115; var middle = Math.floor(numImages / 2); var zIndex = 1000; var prevIndex = currentScrollIndex; var currIndex = currentScrollIndex = index; var offset = 0; if(currIndex < middle) { offset = (middle - currIndex) * scrollGalleryImgWidth; } else if(currIndex > middle) { offset = -((currIndex - middle) * scrollGalleryImgWidth); } var endX = startX + offset; var thisX = currX; scrollTimer = setInterval(function() { isScrolling = true; if(thisX != endX) { var percent = Math.abs(endX - thisX) / scrollGalleryImgWidth; for(var i=0;i middle) { offset = -((currIndex - middle) * scrollGalleryImgWidth); } startX += offset; for(var i=0;i 20) numColumns = 5; else if(numImages > 9) numColumns = 4; else numColumns = 3; if(elm.hasClassName("onecol")) { numRows = 1; numColumns = numImages; } if(elm.hasClassName("double")) { numRows = 2; numColumns = Math.ceil(numImages / 2); } } if(elm.hasClassName("wide")) { numRows = 2; numColumns = Math.ceil(numImages / numRows); } var minDistanceToExpand = Math.round(maxThumbWidth / 3); var minDistanceToCollapse = radius * 2; var circleDegrees = 360; var circleStart = 0; var maxDegree = 360; var minDegree = 0; offsetY = 0; offsetX = 0; if(elm.hasClassName("half") || elm.hasClassName("fourth")) { minDegree = 0; maxDegree = 75; circleStart = 0; radius = (Math.max(maxThumbWidth * 2.5, maxThumbHeight * 2.5)) + 50; offsetY = radius * 0.8; if(elm.hasClassName("fourth")) { minDegree = 0; maxDegree = 270; circleStart = 0; radius *= 0.6; offsetY *= 0.2; } else if(elm.hasClassName("wide")) { radius = (Math.max(maxThumbWidth * 2, maxThumbHeight * 2)) + 50; offsetY = radius * 0.8; } if(elm.hasClassName("double")) { if(elm.hasClassName("fourth")) { if(elm.hasClassName("wide")) { radius *= 1.4; offsetY = radius * 0.6; } else { radius *= elm.hasClassName("overlap") ? 0.65 : 1.0; offsetY = radius * 0.6; } } else { radius *= elm.hasClassName("overlap") ? 0.8 : 1.2; offsetY *= elm.hasClassName("overlap") ? 0.8 : 1.2; } } if(elm.hasClassName("invert")) { circleStart = 180; offsetY = -offsetY; } } else if(elm.hasClassName("double")) { minDegree = 0; maxDegree = 360; circleStart = 0; radius = ((Math.max(maxThumbWidth, maxThumbHeight)) + (Math.max(maxThumbWidth, maxThumbHeight) / 2)) * (elm.hasClassName("overlap") ? 0.75 : 1.0); } else if(elm.hasClassName("circle")) { radius = ((Math.max(maxThumbWidth, maxThumbHeight)) + (Math.max(maxThumbWidth, maxThumbHeight) / 2)) * (elm.hasClassName("overlap") ? 0.75 : 1.0); } maxZIndex = numImages; var numImagesInFirstRow = Math.ceil(numImages / 2); var numImagesInRow = numImages; var degreesPerImage = Math.round(Math.abs(maxDegree - minDegree) / images.length); if(/*(elm.hasClassName("half") || elm.hasClassName("fourth")) &&*/ elm.hasClassName("double")) { numImagesInRow = numImagesInFirstRow; degreesPerImage = Math.round(Math.abs(maxDegree - minDegree) / numImagesInFirstRow); } var maxThisCircle = Math.ceil(360 / degreesPerImage) * degreesPerImage; var iterator = true; var degreeCounter = 0; var bounds = { galler : null, left : 100000, top : 100000, right : -100000, bottom : -100000 , intersects : function(x,y) { return ( x > this.left + this.gallery.offsetX && x < this.right + this.gallery.offsetX && y > this.top + this.gallery.offsetY && y < this.bottom + this.gallery.offsetY); } }; var rc = 0; var animationOrder = new Array(); var numImagesInTriangleRow = 1; var tc = 0; if(elm.hasClassName("triangle")) { radius = 5; offsetX = 10; offsetY = 15; circleStart = -45; if(elm.hasClassName("righttoleft")) { circleStart = -45 - 45 - 45; offsetX = 15; offsetY = 5; } else if(elm.hasClassName("lefttoright")) { circleStart = 45; offsetX = -15; offsetY = 5; } else if(elm.hasClassName("invert")) { circleStart = -45 - 45 - 45 - 45 - 45; offsetY = -15; offsetX = 5; } } for(var i = 0; i < images.length; i++) { var image = $(images[i]); var theImage = image.getElementsByTagName("img")[0]; var useRadius = radius; var degrees = (degreesPerImage * i); var useCircleStart = circleStart; if(elm.hasClassName("double") && (elm.hasClassName("half") || elm.hasClassName("fourth")) && i == numImagesInFirstRow - 1) { degreeCounter = 0; degreesPerImage = Math.round(Math.abs(maxDegree - minDegree) / (images.length - numImagesInFirstRow)); numImagesInRow = images.length - numImagesInFirstRow; iterator = false; radius -= maxThumbHeight / 2; useRadius = radius; rc = 0; } else if(elm.hasClassName("double") && !elm.hasClassName("half")) { degrees = degreeCounter; if(i == numImagesInFirstRow - 1) { degreeCounter = 0; degreesPerImage = Math.round(Math.abs(maxDegree - minDegree) / (images.length - numImagesInFirstRow)); radius -= Math.max(maxThumbWidth / 2, maxThumbHeight / 2) * (elm.hasClassName("overlap") ? 0.75 : 1.1); circleStart += degreesPerImage / 2; } } if(elm.hasClassName('half') || elm.hasClassName('fourth')) { degrees = iterator ? -degreeCounter : degreeCounter; if( (rc%2) == 0 ) { degreeCounter += degreesPerImage; } iterator = !iterator; } else { degreeCounter += degreesPerImage; } rc++; /* if(degrees > maxThisCircle) { radius -= Math.max(maxThumbWidth / 2, maxThumbHeight / 2); maxThisCircle += maxThisCircle; circleStart += degreesPerImage * 2; }*/ tc++; if(elm.hasClassName("triangle")) { degreesPerImage = Math.round(90 / Math.max(numImagesInTriangleRow - 1,1)); degrees = (tc - 1) * degreesPerImage; if(tc == numImagesInTriangleRow) { radius += Math.max(maxThumbWidth / 2, maxThumbWidth / 2) * (elm.hasClassName("overlap") ? 0.6 : 1.0); numImagesInTriangleRow++; tc = 0; } } var radians = ((degrees + useCircleStart) * Math.PI) / 180; var sin = Math.sin(radians); var cos = -Math.cos(radians); var fullWidth = theImage.width; var fullHeight = theImage.height; var smallWidth = fullWidth * 0.8; var smallHeight = fullHeight * 0.8; var diffSizeX = fullWidth - smallWidth; var diffSizeY = fullHeight - smallHeight; var midXSmall = midX; var midYSmall = midY; var imgStartPosX = (galleryWidth / 2) - (fullWidth / 2); var imgStartPosY = (galleryHeight / 2) - (fullHeight / 2); var imgPosXSmall = midX + (useRadius * sin) - (fullWidth / 2) + offsetX; var imgPosYSmall = midY + (useRadius * cos) - (fullHeight / 2) + offsetY; var imgPosXFull = imgPosXSmall - diffSizeX / 2; var imgPosYFull = imgPosYSmall - diffSizeY / 2; if(type == "rowsandcols") { if(currentColumn == numColumns) { currentColumn = 0; currentRow++; } var numRows = Math.ceil(numImages / numColumns); // calc image positions var width = -Math.round(((numColumns * maxThumbWidth / 2) / 2) - (galleryWidth / 2)); var height = -Math.round(((numRows * maxThumbHeight / 2) / 2) - (galleryHeight / 2)); var thumbSpaceX = ((maxThumbWidth * (elm.hasClassName("static") ? 1.02 : 0.8))); var thumbSpaceY = ((maxThumbHeight * (elm.hasClassName("static") ? 1.02 : 0.8))); if(elm.hasClassName("overlap")) { thumbSpaceX = ((maxThumbWidth / 2)) + 0; thumbSpaceY = ((maxThumbHeight / 2)) + 0; } else { thumbSpaceX = ((maxThumbWidth)) * 0.65; thumbSpaceY = ((maxThumbHeight)) * 0.65; } if(elm.hasClassName("lefttoright")) { thumbSpaceX -= (maxThumbWidth / 2) * 0.5; imgPosXSmall = imgPosXFull = (currentColumn * thumbSpaceX) + (galleryWidth / 2) - (maxThumbWidth / 2); imgPosYSmall = imgPosYFull = (currentRow * thumbSpaceY) - (thumbSpaceY * numRows) / 2 + (galleryHeight / 2); } else if(elm.hasClassName("righttoleft")) { thumbSpaceX -= (maxThumbWidth / 2) * 0.5; imgPosXSmall = imgPosXFull = -(currentColumn * thumbSpaceX) + (galleryWidth / 2) ; imgPosYSmall = imgPosYFull = (currentRow * thumbSpaceY) - (thumbSpaceY * numRows) / 2 + (galleryHeight / 2); } else { imgPosXSmall = imgPosXFull = (currentColumn * thumbSpaceX) - (thumbSpaceX * numColumns) / 2 + (galleryWidth / 2); imgPosYSmall = imgPosYFull = (currentRow * thumbSpaceY) - (thumbSpaceY * numRows) / 2 + (galleryHeight / 2); } imgPosXFull -= Math.round((fullWidth - smallWidth) / 2); imgPosYFull -= Math.round((fullHeight - smallHeight) / 2); var x1 = galleryPosX; var y1 = galleryPosY; var x2 = x1 + ((numColumns * thumbSpaceX) / 2); var y2 = y1 + ((numRows * thumbSpaceY) / 2); var tx = Math.pow(x2 - x1, 2); var ty = Math.pow(y2 - y1, 2); minDistanceToCollapse = Math.sqrt(tx + ty); currentColumn++; } if(elm.hasClassName("static")) { imgStartPosX = imgPosXSmall = imgPosXFull; imgStartPosY = imgPosYSmall = imgPosYFull; smallWidth = fullWidth; smallHeight = fullHeight; } if(elm.hasClassName("appear")) { image.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=0)"; image.style.opacity = 0; } image.style.left = imgStartPosX + "px"; image.style.top = imgStartPosY + "px"; theImage.width = fullWidth; theImage.height = fullHeight; bounds.left = Math.min(galleryOffsetX + imgPosXFull, bounds.left); bounds.top = Math.min(galleryOffsetY + imgPosYFull, bounds.top); bounds.right = Math.max(galleryOffsetX + imgPosXFull + fullWidth, bounds.right); bounds.bottom = Math.max(galleryOffsetY + imgPosYFull + fullHeight, bounds.bottom); image.style.zIndex = maxZIndex--; imagePositionData.push( new Array( image /*0*/, theImage/*1*/, fullWidth/*2*/, fullHeight/*3*/, smallWidth/*4*/, smallHeight/*5*/, parseInt(imgPosXFull)/*6*/, parseInt(imgPosYFull)/*7*/, parseInt(imgPosXSmall)/*8*/, parseInt(imgPosYSmall)/*9*/, parseInt(imgStartPosX)/*10*/, parseInt(imgStartPosY)/*11*/, image.style.display) ); var animationImageNum = i; if(elm.hasClassName("random")) { animationImageNum = Math.floor(Math.random() * numImages); var exists = true; while(exists) { exists = false; for(var jj = 0; jj < animationOrder.length; jj++) { if(animationOrder[jj] == animationImageNum) { exists = true; } } if(exists) { animationImageNum = Math.floor(Math.random() * numImages); } } } animationOrder.push(animationImageNum); } var gallery = { element : elm, images : images, positionData : imagePositionData, left : galleryPosX, top : galleryPosY, width : galleryWidth, height : galleryHeight, thumbWidth : maxThumbWidth, thumbHeight : maxThumbHeight, expanded : false, expanding : false, radius : radius, selectedIndex : -1, collapsed : true, collapsing : false, minDistanceToExpand : minDistanceToExpand, minDistanceToCollapse : minDistanceToCollapse, numImagesToAnimate : 0, dealAnimation : elm.hasClassName("deal"), reverseAnimation : false, overShoot : elm.hasClassName('overshoot'), overShootValue : 0.06, overShootInvert : false, bounds : bounds, hasFocus : false, appear : elm.hasClassName("appear"), offsetX : 0, offsetY : 0, animationOrder : animationOrder }; gallery.bounds.gallery = gallery; expandingGalleries.push(gallery); } }; /** * this function handles all animations */ var scrambleCounter = 0; function expandCollapseGalleries() { for(var j = 0; j < expandingGalleries.length; j++) { var gallery = expandingGalleries[j]; var numUndone = 0; if(gallery.element.hasClassName("scramble") && gallery.expanded && !gallery.collapsing && !gallery.expanding) { for(var i = 0; i < gallery.images.length && scrambleCounter == 1; i++) { if(gallery.selectedIndex == i) continue; var pData = gallery.positionData[i]; var image = pData[0]; var theImage = pData[1]; var randomNoise = Math.floor(Math.random() * 2); randomNoise = Math.random() > 0.5 ? -randomNoise : randomNoise; image.style.left = (pData[8] + randomNoise) + "px"; image.style.top = (pData[9] + randomNoise) + "px"; } if(scrambleCounter == 1) { scrambleCounter = 0; } else { scrambleCounter++; } } if(!gallery.expanding && !gallery.collapsing) continue; gallery.numImagesToAnimate++; var start = (gallery.reverseAnimation ? gallery.positionData.length - 1 : 0); var end = (gallery.reverseAnimation ? -1 : gallery.positionData.length); var step = (gallery.reverseAnimation ? -1 : 1); var loopCount = 0; //alert(start + "=" + end + "=" + step); for(var i = start; i != end && loopCount < gallery.numImagesToAnimate; i += step) { loopCount++; var pData = gallery.positionData[gallery.animationOrder[i]]; var image = pData[0]; var theImage = pData[1]; image.style.visible = "true"; image.style.visibility = "visible"; var finalPositionX = pData[8]; var finalPositionY = pData[9]; finalPositionX += gallery.offsetX; finalPositionY += gallery.offsetY; if(gallery.collapsing) { finalPositionX = pData[10]; finalPositionY = pData[11]; } if(gallery.overShoot) { finalPositionX = Math.round(finalPositionX + finalPositionX * (gallery.overShootValue * (gallery.overShootInvert ? -1 : 1))); finalPositionY = Math.round(finalPositionY + finalPositionY * (gallery.overShootValue * (gallery.overShootInvert ? -1 : 1))); } var currentPositionX = parseInt(image.style.left); var currentPositionY = parseInt(image.style.top); var distanceX = finalPositionX - currentPositionX; var distanceY = finalPositionY - currentPositionY; var multiplier = 1; var moveX = (distanceX / 2) * multiplier; var moveY = (distanceY / 2) * multiplier; var interpolatedX = Math.ceil(currentPositionX + moveX); var interpolatedY = Math.ceil(currentPositionY + moveY); if(currentPositionX != finalPositionX || currentPositionY != finalPositionY) { theImage.width = gallery.collapsing ? pData[2] : pData[4]; theImage.height = gallery.collapsing ? pData[3] : pData[5]; if(Math.abs(moveX) < 1) { image.style.left = finalPositionX + "px"; } else { image.style.left = interpolatedX + "px"; } if(Math.abs(moveY) < 1) { image.style.top = finalPositionY + "px"; } else { image.style.top = interpolatedY + "px"; } currentPositionX = parseInt(image.style.left); currentPositionY = parseInt(image.style.top); if(currentPositionX != finalPositionX || currentPositionY != finalPositionY) { numUndone++; } image.style.zIndex = ( gallery.collapsing && gallery.dealAnimation ? loopCount : gallery.images.length - loopCount); } if( ((parseFloat(image.style.opacity) < 1.0) && gallery.expanding) || ((parseFloat(image.style.opacity) > 0.0) && gallery.collapsing) ) { if(gallery.appear) { var newOpacity = parseFloat(image.style.opacity) + (gallery.expanding ? 0.1 : -0.1); image.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (newOpacity * 100) + ")"; image.style.opacity = newOpacity; numUndone++; } } } if(gallery.numImagesToAnimate < gallery.images.length) { numUndone++; } if(numUndone == 0) { if(gallery.overShoot && gallery.overShootValue != 0) { gallery.overShootValue = gallery.overShootValue / 3; gallery.overShootInvert = !gallery.overShootInvert; if( Math.abs(gallery.overShootValue) < 0.01) { gallery.overShootValue = 0; } if(gallery.dealAnimation) { gallery.numImagesToAnimate = 0; gallery.reverseAnimation = false; } } else { if(gallery.collapsing) { gallery.collapsed = true; gallery.collapsing = false; gallery.expanded = false; gallery.expanding = false; } else { gallery.collapsed = false; gallery.collapsing = false; gallery.expanded = true; gallery.expanding = false; } } } } } var expanding_loaded = false; function reload_expanding() { expandingGalleries = new Array(); Behaviour.apply(rules_expandingGallery); if(expanding_loaded) return; expanding_loaded = true; expandTimer = setInterval(expandCollapseGalleries, 30); window.onresize = function(e) { reload_expanding(); }; /** * mouse click handler */ $(document.body).observe('click', function(e) { if(!e) var e = window.event; var x = (e.clientX ? e.clientX - $(this).cumulativeOffset().left : e.x); var y = (e.clientY ? e.clientY - $(this).cumulativeOffset().top : e.y); var minDistance = 100000; var nearestIndex = -1; if(lightboxVisible) return; for(var j = 0; j < expandingGalleries.length; j++) { var gallery = expandingGalleries[j]; if(!gallery.bounds.intersects(x,y) && gallery.expanded) { if(gallery.dealAnimation) { gallery.numImagesToAnimate = 0; gallery.reverseAnimation = true; } else { gallery.numImagesToAnimate = gallery.images.length; gallery.reverseAnimation = false; } gallery.collapsing = true; expandedGallery = null; } } }); /** * mouse motion handler */ $(document.body).observe('mousemove', function(e) { if(!e) var e = window.event; var so = $(document.body).cumulativeScrollOffset(); var o = $(this).cumulativeOffset(); var x = (e.clientX ? e.clientX - o.left : e.x) + so.left; var y = (e.clientY ? e.clientY - o.top : e.y) + so.top; var minDistance = 100000; var nearestIndex = -1; for(var j = 0; j < expandingGalleries.length; j++) { var gallery = expandingGalleries[j]; var x1 = gallery.left; var y1 = gallery.top; var x2 = x; var y2 = y; var tx = Math.pow(x2 - x1, 2); var ty = Math.pow(y2 - y1, 2); var distance = Math.sqrt(tx + ty); if(distance < minDistance) nearestIndex = j; if(gallery.expanding && !gallery.bounds.intersects(x,y)) { gallery.collapsing = true; gallery.expanding = false; gallery.overShootValue = 0; if(gallery.dealAnimation) { //gallery.numImagesToAnimate = 0; gallery.reverseAnimation = true; } else { gallery.numImagesToAnimate = gallery.images.length; gallery.reverseAnimation = false; } gallery.collapsing = true; gallery.overShootValue = 0; } else if(gallery.expanding || gallery.collapsing) { continue; } if(distance < gallery.minDistanceToExpand && gallery.collapsed) { if(gallery.overShoot) { gallery.overShootValue = 0.06; gallery.overShootInvert = false; } if(gallery.dealAnimation) { gallery.numImagesToAnimate = 0; gallery.reverseAnimation = false; } else { gallery.numImagesToAnimate = gallery.images.length; gallery.reverseAnimation = false; } if(expandedGallery != null && expandedGallery.expanded) { expandedGallery.collapsing = true; expandedGallery.expanding = true; } // recalc positions var bodyRight = $(document.body).getWidth() + $(document.body).cumulativeScrollOffset().left; var bodyLeft = $(document.body).cumulativeScrollOffset().left; var bodyTop = $(document.body).cumulativeScrollOffset().top; var bodyBottom = 0; if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) { bodyBottom = document.documentElement.clientHeight; } else { bodyBottom = document.getElementsByTagName('body')[0].clientHeight; } bodyBottom += bodyTop; var rightOverFlow = 0; var topOverFlow = 0; if(gallery.bounds.right > bodyRight) { rightOverFlow = -Math.round(gallery.bounds.right - bodyRight); } else if(gallery.bounds.left < bodyLeft) { rightOverFlow = -Math.round(gallery.bounds.left - bodyLeft); } if(gallery.bounds.top < bodyTop) { topOverFlow = -Math.round(gallery.bounds.top - bodyTop); } else if(gallery.bounds.bottom > bodyBottom) { topOverFlow = -Math.round(gallery.bounds.bottom - bodyBottom); } var galleryOffsetX = gallery.element.cumulativeOffset().left; var galleryOffsetY = gallery.element.cumulativeOffset().top; gallery.offsetX = rightOverFlow; gallery.offsetY = topOverFlow; gallery.expanding = true; expandedGallery = gallery; for(var k = 0; k < expandingGalleries.length; k++) { for(var ii = 0; ii < expandingGalleries[k].images.length; ii++) { expandingGalleries[k].element.style.zIndex = expandingGalleries[k] == gallery ? 101 : 100; } } gallery.hasFocus = true; } else if(!gallery.bounds.intersects(x, y) && gallery.expanded && !gallery.collapsing && !lightboxVisible && gallery.hasFocus) // distance > gallery.minDistanceToCollapse && gallery.expanded && !gallery.collapsing { if(gallery.dealAnimation) { gallery.numImagesToAnimate = 0; gallery.reverseAnimation = true; } else { gallery.numImagesToAnimate = gallery.images.length; gallery.reverseAnimation = false; } gallery.collapsing = true; gallery.overShootValue = 0; expandedGallery = null; } else if(gallery.expanded && !gallery.collapsing && !gallery.expanding && !lightboxVisible && gallery.hasFocus) { gallery.hasFocus = true; var minDistance = 1000000; var newSelectedIndex = -1; for(var i = 0; i < gallery.positionData.length; i++) { var image = $(gallery.positionData[i][0]); var position = $(image).cumulativeOffset(); var x1 = position.left + gallery.positionData[i][4] / 2; var y1 = position.top + gallery.positionData[i][5] / 2; if(gallery.selectedIndex == i) { x1 = position.left + gallery.positionData[i][2] / 2; y1 = position.top + gallery.positionData[i][3] / 2; } var x2 = x; var y2 = y; var tx = Math.pow(x2 - x1, 2); var ty = Math.pow(y2 - y1, 2); var distance = Math.sqrt(tx + ty); if(distance < minDistance) newSelectedIndex = i; minDistance = Math.min(minDistance, distance); } if(newSelectedIndex != -1) { if(gallery.selectedIndex != -1) { gallery.positionData[gallery.selectedIndex][0].style.zIndex = gallery.positionData[gallery.selectedIndex][0].style.prevZIndex; gallery.positionData[gallery.selectedIndex][1].width = gallery.positionData[gallery.selectedIndex][4]; gallery.positionData[gallery.selectedIndex][1].height = gallery.positionData[gallery.selectedIndex][5]; gallery.positionData[gallery.selectedIndex][0].style.left = (gallery.positionData[gallery.selectedIndex][8] + gallery.offsetX) + "px"; gallery.positionData[gallery.selectedIndex][0].style.top = (gallery.positionData[gallery.selectedIndex][9] + gallery.offsetY) + "px"; } gallery.selectedIndex = newSelectedIndex; for(var i = 0; i < gallery.positionData.length; i++) { var pData = gallery.positionData[i]; var image = pData[0]; var theImage = pData[1]; if(i != gallery.selectedIndex) { /*theImage.width = pData[4]; theImage.height = pData[5]; image.style.left = pData[8] + "px"; image.style.top = pData[9] + "px";*/ } else { theImage.width = pData[2]; theImage.height = pData[3]; image.style.left = (pData[6] + gallery.offsetX) + "px"; image.style.top = (pData[7] + gallery.offsetY) + "px"; } } for(var ii = 0; ii < gallery.images.length; ii++) { //gallery.images[ii].style.zIndex = 2000; } gallery.positionData[gallery.selectedIndex][0].style.prevZIndex = gallery.positionData[gallery.selectedIndex][0].style.zIndex; gallery.positionData[gallery.selectedIndex][0].style.zIndex = 3000; } } if(!gallery.bounds.intersects(x,y)) { gallery.hasFocus = false; } else { gallery.hasFocus = true; } } }); } Behaviour.addLoadEvent( function() { Behaviour.apply(rules); reload_expanding(); moveInPositionTimer = setInterval(function() { var done = true; for(var i=0; i < randomGalleryImages.length; i++) { var data = randomGalleryImages[i]; var imgs = data.images; var telm = data.element; var positionData = data.positionData; var runDone = false; for(var j = 0; j < imgs.length; j++) { var img = imgs[j]; var pData = positionData[j]; var imgX = parseInt(img.style.left); var imgY = parseInt(img.style.top); if(imgX != pData[5] || imgY != pData[6]) { runDone = false; var distanceX = pData[5] - imgX; var distanceY = pData[6] - imgY; var moveX = parseInt(distanceX / 2); var moveY = parseInt(distanceY / 2); img.style.left = parseInt(parseInt(img.style.left) + moveX) + "px"; img.style.top = parseInt(parseInt(img.style.top) + moveY) + "px"; if(Math.abs(moveX) < 1) { img.style.left = pData[5] + "px"; } if(Math.abs(moveY) < 1) { img.style.top = pData[6] + "px"; } if(Math.abs(moveX) < 1 && Math.abs(moveY) < 1) runDone = true; } } if(!runDone) done = false; } if(done) { clearInterval(moveInPositionTimer); } }, 40); }); var prevRefGalleryLink = null; function reloadgalleryimages(galleryId, categoryId, link) { if(prevRefGalleryLink) $(prevRefGalleryLink).removeClassName("cactive"); else if($('refgallery_all_' + galleryId)) $('refgallery_all_' + galleryId).removeClassName("cactive"); new Ajax.Request("/modules/refgallery/gallery.php?reload=1&galleryId=" + galleryId + "&categoryId=" + categoryId, { onSuccess : function(e) { $('galleryimages_' + galleryId).innerHTML = e.responseText; initLightbox(); } }); prevRefGalleryLink = link; $(prevRefGalleryLink).addClassName("cactive"); }