var XmlDocument = Class.create();

XmlDocument.prototype = {
    initialize:function(options) {
        if(options) {
            this.async = this.options.async || "false";
        }
        if (window.ActiveXObject) {
            this.xmlObjType = "activex";
            this.xmlObj = new ActiveXObject("Microsoft.XMLDOM");
            if(this.async)
                this.xmlObj.async = this.async;
            else
                this.xmlObj.async = "false";
        }
        else {
            this.xmlObjType = "domparser";
            this.xmlObj = new DOMParser();
        }
    },
    loadXml:function(xmlText) {
        if(this.xmlObjType == "activex")
            this.xmlObj.loadXML(xmlText);
        else if(this.xmlObjType == "domparser") {
            this.xmlObj = this.xmlObj.parseFromString(xmlText,"text/xml");
        }
        else
            throw("Unknown XML parser.");
        this.documentElement = this.xmlObj.documentElement;
    },
    load:function(xmlFile) {
   			if(this.xmlObjType == "activex")
   					this.xmlObj.load(xmlfile);
   			else if(this.xmlObjType == "domparser") {
   					this.xmlObj = document.implementation.createDocument("","",null);
						this.xmlObj.load(xmlFile);
						this.xmlObj.onload = function() {
							this.documentElement = this.xmlObj.documentElement;
						}
   			}
   			else
	   				throw("Unknown XML parser.");
   			if(!this.documentElement)
						this.documentElement = this.xmlObj.documentElement;
    }
};

var Browser = Class.create();

Browser.prototype = {
	initialize:function() {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString:function(data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion:function(dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS: [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};

Position.Window = {
    getDeltas: function() {
        var deltaX =  window.pageXOffset
            || document.documentElement.scrollLeft
            || document.body.scrollLeft
            || 0;
        var deltaY =  window.pageYOffset
            || document.documentElement.scrollTop
            || document.body.scrollTop
            || 0;
        return [deltaX, deltaY];
    },
    size: function() {
        var winWidth, winHeight, d=document;
        if (typeof window.innerWidth!='undefined') {
            winWidth = window.innerWidth;
            winHeight = window.innerHeight;
        } else {
            if (d.documentElement && typeof d.documentElement.clientWidth!='undefined' && d.documentElement.clientWidth!=0) {
                winWidth = d.documentElement.clientWidth
                winHeight = d.documentElement.clientHeight
            } else {
                if (d.body && typeof d.body.clientWidth!='undefined') {
                    winWidth = d.body.clientWidth
                    winHeight = d.body.clientHeight
                }
            }
        }
        return [winWidth, winHeight];
    }
}

function $X(xmlContent) {
    var xml = new XmlDocument();
     Try.these(
     		function() { xml.loadXml(xmlContent); },
     		function() { xml.load(xmlContent); }
    );
    return xml.documentElement;
}
