bcubed-8.x-1.0-beta5/modules/bcubed_interaction/js/jquery.highlightoverlay.js

modules/bcubed_interaction/js/jquery.highlightoverlay.js
(function($){
  var highlightOverlay = function() {
    var container,
    defaults = {
      zIndex: 1000000,
      overlayOpacity: 0.5,
      exitOnOverlayClick: true,
      dismissCallback: undefined,
      actions: [
        {
          label: 'Dismiss',
          id: 'dismiss',
          callback: undefined
        }
      ]
    },
    topMask = $("<div/>").addClass("highlightMask"),
    bottomMask = $("<div/>").addClass("highlightMask"),
    leftMask = $("<div/>").addClass("highlightMask"),
    rightMask = $("<div/>").addClass("highlightMask"),
    message = $("<div/>").addClass("highlightMessage"),
    buttons = [];

    isFixed = function(element) {
        var $element = $(element);
        var $checkElements = $element.add($element.parents());
        var isFixed = false;
        $checkElements.each(function(){
          if ($(this).css("position") === "fixed") {
            isFixed = true;
            return false;
          }
        });
        return isFixed;
    },

    getElementAttrs = function(element) {
      return {
        top: element.offset().top,
        left: element.offset().left,
        width: element.outerWidth(),
        height: element.outerHeight()
      }
    },
    positionMask = function(element) {
      var attrs = getElementAttrs(element),
          top = attrs.top,
          left = attrs.left,
          width = attrs.width,
          height = attrs.height,
          pos = 'absolute',
          offset = 0;

      if(isFixed(element)) {
        pos = "fixed";
        offset = $(document).scrollTop();
      }

      topMask.css({
        height: (top - offset) + "px",
        position: pos
      });

      bottomMask.css({
        top: (height + top - offset) + "px",
        height: ($(document).height() - height - top) + "px",
        position: pos
      });

      leftMask.css({
        width: (left) + "px",
        top: (top - offset) + "px",
        height: (height) + "px",
        position: pos
      });

      rightMask.css({
        left: (left + width) + "px",
        top: (top - offset) + "px",
        height: (height) + "px",
        width: ($(document).width() - width - left) + "px",
        position: pos
      });
    },
    showMessage = function(html) {
      // set message content
      content = $("<div/>").addClass("messageContent");
      content.html(html);
      // add dismiss button
      content.append(buttons);
      // add to message container
      $(message).append(content);
    },
    scrollIntoView = function(element) {

      var elementTop = element.offset().top;
      var elementBottom = elementTop + element.outerHeight();

      var viewportTop = $(window).scrollTop();
      var viewportBottom = viewportTop + $(window).height();

      if ((elementBottom > viewportTop) && (elementTop < viewportBottom)) {
        // element already in viewport, no need to scroll
      }
      else {
        // element not in viewport, scroll into view
        $('body').animate({
            scrollTop: element.offset().top - 20
        });
      }
    },
    clear = function() {
      message.detach();
      topMask.add(bottomMask).add(leftMask).add(rightMask).stop().detach();
      if (typeof options.dismissCallback != 'undefined'){
        options.dismissCallback();
      }
    }

    return {
      init: function(opts) {
        container = $(this);
        options = $.extend({}, defaults, opts);

        topMask.add(bottomMask).add(leftMask).add(rightMask).css("z-index", options.zIndex + 1);
        message.css("z-index", options.zIndex + 2).html("");
        $.each(options.actions, function(index, value){
          button = $("<button/>").addClass("dismissButton");
          button.html(value.label);
          if (typeof value.id != 'undefined'){
            button.attr('id', value.id);
          }
          button.on("click", function() {
            if (!$(this).hasClass("disabled")) {
              clear();
              if (typeof value.callback != 'undefined'){
                value.callback();
              }
            }
          });
          buttons.push(button);
        });

        if (options.exitOnOverlayClick) {
          topMask.add(bottomMask).add(leftMask).add(rightMask).on("click", function() {
            clear();
          });
        }

        return {
          highlight: function(selector, html) {
            var element = $(selector);
            container.append(topMask, bottomMask, leftMask, rightMask);
            container.append(message);
            topMask.add(bottomMask).add(leftMask).add(rightMask).stop().show();
            positionMask(element);
            topMask.add(bottomMask).add(leftMask).add(rightMask).css({opacity: options.overlayOpacity});
            scrollIntoView(element);
            showMessage(html);
          },
          exit: function() {
            clear();
          }
        }
      },
    }
  }();

  $.fn.extend({
    highlightOverlay: highlightOverlay.init
  });
})(jQuery);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc