
// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
}

//////////////////////////////////////////////////////////////////////////////////
// getobjects2.js


//misc objects
//a simple encapsulation object
//used to query widths and heights

function cDomObject( sId )
{
	if( bw.dom || bw.ie )
	{
		this.hElement = document.getElementById( sId )
		this.hStyle = this.hElement.style
	}
}

cDomObject.prototype.getWidth = function( )
{
	return  cDomObject.getWidth( this.hElement )
}

cDomObject.getWidth = function( hElement )
{
	if( hElement.currentStyle )
	{
		var nWidth = parseInt( hElement.currentStyle.width )
		if( isNaN( nWidth ) )
		{
			return parseInt( hElement.offsetWidth )
		}
		else
		{
			return nWidth
		}
	}
	else
	{
		return parseInt( hElement.offsetWidth )
	}
}

cDomObject.prototype.getHeight = function( )
{
	return  cDomObject.getHeight( this.hElement )
}

cDomObject.getHeight = function( hElement )
{
	if( hElement.currentStyle )
	{
		var nHeight = parseInt( hElement.currentStyle.height )
		if( isNaN( nHeight ) )
		{
			return parseInt( hElement.offsetHeight )
		}
		else
		{
			return nHeight
		}
	}
	else
	{
		return parseInt( hElement.offsetHeight )
	}
}

cDomObject.prototype.getLeft = function()
{
	return cDomObject.getLeft( this.hElement )
}

cDomObject.getLeft = function( hElement )
{
	return parseInt( hElement.offsetLeft )
}

cDomObject.prototype.getTop = function( )
{
	return cDomObject.getTop( this.hElement )
}

cDomObject.getTop = function( hElement )
{
	return parseInt( hElement.offsetTop )
}


// used to get the absolute position of an relativeli position element
// by accumulating the offset parameters
// example
// cDomObject.getOffsetParam( hElement,'offsetLeft' )

cDomObject.getOffsetParam = function( hElement, sParam, hLimitParent )
{
	var nRes = 0
	if( hLimitParent == null )
	{
		hLimitParent = document.body.parentElement
	}
	while( hElement != hLimitParent )
	{
		nRes += eval( 'hElement.' + sParam )
		if( !hElement.offsetParent ) { break }
		hElement = hElement.offsetParent
	}
	return nRes
}


// used to get the absolute position of an relativeli position element
// by accumulating the scroll offset parameters
// example
// cDomObject.getScrollOffset( hElement,'Left' )

cDomObject.getScrollOffset = function( hElement, sParam, hLimitParent  )
{
	nRes = 0
	if( hLimitParent == null )
	{
		hLimitParent = document.body.parentElement
	}
	while( hElement != hLimitParent )
	{
		nRes += eval( 'hElement.scroll' + sParam )
		if( !hElement.offsetParent ) { break }
		hElement = hElement.parentNode
	}
	return nRes
}




