Template:Team:BGU Israel/gallery.js

From 2014.igem.org

Revision as of 10:34, 13 October 2014 by Priels (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

// --- Begin Config --- var preloadSlides = 3; // Number of slides to preload before showing gallery var loadingMessageDelay = 2000; // How long to wait before showing loading message (in ms) var loadingMessageSpeed = 600; // Duration of each pulse in/out of the loading message (in ms) var loadingMessageMinOpacity = 0.4; // Minimum opacity of the loading message var loadingMessageMaxOpacity = 1; // Maximum opacity of the loading message var captionSpeed = 600; // Duration of the caption fade in/out (in ms) var captionOpacity = 0.9; // Maximum opacity of the caption when faded in var currentSlideOpacity = 1.0; // Opacity of the current (centre) slide var backgroundSlideOpacity = 0.5; // Opacity of the slides either side of the current slide // --- End Config ---

var slideHorizMargin = 0; // Number of pixels either side of each slide var buttonHeight = 0; // Temporary store for the button heights var currentSlide = 0; // The slide that the user is currently viewing var totalSlides = 0; // Total number of slides in the gallery var slides = new Array(); // Holds jQuery objects representing each slide image var slideWidths = new Array(); // Holds the widths (in pixels) of each slide var slideLoaded = new Array(); // True if the given slide image has loaded var loading = true; // True if we're still preloading images prior to displaying the gallery

$( init );


// Set up the gallery once the document is ready

function init() {

 // Grab the horizontal margin between slides for later calculations
 slideHorizMargin = parseInt( $('#gallery img').css('margin-left') );
 // Hide the gallery and left/right buttons
 $('#gallery').fadeTo( 0, 0 );
// $('#gallery').css('top','-999em');
 buttonHeight = $('#leftButton').css('height');
// $('#leftButton').css('height',0);
// $('#rightButton').css('height',0);
 // If the requried number of slides haven't loaded after 'loadingMessageDelay' ms,
 // start fading in the loading message
 $('#loading').delay( loadingMessageDelay );
 fadeInLoadingMessage();
 // Bind the handleSlideLoad() handler function to each slide's load event
 $('#gallery img').load( handleSlideLoad );
 // For each of the slide images:
 // 1. Hide the slide
 // 2. Record its serial number (0 = the first slide)
 // 3. Store it in the slides array
 // 4. Trigger the load event if the image is already cached (for IE and Opera)
 $('#gallery img').each( function() {
   $(this).hide();
   $(this).data( 'slideNum', totalSlides );
   slides[totalSlides++] = $(this);
   if ( this.complete ) $(this).trigger("load");
   $(this).attr( 'src', $(this).attr('src') );
 } );
 // Re-centre the current slide whenever the user resizes the browser
 $(window).resize( centreCurrentSlide ); 
 // Set the initial show/hide states of the left and right buttons


 // Set the caption text to the alt text of the first slide
 $('#caption').html( slides[currentSlide].attr('alt') );
   $('#caption').css("display", "block");
 // Bind the moveRight() and moveLeft() functions to
 // the swipeLeft and swipeRight events respectively.
 // (IE chokes on the swipe plugin, so skip this code on IE)


 // Bind the moveleft() and moveRight() functions to the
 // "move left" and "move right" keys on the keyboard

$('#gallery').fadeTo( 1, 1 );


}


// Process each slide once it's finished loading

function handleSlideLoad() {

 // Record the slide's width in the slideWidths array
 slideWidths[$(this).data('slideNum')] = $(this).width();
 // Increase the gallery div's width to encompass this newly-loaded slide
 $('#gallery').width( $('#gallery').width() + $(this).width() + slideHorizMargin*2 );
 // Record the fact that this slide has loaded in the slideLoaded array
 slideLoaded[$(this).data('slideNum')] = true;
 // Are we still preloading the slides?
 if ( loading ) {
   // Yes: Calculate how many slides we've now preloaded
   var preloaded = 0;
   for ( var i=0; i < preloadSlides; i++ ) {
     if ( slideLoaded[i] ) preloaded++;
   }
   // If we've preloaded enough slides, fade in the gallery and enable the left/right buttons
   if ( preloaded == preloadSlides || preloaded == totalSlides ) {
     $('#loading').clearQueue().stop().fadeTo('slow', 0 );
     $('#gallery').css('top',0);
     $('#gallery').fadeTo('slow', 1 );
  //   $('#leftButton').css('height',buttonHeight);
  //   $('#rightButton').css('height',buttonHeight);
  //   $('#rightButton').show();
     loading = false;
   }
 }
 // If this newly-loaded slide is the first slide in the gallery,
 // centre it in the browser viewport and set its opacity to currentSlideOpacity.
 // Otherwise, set its opacity to backgroundSlideOpacity.
 if ( $(this).data('slideNum') == 0 ) {
   centreCurrentSlide();
   $(this).fadeTo( 'slow', currentSlideOpacity );
 } else {
   $(this).fadeTo( 'slow', backgroundSlideOpacity );
 }

}


// Move one slide to the left by sliding the gallery left-to-right

function moveLeft() {

 // Don't move if this is the first slide, or if we don't yet have a width for the previous slide
 if ( currentSlide == 0 ) return;
 if ( slideWidths[currentSlide-1] == undefined ) return;
 // Cancel all event handlers on the current slide
 slides[currentSlide].unbind('mouseenter').unbind('mouseleave').unbind('touchstart');
 // Stop any fades on the caption and hide it
 $('#caption').stop().clearQueue().hide();
 // Slide the whole gallery right so that the previous slide is now centred
 var offset = slideWidths[currentSlide]/2 + slideHorizMargin*2 + slideWidths[currentSlide-1]/2;
 $('#gallery').animate( { left: '+=' + offset } );
 // Fade the old slide to backgroundSlideOpacity, and the new slide to currentSlideOpacity
 slides[currentSlide].animate( { opacity: backgroundSlideOpacity } );
 slides[currentSlide-1].animate( { opacity: currentSlideOpacity } );
 // Update the current slide index
 currentSlide--;
 // Update the shown/hidden states of left/right buttons as appropriate


 // Set the caption to the new current slide's alt text,
 // and attach the hover events to the new slide
 $('#caption').html( slides[currentSlide].attr('alt') );
   $('#caption').css("display", "block");

}


// Move one slide to the right by sliding the gallery right-to-left

function moveRight() {

 // Don't move if this is the final slide, or if we don't yet have a width for the next slide
 if ( currentSlide == totalSlides - 1 ) return;
 if ( slideWidths[currentSlide+1] == undefined ) return;
 // Cancel all event handlers on the current slide
 slides[currentSlide].unbind('mouseenter').unbind('mouseleave').unbind('touchstart');
 // Stop any fades on the caption and hide it
 $('#caption').stop().clearQueue().hide();
 // Slide the whole gallery left so that the next slide is now centred
 var offset = slideWidths[currentSlide]/2 + slideHorizMargin*2 + slideWidths[currentSlide+1]/2;
 $('#gallery').animate( { left: '-=' + offset } );
 // Fade the old slide to backgroundSlideOpacity, and the new slide to currentSlideOpacity
 slides[currentSlide].animate( { opacity: backgroundSlideOpacity } );
 slides[currentSlide+1].animate( { opacity: currentSlideOpacity } );
 // Update the current slide index
 currentSlide++
 // Update the shown/hidden states of left/right buttons as appropriate


 // Set the caption to the new current slide's alt text,
 // and attach the hover events to the new slide
 $('#caption').html( slides[currentSlide].attr('alt') );
 $('#caption').css("display", "block");

}


// Centre the current slide horizontally in the viewport

function centreCurrentSlide() {

 // Work out how far the left edge of the slide is from the
 // left hand edge of the gallery div
 var offsetFromGalleryStart = 0;
 for ( var i=0; i<currentSlide; i++ ) {
   offsetFromGalleryStart += slideWidths[i] + slideHorizMargin*2;
 }
 // Find the horizontal centre of the browser window
 var windowCentre = $(window).width() / 2;
 // Compute the left position of the slide based on the window centre and slide width
 var slideLeftPos = windowCentre - ( slideWidths[currentSlide] / 2 );
 // Compute the offset for the gallery div based on the slide position and
 // the slide offset from the gallery start. Also allow for the
 // horizontal margin on the left side of the slide.
 var offset = slideLeftPos - offsetFromGalleryStart - slideHorizMargin;
 // Move the gallery div to the new offset
 $('#gallery').css( 'left', offset );

}


// Show or hide the left and right buttons depending on the current slide: // 1. If we're showing the first slide, hide the left button // 2. If we're showing the last slide, hide the right button


// Attach mouseenter and mouseleave event handlers to the current slide to fade the caption in and out // However, if the device supports touch events then fade the caption in/out when the slide is touched



// Functions to pulse the loading message

function fadeInLoadingMessage() {

 $('#loading').animate( { opacity: loadingMessageMaxOpacity }, loadingMessageSpeed, 'swing', fadeOutLoadingMessage );

}

function fadeOutLoadingMessage(){

 $('#loading').animate( { opacity: loadingMessageMinOpacity }, loadingMessageSpeed, 'swing', fadeInLoadingMessage );

}