//<script language="javascript">
/*=============================================================================
 WebSolvers Framework Library
 Copyright 2003, WebSolvers, Inc., All Rights Reserved.

 Library DHTML
 Cross-Browser/Platform common DHTML library

 Revision History:
 6-30-03 Broken in to Library.js and Library_Browser.js
 5-20-03 Revamped code to new specifications

 Requires
  Library.js
  Library_Browser.js

  Notes:
  Provides addition DHMTL capabilities to elements, such as
    positioning and display.

=============================================================================

 The WebSolvers Framework Library may be used and/or modified by anyone owning
 the original work as it was incorporated into an original development project
 so long as this copyright notice and the comments above remain intact.

 By using this code you agree to indemnify WebSolvers, Inc. from any liability
 that might arise from its use.

 This code may not be sold exclusively or as a part of other code without prior
 written consent and is expressly forbidden.

 Obtain permission before redistributing this software over the Internet or
 in any other medium. In all cases the copyright and header must remain intact.
============================================================================= */

//======================================================================================
//                                 Internal Routines
//======================================================================================

// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
function adhtml_NormDoc(doc) {
  doc.loadscript = docObject_LoadScript;
  
  doc.getScreenWidth = docObject_GetScreenWidth;
  doc.getScreenHeight = docObject_GetScreenHeight;
  doc.getClientWidth = docObject_GetClientWidth;
  doc.getClientHeight = docObject_GetClientHeight;
  doc.getClientX = docObject_GetClientX;
  doc.getClientY = docObject_GetClientY;
  doc.getWidth = docObject_GetWidth;
  doc.getHeight = docObject_GetHeight;
  doc.getX = docObject_GetX;
  doc.getY = docObject_GetY;
  
  if(dhtml.IE || dhtml.mozilla) {
    dhtml.normalize(doc.body, doc)
  }
}

function docObject_LoadScript(src) {
  var head = document.getByTag("HEAD")[0];
  var script = document.newElement("SCRIPT");
  script.src = src;
  head.appendElem(script);
}

function adhtml_Norm(elem, doc) {
  if(!elem.id) {
    elem.id = "dNOID_" + dhtml.lastID;
    dhtml.lastID++;
  }
  if(!elem.nodeType)
    return elem;

  if(!elem.getX)
    elem.getOffsetLeft = elem.getX = elemObject_GetX;
  if(!elem.getY)
    elem.getOffsetTop = elem.getY = elemObject_GetY;
  if(!elem.getWidth)
    elem.getWidth = elemObject_GetWidth;
  if(!elem.getHeight)
    elem.getHeight = elemObject_GetHeight;

  if(!elem.contains)
    elem.contains = elemObject_Contains;

  if(!elem.moveTo)
    elem.moveTo = elemObject_MoveTo;

  if(!elem.resizeTo)
    elem.resizeTo = elemObject_ResizeTo;

  if(!elem.alignTo)
    elem.alignTo = elemObject_AlignTo;

  if(!elem.visible)
    elem.visible = elemObject_Visible;
  if(!elem.hide)
    elem.hide = elemObject_Hide;
  if(!elem.show)
    elem.show = elemObject_Show;

  if(!elem.getText)
    elem.getText = elemObject_GetText;
  if(!elem.getHTML)
    elem.getHTML = elem.getHtml = elemObject_GetHTML;
  if(!elem.setText)
    elem.setText = elemObject_SetText;
  if(!elem.setHTML)
    elem.setHTML = elem.setHtml = elemObject_SetHTML;

  if(!elem.getCursor)
    elem.getCursor = elemObject_GetCursor;
  if(!elem.setCursor)
    elem.setCursor = elemObject_SetCursor;

  if(!elem.createTextRange)
    elem.createTextRange = elemObject_CreateTextRange;      if(!elem.selectText)    elem.selectText = elemObject_SelectText;
}

function elemObject_GetX(rel) {
  var pix = 0;
  var parent = null;

  if(rel) {
    if(dhtml.IE)
      pix = this.style.pixelLeft;
    else if(dhtml.DOM)
      pix = parseInt(this.style.left);
    else if(dhtml.NN4)
      pix = this.left;
    else
      pix = null;
  } else if(dhtml.DOM) {
    pix = this.offsetLeft;
    if(this.style.position != "absolute") {
      parent = this.getOffsetParent();
      while(parent && parent.nodeType == 1) {
        pix += parent.offsetLeft;
        if(parent.style.position == "absolute")
          parent = null;
        else
          parent = parent.getOffsetParent();
      }
      if(dhtml.mac && dhtml.IE)
        pix += parseInt(this.document.body.leftMargin);
    }
  } else if(dhtml.NN4)
    pix = this.pageX;
  else
    pix = null;

  return pix;
}

function elemObject_GetY(rel) {
  var pix = 0;
  var parent = null;

  if(rel) {
    if(dhtml.IE)
      pix = this.style.pixelTop;
    else if(dhtml.DOM)
      pix = parseInt(this.style.top);
    else if(dhtml.NN4)
      pix = this.top;
    else
      pix = null;
  } else if(dhtml.DOM) {
    if(dhtml.IE && dhtml.mac && this.nodeName == "TD")
      pix = this.getFirst().offsetTop;
    else
      pix = this.offsetTop;
    
    if(this.style.position != "absolute") {
      parent = this.getOffsetParent();
      while(parent && parent.nodeType == 1) {
        if(parent.nodeName != 'TR' && parent.nodeName != 'NOBR')
          pix += parent.offsetTop;
        if(parent.style.position == "absolute")
          parent = null;
        else
          parent = parent.getOffsetParent();
      }
  
      if(dhtml.mac && dhtml.IE)
        pix += parseInt(this.document.body.topMargin);
    }
  } else if(dhtml.NN4)
    pix = this.pageY;
  else
    pix = null;

  return pix;
}

function elemObject_GetWidth() {
  var pix = 0;

  if(dhtml.DOM)
    pix = this.offsetWidth;
  else if(dhtml.NN4)
    pix = this.clip.width;
  else
    pix = null;

  return pix;
}

function elemObject_GetHeight() {
  var pix = 0;

  if(dhtml.mozilla && this == this.document.body) {
    pix = this.document.parentWindow.innerHeight;
  } else if(dhtml.DOM)
    pix = this.offsetHeight;
  else if(dhtml.NN4)
    pix = this.clip.height;
  else
    pix = null;

  if(this == this.document.body && (!dhtml.mac && dhtml.IE)) {
//    pix -= parseInt(this.document.body.topMargin);
    pix -= parseInt(this.document.body.bottomMargin);
  }

  return pix;
}

function elemObject_Contains(x, y) {
  return x >= this.getX() && x <= this.getX() + this.getWidth() &&
    y >= this.getY() && y <= this.getY() + this.getHeight();
}

function dhtmlObject_width2Pixel(elem, w) {
  var fmt = "px";
  var pos = 0;
  var ep = elem.getOffsetParent();
  var sw = 0;

  w = w.toString();
  pos = w.length;
  while(isNaN(parseInt(w.substring(pos-1,pos), 10))) {
    pos--;
  }
  if(pos < w.length) {
    fmt = w.substring(pos, w.length);
    w = parseInt(w.substring(0, pos));
  } else
    w = parseInt(w, 10);
  if(fmt == "%") {
    if(!ep)
      return 0;

    var epw = ep.getWidth();
    var ec = ep.getFirst();
    while(ec && ec != elem) {
      if(ec.getY() == elem.getY())
        sw += ec.getWidth();
      ec = ec.getNext();
    }
    if(ec)
      ec = ec.getNext();
    while(ec) {
      if(ec.getY() == elem.getY())
        sw += ec.getWidth();
      ec = ec.getNext();
    }
    
    return Math.max(0, Math.floor((epw - sw)*(w/100))) + 'px';
  } else {
    return parseInt(w) + fmt;
  }  
}

function dhtmlObject_height2Pixel(elem, h) {
  var fmt = "px";
  var pos = 0;
  var ep = elem.getOffsetParent();
  var sh = 0;

  h = h.toString();
  pos = h.length;
  while(isNaN(parseInt(h.substring(pos-1,pos), 10))) {
    pos--;
  }
  if(pos < h.length) {
    fmt = h.substring(pos, h.length);
    h = parseInt(h.substring(0, pos));
  } else
    h = parseInt(h, 10);

  if(fmt == "%") {
    if(!ep)
      return 0;
    var eph = ep.getHeight();
    var ec = ep.getFirst();
    while(ec && ec != elem) {
      if(ec.getX() == elem.getX())
        sh += ec.getHeight();
      ec = ec.getNext();
    }
    if(ec)
      ec = ec.getNext();
    while(ec) {
      if(ec.getX() == elem.getX())
        sh += ec.getHeight();
      ec = ec.getNext();
    }
    return Math.max(0, Math.floor((eph - sh)*(h/100))) + 'px';
  } else {
    return parseInt(h) + fmt;
  }  
}

function elemObject_MoveTo(x, y, rel) {
  if(dhtml.NN4) {
    if(!rel) {
      this.position = "absolute";
      if(!isNaN(x))
        this.pageX = x;
      if(!isNaN(y))
        this.pageY = y;
    } else {
      if(!isNaN(x))
        this.x = x;
      if(!isNaN(y))
        this.y = y;
    }
  } else if(dhtml.IE) {
    if(!rel) {
      this.style.position = "absolute";
      if(!isNaN(x))
        this.style.left = x + 'px';
      if(!isNaN(y))
        this.style.top = y + 'px';
    } else {
      if(!isNaN(x))
        this.style.pixelLeft = x;
      if(!isNaN(y))
        this.style.pixelTop = y;
    }
  } else if(dhtml.DOM) {
    if(!rel) {
      this.style.position = "absolute";
    }
    if(!isNaN(x))
      this.style.left = x + 'px';
    if(!isNaN(y))
      this.style.top = y + 'px';
  }
}

function elemObject_ResizeTo(w, h, scroll) {
  var pos = 0;

  if(w || w == 0)     w = dhtml.width2Pixel(this, w);
  if(h || h == 0)     h = dhtml.height2Pixel(this, h);

  if(w && w < 0)
    w = 0;
    
  if(h && h < 0)
    h = 0;

  if(dhtml.NN4) {
    if(w)
      this.clip.width = w;
    if(h)
      this.clip.height = h;
  } else {
    if(w)
      this.style.width = w;
    if(h)
      this.style.height = h;
    if(!scroll) {
      this.style.overflow = "hidden";
    } else {
      this.style.overflow = "auto";
    }
    
    if(!w)
      w = "auto"
    if(!h)
      h = "auto"
    this.style.clip = "rect(auto " + w + " " + h + " auto)";
  }
}

function elemObject_AlignTo(elem, myHorz, myVert, elemHorz, elemVert, shiftX, shiftY) {
  var x = 0;
  var y = 0;
  var xelem = elem;
  var yelem = elem;

  if(!elem)
    return;

  if(elem.length) {
    yelem = xelem = elem[0];
    if(elem.length > 0)
      yelem = elem[1];
  }
      
  myHorz = dhtml.procAlign(myHorz);
  myVert = dhtml.procAlign(myVert);
  if(!elemHorz && elemHorz != 0)
    elemHorz = myHorz;
  else
    elemHorz = dhtml.procAlign(elemHorz);

  if(!elemVert && elemVert != 0) {
    if(myVert)
      elemVert = myVert*-1;
    else
      elemVert = 0;
  } else
    elemVert = dhtml.procAlign(elemVert);

  shiftX = parseInt(shiftX, 10);
  shiftY = parseInt(shiftY, 10);

  x = xelem.getX();
  y = yelem.getY();

  if(elemHorz == 0)
    x += Math.floor(xelem.getWidth()/2);
  else if(elemHorz == 1)
    x += xelem.getWidth();

  if(elemVert == 0)
    y += Math.floor(yelem.getHeight()/2);
  else if(elemVert == 1)
    y += yelem.getHeight();

  if(myHorz == 0)
    x -= Math.floor(this.getWidth()/2);
  else if(myHorz == 1)
    x -= this.getWidth();

  if(myVert == 0)
    y += Math.floor(this.getHeight()/2);
  else if(myVert == 1)
    y += this.getHeight();

  if(!isNaN(shiftX))
    x += shiftX;
  if(!isNaN(shiftY))
    y += shiftY;

  this.moveTo(x, y);
}

function elemObject_Visible() {
  if(dhtml.NN4)
    return this.visibility != "hidden";
  else
    return this.style.visibility != "hidden";
}

function elemObject_Hide(hard) {
  if(hard)
    this.style.position = "absolute"; 
  if(dhtml.NN4)
    this.visibility = "hidden";
  else
    this.style.visibility = "hidden";
}

function elemObject_Show(hard) {
  if(hard)
    this.style.position = "";
  if(dhtml.NN4)
    this.visibility = "show";
  else
    this.style.visibility = "visible";
}

function elemObject_GetText() {
  var txt = "";
  var child = null;

  if(this.value)
    return this.value;
  else if(this.options && this.selectedIndex)
    return this.options[this.selectedIndex].text;
  else if(dhtml.IE || dhtml.mozilla || (this.NN4 && this.innerText))
    return this.innerText;
  else if(dhtml.DOM) {
    txt = this.nodeValue;
    if(this.hasChildren) {
      child = this.firstChild;
      txt = child.getText();
      while(child.nextSibling)
        txt += child.getText();
    }
    return txt;
  } else
    return null;
}

function elemObject_GetHTML() {
  if(dhtml.IE || dhtml.mozilla || (dhtml.NN$ && this.innerHTML))
    return this.innerHTML;
  else if(dhtml.DOM) {

  } else
    return null;
}

function elemObject_SetText(text) {
  if(dhtml.IE || dhtml.mozilla)
    this.innerText = text;
  else if(dhtml.NN4) {
    this.innerText = text;
    this.innerHTML = text;
    this.document.clear();
    this.document.open("text/plain");
    this.document.write(text);
    this.document.close();
  } else if(dhtml.DOM)
    this.appendChild(document.createTextNode(text));
}

function elemObject_SetHTML(html) {
  if(dhtml.IE || dhtml.mozilla)
    this.innerHTML = html;
  else if(dhtml.NN4) {
    this.document.clear();
    this.document.open("text/html");
    this.document.write(html);
    this.document.close();
    this.innerHTML = html;
    this.innerText = null;
  } else if(dhtml.DOM) {
//    alert("This is not supported in this browser currently!");
  }
}

function elemObject_GetCursor() {
  if(dhtml.IE)
    return this.style.cursor;
  else if(dhtml.DOM)
    return this.style.cursor;
  else
    return null;
}

function elemObject_SetCursor(cursor) {
  if(dhtml.DOM)
    this.style.cursor = cursor;
}
function elemObject_SelectText(s, e) {  var tr = this.createTextRange();    tr.moveStart("character", s);  tr.moveEnd("character", e);  tr.select();
}
function elemObject_CreateTextRange() {
  var range = null;

  if(dhtml.mozilla)
    return new textRangeObject(this);
  else if(dhtml.IE) {
    range = this.document.selection.createRange();
    range.type = this.document.selection.type;
    this.range = range;
    return range;
  }
}

function textRangeObject(elem) {
  this.parentElement = elem;
  elem.range = this;
  elem._select = elem.select;
  elem.select = textRangeObject_ParentSelect;

  this.start = 0;
  this.end = elem.getText().length;

  this.select = textRangeObject_Select;
  this.moveStart = textRangeObject_MoveStart;
  this.moveEnd = textRangeObject_MoveEnd;
  this.findText = textRangeObject_FindText;
}

function textRangeObject_ParentSelect() {
  this.range.start = 0;
  this.range.end = this.getText().length;
  if(this._select)
    this._select();
}

function textRangeObject_Select() {
  this.parentElement.setSelectionRange(this.start, this.end);
}

function textRangeObject_MoveStart(moveBy, count) {
  if(moveBy.toLowerCase() == "character") {
    this.start += count;
    if(this.start < 0)
      this.start = 0;
  }
}

function textRangeObject_MoveEnd(moveBy, count) {
  if(moveBy.toLowerCase() == "character") {
    this.end += count;
    if(this.end > this.parentElement.getText().length)
      this.end = this.parentElement.getText().length;
  }
}

function textRangeObject_FindText(text) {
  var start = this.parentElement.getText().indexOf(text);
  if(start > -1) {
    this.start = start;
    this.end = this.start + text.length;
  }
}

function docObject_GetScreenWidth() {
  if(dhtml.IE || dhtml.mozilla) {
    return dhtml.rootWin.screen.width;
  }
}

function docObject_GetScreenHeight() {
  if(dhtml.IE || dhtml.mozilla) {
    return dhtml.rootWin.screen.height;
  }
}

function docObject_GetClientWidth() {
  if(dhtml.IE || dhtml.mozilla) {
    return dhtml.rootWin.document.body.getWidth();
  }
}

function docObject_GetClientHeight() {
  if(dhtml.IE || dhtml.mozilla) {
    return dhtml.rootWin.document.body.getHeight();
  }
}

function docObject_GetClientX() {
  if(dhtml.IE) {
    return dhtml.rootWin.screenLeft;
  } else if(dhtml.mozilla) {    return dhtml.rootWin.screen.left;
  }
}

function docObject_GetClientY() {
  if(dhtml.IE) {
    return dhtml.rootWin.screenTop;
  } else if(dhtml.mozilla) {    return dhtml.rootWin.screen.top;
  }
}

function docObject_GetWidth() {
  if(dhtml.IE || dhtml.mozilla) {
    return this.body.getWidth();
  }
}

function docObject_GetHeight() {
  if(dhtml.IE || dhtml.mozilla) {
    return this.body.getHeight();
  }
}

function docObject_GetX() {
  if(dhtml.IE || dhtml.mozilla) {
    return this.body.getX();
  }
}

function docObject_GetY() {
  if(dhtml.IE || dhtml.mozilla) {
    return this.body.getY();
  }
}

//======================================================================================
//                                Initialization code
//======================================================================================
if(window.dhtml) {
  dhtml.lastID = 0;
  dhtml.addNorm(adhtml_Norm);
  dhtml.addNormDoc(adhtml_NormDoc);
  dhtml.width2Pixel = dhtmlObject_width2Pixel;
  dhtml.height2Pixel = dhtmlObject_height2Pixel;
}