| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- (function ($) {
-
- /**
- * The constructor of the dropdown object
- * @param {object} element The menu element.
- * @returns {object} The dropdown menu object.
- */
- function um_dropdownMenu(element) {
-
- var self = {
- get: function(){
- return self;
- },
-
- show: function () {
- self.hideAll();
-
- /* add dropdown into the <body> */
- self.$menu = self.$element.find('.um-new-dropdown');
- if ( !self.$menu.length ) {
- self.$menu = $('div.um-new-dropdown[data-element="' + self.data.element + '"]').first();
- }
- self.$dropdown = self.$menu.clone();
- self.$dropdown.on('click', 'li a', self.itemHandler); /* add the handler for menu items */
- $(window).on('resize', self.updatePosition); /* update the position on window resize */
- $(document.body).append(self.$dropdown);
-
- /* trigger event */
- self.$element.trigger('um_new_dropdown_render', {
- dropdown_layout: self.$dropdown,
- trigger: self.data.trigger,
- element: self.data.elemen,
- obj: self.$element
- });
-
- /* set styles and show */
- self.$dropdown.css(self.calculatePosition()).show();
- self.$element.addClass('um-new-dropdown-shown').data('um-new-dropdown-show', true);
-
- return self;
- },
-
- hide: function () {
- if ( self.$dropdown && self.$dropdown.is(':visible') ) {
- $(window).off('resize', self.updatePosition);
- self.$dropdown.remove();
- self.$element.removeClass('um-new-dropdown-shown').data('um-new-dropdown-show', false);
- }
-
- return self;
- },
-
- hideAll: function () {
- self.hide();
- $('body > div.um-new-dropdown').remove();
- $('.um-new-dropdown-shown').removeClass('um-new-dropdown-shown').data('um-new-dropdown-show', false);
-
- return self;
- },
-
- calculatePosition: function () {
- var offset = self.$element.offset(),
- rect = self.$element.get(0).getBoundingClientRect(),
- height = self.$dropdown.innerHeight() || 150,
- width = self.data.width || 150,
- place = '';
-
- var css = {
- position: 'absolute',
- width: width + 'px'
- };
-
- /* vertical position */
- if ( window.innerHeight - rect.bottom > height ) {
- css.top = offset.top + rect.height + 'px';
- place += 'bottom';
- } else {
- place += 'top';
- css.top = offset.top - height + 'px';
- }
-
- /* horisontal position */
- if ( offset.left > width || offset.left > window.innerWidth / 2 ) {
- css.left = offset.left + rect.width - width + 'px';
- place += '-left';
- } else {
- css.left = offset.left + 'px';
- place += '-right';
- }
-
- /* border */
- switch ( place ) {
- case 'bottom-right':
- css.borderRadius = '0px 5px 5px 5px';
- break;
- case 'bottom-left':
- css.borderRadius = '5px 0px 5px 5px';
- break;
- case 'top-right':
- css.borderRadius = '5px 5px 5px 0px';
- break;
- case 'top-left':
- css.borderRadius = '5px 5px 0px 5px';
- break;
- }
-
- return css;
- },
-
- updatePosition: function () {
- if ( self.$dropdown && self.$dropdown.is(':visible') ) {
- self.$dropdown.css(self.calculatePosition());
- }
-
- return self;
- },
-
- itemHandler: function (e) {
- e.stopPropagation();
-
- /* trigger 'click' in the original menu */
- var attrClass = $(e.currentTarget).attr('class');
- self.$menu.find('li a[class="' + attrClass + '"]').trigger('click');
-
- /* hide dropdown */
- self.hide();
- },
-
- triggerHandler: function (e) {
- e.stopPropagation();
-
- self.$element = $(e.currentTarget);
-
- if ( self.$element.data('um-new-dropdown-show') ) {
- self.hide();
- } else {
- self.show();
- }
- }
- };
-
- self.$menu = $(element);
-
- self.data = self.$menu.data();
-
- self.$element = self.$menu.closest(self.data.element);
- if ( !self.$element.length ) {
- self.$element = $(self.data.element).first();
- }
-
- self.$dropdown = $(document.body).children('div[data-element="' + self.data.element + '"]');
-
- if ( typeof self.data.initted === 'undefined' ) {
- self.$menu.data('initted', true);
- $(document.body).on(self.data.trigger, self.data.element, self.triggerHandler);
- }
-
- if ( typeof um_dropdownMenu.globalHandlersInitted === 'undefined' ) {
- um_dropdownMenu.globalHandlersInitted = true;
- $(document.body).on('click', function (e) {
- if ( !$(e.target).closest('.um-new-dropdown').length ) {
- self.hideAll();
- }
- });
- }
-
- return self;
- }
-
- /* Add the method um_dropdownMenu() to the jQuery */
- $.fn.um_dropdownMenu = function (action) {
- if ( typeof action === 'string' && action ) {
- return this.map( function (i, menu) {
- var obj = um_dropdownMenu( menu );
- return typeof obj[action] === 'function' ? obj[action]() : obj[action];
- } ).toArray();
- } else {
- return this.each( function (i, menu) {
- um_dropdownMenu( menu );
- } );
- }
- };
-
- })(jQuery);
-
-
- function um_init_new_dropdown() {
- jQuery('.um-new-dropdown').um_dropdownMenu();
- }
-
- /* Init all dropdown menus on page load */
- jQuery( document ).ready( function($) {
- um_init_new_dropdown();
- });
|