/**
 * Overlay
 *
 * Overlay allows to show block element centered horizontally and vertically over page content.
 *
 * Shown element has to:
 * - be absolutely positioned
 * - have both width and height in absolute units
 * - completely fit in browser window
 * - already be attached to the document element hierarchy
 *
 * Works for: FF2.x, IE6, Opera8.x.
 * Not tested for other browsers.
 * Vertical positioning is different in IE6 than in FF.
 *
 * Warning! Overlay uses window.onresize and window.onscroll attributes thus possibly may come
 * in conflict with other code.
 */
var Overlay = {
  z_index : 980,
  background_image : 'gfx/overlay_background.png',

  /**
   * Overlay.bckg
   *
   * Return DOM object representing overlay background.
   */
  bckg : function() {
    var bckg = document.getElementById('overlay_background');
    if (! bckg) {
      bckg = document.createElement('div');
      bckg.id = 'overlay_background';
      bckg.style.position = 'absolute';
      bckg.style.top = '0';
      bckg.style.left = '0';
      bckg.style.right = '0';
      bckg.style.zIndex = Overlay.z_index;
      bckg.style.backgroundImage = "url('" + Overlay.background_image + "')";
      bckg.style.backgroundColor = 'transparent';

      document.body.appendChild(bckg);
    };

    return bckg;
  },

  /**
   * Overlay.hide
   *
   * Hide overlay based on element e.
   */
  hide : function(e) {
    window.onresize = null;
    window.onscroll = null;

    e.style.display = 'none';
    Overlay.bckg().style.display = 'none';
    Overlay.display_selects(true);

    return;
  },

  /**
   * Overlay.show
   *
   * Show element as an overlay window.
   *
   * @param e
   * @return void
   */
  show : function(e) {
    window.onresize = Overlay.position_bckg;
    window.onscroll = Overlay.position_bckg;

    var bckg = Overlay.bckg();

    e.style.position = 'absolute';
    e.style.display = 'block';
    bckg.style.display = 'block';

    var w = e.offsetWidth; //always in pixels
    var h = e.offsetHeight; //always in pixels

    var screen_height = parseInt(window.innerHeight);
    var vertical_scroll = parseInt(window.pageYOffset); //Mozilla
    if (! vertical_scroll) 
      var vertical_scroll = parseInt(document.documentElement.scrollTop); // IE

    var vertical_offset = vertical_scroll;
    if (screen_height)
      vertical_offset += (screen_height - h) / 2;

    e.style.top = Math.round(vertical_offset) + 'px'; 
    e.style.left = '50%';
    e.style.marginLeft = Math.round(-w / 2) + 'px';

    Overlay.display_selects(false);
    Overlay.position_bckg();
  },

  /**
   * Overlay.position_bckg
   *
   * Postion overlay background so that it covers visible portion of page.
   */
  position_bckg : function() {
    var bckg = Overlay.bckg();

    var test1 = document.body.scrollHeight;
    var test2 = document.documentElement.clientHeight;
    var bckg_h;

    if (test1 > test2)
      bckg_h = document.body.scrollHeight;
    else  // Opera 9.0
      bckg_h = document.documentElement.clientHeight;

    var horizontal_scroll = parseInt(window.pageXOffset); //Mozilla
    if (! horizontal_scroll) 
      var horizontal_scroll = parseInt(document.documentElement.scrollLeft); // IE

    bckg.style.width = parseInt(document.body.scrollWidth) + parseInt(horizontal_scroll) + 'px';
    bckg.style.height = parseInt(bckg_h) + 'px';
  },

  display_selects : function(show) {
    var selects =  document.getElementsByTagName('select');
    for (var i = 0; i < selects.length; i++)
      selects[i].style.visibility = show ? '' : 'hidden';
  }
};

