//<!--
var   m_control = null;

function InitRubberBand(controlId) {
   var rubberBand = document.getElementById(controlId + '_RubberBand');
   
   // --- not yet rendered, keep waiting ---
   
   if (rubberBand.offestTop < 0) {
      setTimeout('InitRubberBand("' + controlId + '")', 1);
   } else {
      Setup(controlId, document.forms[0]);
   }
}

function Setup(controlId, form)
{
   m_control = new Control(controlId, form);      
   DrawRegion();
}

function Control(controlId, form)
{
   this.ID = controlId;
   this.rubberBand = document.getElementById(controlId + '_RubberBand');   
   this.selectedRegion = document.getElementById(controlId + '_SelectedRegion');
   this.nonSelectedRegionLeft = document.getElementById(controlId + '_NonSelectedRegionLeft');
   this.nonSelectedRegionRight = document.getElementById(controlId + '_NonSelectedRegionRight');
   this.nonSelectedRegionTop = document.getElementById(controlId + '_NonSelectedRegionTop');
   this.nonSelectedRegionBottom = document.getElementById(controlId + '_NonSelectedRegionBottom');
   this.parent = document.getElementById(controlId + '_Image');
   this.BoundsMaxX = document.getElementById(controlId + '_RubberBandBoundsMaxX');
   this.BoundsMaxY = document.getElementById(controlId + '_RubberBandBoundsMaxY');
   this.BoundsMinX = document.getElementById(controlId + '_RubberBandBoundsMinX');
   this.BoundsMinY = document.getElementById(controlId + '_RubberBandBoundsMinY');
   this.MaxX = document.getElementById(controlId + '_RubberBandMaxX');
   this.MaxY = document.getElementById(controlId + '_RubberBandMaxY');
   this.MinX = document.getElementById(controlId + '_RubberBandMinX');
   this.MinY = document.getElementById(controlId + '_RubberBandMinY');
   this.postBack = form[controlId + '_RubberBandPostBack'].value;
   
   if (this.rubberBand.offsetParent != null) {
      this.rubberBandOffsetTop = CalculateBoundsTop(this.rubberBand.offsetParent) - 1; //adjust for the border size
      this.rubberBandOffsetLeft = CalculateBoundsLeft(this.rubberBand.offsetParent) - 1; //adjust for the border size
   } else {
      this.rubberBandOffsetTop = 0;
      this.rubberBandOffsetLeft = 0;
   }
   
   if (this.parent != null) {
      this.boundsLeft = CalculateBoundsLeft(this.parent);
      this.boundsTop = CalculateBoundsTop(this.parent);
      this.boundsRight = this.boundsLeft + parseInt(this.parent.style.width);
      this.boundsBottom = this.boundsTop + parseInt(this.parent.style.height);
      this.height = parseInt(this.parent.style.height);
      this.width = parseInt(this.parent.style.width);
   } else {
      this.boundsLeft = 0;
      this.boundsTop = 0;
      this.boundsRight = 0;
      this.boundsBottom = 0;
      this.height = 0;
      this.width = 0;
   }   
}

function CalculateBoundsLeft(parent) {
   var offsetLeft = parent.offsetLeft;
   
   if (parent.offsetParent) {
      offsetLeft += CalculateBoundsLeft(parent.offsetParent);
   }
   
   return offsetLeft;
}

function CalculateBoundsTop(parent) {
   var offsetTop = parent.offsetTop;
   
   if (parent.offsetParent) {
      offsetTop += CalculateBoundsTop(parent.offsetParent);
   }
   
   return offsetTop;
}

function StartRubberBand (evt) {         
   var x = (document.all)?event.x:evt.pageX;
   var y = (document.all)?event.y:evt.pageY;
   
   m_control.rubberBand.style.width = 0;
   m_control.rubberBand.style.height = 0;
   m_control.rubberBand.style.left = (x - m_control.rubberBandOffsetLeft) + 'px';
   m_control.rubberBand.style.top = (y - m_control.rubberBandOffsetTop) + 'px';   
   
   m_control.originX = parseInt(x) + parseInt(m_control.rubberBand.style.width);
   m_control.originY = parseInt(y) + parseInt(m_control.rubberBand.style.height);
   m_control.offsetX = parseInt(x);
   m_control.offsetY = parseInt(y);
                       
   if (document.layers) {
      document.captureEvents(Event.MOUSEUP);
      document.captureEvents(Event.MOUSEMOVE);
   }
      
   document.onmouseup = StopRubberBand;
   document.onmousemove = MoveRubberBand;
}
function MoveRubberBand (evt) {
   var x = (document.all)?event.x:evt.pageX;
   var y = (document.all)?event.y:evt.pageY;
   
   m_control.rubberBand.style.visibility = 'visible';
   
   if (x >= m_control.boundsLeft && x <= m_control.boundsRight && y >= m_control.boundsTop && y <= m_control.boundsBottom) {      
      if (x <= m_control.originX) {
         m_control.rubberBand.style.width = (m_control.originX - x) + 'px';
         m_control.rubberBand.style.left = (x - m_control.rubberBandOffsetLeft) + 'px';
      } else { 
         m_control.rubberBand.style.width = (x - m_control.originX) + 'px';
      }
      
      if (y <= m_control.originY) {            
         m_control.rubberBand.style.height = (m_control.originY - y) + 'px';
         m_control.rubberBand.style.top = (y - m_control.rubberBandOffsetTop) + 'px';
      } else {
         m_control.rubberBand.style.height = (y - m_control.originY) + 'px';
      }   
   }
}
function StopRubberBand (evt) {
   if (document.layers) {
      document.releaseEvents(Event.MOUSEUP);
      document.releaseEvents(Event.MOUSEMOVE);
   }
   document.onmouseup = null;
   document.onmousemove = null;
   
   m_control.rubberBand.style.visibility = 'hidden';
   
   CalculateRegion();
}

function CalculateRegion()
{         
   var dMapTop = m_control.boundsTop;
   var dMapLeft = m_control.boundsLeft;            
   var dMapWidth = m_control.width;
   var dMapHeight = m_control.height;
   
   var dRegionTop = parseInt(m_control.rubberBand.style.top) + m_control.rubberBandOffsetTop;
   var dRegionLeft = parseInt(m_control.rubberBand.style.left) + m_control.rubberBandOffsetLeft;
   var dRegionWidth = parseInt(m_control.rubberBand.style.width);
   var dRegionHeight = parseInt(m_control.rubberBand.style.height);
   
   var dMaxX = m_control.BoundsMaxX.value;
   var dMaxY = m_control.BoundsMaxY.value;
   var dMinX = m_control.BoundsMinX.value;
   var dMinY = m_control.BoundsMinY.value;
   
   var dWidth = dMaxX - dMinX;
   var dHeight = dMaxY - dMinY;
   
   var dPercentLeft = (dRegionLeft - dMapLeft) / dMapWidth;
   var dPercentTop = (dRegionTop - dMapTop) / dMapHeight;
   var dPercentWidth = dRegionWidth / dMapWidth;
   var dPercentHeight = dRegionHeight / dMapHeight;     
   
   m_control.MinX.value = parseFloat(dMinX) + dWidth * dPercentLeft;
   m_control.MaxX.value = parseFloat(dMinX) + dWidth * (dPercentLeft + dPercentWidth);
   m_control.MaxY.value = parseFloat(dMaxY) - dHeight * dPercentTop;
   m_control.MinY.value = parseFloat(dMaxY) - dHeight * (dPercentTop + dPercentHeight);
   
   if (m_control.postBack == 'True') doRubberBandPostBack(m_control.ID,'RubberBand');
}

function DrawRegion()
{            
   var dMapTop = m_control.boundsTop;
   var dMapLeft = m_control.boundsLeft;            
   var dMapWidth = m_control.width;
   var dMapHeight = m_control.height;
   
   var dBoundsMaxX = parseFloat(m_control.BoundsMaxX.value);
   var dBoundsMaxY = parseFloat(m_control.BoundsMaxY.value);
   var dBoundsMinX = parseFloat(m_control.BoundsMinX.value);
   var dBoundsMinY = parseFloat(m_control.BoundsMinY.value);
   
   var dMaxX = parseFloat(m_control.MaxX.value);
   var dMaxY = parseFloat(m_control.MaxY.value);
   var dMinX = parseFloat(m_control.MinX.value);
   var dMinY = parseFloat(m_control.MinY.value);
   
   var dWidth = dBoundsMaxX - dBoundsMinX;
   var dHeight = dBoundsMaxY - dBoundsMinY;
   
   var dPercentLeft = (dMinX - dBoundsMinX) / dWidth;
   var dPercentTop = (dBoundsMaxY - dMaxY) / dHeight;
   var dPercentWidth = (dMaxX - dMinX) / dWidth;
   var dPercentHeight = (dMaxY - dMinY) / dHeight;
   
   if (dWidth == 0) {
      dPercentLeft = 0;
      dPercentWidth = 0;
   }
   
   if (dHeight == 0) {
      dPercentTop = 0;
      dPercentHeight = 0;
   }
   
   
   // --- left border out of boundary area ---
   
   if (dMinX < dBoundsMinX) {
      dPercentLeft = 0;
      dMinX = dBoundsMinX;
      dPercentWidth = (dMaxX - dMinX) / dWidth;
            
      m_control.selectedRegion.style.borderLeft = "none";      
   }
   
   // --- top border out of boundary area ---
   
   if (dMaxY > dBoundsMaxY) {
      dPercentTop = 0;
      dMaxY = dBoundsMaxY;
      dPercentHeight = (dMaxY - dMinY) / dHeight;
      
      m_control.selectedRegion.style.borderTop = "none";
   }
   
   // --- right border out of boundary area ---
   
   if (dMaxX > dBoundsMaxX) {
      dPercentWidth = (dBoundsMaxX - dMinX) / dWidth;
      
      m_control.selectedRegion.style.borderRight = "none";
   }
   
   // --- bottom border out of boundary area ---
   
   if (dMinY < dBoundsMinY) {
      dPercentHeight = (dMaxY - dBoundsMinY) / dHeight;
      
      m_control.selectedRegion.style.borderBottom = "none";
   }
   
     
   if (dPercentHeight < 0 || dPercentWidth < 0)
   {
      m_control.selectedRegion.style.visibility = 'hidden';
      m_control.nonSelectedRegionRight.style.visibility = 'hidden';
      m_control.nonSelectedRegionTop.style.visibility = 'hidden';
      m_control.nonSelectedRegionBottom.style.visibility = 'hidden';
      
      m_control.nonSelectedRegionLeft.style.visibility = 'visible';
      m_control.nonSelectedRegionLeft.style.left = (dMapLeft - m_control.rubberBandOffsetLeft) + 'px';
      m_control.nonSelectedRegionLeft.style.width = dMapWidth + 'px';
      m_control.nonSelectedRegionLeft.style.top = (dMapTop - m_control.rubberBandOffsetTop) + 'px';
      m_control.nonSelectedRegionLeft.style.height = dMapHeight + 'px';           
   } 
   else 
   {     
      m_control.selectedRegion.style.left = (dMapLeft + dMapWidth * dPercentLeft - m_control.rubberBandOffsetLeft) + 'px';
      m_control.selectedRegion.style.width = (dPercentWidth * dMapWidth) + 'px';
      m_control.selectedRegion.style.top = (dMapTop + dMapHeight * dPercentTop - m_control.rubberBandOffsetTop) + 'px';
      m_control.selectedRegion.style.height = (dPercentHeight * dMapHeight)+ 'px';     
      m_control.selectedRegion.style.visibility = 'visible';
      
      
      if (dPercentLeft > 0)
      {
         m_control.nonSelectedRegionLeft.style.visibility = 'visible';
         m_control.nonSelectedRegionLeft.style.left = (dMapLeft - m_control.rubberBandOffsetLeft) + 'px';
         m_control.nonSelectedRegionLeft.style.width = (dMapWidth * dPercentLeft) + 'px';
         m_control.nonSelectedRegionLeft.style.top = (dMapTop - m_control.rubberBandOffsetTop) + 'px';
         m_control.nonSelectedRegionLeft.style.height = dMapHeight + 'px';           
      }
      
      if (dPercentLeft + dPercentWidth < 1)
      {
         m_control.nonSelectedRegionRight.style.visibility = 'visible';
         m_control.nonSelectedRegionRight.style.left = (parseFloat(m_control.selectedRegion.style.left) + parseFloat(m_control.selectedRegion.style.width)) + 'px';
         m_control.nonSelectedRegionRight.style.width = (dMapWidth * (1 - dPercentLeft - dPercentWidth)) + 'px';
         m_control.nonSelectedRegionRight.style.top = (dMapTop - m_control.rubberBandOffsetTop) + 'px';
         m_control.nonSelectedRegionRight.style.height = dMapHeight + 'px';           
      }
      
      if (dPercentTop > 0)
      {
         m_control.nonSelectedRegionTop.style.visibility = 'visible';
         m_control.nonSelectedRegionTop.style.left = m_control.selectedRegion.style.left;
         m_control.nonSelectedRegionTop.style.width = m_control.selectedRegion.style.width;
         m_control.nonSelectedRegionTop.style.top = (dMapTop - m_control.rubberBandOffsetTop) + 'px';
         m_control.nonSelectedRegionTop.style.height = (dMapHeight * dPercentTop)+ 'px';           
      }
      
      if (dPercentTop + dPercentHeight < 1)
      {
         m_control.nonSelectedRegionBottom.style.visibility = 'visible';
         m_control.nonSelectedRegionBottom.style.left = m_control.selectedRegion.style.left;
         m_control.nonSelectedRegionBottom.style.width = m_control.selectedRegion.style.width;
         m_control.nonSelectedRegionBottom.style.top = (dMapTop - m_control.rubberBandOffsetTop + dMapHeight * (dPercentTop + dPercentHeight)) + 'px';
         m_control.nonSelectedRegionBottom.style.height = (dMapHeight * (1 - dPercentTop - dPercentHeight)) + 'px';           
      }
   }
}
//-->

