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;
}

// mozilla: window{ scrollX, scrollY, scrollMaxX, scrollMaxY }
// safari: body { scrollLeft, scrollTop, scrollWidth, scrollHeight }
XBrowser.getScroll = function (wnd) {
	var scroll;
	if (typeof(wnd.scrollX) != "undefined") {
	
		// mozilla
		scroll = { left: wnd.scrollX, top: wnd.scrollY, width: wnd.innerWidth + wnd.scrollMaxX, height: wnd.innerHeight + wnd.scrollMaxY };
	} else if (wnd.document.documentElement && typeof(wnd.document.documentElement.scrollLeft) != "undefined") {
	
		// ie 6 strict
		var o = wnd.document.documentElement;
		scroll = { left: o.scrollLeft, top: o.scrollTop, width: o.scrollWidth, height: o.scrollHeight };
	} else if (typeof(wnd.document.body.scrollLeft) != "undefined") {
	
		// safari
		var o = wnd.document.body;
		scroll = { left: o.scrollLeft, top: o.scrollTop, width: o.scrollWidth, height: o.scrollHeight };
	}
	return scroll;
}

XBrowser.getStyle = function (elem, property){
	if (elem.currentStyle) {
		var ret = elem.currentStyle[property];
	} else if (window.getComputedStyle) {
		var ret = document.defaultView.getComputedStyle(elem, null).getPropertyValue(property);
	} else if (document.defaultView.getComputedStyle) {
		var ret = document.defaultView.getComputedStyle(elem, null)[property];
	}
	return ret;
}

