document.getElementsByClassName = function(className, tagName)
{
	var elementsByClassName = [];

	var elements = (tagName) ? this.getElementsByTagName(tagName) : this.all || this.getElementsByTagName('*');

	for (var i = 0, ii = elements.length; i < ii; i++)
	{
		var element = elements[i];
		var elementClassName = element.className;
		var elementHasClassName = false;

		if (className == elementClassName)
		{
			elementHasClassName = true;
		}
		else if (elementClassName && elementClassName.indexOf(' ') != -1)
		{
			var elementClassNames = elementClassName.split(' ');

			for (var k = 0, kk = elementClassNames.length; k < kk; k++)
			{
				if (className == elementClassNames[k])
				{
					elementHasClassName = true;
					break;
				}
			}
		}

		if (elementHasClassName)
		{
			elementsByClassName.push(element);
		}
	}

	return elementsByClassName;
};

if (!Array.prototype.push)
{
	Array.prototype.push = function()
	{
		for (var i = 0, ii = arguments.length; i < ii; i++)
		{
			this[this.length] = arguments[i];
		}

		return this.length;
	};
}

var EventBroadcaster = {};
EventBroadcaster.init = function(obj)
{
	obj._listeners = [];
	obj.broadcastMessage = this._broadcastMessage;
	obj.addListener = this._addListener;
};
EventBroadcaster._broadcastMessage = function()
{
	var method = arguments[0];
	var args = (arguments.length > 1) ? Array.prototype.slice.apply(arguments, [1]) : [];
	var listeners = this._listeners;
	var i = listeners.length;

	while (i--)
	{
		var listener = listeners[i];
		listener[method].apply(listener, args);
	}
};
EventBroadcaster._addListener = function(obj)
{
	this._listeners.push(obj);
	return true;
};

EventBroadcaster.init(window);
window.onload = function()
{
	this.broadcastMessage('onload');
};

var addClass = function(element, className)
{
	if (element.className)
	{
		element.className = element.className + ' ' + className;
	}
	else
	{
		element.className = className;
	}
};
var removeClass = function(element, className)
{
	element.className = element.className.replace(className, '');
};
