// (C) Shelley Powers, YASD, 1998 - 2000
//
// These are the newest version of the cross-browser scripting objects, 
// incorporated into one Javascript file. 
//
// Each DOM gets its own object, with similar interfaces but differing implementations

// The W3C DOM Object
//
//*************************************************************************************

function BrowserCheck() {
	var b = navigator.appName
	if (b=="Netscape") this.b = "ns"
		else if (b=="Microsoft Internet Explorer") this.b = "ie"
		else this.b = b
	this.v = parseInt(navigator.appVersion)
	this.ns = (this.b=="ns" && this.v>=4)
	this.ns4 = (this.b=="ns" && this.v==4)
	this.ns5 = (this.b=="ns" && this.v==5)
	this.ie = (this.b=="ie" && this.v>=4)
	this.ie4 = (navigator.userAgent.indexOf('MSIE 4')>0)
	this.ie5 = (navigator.userAgent.indexOf('MSIE 5')>0)
	this.ie55 = (navigator.userAgent.indexOf('MSIE 5.5')>0)
	this.ie6 = (navigator.userAgent.indexOf('MSIE 6')>0)
	if (this.ie5) this.v = 5
	if (this.ie6) this.v = 6
	this.min = (this.ns||this.ie)
}

// automatically create the "is" object
is = new BrowserCheck()


function dom_object(obj) {
	this.css2 = obj;
	this.name = obj.id;
	this.objResizeBy = domResizeBy;
	this.objHide = domHide;
	this.objShow = domShow;
      this.objDisplay = domDisplay;
	this.objGetLeft = domGetLeft;
	this.objGetTop = domGetTop;
	this.objSetTop = domSetTop;
	this.objSetLeft = domSetLeft;
	this.objMoveAbsolute = domMoveAbsolute;
	this.objMoveRelative = domMoveRelative;
	this.objGetWidth = domGetWidth;
	this.objGetHeight = domGetHeight;
	this.objSetHeight = domSetHeight;
	this.objSetWidth = domSetWidth;
	this.objSetZIndex = domSetZIndex;
	this.objGetZIndex = domGetZIndex;
	this.objSetClipRect = domSetClipRect;
      this.objGetClipRect = domGetClipRect;
	this.objGetClipLeft = domGetClipLeft;
	this.objGetClipRight = domGetClipRight;
	this.objGetClipTop = domGetClipTop;
	this.objGetClipBottom = domGetClipBottom;
	this.replace_html = domReplaceHTML;
	this.objReplaceHTML = domParamReplaceHTML;
	this.objReplaceText = domReplaceText;
      this.objGetVisibility = domGetVisibility;
}


// The IE 4.x and 5.x DOM Object
//
//*************************************************************************************
function ie_object(obj) {
	this.css2 = obj;
	this.name = obj.id;
	this.objResizeBy = domResizeBy;
	this.objHide = domHide;
	this.objShow = domShow;
      this.objDisplay = domDisplay;
	this.objGetLeft = domGetLeft;
	this.objGetTop = domGetTop;
	this.objSetTop = domSetTop;
	this.objSetLeft = domSetLeft;
	this.objMoveAbsolute = domMoveAbsolute;
	this.objMoveRelative = domMoveRelative;
	this.objGetWidth = domGetWidth;
	this.objGetHeight = domGetHeight;
	this.objSetHeight = domSetHeight;
	this.objSetWidth = domSetWidth;
	this.objSetZIndex = domSetZIndex;
	this.objGetZIndex = domGetZIndex;
	this.objSetClipRect = domSetClipRect;
      this.objGetClipRect = domGetClipRect;
	this.objGetClipLeft = domGetClipLeft;
	this.objGetClipRight = domGetClipRight;
	this.objGetClipTop = domGetClipTop;
	this.objGetClipBottom = domGetClipBottom;
	this.replace_html = domReplaceHTML;
	this.objReplaceHTML = domParamReplaceHTML;
	this.objReplaceText = domReplaceText;
      this.objGetVisibility = domGetVisibility;
}



// The Navigator DOM Object
//
//*************************************************************************************
function ns_object(obj) {
	this.css2 = obj;
	this.name = obj.name;
	this.objResizeBy = domResizeBy;
	this.objHide = nsobjHide;
	this.objShow = nsobjShow;
        this.objDisplay = nsobjDisplay;
	this.objGetLeft = nsobjGetLeft;
	this.objGetTop = nsobjGetTop;
	this.objSetTop = nsobjSetTop;
	this.objSetLeft = nsobjSetLeft;
	this.objMoveAbsolute = domMoveAbsolute;
	this.objMoveRelative = domMoveRelative;
	this.objGetWidth = nsobjGetWidth;
	this.objGetHeight = nsobjGetHeight;
	this.objSetHeight = nsobjSetHeight;
	this.objSetWidth = nsobjSetWidth;
	this.objSetZIndex = nsobjSetZIndex;
	this.objGetZIndex = nsobjGetZIndex;
	this.objSetClipRect = nsobjSetClipRect;
      this.objGetClipRect = nsobjGetClipRect;
	this.objGetClipLeft = nsobjGetClipLeft;
	this.objGetClipRight = nsobjGetClipRight;
	this.objGetClipTop = nsobjGetClipTop;
	this.objGetClipBottom = nsobjGetClipBottom;
	this.replace_html = nsreplace_html;
	this.objReplaceHTML = nsParamReplaceHTML;
	this.objReplaceText = nsReplaceText;
      this.objGetVisibility = nsVisibility;
}

//*************************************************************************************
//
// The implementations
//
//*************************************************************************************


// The DOM Object Implementations
//
//*************************************************************************************


function domResizeBy(wincr,hincr) {
   var wdth = this.objGetWidth();
   wdth += wincr;
   this.objSetWidth(wdth);
   
   var ht = this.objGetHeight();
   ht += hincr;
   this.objSetHeight(ht);
}


// element's left position
function domGetLeft() {
        var lt = parseInt(this.css2.style.left);
	return lt;
}

// element's top position
function domGetTop () {
        var tp = parseInt(this.css2.style.top);
	return tp;
}

// set element's top position
function domSetTop (top) {
	this.css2.style.top = top + "px";
}

// set element's left position
function domSetLeft(left) {
	this.css2.style.left = left + "px";
}


// get element's width
function domGetWidth() {
        var wd = parseInt(this.css2.style.width);
	return wd;
}

// get element's height
function domGetHeight() {
        var ht = parseInt(this.css2.style.height);
	return ht;
}

// set element's height
function domSetHeight(height) {
	this.css2.style.height = height + "px";
}

// set element's width
function domSetWidth(width) {
	this.css2.style.width = width + "px";
}


// hide element
function domHide() {
   this.css2.style.visibility = "hidden";
}

// show element
function domShow() {
   this.css2.style.visibility = "visible";
}


// display element
function domDisplay(type) {
   this.css2.style.display = type;
}

// make absolute move
function domMoveAbsolute(newleft, newtop) {
   this.objSetLeft(newleft);
   this.objSetTop(newtop);
}

// move relative to current location
function domMoveRelative(left, top) {
   this.objSetLeft(left + this.objGetLeft());
   this.objSetTop(top + this.objGetTop());    
}

// return clipping rectangle
function domGetClipRect() {
   return this.css2.style.clip;
}

// clip object
function domSetClipRect(top, left, bottom, right) {
   if (top == null) top = this.objGetClipTop();
   if (left == null) left = this.objGetClipLeft();
   if (bottom == null) bottom = this.objGetClipBottom();
   if (right == null) right = this.objGetClipRight();
   strng = "rect(" + top + "px, " + right + "px, " + bottom + "px, " + left + "px)";
  this.css2.style.clip = strng;
}

// convert string to value
function convert(strng) {
    var i = parseInt(strng);
    return i;
}

// get clipping value for specific dimension
function get_entry(obj,indx) {
	strng = obj.css2.style.clip;
        if (strng.length > 0) {
	   strng = strng.slice(5,strng.length-1);
	   var entries = strng.split(" ");
           }
        else {
            var entries = new Array(5);
            for (i = 0; i < entries.length; i++)
                entries[i] = "auto";
            }
	if (indx == "top") {
		if (entries[0] == "auto") 
                   return 0;
		else
		   return convert(entries[0]);
            }
	else if (indx == "left") {
		if (entries[3] == "auto") 
		   return 0;
		else
		   return convert(entries[3]);
		}
	else if (indx == "bottom"){
		if (entries[2] == "auto") {
		   return obj.objGetHeight();
                   }
		else
		   return convert(entries[2]);
              }
	else if (indx == "right") {
		if (entries[1] == "auto") 
		   return obj.objGetWidth();
		else
		   return convert(entries[1]);
		}
	
}
	
// clip object on left
function domGetClipLeft() {
	return get_entry(this,"left");
}

// clip object on right
function domGetClipRight() {
	return get_entry(this, "right");
}

// clip object at top
function domGetClipTop() {
	return get_entry(this,"top");
}

// clip object at bottom
function domGetClipBottom() {
	return get_entry(this,"bottom");
}

// set element's zindex order
function domSetZIndex(zindex) {
   this.css2.style.zIndex = zindex;
}

// get element's current zindex order
function domGetZIndex(zindex) {
   return this.css2.style.zIndex;
}


// replace text (equivalent to innerText)
function domReplaceText(txt_string) {

   var nodes = this.css2.childNodes;
   var node = nodes.item(0);
   node.replaceData(0,node.length,txt_string);   
}

// replace html (innerHTML)
function domReplaceHTML(html_string) {
	this.css2.innerHTML = html_string;
} 


// replace HTML -- replace contents with specific object
function domParamReplaceHTML(tag,clss,id,contents) {

    this.objHide();
    var r = this.css2.ownerDocument.createRange();
    r.selectNodeContents(this.css2);
    r.deleteContents();

    var elem = document.createElement(tag);
    elem.setAttribute("id",id);
    elem.setAttribute("className",clss);
    var txt = document.createTextNode(contents);
    elem.appendChild(txt);
    this.css2.appendChild(elem); 
    this.objShow();
  }


// return visibility
function domGetVisibility() {
    return this.css2.style.visibility;
}




// The IE Object Implementations
//
//*************************************************************************************



// replace html (with specific element)
function ieParamReplaceHTML(tag, clss, id, contents) {
    var strng = "<" + tag + " class='" + clss + "' id='" + id + "'>";
    strng = strng + contents;
    strng = strng + "</" + tag +  ">";
    this.css2.innerHTML = strng;
     }





// The Navigator 4.x Object Implementations
//
//*************************************************************************************

// hide element
function nsobjHide() {
	this.css2.visibility = "hidden";
}

// show element
function nsobjShow() {
	this.css2.visibility = "inherit";
}


// element display
function nsobjDisplay(type) {
   if (type == "none")
       this.objHide();
   else
       this.objShow();
}

// element's left position
function nsobjGetLeft() {
	return this.css2.left;
}

// element's top position
function nsobjGetTop () {
	return this.css2.top;
}

// set element's top position
function nsobjSetTop(top) {
	this.css2.top = top;
}

// set element's left position
function nsobjSetLeft(left) {
	this.css2.left = left;
}


// get element's width
function nsobjGetWidth() {
	return this.css2.clip.width;
}

// get element's height
function nsobjGetHeight() {
	return this.css2.clip.height;
}

// set element's width
function nsobjSetWidth(width) {
	this.css2.clip.width = width;
}

// set element's height
function nsobjSetHeight(height) {
	this.css2.clip.height = height;
}

// set element's zindex order
function nsobjSetZIndex(zindex) {
	this.css2.zIndex = zindex;
}

// get element's current zindex order
function nsobjGetZIndex() {
	return this.css2.zIndex;
}

// clip object
function nsobjSetClipRect (top,left,bottom,right) {
	if (top == null) top = this.objGetClipTop();
	if (left == null) left = this.objGetClipLeft();
	if (bottom == null) bottom = this.objGetClipBottom();
	if (right == null) right = this.objGetClipRight();
	this.css2.clip.left = left;
	this.css2.clip.right = right;
	this.css2.clip.top = top;
	this.css2.clip.bottom = bottom;
}

function nsobjGetClipRect () {
   var strng;
   var left = this.css2.clip.left;
   var right = this.css2.clip.right;
   var bottom = this.css2.clip.bottom;
   var top = this.css2.clip.top;

   strng = "rect(" + top + "px, " + right + "px, " + bottom + "px, " + left + "px)";
   return strng;
}

// get current clip right 
function nsobjGetClipRight() {
	return this.css2.clip.right;
}

// get current clip left
function nsobjGetClipLeft() {
	return this.css2.clip.left;
}

// get current clip top
function nsobjGetClipTop() {
	return this.css2.clip.top;
}

// get current clip bottom
function nsobjGetClipBottom() {
	return this.css2.clip.bottom;
}
	
// replace html (navigator)
function nsreplace_html(html_string) {
	this.css2.document.write(html_string);
	this.css2.document.close();
}


function nsParamReplaceHTML(tag, clss, id, contents) {
    var strng = "<" + tag + " class='" + clss + "' id='" + id + "'>";
    strng = strng + contents;
    strng = strng + "</" + tag + ">";
    this.css2.document.write(strng);
    this.css2.document.close();
    }

function nsReplaceText(text_string) {
  // this function not implemented
}

function nsVisibility() {
   return this.css2.visibility;
}





//****************************************************************************************
//
// Create the objects
//
//****************************************************************************************


// For IE, pull all DIV blocks into object array
function create_ie_objects() {
   theelements = document.all.tags("DIV");
   theobjs = new Array();
   for (i = 0; i < theelements.length; i++){
      if (theelements[i].id != "") {
	   theobjs[theelements[i].id] = new ie_object(theelements[i]);
	   }
      }
}

// For Navigator 4.x, pull all DIV blocks into object array
function create_ns_objects(newarray) {
   theobjs = new Array();
   for (i = 0; i < document.layers.length; i++){
     if (document.layers[i].name != "") 
   	 theobjs[document.layers[i].name] = new ns_object(document.layers[i]);
     }
}

// For W3C DOM (Navigator 6.x, Mozilla), pull all named DIV blocks into an array
function create_dom_objects() {
  theelements = document.getElementsByTagName("DIV");
  theobjs = new Array();
  for (i = 0; i < theelements.length; i++) {
      var obj = theelements[i];
      if (obj.id != "")
         theobjs[obj.id] = new dom_object(obj);
      }
}


function create_objects() {

    // if IE
    if (navigator.appName == "Microsoft Internet Explorer")
	   create_ie_objects();
    else // Navigator or Mozilla
        if (navigator.appName == "Mozilla" || navigator.appName == "Netscape")
           if (navigator.appVersion.indexOf("4.") == -1)
	      create_dom_objects();
           else 
  	      create_ns_objects();
}



//////////////////////////////////////////////////////////////////////////////////////////////////////////
////////Aaron's reload_layer addition:  1-03-2001
//////////////////////////////////////////////////////////////////////////////////////////////////////////

function reload_layer(name,url) {
	theobjs[name].load = objLayerLoad;
	theobjs[name].load(name,url);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
function objLayerLoad(name,url) {

	if (is.ns4)
	{
		this.css2.load(url,this.objGetWidth())
	}
	else if (is.ie)
	{
		parent.bufferFrame.document.location = url;
		timerID=setInterval("if(parent.bufferFrame.document.readyState=='complete') {clearInterval(timerID);theobjs['" + name + "'].replace_html(document.frames['bufferFrame'].document.body.innerHTML);}",250);
			
	}
	else if (is.ns6)
	{
		this.css2.src=url;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////
function ie_load_done(name)
{
	if(ie_load_done_once)
	{
		if (is.ie) parent.theobjs[name].replace_html(parent.bufferFrame.document.body.innerHTML);
	}
	ie_load_done_once=true;
}

var ie_load_done_once=false;




//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
  function getImageLeft(img) {

	var obj;

	if(is.ns && !is.ns6)
	{
		x=img.x;
	}
	else
	{
		x = 0;
		obj = img;
		while (obj.offsetParent != null) {
		  x += obj.offsetLeft;
		  obj = obj.offsetParent;
		}
		x += obj.offsetLeft;
	}
	return x;
  }

  function getImageTop(img) {

	var obj;

	if(is.ns && !is.ns6)
	{
		y=img.y;
	}
	else
	{
		y = 0;
		obj = img;
		while (obj.offsetParent != null) {
		  y += obj.offsetTop;
		  obj = obj.offsetParent;
		}
		y += obj.offsetTop;
	}

	return y;
  }
