Team:UT-Dallas/dropit.js

From 2014.igem.org

/*

* Dropit v1.1.0
* http://dev7studios.com/dropit
*
* Copyright 2012, Dev7studios
* Free to use and abuse under the MIT license.
* http://www.opensource.org/licenses/mit-license.php
*/
(function($) {
   $.fn.dropit = function(method) {
       var methods = {
           init : function(options) {
               this.dropit.settings = $.extend({}, this.dropit.defaults, options);
               return this.each(function() {
                   var $el = $(this),
                        el = this,
                        settings = $.fn.dropit.settings;
                   // Hide initial submenus
                   $el.addClass('dropit')
                   .find('>'+ settings.triggerParentEl +':has('+ settings.submenuEl +')').addClass('dropit-trigger')
                   .find(settings.submenuEl).addClass('dropit-submenu').hide();
                   // Open on click
                   $el.on(settings.action, settings.triggerParentEl +':has('+ settings.submenuEl +') > '+ settings.triggerEl +, function(){
                       // Close click menu's if clicked again
                       if(settings.action == 'click' && $(this).parents(settings.triggerParentEl).hasClass('dropit-open')){
                           settings.beforeHide.call(this);
                           $(this).parents(settings.triggerParentEl).removeClass('dropit-open').find(settings.submenuEl).hide();
                           settings.afterHide.call(this);
                           return false;
                       }
                       // Hide open menus
                       settings.beforeHide.call(this);
                       $('.dropit-open').removeClass('dropit-open').find('.dropit-submenu').hide();
                       settings.afterHide.call(this);
                       // Open this menu
                       settings.beforeShow.call(this);
                       $(this).parents(settings.triggerParentEl).addClass('dropit-open').find(settings.submenuEl).show();
                       settings.afterShow.call(this);
                       return false;
                   });
                   // Close if outside click
                   $(document).on('click', function(){
                       settings.beforeHide.call(this);
                       $('.dropit-open').removeClass('dropit-open').find('.dropit-submenu').hide();
                       settings.afterHide.call(this);
                   });
                   // If hover
                   if(settings.action == 'mouseenter'){
                       $el.on('mouseleave', function(){
                           settings.beforeHide.call(this);
                           $(this).removeClass('dropit-open').find(settings.submenuEl).hide();
                           settings.afterHide.call(this);
                       });
                   }
                   settings.afterLoad.call(this);
               });
           }
       };
       if (methods[method]) {
           return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
       } else if (typeof method === 'object' || !method) {
           return methods.init.apply(this, arguments);
       } else {
           $.error( 'Method "' +  method + '" does not exist in dropit plugin!');
       }
   };
   $.fn.dropit.defaults = {
       action: 'mouseenter', // The open action for the trigger
       submenuEl: 'ul', // The submenu element
       triggerEl: 'a', // The trigger element
       triggerParentEl: 'li', // The trigger parent element
       afterLoad: function(){}, // Triggers when plugin has loaded
       beforeShow: function(){}, // Triggers before submenu is shown
       afterShow: function(){}, // Triggers after submenu is shown
       beforeHide: function(){}, // Triggers before submenu is hidden
       afterHide: function(){} // Triggers before submenu is hidden
   };
   $.fn.dropit.settings = {};

})(jQuery);