/**
 *  abstract window control object
 */

/**
 *  function to center the window in InternetExplorer
 */
function THWndCtrl_center_ie4()
{
  var b = this.document.body;
  this.moveTo(b.scrollLeft + Math.max(0, Math.floor((b.clientWidth - this.width) / 2)), b.scrollTop + 100);
}

/**
 *  function to center the window in mozilla
 */
function THWndCtrl_center_moz()
{
  this.moveTo(self.pageXOffset + Math.max(0, Math.floor((self.innerWidth - this.width) / 2)), self.pageYOffset + 100);
}

/**
 *  function to set effects in InternetExplorer
 */
function THWndCtrl_setEffects_ie4(fx)
{
  this.effects = fx;
  with (this.wnd)
  {
    filters[0].enabled = (fx & 256) != 0;
    filters[1].enabled = (fx & 512) != 0;
    filters[2].enabled = (fx & 1024) != 0;
    filters[4].enabled = (fx & 2048) != 0;
  }
}

/**
 *  function to set effects in Mozilla
 */
function THWndCtrl_setEffects_moz(fx)
{
  this.effects = fx;
}

/**
 *  function to set opacity in Internet Explorer
 */
function THWndCtrl_setOpacity_ie4(op)
{
  this.opacity = Math.max(0, Math.min(100, Math.floor(op - 0)));
  this.wnd.filters[3].opacity = this.opacity;
  this.wnd.filters[3].enabled = (this.opacity < 100);
}

/**
 *  function to set opacity in Mozilla
 */
function THWndCtrl_setOpacity_moz(op)
{
  this.opacity = Math.max(0, Math.min(100, Math.floor(op - 0)));
  this.wnd.style.MozOpacity = this.opacity + "%";
}

/**
 *  function to set the window size
 */
function THWndCtrl_setSize_css(w, h)
{
  this.wnd.style.width = (this.width = Math.floor(w - 0)) + "px";
  this.wnd.style.height = typeof(h) == "number" ? (this.height = Math.floor(h)) + "px" : "auto";
}

/**
 *  function to set the window size in Netscape 4
 */
function THWndCtrl_setSize_ns4(w, h)
{
  this.wnd.clip.width = this.width = Math.floor(w - 0);
  if (typeof(h) == "number")
  {
    this.wnd.clip.height = this.height = Math.floor(h);
  }
}

/**
 *  function to set the focus
 */
function THWndCtrl_focus()
{
  this.setZIndex(THWndCtrl.TOPZINDEX++);
}

/**
 *  set the Z-Index of the window
 */
function THWndCtrl_setZIndex_css(z)
{
  this.wnd.style.zIndex = this.zindex = z || 0;
}

/**
 *  set the Z-Index in Netscape 4
 */
function THWndCtrl_setZIndex_ns4(z)
{
  this.wnd.zIndex = this.zindex = z || 0;
}

/**
 *  move the window
 */
function THWndCtrl_moveTo_css(x, y)
{
  this.wnd.style.left = (this.x = Math.floor(x - 0)) + "px";
  this.wnd.style.top = (this.y = Math.floor(y - 0)) + "px";
}

/**
 *  move the window in Netscape 4
 */
function THWndCtrl_moveTo_ns4(x, y)
{
  this.wnd.moveTo(this.x = Math.floor(x - 0), this.y = Math.floor(y - 0));
}

/**
 *  fx handler
 */
function THWndCtrl_fxhandler()
{
  this.fxhandler = THControl.nop;
  this.onShow(this.visible, this.tag);
}

/**
 *  show the window in Internet Explorer
 */
function THWndCtrl_show_ie4(show)
{
  if (this.visible != show)
  {
    var fx = false;
    switch (show ? this.effects & 15 : (this.effects & 240) >>> 4)
    {
      case 1:
        fx = this.wnd.filters[5];
        break;
      case 2:
        (fx = this.wnd.filters[6]).transition = show ? 1 : 0;
        break;
      case 3:
        (fx = this.wnd.filters[6]).transition = show ? 3 : 2;
        break;
      case 4:
        (fx = this.wnd.filters[6]).transition = show ? 5 : 4;
        break;
      case 5:
        (fx = this.wnd.filters[6]).transition = show ? 14 : 13;
        break;
      case 6:
        (fx = this.wnd.filters[6]).transition = show ? 16 : 15;
        break;
      case 7:
        (fx = this.wnd.filters[6]).transition = 12;
        break;
      case 8:
        (fx = this.wnd.filters[6]).transition = 8;
        break;
      case 9:
        (fx = this.wnd.filters[6]).transition = 9;
    }

    if (fx)
    {
      fx.apply();
      this.wnd.style.visibility = (this.visible = show) ? "visible" : "hidden";
      this.fxhandler = THWndCtrl_fxhandler;
      fx.play(0.3);
    }
    else
    {
      this.wnd.style.visibility = (this.visible = show) ? "visible" : "hidden";
      this.onShow(show, this.tag);
    }
  }
}

/**
 *  window fade
 */
function THWndCtrl_fade_moz(op, step)
{
  this._wndt = false;
  if (step)
  {
    op += step;
    if ((op > 0) && (op < this.opacity))
    {
      this.wnd.style.MozOpacity = op + "%";
      this._wndt = setTimeout(this.name + ".fade(" + op + "," + step + ")", 50);
    }
    else
    {
      if (op <= 0)
      {
        this.wnd.style.visibility = "hidden";
        this.visible = false;
      }
      this.wnd.style.MozOpacity = this.opacity + "%";
      this.onShow(this.visible, this.tag);
    }
  }
}

/**
 *  show the window in Mozilla
 */
function THWndCtrl_show_moz(show)
{
  if (this.visible != show)
  {
    if (this._wndt)
    {
      clearTimeout(this._wndt);
      this._wndt = false;
    }

    var step = show ? ((this.effects & 15) == 1) && Math.floor(this.opacity / 5) :
                      ((this.effects & 240) == 16) && - Math.floor(this.opacity / 5);
    if (step)
    {
      if (this.visible)
      {
        this.fade(this.opacity - 0, step);
      }
      else
      {
        this.wnd.style.MozOpacity = "0%";
        this.wnd.style.visibility = "visible";
        this.visible = true;
        this.fade(0, step);
      }
    }
    else
    {
      this.wnd.style.visibility = (this.visible = show) ? "visible" : "hidden";
      this.onShow(show, this.tag);
    }
  }
}

/**
 *  show the window
 */
function THWndCtrl_show_css(show)
{
  if (this.visible != show)
  {
    this.wnd.style.visibility = (this.visible = show) ? "visible" : "hidden";
    this.onShow(show, this.tag);
  }
}

/**
 *  show the window in Netscape 4
 */
function THWndCtrl_show_ns4(show)
{
  if (this.visible != show)
  {
    this.wnd.visibility = (this.visible = show) ? "show" : "hidden";
    this.onShow(show, this.tag);
  }
}

/**
 *  create the window
 */
function THWndCtrl_create_dom2()
{
  with (this)
  {
    this.fxhandler = THControl.nop;
    var ie4 = document.body && document.body.filters;
    var moz = document.body && document.body.style &&
    typeof(document.body.style.MozOpacity) == "string";

    document.write('<div unselectable="on" id="' + id +
                   (ie4 ? '" onfilterchange="' + name + '.fxhandler()': '') +
                   '" style="position:absolute;left:' + x + 'px;top:' + y +
                   'px;width:' + width + (height != null ? 'px;height:' + height : '') +
                   'px;visibility:' + (visible ? 'visible' : 'hidden') +
                   ';overflow:hidden' + (zindex ? ';z-index:' + zindex : '') +
                   (ie4 ? ';filter:Gray(enabled=' + (effects & 256 ? '1' : '0') +
                   ') Xray(enabled=' + (effects & 512 ? '1' : '0') +
                   ') Invert(enabled=' + (effects & 1024 ? '1' : '0') +
                   ') alpha(enabled=' + (opacity < 100 ? '1' : '0') + ',opacity=' + opacity +
                   ') shadow(enabled=' + (effects & 2048 ? '1' : '0') +
                   ',direction=135) BlendTrans(enabled=0) RevealTrans(enabled=0)' : '') +
                   (moz && (opacity < 100) ? ';-moz-opacity:' + opacity + '%' : '') +
                   '"><div unselectable="on" class="qwindow">');

    if (typeof(content) == "function")
    {
      this.content();
    }
    else
    {
      document.write(content);
    }

    document.write('</div></div>');
    if (this.wnd = document.getElementById ? document.getElementById(id) :
                        (document.all.item ? document.all.item(id) : document.all[id]))
    {
      if (wnd.style)
      {
        ie4 = ie4 && wnd.filters;
        moz = moz && typeof(wnd.style.MozOpacity) == "string";
        this.moveTo = THWndCtrl_moveTo_css;
        this.setZIndex = THWndCtrl_setZIndex_css;
        this.focus = THWndCtrl_focus;
        this.setSize = THWndCtrl_setSize_css;
        this.show = ie4 ? THWndCtrl_show_ie4 : (moz ? THWndCtrl_show_moz : THWndCtrl_show_css);
        this.fade = moz ? THWndCtrl_fade_moz : THControl.nop;
        this.setOpacity = ie4 ? THWndCtrl_setOpacity_ie4 : (moz ? THWndCtrl_setOpacity_moz : THControl.nop);
        this.setEffects = ie4 ? THWndCtrl_setEffects_ie4 : (moz ? THWndCtrl_setEffects_moz : THControl.nop);
        this.center = self.innerWidth ? THWndCtrl_center_moz :
                          (document.body && document.body.clientWidth ? THWndCtrl_center_ie4 : THControl.nop);
      }
    }
  }
}

/**
 *  create the window in Netscape 4
 */
function THWndCtrl_create_ns4(finalize)
{
  with (this)
  {
    if (finalize)
    {
      if (_wnde)
      {
        parent.window.onload = _wnde;
        parent.window.onload();
      }

      document.open();
      document.write('<div class="qwindow">');
      this.content();
      document.write('</div>');
      document.close();
    }
    else
    {
      document.write('<layer id="' + id + '" left="' + x + '" top="' + y +
                     '" width="' + width + '" visibility="' + (visible ? 'show' : 'hidden') +
                     (height != null ? '" height="' + height + '" clip="' + width + ',' + height : '') +
                     (zindex ? '" z-index="' + zindex : '') + (typeof(content) != "function" ?
                     '"><div class="qwindow">' + content + '</div></layer>' : '">&nbsp;</layer>'));

      if (this.window = this.wnd = document.layers[id])
      {
        if (this.document = wnd.document)
        {
          this.show = THWndCtrl_show_ns4;
          this.moveTo = THWndCtrl_moveTo_ns4;
          this.setZIndex = THWndCtrl_setZIndex_ns4;
          this.focus = THWndCtrl_focus;
          this.center = THWndCtrl_center_moz;
          this.setSize = THWndCtrl_setSize_ns4;
          if (typeof(content) == "function")
          {
            this._wnde = parent.window.onload;
            parent.window.onload = new Function(name + ".create(true)");
          }
        }
      }
    }
  }
}

/**
 *  creating the window is not possible
 */
function THWndCtrl_create_na()
{
  this.document.write('Object THWndCtrl is not supported.');
  this.wnd = null;
}

/**
 *  create the window
 */
function THWndCtrl_create()
{
  with (this)
  {
    this.create = (document.getElementById || document.all) ? THWndCtrl_create_dom2 :
                  (document.layers ? THWndCtrl_create_ns4 : THWndCtrl_create_na);
    create();
  }
}

/**
 *  constructor
 */
function THWndCtrl()
{
  this.x = this.y = 0;
  this.width = this.height = 0;
  this.content = "";
  this.visible = true;
  this.effects = 0;
  this.opacity = 100;
  this.zindex = null;
  this._wndt = this._wnde = false;
  this.create = THWndCtrl_create;
  this.show = THControl.nop;
  this.focus = THControl.nop;
  this.center = THControl.nop;
  this.moveTo = THControl.nop;
  this.setSize = THControl.nop;
  this.setOpacity = THControl.nop;
  this.setEffects = THControl.nop;
  this.setZIndex  = THControl.nop;
  this.onShow = THControl.event;
}

THWndCtrl.prototype = new THControl();
THWndCtrl.TOPZINDEX   = 1000;
THWndCtrl.GRAY        = 256;
THWndCtrl.XRAY        = 512;
THWndCtrl.INVERT      = 1024;
THWndCtrl.SHADOW      = 2048;
THWndCtrl.FADEIN      = 1;
THWndCtrl.FADEOUT     = 16;
THWndCtrl.BOXIN       = 2;
THWndCtrl.BOXOUT      = 32;
THWndCtrl.CIRCLEIN    = 3;
THWndCtrl.CIRCLEOUT   = 48;
THWndCtrl.WIPEIN      = 4;
THWndCtrl.WIPEOUT     = 64;
THWndCtrl.HBARNIN     = 5;
THWndCtrl.HBARNOUT    = 80;
THWndCtrl.VBARNIN     = 6;
THWndCtrl.VBARNOUT    = 96;
THWndCtrl.DISSOLVEIN  = 7;
THWndCtrl.DISSOLVEOUT = 112;
THWndCtrl.HBLINDSIN   = 8;
THWndCtrl.HBLINDSOUT  = 128;
THWndCtrl.VBLINDSIN   = 9;
THWndCtrl.VBLINDSOUT  = 144;
