
if (!xb.Versions) {
	xb.Versions = new Array () ;
}
xb.Versions['dom']	= '2005-11-22' ;

/*===========================================================================
 *
 * Useful constants
 *
 */
try {
	xb.ELEMENT_NODE					= Node.ELEMENT_NODE ? Node.ELEMENT_NODE : 1 ;
	xb.ATTRIBUTE_NODE				= Node.ATTRIBUTE_NODE ? Node.ATTRIBUTE_NODE : 2 ;
	xb.TEXT_NODE					= Node.TEXT_NODE ? Node.TEXT_NODE : 3 ;
	xb.CDATA_SECTION_NODE			= Node.CDATA_SECTION_NODE ? Node.CDATA_SECTION_NODE : 4 ;
	xb.ENTITY_REFERENCE_NODE		= Node.ENTITY_REFERENCE_NODE ? Node.ENTITY_REFERENCE_NODE : 5 ;
	xb.ENTITY_NODE					= Node.ENTITY_NODE ? Node.ENTITY_NODE : 6 ;
	xb.PROCESSING_INSTRUCTION_NODE	= Node.PROCESSING_INSTRUCTION_NODE ? Node.PROCESSING_INSTRUCTION_NODE : 7 ;
	xb.COMMENT_NODE					= Node.COMMENT_NODE ? Node.COMMENT_NODE : 8 ;
	xb.DOCUMENT_NODE				= Node.DOCUMENT_NODE ? Node.DOCUMENT_NODE : 9 ;
	xb.DOCUMENT_TYPE_NODE			= Node.DOCUMENT_TYPE_NODE ? Node.DOCUMENT_TYPE_NODE : 10 ;
	xb.DOCUMENT_FRAGMENT_NODE		= Node.DOCUMENT_FRAGMENT_NODE ? Node.DOCUMENT_FRAGMENT_NODE : 11 ;
	xb.NOTATION_NODE				= Node.NOTATION_NODE ? Node.NOTATION_NODE : 12 ;
} catch (x) {
	xb.ELEMENT_NODE					=  1 ;
	xb.ATTRIBUTE_NODE				=  2 ;
	xb.TEXT_NODE					=  3 ;
	xb.CDATA_SECTION_NODE			=  4 ;
	xb.ENTITY_REFERENCE_NODE		=  5 ;
	xb.ENTITY_NODE					=  6 ;
	xb.PROCESSING_INSTRUCTION_NODE	=  7 ;
	xb.COMMENT_NODE					=  8 ;
	xb.DOCUMENT_NODE				=  9 ;
	xb.DOCUMENT_TYPE_NODE			= 10 ;
	xb.DOCUMENT_FRAGMENT_NODE		= 11 ;
	xb.NOTATION_NODE				= 12 ;
}

xb.NodeToXML = function (node) {
	var	result ;
	var	i ;

	switch (node.nodeType) {
		case xb.ELEMENT_NODE: {
			result = '<' + node.tagName ;
			for (i = 0 ; i != node.attributes.length ; i++) {
				result += ' ' + node.attributes.item (i).name + '="' + node.attributes.item (i).value + '"' ;
			}
			if (node.hasChildNodes ()) {
				result += '>' ;
				for (i = 0 ; i != node.childNodes.length ; i++) {
					result += xb.NodeToXML (node.childNodes[i]) ;
				}
				result += '</' + node.tagName + '>' ;
			} else {
				result += '/>' ;
			}
			break ;
		}
		case xb.CDATA_SECTION_NODE: {
			result = '<![CDATA[' + node.nodeValue + ']]>' ;
			break ;
		}
		case xb.TEXT_NODE: {
			result = node.nodeValue ;
			break ;
		}
		case xb.PROCESSING_INSTRUCTION_NODE: {
			result = '<?' + node.nodeName + ' ' + node.nodeValue + '?>' ;
			break ;
		}
		case xb.ENTITY_REFERENCE_NODE: {
			result = '&' + node.nodeName + ';' ;
			break ;
		}
		default: {
			result = '' ;
			break ;
		}
	}

	return result ;
}

xb.STRIP_WHITESPACE	= 'strip whitespace' ;

xb.NodeTextContent = function (node) {
	var	result ;
	var	child ;
	var	i ;

	result = '' ;
	if (node.hasChildNodes ()) {
		for (i = 0 ; i != node.childNodes.length ; i++) {
			child = node.childNodes[i] ;
			switch (child.nodeType) {
				case xb.TEXT_NODE:
				case xb.CDATA_SECTION_NODE: {
					result += child.nodeValue ;
					break ;
				}
				//
				// Really we should be trying to resolve this...
				//
				case xb.ENTITY_REFERENCE_NODE: {
					result += '&' + child.nodeName + ';' ;
					break ;
				}
				default: {
					break ;
				}
			}
		}
	}

	if ((arguments.length > 1) && (arguments[1] == xb.STRIP_WHITESPACE)) {
		result = result.replace (/^\s*(.*?)\s*$/, '$1') ;
	}

	return result ;
}
/*===========================================================================
 *
 * XMLHttpRequest
 *
 */
xb.MSXMLHTTPprogids = [
	'Msxml2.XMLHTTP.5.0',
	'Msxml2.XMLHTTP.4.0',
	'MSXML2.XMLHTTP.3.0',
	'MSXML2.XMLHTTP',
	'Microsoft.XMLHTTP'
] ;

//---------------------------------------------------------------------------
//
// Returns an XMLHttpRequest object
//
xb.XMLHttpRequest = function () {
	if (window.XMLHttpRequest) {
		try {
			return new XMLHttpRequest () ;
		} catch (x) {
		}
	} else if (window.ActiveXObject) {
		for (var i = 0 ; i != xb.MSXMLHTTPprogids.length ; i++) {
			try {
				return new ActiveXObject (xb.MSXMLHTTPprogids[i]) ;
			} catch (x) {
			}
		}
	}

	return null ;
}

//---------------------------------------------------------------------------

xb.RandomizeURL = function (url) {
	var	result	= url ;
	var	name	= 't' ;
	var	value	= new Date ().valueOf () ;
	var	i ;

	while (url.match (new RegExp ('\\b' + name)) != null) {
		name = 't' + i ;
		i++ ;
	}

	var	v = url + ((url.indexOf ('?') == -1) ? '?' : '&') + name + '=' + value ;
	//alert (v) ;
	return v ;
}

//---------------------------------------------------------------------------
//
// Fetch XML document asynchronously via a HTTP request
//
//	xb.SimpleXMLHttpRequest (url, postvars, callback[, callbackMethod])
//
//	@param	url				Document URL
//	@param	postvars		Variables to post.
//	@param	callback		Callback function or object to invoke when
//							document is received.
//	@param	callbackMethod	If callback is an object, callbackMethod is the
//							name of the object's method to invoke.
//
xb.SimpleXMLHttpRequest = function (url, postvars, callback) {
	var	request ;
	var	handleReadyStateChange ;

	//
	// Acquire request object
	//
	request = xb.XMLHttpRequest () ;
	if (request) {
		//
		// Wrap callback in a closure...
		//
		if (arguments.length > 3) {
			var	callbackMethod = arguments[3] ;
			handleReadyStateChange = function () {
				callback[callbackMethod] (request) ;
			}
		} else {
			handleReadyStateChange = function () {
				callback (request) ;
			}
		}

		//
		// Attach wrapped callback as event handler
		//
		request.onreadystatechange = handleReadyStateChange ;

		//
		// Prepare request string
		//
		data = '' ;
		if (postvars) {
			for (key in postvars) {
				if (data != '') {
					data += '&' ;
				}
				data += xb.EncodeURIComponent (key) + '=' + xb.EncodeURIComponent (postvars[key]) ;
			}
		}

		//
		// Submit request.
		//
		request.open ((data == '') ? 'GET' : 'POST', xb.RandomizeURL (url)) ;
		if (data != '') {
			request.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded') ;
		}
		request.send (data) ;
		return true ;
	} else {
		return false ;
	}
}
