MachoThemes.initMTNavigation = function ($) {
/**
* Calculate the width of an element
*
* @param element
* @returns {*}
* @constructor
*/
var MTcalcWidth = function (element) {
return element.width();
};
/**
*
* @type {number}
*/
var toggled = 0;
/**
* Check the resize direction ( LEFT OR RIGHT )
*
* @param ref
* @param current
* @returns {*}
* @constructor
*/
var MTCheckResize = function (ref, current) {
var result;
if ( ref == current ) {
return false;
}
if ( ref < current ) {
result = 'right';
} else {
result = 'left';
}
windowWidth = current;
return result;
};
/**
* Look for an already created list in the container, if there is none - create it and return it
*
* @param initiated
* @param container
* @returns {jQuery}
* @constructor
*/
var MTCreateList = function (container) {
var hiddenList = $(container).find('.mt-navigation-hidden');
if ( !hiddenList.length ) {
$(container).append('
');
hiddenList = $(container).find('.mt-navigation-hidden');
}
$(container).trigger('MTNavigationHolderCreated', [ 'MTNavigationHolderCreated', 'Event' ]);
return hiddenList;
};
/**
* Add items to the list
*
* @param data
* @constructor
*/
var MTAddItemsToList = function (data) {
var items = data.hiddenItems,
list = data.hiddenList;
$.each(items, function () {
$(this).detach().appendTo(list);
});
};
/**
* Calculations, returns an object containing the items that need to be placed in the other list
*
* @param direction
* @param selector
* @returns {{action: boolean, perRow: number, hiddenItems: (Buffer|ArrayBuffer|Array.|Blob|string|*), allItems:
* (*|jQuery), notHidden: (Buffer|ArrayBuffer|Array.|Blob|string|*), container: *}}
* @constructor
*/
var MTComputedStats = function (selector, direction) {
var containerWidth = MTcalcWidth(selector.parents('.col-md-12')),
listItems = $(selector).find('li').not('.mt-navigation-holder'),
elementWidth = MTcalcWidth(listItems),
allElements = $(selector).find('li').not('.mt-navigation-holder').length,
perRow = Math.floor(containerWidth / elementWidth),
maxPerRow = perRow - 2,
hideThis = allElements - maxPerRow,
hiddenItems = listItems.slice(-hideThis);
var object = {
action : true,
perRow : maxPerRow,
hiddenItems: hiddenItems,
allItems : listItems,
notHidden : listItems.slice(0, maxPerRow),
container : selector
};
if ( direction === 'right' ) {
object.hiddenItems = listItems.slice(-(allElements - object.notHidden.length));
}
if ( perRow > allElements ) {
object.action = false;
}
if ( object.action ) {
object.hiddenList = MTCreateList(selector);
}
return object;
};
/**
* Initiate the script here, we define the selector and start the calculations
* @type {any}
*/
var menu = $('#menu-social-items'),
pluginObject = MTComputedStats(menu),
windowWidth = $(window).width();
/**
* Start adding items to the list
*/
if ( pluginObject.action ) {
MTAddItemsToList(pluginObject);
}
/**
* List toggle functionality
*/
var toggler = $('.mt-navigation-opener');
toggler.addClass('mt-navigation-initiated');
toggler.on('click', function (e) {
e.preventDefault();
$(this).next('ul').toggleClass('opened');
});
$(menu).on('MTNavigationHolderCreated', function () {
toggler = $('.mt-navigation-opener');
if ( toggler.hasClass('mt-navigation-initiated') ) {
return false;
}
toggler.addClass('mt-navigation-initiated');
toggler.on('click', function (e) {
e.preventDefault();
$(this).next('ul').toggleClass('opened');
});
});
/**
* Close menu on click
*/
$(document).on('click', function (e) {
var menuToggled = $('.mt-navigation-opener').next('ul');
if ( menuToggled.hasClass('opened') ) {
toggled++;
}
if ( !menuToggled.is(e.target) ) {
if ( toggled > 1 ) {
menuToggled.removeClass('opened');
toggled = 0;
}
}
});
/**
* Window resize handling
*/
$(window).on('resize', function () {
clearTimeout(window.MTresizedFinished);
window.MTresizedFinished = setTimeout(function () {
var resizedWindow = $(window).width(),
direction = MTCheckResize(windowWidth, resizedWindow),
newData;
switch ( direction ) {
case 'left':
newData = MTComputedStats(menu);
if ( newData.action ) {
MTAddItemsToList(newData);
}
break;
case 'right':
newData = MTComputedStats(menu, direction);
if ( !newData.action ) {
$(menu).find('.mt-navigation-holder > ul').children().detach().appendTo(menu);
$(menu).find('.mt-navigation-holder').remove();
} else {
var toggler = $(menu).find('.mt-navigation-holder');
$.each(newData.notHidden, function () {
if ( $(this).parent().hasClass('mt-navigation-hidden') ) {
$(this).detach().insertBefore(toggler);
}
});
}
break;
}
}, 50);
});
};