// JavaScript Document // Requires JQuery // Based heavily upon the infinite carousel script // http://jqueryfordesigners.com/jquery-infinite-carousel/ $.fn.flyoutCarousel = function () { function repeat(str, num) { return new Array( num + 1 ).join( str ); } return this.each(function () { var $wrapper = $('> div', this).css('overflow', 'hidden'), $slider = $wrapper.find('> ul'), $items = $slider.find('> li'), $single = $items.filter(':first'), singleWidth = $single.outerWidth(), visible = Math.ceil($wrapper.innerWidth() / singleWidth), currentPage = 1, pages = Math.ceil($items.length / visible); // 1. Pad so that 'visible' number will always be seen, otherwise create empty items if (($items.length % visible) != 0) { $slider.append(repeat('
  • ', visible - ($items.length % visible))); //$items = $slider.find('> li'); } // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned')); $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned')); $items = $slider.find('> li'); // reselect // 3. Set the left position to the first 'real' item $wrapper.scrollLeft(singleWidth * visible); // 4. paging function function gotoPage(page) { var isHidden = true; $.each( $items, function() { if ( $(this).children('.hidden').is(':visible') ) { isHidden = false; } }); // DONT ALLOW SCROLLING IF PANEL IS OPEN if ( isHidden == true ) { var dir = page < currentPage ? -1 : 1, n = Math.abs(currentPage - page), left = singleWidth * dir * visible * n; $wrapper.filter(':not(:animated)').animate({ scrollLeft : '+=' + left }, 500, function () { if (page == 0) { $wrapper.scrollLeft(singleWidth * visible * pages); page = pages; } else if (page > pages) { $wrapper.scrollLeft(singleWidth * visible); // reset back to start position page = 1; } currentPage = page; }); } else { $('.wrapper ul li.open div.thumb').click(); } return false; } $wrapper.after('<>'); // 5. Bind to the forward and back buttons $('a.back', this).click(function () { return gotoPage(currentPage - 1); }); $('a.forward', this).click(function () { return gotoPage(currentPage + 1); }); // create a public interface to move to a specific page $(this).bind('goto', function (event, page) { gotoPage(page); }); $('.wrapper .thumb').filter(':not(:animated)').click(function() { var $parentElement = $(this).parent(); if ( $($parentElement).children('.hidden').is(':hidden') ) { // Add Open Class $($parentElement).addClass('open'); // Move object to first position based on the index # var index = ( ( $($items).index($parentElement) ) - ( visible - 1) ); if ( currentPage == '1' ) { var position = index; } else { var position = ( index - ( visible * ( currentPage -1 ) ) ); } var position = position -1; var offset = ( position * singleWidth ); $//("span").text("Index #" + index + " and the offset is" + offset); $wrapper.filter(':not(:animated)').animate({ scrollLeft : '+=' + offset }, 500, 'linear'); // Unhide Children of Clicked Object $($parentElement).children('.hidden').show('slow'); // DISABLE ARROWS $('a.arrow').addClass('inactive'); // $('.output').html('index: ' + index + ' - position: ' + position + ' - Offset: ' + offset + ' - Current Page: ' + currentPage); } else { // Remove Open Class $($parentElement).removeClass('open'); // Move object to first position based on the index # var index = ( ( $($items).index($parentElement) ) - ( visible - 1) ); if ( currentPage == '1' ) { var position = index; } else { var position = ( index - ( visible * ( currentPage -1 ) ) ); } var position = position -1; var offset = ( position * singleWidth ); $($parentElement).removeClass('open'); $($parentElement).children('.hidden').hide( 200, function() { $wrapper.filter(':not(:animated)').animate({ scrollLeft : '-=' + offset }, 500, 'linear' ); }); // ENABLE ARROWS $('a.arrow').removeClass('inactive'); // $('.output').html('index: ' + index + ' - position: ' + position + ' - Offset: ' + offset + ' - Current Page: ' + currentPage); } return false; }); }); }; $(document).ready(function () { $('.flyoutCarousel').flyoutCarousel(); });