(function($) {
  $.fn.overlay = function(options) {
    var defaults = {
  		offset: 0,
  		fade: true,
  		fadeSpeed: 'slow',
  		opacity : 0.25,
  		bgColor : '#333333'
  	};

  	options = jQuery.extend(defaults, options);

    return this.each(function(index, elm) {
      if ($(elm).children(".overlay").length == 0) {
        var html = '<div class="overlay" style="position: absolute;"></div>';

        if ($(elm).get(0).tagName.toLowerCase() == 'body') {
          $(elm).prepend(html);

          var overlay = $(elm).children(".overlay");

          $(window).bind("scroll", $(elm).overlayScroll);
          $(window).bind("resize", $(elm).overlayScroll);
        } else {
          $(elm).before(html);

          var overlay = $(elm).prev(".overlay");
        }

        if ($.browser.msie && $.browser.version < 7) {
          $(elm).find("select:visible").addClass("overlaySelect");
          $(elm).find("select:visible").fadeOut('fast');
        }

        if (overlay) {
          var cssObj = {
            opacity: options.opacity,
            position: "absolute",
            display: "none",
            left: $(elm).offset().left,
            top: $(elm).offset().top,
            width: (($(elm).get(0).tagName.toLowerCase() == 'body')?"100%":$(elm).outerWidth()),
            height: (($(elm).get(0).tagName.toLowerCase() == 'body')?"100%":$(elm).outerHeight()),
            zIndex: "500",
            backgroundColor: options.bgColor
          }

      		overlay.css(cssObj);

      		$(elm).overlayScroll();

      		if (!options.fade) {
            overlay.show();
          } else {
            overlay.fadeIn(options.fadeSpeed);
          }
      	}
      }
    });
  }

  $.fn.overlayScroll = function() {
    $("body").children(".overlay").eq(0).css({
      top: $(window).scrollTop(),
      left: $(window).scrollLeft()
    });
  }

  $.fn.overlayHide = function(options) {
    var destination = top.document ? top.document : document.body;

    if ($(".overlay", destination).length != 0) {
      if (options) {
        var fade = options.fade ? options.fade : false;
        var fadeSpeed = options.fadeSpeed ? options.fadeSpeed : 1000;
      }

      $(".overlay", destination).css("left", "0px");
      $(".overlay", destination).css("top", "0px");

      if (!fade) {
        $(".overlay", destination).remove();
      } else {
        $(".overlay", destination).queue(function() {
          $(".overlay", destination).fadeOut(fadeSpeed);

          $(".overlay", destination).dequeue();
        });

        $(".overlay", destination).queue(function() {
          $(".overlay", destination).remove();
        });
      }
    }
  }
})(jQuery);
