// VSCalcPosTools.js page elements calc setup file
// ------------------------------------------------------------
// namespace Viasoft
// Written by Viasoft Ltd. (viasoft.com.ua)
// Free permission to use granted under BSD licence

function CalcPositionData(absLeft,absTop,absWidth,absHeight) // class to be returned
 {
  // Main names
  this.absLeft   = absLeft;
  this.absTop    = absTop;
  this.absWidth  = absWidth;
  this.absHeight = absHeight;
  
  // Alternative names
  this.absX      = absLeft;
  this.absY      = absTop;
  this.absSizeX  = absWidth;
  this.absSizeY  = absHeight;
 }
 
function CalcElementPositionIsOverlap(pos1,pos2)
 {
  if ((pos1.absX + pos1.absSizeX) < pos2.absX)
   {
    return(false);
   }

  if ((pos1.absY + pos1.absSizeY) < pos2.absY)
   {
    return(false);
   }

  if ((pos2.absX + pos2.absSizeX) < pos1.absX)
   {
    return(false);
   }

  if ((pos2.absY + pos2.absSizeY) < pos1.absY)
   {
    return(false);
   }
   
  return(true);
 }
 
function CalcElementPosition(oSource)
 {
  var x;
  var y;
  var size_x;
  var size_y;
  
  if (isNavigatorIE())
   {
    x = oSource.offsetLeft;
    y = oSource.offsetTop;
    
    size_x = oSource.offsetWidth;
    size_y = oSource.offsetHeight;
    
    var item;
    
    item = oSource.offsetParent;
    
    while((item != null) && (item != document.body))
     {
      x += item.offsetLeft;
      y += item.offsetTop;
      
      item = item.offsetParent;
     }
     
    x += document.body.offsetLeft;
    y += document.body.offsetTop;
    
    //x += document.body.clientLeft;
    //y += document.body.clientTop;
    
    if (document.body.offsetParent != null)
     {
      x += document.body.offsetParent.offsetLeft;
      y += document.body.offsetParent.offsetTop;
     }
    
    return(new CalcPositionData(x,y,size_x,size_y));
   }
  else
   {
    x = 0;
    y = 0;
                
    size_x = oSource.offsetWidth;
    size_y = oSource.offsetHeight;
    
    while(oSource != null)
     {
      x += oSource.offsetLeft;
      y += oSource.offsetTop;
      
      oSource = oSource.offsetParent;
     }
                       		      
    return(new CalcPositionData(x,y,size_x,size_y));
   }
 }
 
function CalcCorrectPositionForAbsElementPosition(oPos)
 {
  // Adjust Pos if element is absolutely positioned
  // (must be used for elements with position:absolute)

  var absX      = oPos.absX;
  var absY      = oPos.absY;
  var absSizeX  = oPos.absSizeX;
  var absSizeY  = oPos.absSizeY;
  
  if (isNavigatorIE())
   {
    absX -= document.body.offsetLeft;
    absY -= document.body.offsetTop;
   }
   
  return(new CalcPositionData(absX,absY,absSizeX,absSizeY));
 }
 
function CalcElementIsPositionAbsoluteActive(oSource)
 {
  var item = oSource;
  var stylePosAbsoluteValue = "absolute".toUpperCase();
  
  while((item != null) && (item != document.body))
   {
    var stylePos = "";
    
    if (window.getComputedStyle)
     {
      // Mozilla
      stylePos = window.getComputedStyle(item,null).position;
     } 
    else if (item.currentStyle)
     {
      // IE
      stylePos = item.currentStyle.position;
     }
    else
     {
      return(false); // BUG trap
     }
    
    stylePos = (""+stylePos).toUpperCase();
    
    if (stylePos == stylePosAbsoluteValue)
     {
      return(true);
     }
    
    item = item.parentNode;
   }
   
  return(false);
 }

function CalcViewPortPosition()
 {
  var BodyAreaX     = document.body.scrollLeft;
  var BodyAreaY     = document.body.scrollTop;
  var BodyAreaSizeX = document.body.parentNode.clientWidth; //document.body.clientWidth; (this not works under IE6 [DOCTYPE?])
  var BodyAreaSizeY = document.body.parentNode.clientHeight; //document.body.clientHeight; (this not works under IE6 [DOCTYPE?])
  
  if ((document.body.parentNode != null) && (document.body.parentNode.scrollLeft != null))
   {
    BodyAreaX += document.body.parentNode.scrollLeft;
   }
   
  if ((document.body.parentNode != null) && (document.body.parentNode.scrollTop != null))
   {
    BodyAreaY += document.body.parentNode.scrollTop;
   }
  
  /*
  alert
   (
    ""
    +"BodyAreaX"+":"+BodyAreaX+"\n"
    +"BodyAreaY"+":"+BodyAreaY+"\n"
    +"BodyAreaSizeX"+":"+BodyAreaSizeX+"\n"
    +"BodyAreaSizeY"+":"+BodyAreaSizeY+"\n"
   );
  */
    
  return(new CalcPositionData(BodyAreaX,BodyAreaY,BodyAreaSizeX,BodyAreaSizeY));
 }

function CalcRangePosition(oRange)
 {
  var resultTop = oRange.offsetTop+document.body.scrollTop;
  
  if ((document.body.parentNode != null) && (document.body.parentNode.scrollTop != null))
   {
    resultTop += document.body.parentNode.scrollTop;
   }
  
  var resultLeft = oRange.offsetLeft+document.body.scrollLeft;
  
  if ((document.body.parentNode != null) && (document.body.parentNode.scrollLeft != null))
   {
    resultLeft += document.body.parentNode.scrollLeft;
   }
    
  return(new CalcPositionData(resultLeft,resultTop,oRange.boundingWidth,oRange.boundingHeight));
 }

function CalcElementPositionExt(oSource)
 {
  var Pos = CalcElementPosition(oSource);
  
  if (CalcElementIsPositionAbsoluteActive(oSource))
   {
    Pos = CalcCorrectPositionForAbsElementPosition(Pos);
   }

  return(Pos);
 }

