﻿function Overlay(am_options) {

 var o_self = this;
 var $o_overlay;
 var b_isIE6 = !$.support.opacity && !window.XMLHttpRequest;

 var am_defaultOptions = {
  showSpeed: 1000,
  hideSpeed: 1000,
  opacity: 0.5,
  color: '#000000',
  callbackOnInit: null,
  callbackBeforeShow: null,
  callbackOnShow: null,
  callbackOnHide: null
 };

 am_options = $.extend({}, am_defaultOptions, am_options);

 this.getOverlay = function() {
  return $o_overlay;
 };

 this.show = function() {
  if ($o_overlay.is(':visible')) return;

  if (am_options.callbackBeforeShow && $.isFunction(am_options.callbackBeforeShow)) am_options.callbackBeforeShow();

  if (b_isIE6) {
   $('select:not(select)')
    .filter(function() { return this.style.visibility !== 'hidden'; })
    .css({'visibility': 'hidden'});
  }

  $o_overlay
   .show()
   .animate({opacity: am_options.opacity}, am_options.showSpeed, function() {
   if (am_options.callbackOnShow && $.isFunction(am_options.callbackOnShow)) am_options.callbackOnShow();
  });
 };

 this.hide = function() {
  if (!$o_overlay.is(':visible')) return;

  $o_overlay.animate({opacity: 0}, am_options.hideSpeed, function() {
   $o_overlay.hide();
   if (b_isIE6) {
    $('select:not(select)')
     .filter(function() { return this.style.visibility === 'hidden'; })
     .css({'visibility': 'visible'});
   }

   if (am_options.callbackOnHide && $.isFunction(am_options.callbackOnHide)) am_options.callbackOnHide();
  });
 };

 function init() {
  $o_overlay = $('<div class="overlay"></div>')
   .css({
    opacity: 0,
    backgroundColor: am_options.color
   })
   .hide()
   .appendTo($('#body'));

  if (am_options.callbackOnInit && $.isFunction(am_options.callbackOnInit)) am_options.callbackOnInit();
 }

 init();

 return this;

};