diff --git a/core/misc/displace.js b/core/misc/displace.js index e787cc2..9f34545 100644 --- a/core/misc/displace.js +++ b/core/misc/displace.js @@ -65,9 +65,45 @@ /** * Removes elements from the list of displacing elements for an edge. + * + * @param elementsByEdge + * Either an object like displacingElements variable + * or an edge (edge will remove all elements assigned to it) */ displace.removeElements = function (elementsByEdge) { - // @todo provide a way to remove elements from the set of displacing elements. + // Check if only edge is given + if ($.inArray(elementsByEdge, ['top', 'right', 'bottom', 'left']) !== -1) { + displacingElements[elementsByEdge] = []; + } + // Remove elements by edge + else { + // Go through each edge in elementsByEdge. + for (var edge in elementsByEdge) { + if (elementsByEdge.hasOwnProperty(edge)) { + // Each element or set of elements must be listed under an edge + // property. + if ($.inArray(edge, ['top', 'right', 'bottom', 'left']) === -1) { + continue; + } + // Array of elements that will be removed + var remove = []; + var elements = elementsByEdge[edge]; + // Wrap the elements in an array if just one element is provided. + elements = (!'length' in elements) ? [elements] : elements; + // Loop through each element and add it to the list of displacing + // elements for the given edge. + for (var i = 0, n = elements.length; i < n; i++) { + // The elements will be stored as DOM nodes for consistency. + var el = ('get' in elements[i]) ? elements[i].get() : elements[i]; + remove.push(el); + } + // Now remove elements from displacingElements + displacingElements[edge] = $.grep(displacingElements[edge], function(el) { + return $.inArray(el, remove) === -1; + }); + } + } + } }; /** @@ -85,8 +121,8 @@ for (var edge in displacingElements) { if (displacingElements.hasOwnProperty(edge)) { var displacement = 0; - // Zero out the offset for this edge. - offsets[edge] = 0; + // Perform the calculations on a local varialbe + var offset = 0; // Go through the displacing elements on each edge and calculate the // offset. for (var i = 0, n = displacingElements[edge].length; i < n; i++) { @@ -137,11 +173,10 @@ } // If the displacement value is larger than the current value for this // edge, use the value. - if (displacement >= 0 && displacement > offsets[edge]) { - // Store the displacement value in the closure's offsets variable. - offsets[edge] = displacement; - } + offset = Math.max(offset, displacement); } + // Store the calculated offset + offsets[edge] = offset; } } }