﻿(function ()
{
	var window = this, undefined;

	// *** Extend System Objects ***

	// Node.contains( [childNode] )
	if (window.Node && Node.prototype && !Node.prototype.contains)
	{
		Node.prototype.contains = function (arg)
		{
			return !!(this.compareDocumentPosition(arg) & 16);
		}
	}

	// String.trim( [string] )
	if (!String.prototype.trim)
	{
		String.prototype.trim = function (arg)
		{
			return this.replace(/^(\s|\&nbsp\;)+/, '').replace (/(\s|\&nbsp\;)+$/, '');
		}
	}

	// *** Building the Global Object ***

	// $( [selector], [context] )
	// $.addEvent( [obj], [type], [context] )
	// $.removeEvent( [obj], [type], [fn] )
	// $.returnEvent( [e], [retValue] )
	// $.setUnselectable( [elem] )
	// $.setOpacity( [elem], [opacity] )
	// $.getAbsPos( [elem] )

	window["$"] = function (selector, context)
	{
		return (context || document).getElementById(selector);
	}

	window["$"].addEvent = function (obj, type, fn)
	{
		if (obj.attachEvent)
		{
			obj[type + fn] = function() { fn.call(obj, window.event); }
			obj.attachEvent('on' + type, obj[type + fn]);
		}
		else
		{
			obj.addEventListener(type, fn, false);
		}
	}

	window["$"].removeEvent = function (obj, type, fn)
	{
		if (obj.detachEvent)
		{
			obj.detachEvent('on' + type, obj[type + fn]);
			obj[type + fn] = null;
		}
		else
		{
			obj.removeEventListener(type, fn, false);
		}
	}

	window["$"].returnEvent = function (e, retValue)
	{
		if (retValue) { return true; }

		if (e.preventDefault) e.preventDefault();
		else e.returnResult = false;
		if (e.stopPropagation) e.stopPropagation();
		else e.cancelBubble = true;
		return false;
	}

	window["$"].setUnselectable = function (elem)
	{
		if (elem == undefined) { return; }
		this.addEvent(elem, "selectstart", function () { return false; });
		elem.style.MozUserSelect = "none";
		elem.style.KhtmlUserSelect = "none";
		elem.unselectable = "on";
	}

	window["$"].setOpacity = function (elem, opacity)
	{
		elem.style.opacity = opacity || '1.0';
		elem.style.MozOpacity = opacity || '1.0';
		elem.style.KhtmlOpacity = opacity || '1.0';
		elem.style.filter = (opacity === undefined ? 'none': 'Alpha(style=0, opacity=' + Math.round(opacity * 100) + ')');

		if (opacity == 0)
		{
			elem.style.visibility = 'hidden';
		}
		else if (elem.style.visibility != 'visible')
		{
			elem.style.visibility = 'visible';
		}
	}

	window["$"].getAbsPos = function (elem)
	{
		var x = 0, y = 0;
		while (elem != null)
		{
			x += elem.offsetLeft;
			y += elem.offsetTop;
			elem = elem.offsetParent;
		}

		return { "x":x, "y":y };
	}
})();