// DOM Methods ------------------------------------------------------------------------------------------------------ //

// getElementsByClassName written by Jonathan Snook, http://www.snook.ca/jonathan
// getElementsByClassName add-ons by Robert Nyman, http://www.robertnyman.com
function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && document.all)? document.all :
	oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}
	

function createElement(name, data) {
	var element = document.createElement(name);
	return (data) ? element.appendChild(document.createTextNode(data)).parentNode : element;
}

Object.prototype.appendElement = function(name, data) {
	var element = createElement(name, data);
	return this.appendChild(element);
}

Object.prototype.insertAfter = function(element, sibling) {
	return (sibling.nextElement()) ? this.insertBefore(element, sibling.nextElement()) : this.appendChild(element);
}

Object.prototype.previousElement = function() {
	var element = this.previousSibling;

	while (element) {
		if (element.nodeType == 1)
			return element;
		element = element.previousSibling;
	}
}

Object.prototype.nextElement = function() {
	var element = this.nextSibling;

	while (element) {
		if (element.nodeType == 1)
			return element;
		element = element.nextSibling;
	}
}

Object.prototype.findElement = function(name) {
	return (this.getElementsByTagName(name).length > 0) ? this.getElementsByTagName(name)[0] :
		(this.parentNode) ? this.parentNode.findElement(name) : null;
}

Object.prototype.replaceContents = function(replacement) {
	while (this.childNodes.length > 0) {
		this.removeChild(this.firstChild);
	}

	return this.appendChild(replacement);
}

Object.prototype.hasClass = function(name) {
	for (var i = 0; this.getAttribute("class") && i < this.getAttribute("class").split(" ").length; i++) {
		if (this.getAttribute("class").split(" ")[i] == name)
			return true;
	}

	return false;
}

Object.prototype.addClass = function(name) {
	if (this.hasClass(name)) return;

	if (this.getAttribute("class"))
		this.setAttribute("class", this.getAttribute("class") + " " + name);
	else
		this.setAttribute("class", name);
}

Object.prototype.removeClass = function(name) {
	if (this.getAttribute("class")) {
		var classes = this.getAttribute("class").split(" ");
		this.removeAttribute("class");

		for (var i = 0; i < classes.length; i++) {
			if (classes[i] != name)
				this.addClass(classes[i]);
		}
	}
}

Object.prototype.replaceClass = function(oldClass, newClass) {
	this.removeClass(oldClass);
	this.addClass(newClass);
}
