var calculatePosition = function($current) {
"use strict";
var instance = {};
instance.$currentElement = $current;
instance.deepestPoint = 700;
instance.$parent = instance.$currentElement.parents('.dropdown-menu');
instance.$secondLevel = instance.$currentElement.parents('.level2');
instance.margin = 0;
/**
* @return void
*/
instance.setMargin = function () {
instance.$currentElement.css('margin-top', '-' + instance.margin + 'px');
};
/**
* @return {number}
*/
instance.calculateDifferenceBetweenObjects = function () {
return instance.$currentElement.offset().top - instance.$secondLevel.offset().top - parseInt(instance.$secondLevel.css('padding-top'));
};
/**
* @return {boolean}
*/
instance.currentIsDeeperThanDeepestPoint = function () {
return (instance.$parent.outerHeight() + instance.$parent.offset().top) > instance.deepestPoint;
};
/**
* @return void
*/
instance.overrideDeepestPoint = function () {
if (instance.currentIsDeeperThanDeepestPoint()) {
instance.deepestPoint = instance.$parent.outerHeight() + instance.$parent.offset().top;
}
};
instance.overrideDeepestPoint();
var currentOuterHeight = instance.$currentElement.outerHeight(),
parentOuterHeight = instance.$parent.outerHeight(),
currentOffset = instance.$currentElement.offset().top + currentOuterHeight;
if (currentOffset > instance.deepestPoint) {
var parentDeepestPoint = parentOuterHeight + instance.$parent.offset().top,
currentDeepestPoint = currentOuterHeight + instance.$currentElement.offset().top;
if (currentOuterHeight > parentOuterHeight && currentOuterHeight > (parentDeepestPoint - instance.$secondLevel.offset().top)) {
// Top flush
instance.margin = instance.calculateDifferenceBetweenObjects();
} else {
// down flush
instance.margin = currentDeepestPoint - parentDeepestPoint;
}
instance.setMargin();
}
};
jQuery('.level3, .level4').each(function () {
calculatePosition($(this));
});