TildBJ
5/31/2017 - 12:10 PM

menuPosition.js

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));
});