/*!

* jQuery Scrollspy Plugin
* Author: @sxalexander
* Licensed under the MIT license
*/

;(function ( $, window, document, undefined ) {

$.fn.extend({
  scrollspy: function ( options ) {
      var defaults = {
        min: 0,
        max: 0,
        mode: 'vertical',
        namespace: 'scrollspy',
        buffer: 0,
        container: window,
        onEnter: options.onEnter ? options.onEnter : [],
        onLeave: options.onLeave ? options.onLeave : [],
        onTick: options.onTick ? options.onTick : []
      }
      var options = $.extend( {}, defaults, options );
      return this.each(function (i) {
          var element = this;
          var o = options;
          var $container = $(o.container);
          var mode = o.mode;
          var buffer = o.buffer;
          var enters = leaves = 0;
          var inside = false;
          /* add listener to container */
          $container.bind('scroll.' + o.namespace, function(e){
              var position = {top: $(this).scrollTop(), left: $(this).scrollLeft()};
              var xy = (mode == 'vertical') ? position.top + buffer : position.left + buffer;
              var max = o.max;
              var min = o.min;
              /* fix max */
              if($.isFunction(o.max)){
                max = o.max();
              }
              /* fix max */
              if($.isFunction(o.min)){
                min = o.min();
              }
              if(max == 0){
                  max = (mode == 'vertical') ? $container.height() : $container.outerWidth() + $(element).outerWidth();
              }
              /* if we have reached the minimum bound but are below the max ... */
              if(xy >= min && xy <= max){
                /* trigger enter event */
                if(!inside){
                   inside = true;
                   enters++;
                   /* fire enter event */
                   $(element).trigger('scrollEnter', {position: position})
                   if($.isFunction(o.onEnter)){
                     o.onEnter(element, position);
                   }
                 }
                 /* trigger tick event */
                 $(element).trigger('scrollTick', {position: position, inside: inside, enters: enters, leaves: leaves})
                 if($.isFunction(o.onTick)){
                   o.onTick(element, position, inside, enters, leaves);
                 }
              }else{
                if(inside){
                  inside = false;
                  leaves++;
                  /* trigger leave event */
                  $(element).trigger('scrollLeave', {position: position, leaves:leaves})
                  if($.isFunction(o.onLeave)){
                    o.onLeave(element, position);
                  }
                }
              }
          }); 
      });
  }
})

})( jQuery, window, document, undefined );