Team:Tongji Shanghai/javascript/TJjquery-wmuSlider

/*!

* jQuery wmuSlider v2.1
* 
* Copyright (c) 2011 Brice Lechatellier
* http://brice.lechatellier.com/
*
* Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
*/
(function($) {
   $.fn.wmuSlider = function(options) {
       /* Default Options
       ================================================== */       
       var defaults = {
           animation: 'fade',
           animationDuration: 600,
           slideshow: true,
           slideshowSpeed: 7000,
           slideToStart: 0,
           navigationControl: true,
           paginationControl: true,
           previousText: 'Previous',
           nextText: 'Next',
           touch: false,
           slide: 'article',
           items: 1
       };
       var options = $.extend(defaults, options);
       
       return this.each(function() {
           /* Variables
           ================================================== */
           var $this = $(this);
           var currentIndex = options.slideToStart;
           var wrapper = $this.find('.wmuSliderWrapper');
           var slides = $this.find(options.slide);
           var slidesCount = slides.length;
           var slideshowTimeout;
           var paginationControl;
           var isAnimating;
           
           
           /* Load Slide
           ================================================== */ 
           var loadSlide = function(index, infinite, touch) {
               if (isAnimating) {
                   return false;
               }
               isAnimating = true;
               currentIndex = index;
               var slide = $(slides[index]);
               $this.animate({ height: slide.innerHeight() });
               if (options.animation == 'fade') {
                   slides.css({
                       position: 'absolute',
                       opacity: 0
                   });
                   slide.css('position', 'relative');
                   slide.animate({ opacity:1 }, options.animationDuration, function() {
                       isAnimating = false;
                   });
               } else if (options.animation == 'slide') {
                   if (!infinite) {
                       wrapper.animate({ marginLeft: -$this.width() / options.items * index }, options.animationDuration, function() {
                           isAnimating = false;
                       });
                   } else {
                       if (index == 0) {
                           wrapper.animate({ marginLeft: -$this.width() / options.items * slidesCount }, options.animationDuration, function() {
                               wrapper.css('marginLeft', 0);
                               isAnimating = false;
                           });
                       } else {
                           if (!touch) {
                               wrapper.css('marginLeft', -$this.width() / options.items * slidesCount);
                           }
                           wrapper.animate({ marginLeft: -$this.width() / options.items * index }, options.animationDuration, function() {
                               isAnimating = false;
                           });
                       }
                   }
               }
               if (paginationControl) {
                   paginationControl.find('a').each(function(i) {
                       if(i == index) {
                           $(this).addClass('wmuActive');
                       } else {
                           $(this).removeClass('wmuActive');
                       }
                   });
               }    
                                                   
               // Trigger Event
               $this.trigger('slideLoaded', index);             
           };
           
       
           /* Navigation Control
           ================================================== */ 
        if (options.navigationControl) {
               var prev = $('<a class="wmuSliderPrev">' + options.previousText + '</a>');
               prev.click(function(e) {
                   e.preventDefault();
                   clearTimeout(slideshowTimeout);
                   if (currentIndex == 0) {
                       loadSlide(slidesCount - 1, true);
                   } else {
                       loadSlide(currentIndex - 1);
                   }
               });
               $this.append(prev);
               
               var next = $('<a class="wmuSliderNext">' + options.nextText + '</a>');
               next.click(function(e) {
                   e.preventDefault();
                   clearTimeout(slideshowTimeout);
                   if (currentIndex + 1 == slidesCount) {    
                       loadSlide(0, true);
                   } else {
                       loadSlide(currentIndex + 1);
                   }
               });                
               $this.append(next);
           }
        
           /* Pagination Control
           ================================================== */ 
           if (options.paginationControl) {
paginationControl = $('
    ');
                   $.each(slides, function(i) {
    
    paginationControl.append('
  • <a href="#">' + i + '</a>
  • ');
                       paginationControl.find('a:eq(' + i + ')').click(function(e) {    
                           e.preventDefault();
                           clearTimeout(slideshowTimeout);   
                           loadSlide(i);
                       });                
                   });
                   $this.append(paginationControl);
               }
               
               
               /* Slideshow
               ================================================== */ 
               if (options.slideshow) {
                   var slideshow = function() {
                       if (currentIndex + 1 < slidesCount) {
                           loadSlide(currentIndex + 1);
                       } else {
                           loadSlide(0, true);
                       }
                       slideshowTimeout = setTimeout(slideshow, options.slideshowSpeed);
                   }
                   slideshowTimeout = setTimeout(slideshow, options.slideshowSpeed);
               }
               
                           
               /* Resize Slider
               ================================================== */ 
               var resize = function() {
                   var slide = $(slides[currentIndex]);
                   $this.animate({ height: slide.innerHeight() });
                   if (options.animation == 'slide') {
                       slides.css({
                           width: $this.width() / options.items
                       });
                       wrapper.css({
                           marginLeft: -$this.width() / options.items * currentIndex,
                           width: $this.width() * slides.length
                       });                    
                   }    
               };
               
                           
               /* Touch
               ================================================== */
               var touchSwipe = function(event, phase, direction, distance) {
                   clearTimeout(slideshowTimeout);              
                   if(phase == 'move' && (direction == 'left' || direction == 'right')) {
                       if (direction == 'right') {
                           if (currentIndex == 0) {
                               wrapper.css('marginLeft', (-slidesCount * $this.width() / options.items) + distance);
                           } else {
                               wrapper.css('marginLeft', (-currentIndex * $this.width() / options.items) + distance);
                           }
                       } else if (direction == 'left') {
                           wrapper.css('marginLeft', (-currentIndex * $this.width() / options.items) - distance);
                       }
                   } else if (phase == 'cancel' ) {
                       if (direction == 'right' && currentIndex == 0) {
                           wrapper.animate({ marginLeft: -slidesCount * $this.width() / options.items }, options.animationDuration);                
                       } else {
                           wrapper.animate({ marginLeft: -currentIndex * $this.width() / options.items }, options.animationDuration);  
                       }
                   } else if (phase == 'end' ) {
                       if (direction == 'right') {
                           if (currentIndex == 0) {
                               loadSlide(slidesCount - 1, true, true);
                           } else {
                               loadSlide(currentIndex - 1);
                           }
                       } else if (direction == 'left')    {        
                           if (currentIndex + 1 == slidesCount) {
                               loadSlide(0, true);
                           } else {
                               loadSlide(currentIndex + 1);
                           }
                       } else {
                           wrapper.animate({ marginLeft: -currentIndex * $this.width() / options.items }, options.animationDuration);
                       }
                   }            
               };
               if (options.touch && options.animation == 'slide') {
                   if (!$.isFunction($.fn.swipe)) {
                       $.ajax({
                           url: 'jquery.touchSwipe.min.js',
                           async: false
                       });
                   }
                   if ($.isFunction($.fn.swipe)) {
                       $this.swipe({ triggerOnTouchEnd:false, swipeStatus:touchSwipe, allowPageScroll:'vertical' });
                   }
               }
               
               
               /* Init Slider
               ================================================== */ 
               var init = function() {
                   var slide = $(slides[currentIndex]);
                   var img = slide.find('img');
                   img.load(function() {
                       wrapper.show();
                       $this.animate({ height: slide.innerHeight() });
                   });
                   if (options.animation == 'fade') {
                       slides.css({
                           position: 'absolute',
                           width: '100%',
                           opacity: 0
                       });
                       $(slides[currentIndex]).css('position', 'relative');
                   } else if (options.animation == 'slide') {
                       if (options.items > slidesCount) {
                           options.items = slidesCount;
                       }
                       slides.css('float', 'left');                    
                       slides.each(function(i){
                           var slide = $(this);
                           slide.attr('data-index', i);
                       });
                       for(var i = 0; i < options.items; i++) {
                           wrapper.append($(slides[i]).clone());
                       }
                       slides = $this.find(options.slide);
                   }
                   resize();
                   
                   $this.trigger('hasLoaded');
                   
                   loadSlide(currentIndex);
               }
               init();
               
                                                   
               /* Bind Events
               ================================================== */
               // Resize
               $(window).resize(resize);
               
               // Load Slide
               $this.bind('loadSlide', function(e, i) {
                   clearTimeout(slideshowTimeout);
                   loadSlide(i);
               });
                           
           });
       }
       
    

    })(jQuery);