// returns refence to object with given id
var $ = function(n) {
	return document.getElementById(n);
}

// returns reference to objects with given classname
function $C(n) {
	return document.getElementsByClassName(n);
}

// returns reference to objects with given tagname
function $T(n) {
	return document.getElementsByTagName(n);
}

var Utils = Utils ? Utils : function() {
	return {
		// creates an element node
		MakeNode: function(tag, attr, child) {
			var e = document.createElement(tag);
			if (attr) for (var i in attr) e.setAttribute(i, attr[i]);
			if (child)
				if (typeof child[0] == "undefined") e.appendChild(child);
				else for (var i = 0; i < child.length; i++) e.appendChild(child[i]);
			return e;
		},

		// creates a text node
		MakeText: function(text) {
			return document.createTextNode(text);
		},

		/* creates an object from an XML element
		Objectify: function(element) {
			var obj = {};
			for (var i = 0; i < element.childNodes.length; i++)
				if (element.childNodes[i].nodeType == 1)
					obj[element.childNodes[i].nodeName] = element.childNodes[i].firstChild.nodeValue;
			return obj;
		},*/

		// returns object with GET variables from URL
		Get: function() {
			var vars = [];
			if (location.search) {
				var a = location.search.replace(/\+/g, " ");
				var b = a.substring(1).split("&");

				for (var i = 0; i < b.length; i++) {
					var n = b[i].split("=");
					if (n.length < 2) vars[n[0]] = true;
					else vars[n[0]] = decodeURIComponent(n[1]);
				}
			}
			return vars;
		},

		// sends an XMLHTTPRequest
		XHR: function(url, method, handler) {
			var x = false;
			try {x = new XMLHttpRequest();} catch(e) {}
			try {x = new ActiveXObject("Microsoft.XMLHTTP");} catch(e) {}
			try {x = new ActiveXObject("Msxml2.XMLHTTP");} catch(e) {}
			try {x = window.createRequest();} catch(e) {}

			if (x) {
				x.open(method, url, true);
				x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				x.onreadystatechange = function() {
					if (x.readyState == 4) handler(x);
				}
				x.send("");
			}
		},

		// turns XML element into object (recursive)
		Objectify: function(e) {
			if (!e || e.nodeType == 7) return;

			if (e.nodeType == 3 || e.nodeType == 4) {
				if (e.nodeValue.match(/[^\x00-\x20]/) == null) return;
				return e.nodeValue;
			}

			var retval;
			var count = {};

			if (e.childNodes && e.childNodes.length) {
				var textonly = true;

				for (var i = 0; i < e.childNodes.length && textonly; i++) {
					if (e.childNodes[i].nodeType == 3 || e.childNodes[i].nodeType == 4) continue;
					textonly = false;
				}

				if (textonly) {
					if (!retval) retval = "";
					for (var i = 0; i < e.childNodes.length; i++) retval += e.childNodes[i].nodeValue;
				} else {
					if (!retval) retval = {};

					for (var i = 0; i < e.childNodes.length; i++) {
						var key = e.childNodes[i].nodeName;
						if (typeof key != "string") continue;

						var val = Utils.Objectify(e.childNodes[i]);

						if (!val) continue;
						if (typeof count[key] == "undefined") count[key] = 0;
						count[key]++;

						if (count[key] == 1) retval[key] = val;
						else if (count[key] == 2) retval[key] = [retval[key], val];
						else retval[key][retval[key].length] = val;
					}
				}
			}

			return retval;
		},

		// turns plaintext urls into html links
		Linkify: function(t) {
			if (!t) return t;
		
			t = t.replace(/((https?\:\/\/|ftp\:\/\/)|(www\.))(\S+)(\w{2,4})(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/gi, function(url) {
				var nice = url;
				if (url.match('^https?:\/\/')) nice = nice.replace(/^https?:\/\//i, '');
				else if (url.match('^ftp:\/\/')) nice = nice.replace(/^ftp:\/\//i, '');
				else url = 'http://' + url;
				return '<a href="'+ url +'" target="_blank">'+ nice.replace(/^www./i,'') +'</a>';
			});
		
			return t;
		}
	}
}();
