//=============================================================================
// GoodHeavens.PopOverWindow:
// Client-side support for the GoodHeavens.Web.UI.WebControls.PopOverWindow 
// control. 
// NOTE: GoodHeavens.js should be loaded first!
//=============================================================================
function GoodHeavens_PopOverWindow ()
{
  this._InitialWindows = new Array ();
  this._MoveElt = 0;
  this._MoveX = 0;
  this._MoveY = 0;
  this._AutoHide = 0;
  this._AutoHideClick = 0;
}
GoodHeavens.PopOverWindow = new GoodHeavens_PopOverWindow ();

function GoodHeavens_PopOverWindow_FindWindowElement (AUniqueID)
{
  var
    elt = 0;
    
  if (AUniqueID)
  {
    elt = GetElement(AUniqueID);
  }
  else if (GoodHeavens.Event)
  {
    elt = GoodHeavens.Event.srcElement;
  }
  
  while (elt && typeof(elt.getAttribute ('PopOverWindow')) == 'object')
  {
    elt = elt.parentNode;
  }
  return elt;
}
GoodHeavens.PopOverWindow.FindWindowElement = GoodHeavens_PopOverWindow_FindWindowElement;

function GoodHeavens_PopOverWindow_FindViewStateElement (AWindowElt)
{
  var
    sID = AWindowElt.getAttribute('PopOverWindow'),
    elt = GetElement (sID+'__Pos');
  if (typeof (elt.tagName) == 'undefined')
  {
    var eltInput;
    for (var i = 0; i < elt.length; i++)
    {
      if (elt[i].tagName == 'INPUT')
      {
        for (var eltP = elt[i]; eltP != null; eltP = eltP.parentNode)
        {
          if (eltP = AWindowElt)
          {
            eltInput = elt[i];
            break;
          }
        }
        if (eltInput) break;
      }
    }
    elt = eltInput;
  }
  return elt;
}
GoodHeavens.PopOverWindow.FindViewStateElement = GoodHeavens_PopOverWindow_FindViewStateElement;

function GoodHeavens_PopOverWindow_PopOverVisible (AUniqueID)
{
  this._InitialWindows[this._InitialWindows.length] = AUniqueID
}
GoodHeavens.PopOverWindow.PopOverVisible = GoodHeavens_PopOverWindow_PopOverVisible;

function GoodHeavens_PopOverWindow_ShowInitialWindows ()
{
  for (var iWindow = 0; iWindow < this._InitialWindows.length; iWindow++)
  {
    this.Show (0, this._InitialWindows[iWindow]);
  } 
}
GoodHeavens.PopOverWindow.ShowInitialWindows = GoodHeavens_PopOverWindow_ShowInitialWindows;
GoodHeavens.AddOnDocumentLoaded ('GoodHeavens.PopOverWindow.ShowInitialWindows()');

function GoodHeavens_PopOverWindow_ShowWindow (AWindowElt, AX, AY)
{
  if (AWindowElt)
  {
    var
      eltState = this.FindViewStateElement (AWindowElt);
    if (eltState)
    {
      if (eltState.value == '')
      {
        eltState.value = 'left: ' + AX + '; top: ' + AY + ';';
        AWindowElt.style.left = AX;
        AWindowElt.style.top = AY;
      }
    }
    else
    {
      AWindowElt.style.left = AX;
      AWindowElt.style.top = AY;
    }
    
    var
      sOnShow = AWindowElt.getAttribute ('OnShow');
    if (sOnShow)
    {
      eval (sOnShow + '()');
    }
    
    AWindowElt.style.visible = '';
    if (AWindowElt.getAttribute('AutoHide'))
    {
      this._AutoHide = AWindowElt;
    }
    this._AutoHideClick = (AWindowElt.getAttribute('AutoHideClick') ? AWindowElt : 0);
  }
}
GoodHeavens.PopOverWindow.ShowWindow = GoodHeavens_PopOverWindow_ShowWindow;

function GoodHeavens_PopOverWindow_Show (AEvent, AUniqueID)
{
  GoodHeavens.RegisterEvent (AEvent);
  GoodHeavens.CancelEvent ();
  var
    elt = this.FindWindowElement(AUniqueID);
  if (elt)
  {
    if (this._AutoHide)
    {
      this.HideWindow (this._AutoHide);
    }
    elt.style.visible = 'hidden';
    elt.style.display = '';
    this.ShowWindow (elt, (document.body.clientWidth - elt.offsetWidth) / 2, (document.body.clientHeight - elt.offsetHeight) / 2);
  }
}
GoodHeavens.PopOverWindow.Show = GoodHeavens_PopOverWindow_Show;

function GoodHeavens_PopOverWindow_ShowNearMousePos (AEvent, AUniqueID)
{
  GoodHeavens.RegisterEvent (AEvent);
  GoodHeavens.CancelEvent ();
  var
    elt = this.FindWindowElement(AUniqueID);
  if (elt)
  {
    if (this._AutoHide)
    {
      this.HideWindow (0, this._AutoHide);
    }
    elt.style.visible = 'hidden';
    elt.style.display = '';
    var
      e = GoodHeavens.Event,
      x  = new Array (e.clientX - elt.offsetWidth, e.clientX, e.clientX - elt.offsetWidth/2),
      y  = new Array (e.clientY, e.clientY - elt.offsetHeight, e.clientY - elt.offsetHeight/2),
      dx = -elt.offsetWidth, ix,
      dy = -elt.offsetHeight, iy;
    for (var i = 0; i < 3; i++)
    {
      var
        dxi = Math.min (x[i], document.body.clientWidth  - x[i] - elt.offsetWidth);
        dyi = Math.min (y[i], document.body.clientHeight - y[i] - elt.offsetHeight);
        
      if (dx < 0 && dxi >= dx)
      {
        ix = i; dx = dxi;
      }
      if (dy < 0 && dyi >= dy)
      {
        iy = i; dy = dyi;
      }
    }
    this.ShowWindow (elt, x[ix], y[iy]);
  }
}
GoodHeavens.PopOverWindow.ShowNearMousePos = GoodHeavens_PopOverWindow_ShowNearMousePos;

function GoodHeavens_PopOverWindow_Hide (AEvent, AUniqueID)
{
  GoodHeavens.RegisterEvent (AEvent);
  GoodHeavens.CancelEvent ();
  var
    elt = this.FindWindowElement(AUniqueID);
  if (elt)
  {
    this.HideWindow (elt);
  }
}
GoodHeavens.PopOverWindow.Hide = GoodHeavens_PopOverWindow_Hide;

function GoodHeavens_PopOverWindow_HideWindow (AWindowElt)
{
  if (AWindowElt)
  {
    if (AWindowElt == this._AutoHide)
    {
      this._AutoHide = 0;
    }
    if (AWindowElt == this._AutoHideClick)
    {
      this._AutoHideClick = 0;
    }
    if (AWindowElt == this._MoveElt)
    {
      this.MouseUp ();
    }
    AWindowElt.style.display = 'none';
    
    var
      eltState = this.FindViewStateElement (AWindowElt);
    if (eltState)
    {
      eltState.value = '';
    }
    
    var
      sOnHide = AWindowElt.getAttribute ('OnHide');
    if (sOnHide)
    {
      eval (sOnHide + '()');
    }
  }
}
GoodHeavens.PopOverWindow.HideWindow = GoodHeavens_PopOverWindow_HideWindow;

function GoodHeavens_PopOverWindow_WindowMoved (AEvent)
{
  if (typeof (this._InitialWindows) != 'undefined')
  {
    GoodHeavens.RegisterEvent (AEvent);
    var
      elt = this.FindWindowElement ();
    if (elt)
    {
      var
        eltState = this.FindViewStateElement (elt);
      if (eltState)
      {
        eltState.value = 'left: ' + elt.style.pixelLeft + '; top: ' + elt.style.pixelTop + ';';
      }
    }
  }
  else
  {
    GoodHeavens.PopOverWindow.WindowMoved (AEvent);
  }
}
GoodHeavens.PopOverWindow.WindowMoved = GoodHeavens_PopOverWindow_WindowMoved;
