﻿var undefined; // undefined

// DOM
function DOM() {
}
DOM.Doc=document;

DOM.Get=function (id) {
	return this.Doc.getElementById(id);
}

DOM.Create=function (tag,parent) {
	var el;
	if (Browser.Moz) el=document.mozCreateElement(tag);
	else el=this.Doc.createElement(tag);
	if (parent) parent.appendChild(el);
	return el;
}

DOM.Event=function (evt,func,o) {
	o = (o || window);
	if (o.attachEvent) o.attachEvent("on"+evt,func);
	else o.addEventListener(evt,func,false);
}
DOM.Deevent=function (evt,func,o) {if (!o) o=window;if (o.detachEvent) o.detachEvent("on"+evt,func);else if (o.removeEventListener) o.removeEventListener(evt,func,false);}

DOM.Find=function (o,tag,prop,eq) {
/*
finds a parent element with the tagName of tag, and property=eq if mentioned

<div id="z">
	<div id="y">
		<div id="x">
			<span id="a">
				<button onclick="alert(f(this,'div','id').id)"></button>
			</span>
		</div>
	</div>
</div>

will return 'x'.
*/
	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
DOM.Classes={};
DOM.Classes.Add=function (el,cls) {
	if (el) return !this.Contains(el,cls) ? el.className+=" "+cls : el.className;
}
DOM.Classes.Remove=function (el,cls) {
	if (el) return el.className=el.className.replace(new RegExp("\\b"+cls.ToRX()+"\\b"),"");
}
DOM.Classes.Contains=function (el,cls) {
	if (el) return new RegExp("\\b"+cls.ToRX()+"\\b").test(el.className);
}
DOM.Classes.Current=function (el,prop) {
	if (el) return el.currentStyle[prop];
}
DOM.Classes.Toggle=function (el,cls) {
	cls=cls || "hidden";
	this[this.Contains(el,cls) ? "Remove" : "Add"](el,cls);
}

// Positions
DOM.Pos={};
DOM.Pos.X=function (o) {
	if (Browser.IE) x=o.getClientRects()[0].left-2+DOM.Doc.body.scrollLeft;
	else for (var x=0;o;x+=o.offsetLeft,o=o.offsetParent);
	return x;
}
DOM.Pos.Y=function (o) {
	if (Browser.IE) y=o.getClientRects()[0].top-2+DOM.Doc.body.scrollTop;
	else for (var y=0;o;y+=o.offsetTop,o=o.offsetParent);
	return y;
}

// creating links from spans

DOM.Event(
	"load",
	function () {
		function isLink(o) {
			return o && o.nodeType==1 && o.getAttribute("link")!=null && (o.getAttribute("href")!=null || o.onclick!=null);
		}

		DOM.Event(
			"mouseover",
			function (e) {
				var src=e.srcElement;

				if (isLink(src)) {
					DOM.Classes.Add(src,"hand");
					DOM.Classes.Add(src,src.getAttribute("classOver") || "ah");
					src.setAttribute("unselectable","on");
				}
			},
			DOM.Doc
		);
		DOM.Event(
			"mouseout",
			function (e) {
				var src=e.srcElement;

				if (isLink(src)) DOM.Classes.Remove(src,src.getAttribute("classOver") || "ah");
			},
			DOM.Doc
		);
		DOM.Event(
			"click",
			function (e) {
				var src=e.srcElement;
				var features=[];

				if (isLink(src) && src.getAttribute("href")!=null) {
					addFeat("width");
					addFeat("height");
					addFeat("scroll");
					addFeat("status");
					open(
						o.getAttribute("href"),
						o.getAttribute("name") || null,
						features.join(",")
					);
				}

				function addFeat(name) {
					if (o.getAttribute(name)) features.push(name+"="+o.getAttribute(name));
				}
			},
			DOM.Doc
		);

		var spans=DOM.Doc.getElementsByTagName("span"),
			o;

		for (var i=0;i<spans.length;i++) {
			o=spans[i];
			if (o.getAttribute("link")!=null) {
				DOM.Classes.Add(o,"hand");
				DOM.Classes.Add(o,o.getAttribute("classOut") || "a");
			}
		}
	}
);
