// Bubbletron is a jquery extension based off the widely used jquery.bubbles.js extension
// 
// Usage:
// 
// Basic Usage:
// $(document).ready(function() {
//   $(".bubble-popup").bubbletron();  
// })
// 
// 
// Configurations:
// $(document).ready(function() {
//   $(".bubble-popup").bubbletron({
//     distance: 10,
//     time: 200,
//     hideDelay: 100,
//     hideDelayTimer: null,
//     
//     popupCss: {top: -90, left: -33, display: 'block'}    
//   });
// })
// 
// distance: The distance from the original position
// time: The time it takes to appear and dissapear in milliseconds
// hideDelay:
// hideDelayTimer: 10000
// popupCss: The css added to the popup element during the end of the appear animation

;(function () {
  $.fn.bubbletron = function(options) {
    $(this).each(function () {
      // options

      options        = options || {}
      defaultOptions = $.fn.bubbletron.defaults

      var distance  = options.distance || defaultOptions.distance;
      var time      = options.time || defaultOptions.time;
      var hideDelay = options.hideDelay || defaultOptions.hideDelay;
      var popupCss  = options.popupCss || defaultOptions.popupCss;

      var hideDelayTimer = null;

      // tracker
      var beingShown = false;
      var shown      = false;
    
      var trigger = $('.trigger', this);
      var popup   = $('.popup', this).css('opacity', 0);

      // set the mouseover and mouseout on both element
      $([trigger.get(0), popup.get(0)]).mouseover(function () {
	
        // stops the hide event if we move from the trigger to the popup element
        if (hideDelayTimer) clearTimeout(hideDelayTimer);

        // don't trigger the animation again if we're being shown, or already visible
        if (beingShown || shown) {
          return;
        } else {
          beingShown = true;

          // reset position of popup box
          popup.css(popupCss)

          // (we're using chaining on the popup) now animate it's opacity and position
          .animate({
            top: '-=' + distance + 'px',
            opacity: 1
          }, time, 'swing', function() {
            // once the animation is complete, set the tracker variables
            beingShown = false;
            shown = true;
          });
        }
      }).mouseout(function () {
        // reset the timer if we get fired again - avoids double animations
        if (hideDelayTimer) clearTimeout(hideDelayTimer);
      
        // store the timer so that it can be cleared in the mouseover if required
        hideDelayTimer = setTimeout(function () {
          hideDelayTimer = null;
          popup.animate({
            top: '-=' + distance + 'px',
            opacity: 0
          }, time, 'swing', function () {
            // once the animate is complete, set the tracker variables
            shown = false;
            // hide the popup entirely after the effect (opacity alone doesn't do the job)
            popup.css('display', 'none');
          });
        }, hideDelay);
      });
    });
  }
  
  // default options
  $.fn.bubbletron.defaults = {
    distance: 25,
    time: 500,
    hideDelay: 100,
    hideDelayTimer: null,
    
    popupCss: {top: -10, left: -33, display: 'block'}
  }
  
})($);