(function ($, window) { var offsets = { top: 0, right: 0, bottom: 0, left: 0 }; /** * Provides displacement of page box */ Drupal.settings.displace = {}; Drupal.settings.displace.elements = []; Drupal.displace = Drupal.displace || {}; /** * Attaches the Displace behavior to each element with '.displace' class. */ Drupal.behaviors.Displace = { attach: function (context, settings) { $('.displace').once('displace', function() { var $el = $(this); var settings = {}; if ($el.hasClass('displace-top')) settings.top = true; if ($el.hasClass('displace-right')) settings.right = true; if ($el.hasClass('displace-bottom')) settings.bottom = true; if ($el.hasClass('displace-left')) settings.left = true; Drupal.settings.displace.elements.push(new Drupal.displace(this, settings)); }); } } /** * Displacement object. */ Drupal.displace = function (element, settings) { var defaults = { top: false, right: false, bottom: false, left: false }; $.extend(this, defaults, settings); this.element = element; } /** * Get all displacement offsets or for one edge only */ Drupal.displace.getOffsets = function (refresh, edge) { var edge = edge || false; if (refresh) { var edges = edge ? [edge] : ['top', 'right', 'bottom', 'left']; for (e in edges) { offsets[edges[e]] = 0; for (i in Drupal.settings.displace.elements) { var displaceObject = Drupal.settings.displace.elements[i]; if (displaceObject[edges[e]]) { offsets[edges[e]] += displaceObject.getDisplace(edges[e]); } } } } return edge ? offsets[edge] : offsets; } /** * Returns a displacement for given edge */ Drupal.displace.prototype.getDisplace = function (edge) { var offset = 0; switch (edge) { case 'left': case 'right': offset = $(this.element).outerWidth(); break; case 'top': case 'bottom': offset = $(this.element).outerHeight(); } return offset; } })(jQuery, this);