isleshocky77

Ability to close

Oct 18th, 2011
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 13.99 KB | None | 0 0
  1. Index: liteaccordion.jquery.js
  2. ===================================================================
  3. --- liteaccordion.jquery.js (revision 47)
  4. +++ liteaccordion.jquery.js (revision 48)
  5. @@ -11,14 +11,14 @@
  6.  **************************************************/
  7.  
  8.  ;(function($) {
  9. -    
  10. +
  11.      var LiteAccordion = function(elem, options) {
  12. -        
  13. +
  14.          var defaults = {
  15.              containerWidth : 960,                   // fixed (px)
  16.              containerHeight : 320,                  // fixed (px)
  17.              headerWidth: 48,                        // fixed (px)
  18. -                                                    
  19. +
  20.              activateOn : 'click',                   // click or mouseover
  21.              firstSlide : 1,                         // displays slide (n) on page load
  22.              slideSpeed : 800,                       // slide animation speed
  23. @@ -29,25 +29,25 @@
  24.              pauseOnHover : false,                   // pause on hover
  25.              cycleSpeed : 6000,                      // time between slide cycles
  26.              easing : 'swing',                       // custom easing function
  27. -                                                    
  28. +
  29.              theme : 'basic',                        // basic, dark, light, or colour
  30.              rounded : false,                        // square or rounded corners
  31. -            enumerateSlides : false,                // put numbers on slides
  32. +            enumerateSlides : false,                // put numbers on slides
  33.              linkable : false                        // link slides via hash, *not supported in IE7
  34.          },
  35.  
  36. -        // merge defaults with options in new settings object  
  37. +        // merge defaults with options in new settings object
  38.              settings = $.extend({}, defaults, options),
  39. -        
  40. +
  41.          // 'globals'
  42.              slides = elem.children('ol').children('li'),
  43.              header = slides.children(':first-child'),
  44.              slideLen = slides.length,
  45. -            slideWidth = settings.containerWidth - slideLen * settings.headerWidth,
  46. +            slideWidth = settings.containerWidth - slideLen * settings.headerWidth,
  47.  
  48. -        // public methods    
  49. +        // public methods
  50.              methods = {
  51. -                    
  52. +
  53.                  // start elem animation
  54.                  play : function(index) {
  55.                      var next = core.nextSlide(index && index);
  56. @@ -59,7 +59,7 @@
  57.                          header.eq(next()).trigger('click.liteAccordion');
  58.                      }, settings.cycleSpeed);
  59.                  },
  60. -            
  61. +
  62.                  // stop elem animation
  63.                  stop : function() {
  64.                      clearInterval(core.playing);
  65. @@ -75,11 +75,11 @@
  66.                  // trigger previous slide
  67.                  prev : function() {
  68.                      methods.stop();
  69. -                    header.eq(core.currentSlide - 1).trigger('click.liteAccordion');  
  70. +                    header.eq(core.currentSlide - 1).trigger('click.liteAccordion');
  71.                  },
  72. -                
  73. +
  74.                  // destroy plugin instance
  75. -                destroy : function() {                    
  76. +                destroy : function() {
  77.                      // stop autoplay
  78.                      methods.stop();
  79.  
  80. @@ -99,7 +99,7 @@
  81.                          .end()
  82.                          .find('b')
  83.                          .remove();
  84. -                        
  85. +
  86.                      slides
  87.                          .removeClass('slide')
  88.                          .children()
  89. @@ -115,22 +115,22 @@
  90.                          methods : methods,
  91.                          core : core
  92.                      };
  93. -                }      
  94. +                }
  95.              },
  96.  
  97.          // core utility and animation methods
  98.              core = {
  99. -        
  100. +
  101.                  // set style properties
  102. -                setStyles : function() {                    
  103. +                setStyles : function() {
  104.                      // set container heights, widths, theme & corner style
  105.                      elem
  106.                          .width(settings.containerWidth)
  107.                          .height(settings.containerHeight)
  108.                          .addClass('accordion')
  109. -                        .addClass(settings.rounded && 'rounded')                  
  110. +                        .addClass(settings.rounded && 'rounded')
  111.                          .addClass(settings.theme);
  112. -                        
  113. +
  114.                      // set tab width, height and selected class
  115.                      slides
  116.                          .addClass('slide')
  117. @@ -143,11 +143,11 @@
  118.                      // compensate for borders on 'light' theme
  119.                      if (settings.theme === 'light') slideWidth -= parseInt(elem.children('ol').css('borderTopWidth'), 10);
  120.  
  121. -                    // set initial positions for each slide            
  122. +                    // set initial positions for each slide
  123.                      header.each(function(index) {
  124.                          var $this = $(this),
  125.                              left = index * settings.headerWidth;
  126. -                            
  127. +
  128.                          if (index >= settings.firstSlide) left += slideWidth;
  129.  
  130.                          $this
  131. @@ -166,26 +166,26 @@
  132.                  },
  133.  
  134.                  // bind click and mouseover events
  135. -                bindEvents : function() {                                        
  136. +                bindEvents : function() {
  137.                      if (settings.activateOn === 'click') {
  138.                          header.bind('click.liteAccordion', core.triggerSlide);
  139.                      } else if (settings.activateOn === 'mouseover') {
  140.                          header.bind({
  141.                              'mouseover.liteAccordion' : core.triggerSlide,
  142. -                            'click.liteAccordion' : core.triggerSlide                          
  143. +                            'click.liteAccordion' : core.triggerSlide
  144.                          });
  145.                      }
  146. -                    
  147. -                    // pause on hover (can't use custom events with $.hover())      
  148. +
  149. +                    // pause on hover (can't use custom events with $.hover())
  150.                      if (settings.pauseOnHover && settings.autoPlay) {
  151.                          elem.bind('mouseover.liteAccordion', function() {
  152.                              core.playing && methods.stop();
  153.                          }).bind('mouseout.liteAccordion', function() {
  154.                              !core.playing && methods.play(core.currentSlide);
  155.                          });
  156. -                    }
  157. +                    }
  158.                  },
  159. -                
  160. +
  161.                  linkable : function() {
  162.                      var cacheSlideNames = (function() {
  163.                          var slideNames = [];
  164. @@ -195,15 +195,15 @@
  165.                          });
  166.  
  167.                          // memoize
  168. -                        return cacheSlideNames = slideNames;                        
  169. +                        return cacheSlideNames = slideNames;
  170.                      })();
  171. -                    
  172. +
  173.                      var triggerHash = function(e) {
  174.                          var index;
  175. -                        
  176. +
  177.                          if (e.type === 'load' && !window.location.hash) return;
  178.                          if (e.type === 'hashchange' && core.playing) return;
  179. -                        
  180. +
  181.                          index = $.inArray((window.location.hash.slice(1)).toLowerCase(), cacheSlideNames);
  182.                          if (index > -1 && index < cacheSlideNames.length) header.eq(index).trigger('click.liteAccordion');
  183.                      };
  184. @@ -213,9 +213,9 @@
  185.                          'load.liteAccordion' : triggerHash
  186.                      });
  187.                  },
  188. -                
  189. +
  190.                  // counter for autoPlay (zero index firstSlide on init)
  191. -                currentSlide : settings.firstSlide - 1,            
  192. +                currentSlide : settings.firstSlide - 1,
  193.  
  194.                  // next slide index
  195.                  nextSlide : function(index) {
  196. @@ -225,11 +225,11 @@
  197.                      return function() {
  198.                          return next++ % slideLen;
  199.                      };
  200. -                },  
  201. -    
  202. +                },
  203. +
  204.                  // holds interval counter
  205.                  playing : 0,
  206. -                
  207. +
  208.                  // animates left and right groups of slides
  209.                  // side: denotes left side
  210.                  animSlideGroup : function(index, next, side) {
  211. @@ -240,48 +240,72 @@
  212.                          .each(function() {
  213.                              var $this = $(this),
  214.                                  slideIndex = slides.index($this);
  215. -                                
  216. +
  217.                              $this
  218.                                  .children()
  219.                                  .stop(true)
  220.                                  .animate({
  221.                                      left : (side ? 0 : slideWidth) + slideIndex * settings.headerWidth
  222. -                                },
  223. -                                    settings.slideSpeed,
  224. +                                },
  225. +                                    settings.slideSpeed,
  226.                                      settings.easing,
  227. -                                    function() {
  228. +                                    function() {
  229.                                          // flag ensures that fn is only called one time per triggerSlide
  230.                                          if (!core.slideAnimCompleteFlag) {
  231.                                              settings.onSlideAnimComplete.call(next);
  232.                                              core.slideAnimCompleteFlag = true;
  233.                                          }
  234. -                                    });                                    
  235. +                                    });
  236.                          });
  237.                  },
  238. -                
  239. +
  240.                  slideAnimCompleteFlag : false,
  241. -                
  242. +
  243.                  // trigger slide animation
  244.                  triggerSlide : function(e) {
  245.                      var $this = $(this),
  246.                          index = header.index($this),
  247. -                        next = $this.next();                          
  248. -                                                                  
  249. +                        next = $this.next();
  250. +
  251. +                    // close group if the first slide is clicked and already open
  252. +                    if(index == 0 && core.currentSlide == 0) {
  253. +                      // trigger callback in context of sibling div
  254. +                      settings.onTriggerSlide.call(next);
  255. +
  256. +                      slides.eq(0)
  257. +                        .children()
  258. +                        .stop(true)
  259. +                        .animate({
  260. +                            left : settings.containerWidth - settings.headerWidth * slides.length
  261. +                            },
  262. +                            settings.slideSpeed,
  263. +                            settings.easing,
  264. +                            function() {
  265. +                                // flag ensures that fn is only called one time per triggerSlide
  266. +                                if (!core.slideAnimCompleteFlag) {
  267. +                                    settings.onSlideAnimComplete.call(next);
  268. +                                    core.slideAnimCompleteFlag = true;
  269. +                                }
  270. +                            });
  271. +                      core.currentSlide = -1;
  272. +                      return false;
  273. +                    }
  274. +
  275.                      // update core.currentSlide
  276.                      core.currentSlide = index;
  277. -                    
  278. +
  279.                      // reset onSlideAnimComplete callback flag
  280.                      core.slideAnimCompleteFlag = false;
  281.  
  282.                      // remove, then add selected class
  283. -                    header.removeClass('selected').filter($this).addClass('selected');              
  284. -                
  285. +                    header.removeClass('selected').filter($this).addClass('selected');
  286. +
  287.                      // reset current slide index in core.nextSlide closure
  288.                      if (e.originalEvent && settings.autoPlay) {
  289.                          methods.stop();
  290.                          methods.play(index);
  291.                      }
  292. -                    
  293. +
  294.                      // set location.hash
  295.                      if (settings.linkable) window.location.hash = $this.parent().attr('name');
  296.  
  297. @@ -292,14 +316,14 @@
  298.                      core.animSlideGroup(index, next, true);
  299.                      core.animSlideGroup(index, next);
  300.                  },
  301. -                
  302. +
  303.                  ieTransformTest : function() {
  304.                      var div = document.createElement('div');
  305. -                    
  306. -                    typeof div.style.msTransform === 'string' && elem.addClass('ie9');                
  307. +
  308. +                    typeof div.style.msTransform === 'string' && elem.addClass('ie9');
  309.                      div = null;
  310.                  },
  311. -                
  312. +
  313.                  init : function() {
  314.                      core.setStyles();
  315.                      core.bindEvents();
  316. @@ -320,7 +344,7 @@
  317.  
  318.          // expose methods
  319.          return methods;
  320. -      
  321. +
  322.      };
  323.  
  324.      $.fn.liteAccordion = function(method) {
  325. @@ -331,7 +355,7 @@
  326.          if (typeof method === 'object' || !method) {
  327.              return elem.each(function() {
  328.                  var liteAccordion;
  329. -    
  330. +
  331.                  // if plugin already instantiated, return
  332.                  if (instance) return;
  333.  
  334. @@ -347,9 +371,9 @@
  335.                  return instance[method].call(elem);
  336.              } else { // the rest of the methods are chainable though
  337.                  instance[method].call(elem);
  338. -                return elem;                
  339. +                return elem;
  340.              }
  341.          }
  342.      };
  343.  
  344. -})(jQuery);
  345. \ No newline at end of file
  346. +})(jQuery);
  347.  
Advertisement
Add Comment
Please, Sign In to add comment