XBrowser = new Object();

// create an XMLHttpRequest object
XBrowser.getRequest = XBrowser_getRequest;
function XBrowser_getRequest() {
	if (typeof(XMLHttpRequest) == "undefined") {
		// ie
		try {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				return new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				return null;
			}
		}
		
	} else {
		// others
		return new XMLHttpRequest();
		
	}
}

// send an XMLHttpRequest object
XBrowser.sendRequest = function (req) {
	if (typeof(XMLHttpRequest) == "undefined") {
		req.send();
	} else {
		req.send(null);
	}
}

// attach event handler to an object
XBrowser.addEventListener = function (node, eventType, listenerReference, captureFlag) {
	
	// optional paramerer
	if (typeof(captureFlag) == "undefined")
		captureFlag = false;
		
	if (node.addEventListener) {
		// others
		node.addEventListener(eventType, listenerReference, captureFlag);
		
	} else {
		// ie
		node.attachEvent("on" + eventType, listenerReference);
		
	}
	
}

// get the "target" from an event object
XBrowser.getEventTarget = XBrowser_getEventTarget;
function XBrowser_getEventTarget(event) {
	
	if (typeof(event.target) == "undefined") {
		// ie
		return event.srcElement;
		
	} else {
		// others
		return event.target;
				
	}
}

// get node attribute (wrapper for ie CLASS)
XBrowser.getAttribute = XBrowser_getAttribute;
function XBrowser_getAttribute(node, attrName) {
	
	// for ie
	if (attrName.toUpperCase() == "CLASS" && typeof(document.all) != "undefined")
		attrName = "className";
	
	return node.getAttribute(attrName);
}

// set node attribute (wrapper for ie CLASS)
XBrowser.setAttribute = XBrowser_setAttribute;
function XBrowser_setAttribute(node, attrName, attrValue) {
	
	// for ie
	if (attrName.toUpperCase() == "CLASS" && typeof(document.all) != "undefined")
		attrName = "className";
	
	node.setAttribute(attrName, attrValue);
}

// remove node attribute (wrapper for ie CLASS)
XBrowser.removeAttribute = XBrowser_removeAttribute;
function XBrowser_removeAttribute(node, attrName, attrValue) {
	
	// for ie
	if (attrName.toUpperCase() == "CLASS" && typeof(document.all) != "undefined")
		attrName = "className";
		
	node.removeAttribute(attrName, attrValue);
}

// 
XBrowser.frameWindow = function (frame) {
	return typeof(frame.contentWindow) != "undefined" ? frame.contentWindow : frame;
}

// 
XBrowser.frameDocument = function (frame) {
	return typeof(frame.contentDocument) != "undefined" ? frame.contentDocument : frame.document;
}

// 
XBrowser.getSelection = function (obj) {
	var sel = null;
	if (!obj.getSelection) {
		if (XBrowser.frameWindow(obj).getSelection) {
			sel = XBrowser.frameWindow(obj).getSelection();
		} else if (XBrowser.frameDocument(obj).getSelection) {
			sel = XBrowser.frameDocument(obj).getSelection();
		} else {
			throw "XBrowser: cannot find 'getSelection()' method!";
		}
	}
	
	var ret = new Object();
	if (sel.getRangeAt) {
		//sel = sel.getRangeAt(0);
		ret.startNode = sel.anchorNode;
		ret.startOffset = sel.anchorOffset;
		ret.endNode = sel.focusNode;
		ret.endOffset = sel.focusOffset;
	} else {
		ret.startNode = sel.baseNode;
		ret.startOffset = sel.baseOffset;
		ret.endNode = sel.extentNode;
		ret.endOffset = sel.extentOffset;
	}
	return ret;
}
