Template:Amoy/Javascript/GalleryJs

<script type="text/javascript"> $(window).load(function(){ var $iw_thumbs = $('#iw_thumbs'), $iw_ribbon = $('#iw_ribbon'), $iw_ribbon_close = $iw_ribbon.children('span.iw_close'), $iw_ribbon_zoom = $iw_ribbon.children('span.iw_zoom');

ImageWall = (function() { // window width and height var w_dim, // index of current image current = -1, isRibbonShown = false, isFullMode = false, // ribbon / images animation settings ribbonAnim = {speed : 500, easing : 'easeOutExpo'}, imgAnim = {speed : 400, easing : 'jswing'}, // init function : call masonry, calculate window dimentions, initialize some events init = function() { $iw_thumbs.imagesLoaded(function(){ $iw_thumbs.masonry({ isAnimated : true }); }); getWindowsDim(); initEventsHandler(); }, // calculate window dimentions getWindowsDim = function() { w_dim = { width : $(window).width(), height : $(window).height() }; }, // initialize some events initEventsHandler = function() {

// click on a image $iw_thumbs.delegate('li', 'click', function() { if($iw_ribbon.is(':animated')) return false;

var $el = $(this);

if($el.data('ribbon')) { showFullImage($el); } else if(!isRibbonShown) { isRibbonShown = true;

$el.data('ribbon',true);

// set the current current = $el.index();

showRibbon($el); } });

// click ribbon close $iw_ribbon_close.bind('click', closeRibbon);

// on window resize we need to recalculate the window dimentions $(window).bind('resize', function() { getWindowsDim(); if($iw_ribbon.is(':animated')) return false; closeRibbon(); }) .bind('scroll', function() { if($iw_ribbon.is(':animated')) return false; closeRibbon(); });

}, showRibbon = function($el) { var $img = $el.children('img'), $descrp = $img.next();

// fadeOut all the other images $iw_thumbs.children('li').not($el).animate({opacity : 0.2}, imgAnim.speed);

// increase the image z-index, and set the height to 100px (default height) $img.css('z-index', 100) .data('originalHeight',$img.height()) .stop() .animate({ height : '100px' }, imgAnim.speed, imgAnim.easing);

// the ribbon will animate from the left or right // depending on the position of the image var ribbonCssParam = { top : $el.offset().top - $(window).scrollTop() - 6 + 'px' }, descriptionCssParam, dir;

if( $el.offset().left < (w_dim.width / 2) ) { dir = 'left'; ribbonCssParam.left = 0; ribbonCssParam.right = 'auto'; } else { dir = 'right'; ribbonCssParam.right = 0; ribbonCssParam.left = 'auto'; }

$iw_ribbon.css(ribbonCssParam) .show() .stop() .animate({width : '100%'}, ribbonAnim.speed, ribbonAnim.easing, function() { switch(dir) { case 'left' : descriptionCssParam = { 'left' : $img.outerWidth(true) + 'px', 'text-align' : 'left' }; break; case 'right' : descriptionCssParam = { 'left' : '-200px', 'text-align' : 'right' }; break; }; $descrp.css(descriptionCssParam).fadeIn(); // show close button and zoom $iw_ribbon_close.show(); $iw_ribbon_zoom.show(); });

}, // close the ribbon // when in full mode slides in the middle of the page // when not slides left closeRibbon = function() { isRibbonShown = false

$iw_ribbon_close.hide(); $iw_ribbon_zoom.hide();

if(!isFullMode) {

// current wall image var $el = $iw_thumbs.children('li').eq(current);

resetWall($el);

// slide out ribbon $iw_ribbon.stop() .animate({width : '0%'}, ribbonAnim.speed, ribbonAnim.easing);

} else { $iw_ribbon.stop().animate({ opacity : 0.8, height : '0px', marginTop : w_dim.height/2 + 'px' // half of window height }, ribbonAnim.speed, function() { $iw_ribbon.css({ 'width' : '0%', 'height' : '126px', 'margin-top': '0px' }).children('img').remove(); });

isFullMode = false; } }, resetWall = function($el) { var $img = $el.children('img'), $descrp = $img.next();

$el.data('ribbon',false);

// reset the image z-index and height $img.css('z-index',1).stop().animate({ height : $img.data('originalHeight') }, imgAnim.speed,imgAnim.easing);

// fadeOut the description $descrp.fadeOut();

// fadeIn all the other images $iw_thumbs.children('li').not($el).animate({opacity : 1}, imgAnim.speed); }, showFullImage = function($el) { isFullMode = true;

$iw_ribbon_close.hide();

var $img = $el.children('img'), large = $img.data('img'),

// add a loading image on top of the image $loading = $('');

$el.append($loading);

// preload large image $('<img/>').load(function() { var $largeImage = $(this);

$loading.remove();

$iw_ribbon_zoom.hide();

resizeImage($largeImage);

// reset the current image in the wall resetWall($el);

// animate ribbon in and out $iw_ribbon.stop().animate({ opacity : 1, height : '0px', marginTop : '63px' // half of ribbons height }, ribbonAnim.speed, function() { // add the large image to the DOM $iw_ribbon.prepend($largeImage);

$iw_ribbon_close.show();

$iw_ribbon.animate({ height : '100%', marginTop : '0px', top : '0px' }, ribbonAnim.speed); }); }).attr('src',large);

}, resizeImage = function($image) { var widthMargin = 100, heightMargin = 100,

windowH = w_dim.height - heightMargin, windowW = w_dim.width - widthMargin, theImage = new Image();

theImage.src = $image.attr("src");

var imgwidth = theImage.width, imgheight = theImage.height;

if((imgwidth > windowW) || (imgheight > windowH)) { if(imgwidth > imgheight) { var newwidth = windowW, ratio = imgwidth / windowW, newheight = imgheight / ratio;

theImage.height = newheight; theImage.width = newwidth;

if(newheight > windowH) { var newnewheight = windowH, newratio = newheight/windowH, newnewwidth = newwidth/newratio;

theImage.width = newnewwidth; theImage.height = newnewheight; } } else { var newheight = windowH, ratio = imgheight / windowH, newwidth = imgwidth / ratio;

theImage.height = newheight; theImage.width = newwidth;

if(newwidth > windowW) { var newnewwidth = windowW, newratio = newwidth/windowW, newnewheight = newheight/newratio;

theImage.height = newnewheight; theImage.width = newnewwidth; } } }

$image.css({ 'width' : theImage.width + 'px', 'height' : theImage.height + 'px', 'margin-left' : -theImage.width / 2 + 'px', 'margin-top' : -theImage.height / 2 + 'px' }); };

return {init : init}; })();

ImageWall.init(); }); </script>