//<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;
}

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 = "NOID_" + dhtml.lastID;
		dhtml.lastID++;
	}
	if(!elem.nodeType)
		return elem;

	if(!elem.getParent)
		elem.getParent = elemObject_GetParent;
	if(!elem.getFirst)
		elem.getFirst = elemObject_GetFirst;
	if(!elem.getLast)
		elem.getLast = elemObject_GetLast;

	if(!elem.getOffsetParent)
		elem.getOffsetParent = elemObject_GetOffsetParent;

	if(!elem.getElement)
		elem.getElement = elemObject_GetElement;
		
	if(!elem.getByTag)
		elem.getByTag = elemObject_GetElementsByTag;

	if(!elem.replaceElem)
		elem.replaceElem = elemObject_ReplaceElem;
	if(!elem.appendElem)
		elem.appendElem = elemObject_AppendElem;

	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;
}

function elemObject_GetParent() {
	if(dhtml.DOM)
		return dhtml.normalize(this.parentNode, this.document);
	else if(dhtml.NN4)
		return dhtml.normalize(this.parentLayer, this.document);
	else
		return null;
}

function elemObject_GetFirst() {
	if(dhtml.DOM && this.lastChild)
		return dhtml.normalize(this.firstChild, this.document);
	else if(dhtml.NN4 && this.layers.length)
		return dhtml.normalize(this.layers[0], this.document);
	else
		return null;
}

function elemObject_GetLast() {
	if(dhtml.DOM && this.lastChild)
		return dhtml.normalize(this.lastChild, this.document);
	else if(dhtml.NN4 && this.layers.length)
		return dhtml.normalize(this.layers[this.layers.length-1], this.document);
	else
		return null;
}

function elemObject_GetOffsetParent() {
	if(dhtml.DOM)
		return dhtml.normalize(this.offsetParent, this.document);
	else if(dhtml.NN4)
		return dhtml.normalize(this.parentLayer, this.document);
	else
		return null;
}

function elemObject_GetElement(id, cascade) {
	var elem = null;
	var i = 0;

	if(dhtml.NN4) {
		elem = this.layers[id];
		if(elem)
			dhtml.normalize(elem, this);
		else if(cascade || cascade != false || cascade != 0) {
			for(i = 0; i < this.layers.length && !elem; i++)
				elem = dhtml.normDoc(this.layers[i].document).getElement(id, true);
		}
	} else if(dhtml.DOM) {
		elem = this.getElementById(id);
		if(elem)
			elem = dhtml.normalize(elem, this.document);
	}

	return elem;
}

function elemObject_GetElementsByTag(tag) {
	var nodes = null;
	var i = 0;
	
	if(dhtml.NN4) {
	} else if(dhtml.DOM) {
		nodes = this.getElementsByTagName(tag.toUpperCase());
		for(i = 0; i < nodes.length; i++)
			nodes[i] = dhmtl.normalize(nodes[i], this.document);
	}
	
	return nodes;
}

function elemObject_GetAttribute(name) {
	var i = 0;

	if(this.attributes) {
		for(i = 0; i < this.attributes.length; i++)
			if(this.attributes[i].nodeName == name)
				return this.attributes[i].nodeValue;
	} else if(this[name])
		return this[name];
	else
		return null;
}

function elemObject_SetAttribute(name, value) {
	var i = 0;
	if(this.attributes) {
		for(i = 0; i < this.attributes.length; i++)
			if(this.attributes[i].nodeName == name)
				this.attributes[i].nodeValue = value;
	} else
		this[name] = value;
}

function elemObject_GetClass() {
	if(this.className)
		return this.className;
	else
		return this.getAttribute("class");
}

function elemObject_SetClass(value) {
	if(this.className)
		this.className = value;
	else
		this.setAttribute("class", value);
}

function elemObject_GetEvent(name) {
	if(dhtml.IE || dhtml.mozilla)
		return eval("this.on" + name.toLowerCase());
	else if(dhtml.NN4 && this._layer)
		return eval("this.on" + name.toLowerCase());
	else
		return eval("this.on" + name.toLowerCase());
}

function elemObject_SetEvent(name, func) {
	if(!func)
		this.clearEvent(name);
	if(dhtml.IE)
		eval("this.on" + name.toLowerCase() + "=func");
	else if(dhtml.mozilla)
		this.addEventListener(name.toLowerCase(), func, false);
	else if(dhtml.NN4 && eval("Event." + name.toUpperCase())) {
		if(this._layer) {
			eval("this.captureEvents(Event." + name.toUpperCase() + ");");
		}
		eval("this.on" + name.toLowerCase() + "=func");
	}
}

function elemObject_ClearEvent(name) {
	if(dhtml.IE)
		eval("this.on" + name.toLowerCase() + "=null");
	else if(dhtml.mozilla)
		this.removeEventListener(name.toLowerCase());
	else if(dhtml.NN4) {
		eval("this.document.releaseEvents(Event." + name.toUpperCase() + ");");
		eval("this.document.on" + name.toLowerCase() + "=null");
	}
}

function elemObject_ReplaceElem(child, elem) {
	dhtml.normalize(elem, this.document);

	if(elem._dhtmlFrag) {
		if(!child._dhtmlFrag)
			this.removeChild(child);

		return this.appendElem(elem);
	} else
		return this.replaceChild(child, elem);
}

function elemObject_AppendElem(elem) {
	var child = null;

	dhtml.normalize(elem, this.document);

	if(elem._dhtmlFrag) {
		child = elem.firstChild;
		while(child) {
			this.appendChild(child);
			child = child.nextSibling;
		}
		return elem.lastChild;
	} else
		return this.appendChild(elem);
}

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;
		parent = this.getOffsetParent();
		while(parent && parent.nodeType == 1) {
			pix += parent.offsetLeft;
			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) {
		pix = this.offsetTop;
		parent = this.getOffsetParent();
		while(parent && parent.nodeType == 1) {
			if(parent.nodeName != 'TR' && parent.nodeName != 'NOBR')
				pix += parent.offsetTop;
			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.DOM)
		pix = this.offsetHeight;
	else if(dhtml.NN4)
		pix = this.clip.height;
	else
		pix = null;

	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 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) {
	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 + 'px';
		if(h)
			this.style.height = h + 'px';
			
		if(!scroll) {
			this.style.overflow = "hidden";
		} else {
			this.style.overflow = "auto";
		}
		
		if(!w)
			w = "auto"
		else
			w = w+"px";
		if(!h)
			h = "auto"
		else
			h = h+"px";
		this.style.clip = "rect(auto " + w + " " + h + " auto)";
	}
}

function elemObject_AlignTo(elem, myHorz, myVert, elemHorz, elemVert, shiftX, shiftY) {
	var x = 0;
	var y = 0;

	if(!elem)
		return;

	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 = elem.getX();
	y = elem.getY();

	if(elemHorz == 0)
		x += Math.floor(elem.getWidth()/2);
	else if(elemHorz == 1)
		x += elem.getWidth();

	if(elemVert == 0)
		y += Math.floor(elem.getHeight()/2);
	else if(elemVert == 1)
		y += elem.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.display != "none" && this.style.visibility != "hidden";
}

function elemObject_Hide(hard) {
	if(dhtml.NN4)
		this.visibility = "hidden";
	else if(hard)
		this.style.display = "none";
	else
		this.style.visibility = "hidden";
}

function elemObject_Show(hard) {
	if(dhtml.NN4)
		this.visibility = "show";
	else if(hard)
		this.style.display = "";
	else
		this.style.visibility = "";
}

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_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 = element.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;
	}
}

//======================================================================================
//                                Initialization code
//======================================================================================
if(window.dhtml) {
	dhtml.lastID = 0;
	dhtml.addNorm(adhtml_Norm);
	dhtml.addNormDoc(adhtml_NormDoc);
}