var undefined; // =undefined, for ie5.

/* DOM */
var DOM = {
    doc: document,

    get: function(sId) {
        return this.doc.getElementById(sId);
    },

    create: function(sTag, oParent) {
        if (Browser.moz && sTag.indexOf("<") != -1 && new RegExp("<(\\w*?)( |>)").test(sTag)) {
            oEl = this.doc.createElement(RegExp.$1);
            var rxAttr = new RegExp(" ([\\w-\\.]*?)=(\\\"|')(.*?)(\\\"|')");

            while (aMatch = rxAttr.exec(sTag)) oEl.setAttribute(aMatch[1], aMatch[3]);
        }
        else oEl = this.doc.createElement(sTag);

        if (oParent) oParent.appendChild(oEl);
        return oEl;
    },

    event: function(sEvent, fFunction, oEl) {
        try {
            if (!Browser.chrome) //attachEventListener
                (oEl || window).attachEvent("on" + sEvent, fFunction);
            else
                (oEl || window).addEventListener(sEvent, fFunction);
        }
        catch (e) {
        }
    },

    pos: {
        x: function(oEl) {
            if (Browser.ie) iX = oEl.getClientRects()[0].left - 2 + DOM.doc.body.scrollLeft;
            else for (var iX = 0; oEl; iX += oEl.offsetLeft, oEl = oEl.offsetParent);

            return iX;
        },

        y: function(oEl) {
            if (Browser.ie) iY = oEl.getClientRects()[0].top - 2 + DOM.doc.body.scrollTop;
            else for (var iY = 0; oEl; iY += oEl.offsetTop, oEl = oEl.offsetParent);
            return iY;
        }
    },

    find: function(o, tag, prop, eq) {
        tag = tag.toUpperCase();

        while (
			o
			&&
			o != this.doc.documentElement
			&&
			(
				(
					prop == undefined
					&&
					o.tagName != tag
				)
				||
				(
					prop
					&&
					(
						(
							eq != undefined
							&&
							(
								o.tagName != tag
								||
								o[prop] != eq
							)
						)
						||
						(
							eq == undefined
							&&
							o.tagName != tag
						)
					)
				)
			)
		) o = o.parentNode;

        return o.tagName == tag ? o : null;
    },

    classes: {
        add: function(oEl, sClass) {
            if (oEl) return !this.contains(oEl, sClass) ? oEl.className += " " + sClass : oEl.className;
        },

        remove: function(oEl, sClass) {
            if (oEl) return oEl.className = oEl.className.replace(new RegExp("(\\b|\\s)" + sClass.toRX() + "(\\b|\\s)"), "");
        },

        contains: function(oEl, sClass) {
            if (oEl) return new RegExp("\\b" + sClass.toRX() + "\\b").test(oEl.className);
        },

        current: function(oEl, sProp) {
            if (document.defaultView && document.defaultView.getComputedStyle) return document.defaultView.getComputedStyle(oEl, "").getPropertyValue(sProp);
            if (oEl.currentStyle) return oEl.currentStyle[sProp];
            return null;
        },

        toggle: function(oEl, sClass) {
            sClass = sClass || "hidden";
            DOM.classes[DOM.classes.contains(oEl, sClass) ? "remove" : "add"](oEl, sClass);
        }
    }
}

/* Browser */

var sAgent=navigator.userAgent.toLowerCase(),
	aVersion=sAgent.match(/msie ([^;]+);/);

var Browser={
	agent:sAgent,
	ie:sAgent.indexOf("msie")!=-1,
	moz: sAgent.indexOf("gecko") != -1,
	chrome: sAgent.indexOf("chrome") != -1,
	other:sAgent.search(/(msie|mozilla)/i)==-1,

	version:aVersion && aVersion.length ? +aVersion[1] : null,
	
	xmlprefix:function () {
		if (Browser.xmlprefix.prefix) return Browser.xmlprefix.prefix;

		var aPrefixes=["MSXML2","Microsoft","MSXML","MSXML3"],
			oXML, oXH;

		for (var iPrefix=0;iPrefix<aPrefixes.length;iPrefix++) {
			try {
				oXML=new ActiveXObject(aPrefixes[iPrefix]+".XMLDOM");
				oXH=new ActiveXObject(aPrefixes[iPrefix]+".XMLHTTP");
				return Browser.xmlprefix.prefix=aPrefixes[iPrefix];
			}
			catch (oErr) {};
		}

		return null;
	},

	xmldom:function () {
		try {
			if (document.implementation && document.implementation.createDocument) {
				var oXML=document.implementation.createDocument("","",null);

				if (oXML.readyState==null) {
					oXML.readyState=1;
					oXML.addEventListener(
						"load",
						function () {
							oXML.readyState=4;
							if (typeof oXML.onreadystatechange=="function") oXML.onreadystatechange();
						},
						false
					);
				}

				return oXML;
			}

			if (window.ActiveXObject) return new ActiveXObject(this.xmlprefix()+".XMLDOM");
		}
		catch (oErr) {}

		return null;
	},

	xmlhttp:function () {
		try {
			if (window.XMLHttpRequest) {
				var oXH=new XMLHttpRequest();

				if (oXH.readyState==null) {
					oXH.readyState=1;
		            oXH.addEventListener(
						"load",
						function () {
							oXH.readyState=4;
							if (typeof oXH.onreadystatechange=="function") oXH.onreadystatechange();
						},
						false
					);
				}

				return oXH;
			}

			if (window.ActiveXObject) return new ActiveXObject(this.xmlprefix()+".XMLHTTP");
		}
		catch (oErr) {}

		return null;
	}
}



/* Moz Implementation by webfx.eae.net */

if (Browser.moz) document.write("<script type=\"text/javascript\" src=\"scripts/moz.js\"></script>");

// creating links from spans

DOM.event(
	"load",
	function () {
		DOM.event(
			"mouseover",
			function (oEvent) {
				var oSrc=oEvent.srcElement;

				if (oSrc && oSrc.nodeType==1 && oSrc.getAttribute("link")!=null && oSrc.getAttribute("link")!="") {
					DOM.classes.add(oSrc,"hand");
					DOM.classes.add(oSrc,"ah");
					oSrc.setAttribute("unselectable","on");
				}
			},
			DOM.doc
		);
		DOM.event(
			"mouseout",
			function (oEvent) {
				var oSrc=oEvent.srcElement;

				if (oSrc && oSrc.nodeType==1 && oSrc.getAttribute("link")!=null && oSrc.getAttribute("link")!="") DOM.classes.remove(oSrc,"ah");
			},
			DOM.doc
		);

		var aSpans=DOM.doc.getElementsByTagName("span"),
			oSpan;

		for (var iSpan=0;iSpan<aSpans.length;iSpan++) {
			oSpan=aSpans[iSpan];
			if (oSpan.getAttribute("link")!=null) {
				DOM.classes.add(oSpan,"hand");
				DOM.classes.add(oSpan,"a");
			}
		}
	}
);
