/**
 * DOM functions
 */

function isIgnorable(node) {
	return (node.nodeType == 8 || (node.nodeType == 3 && !/[^\t\n\r ]/.test(node.data)));
}

function nodeBefore(sibling) {
	if ( sibling ) {
		while((sibling = sibling.previousSibling)) {
			if ( !isIgnorable(sibling) ) return sibling;
		}
	}
	
	return null;
}

function nodeAfter(sibling) {
	if ( sibling ) {
		while((sibling = sibling.nextSibling)) {
			if ( !isIgnorable(sibling) ) return sibling;
		}
	}
	
	return null;
}

function firstChild(parent) {
	if ( parent && parent.nodeType == 1 ) {
		var result = parent.firstChild;
		do {
			if ( !isIgnorable(result) ) return result;
		} while((result = result.nextSibling));
	}
}

function lastChild(parent) {
	if ( parent && parent.nodeType == 1 ) {
		var result = parent.lastChild;
		do {
			if ( !isIgnorable(result) ) return result;
		} while((result = result.previousSibling));
	}
}

//
// Class functions
function getElementsByClassName(className, tagName) {
	if ( !tagName ) tagName = '*';
	var tagNameRegex = new RegExp('(^|\\s)' + className + '(\\s|$)');
	var el = document.getElementsByTagName(tagName), i = el.length, e, result = [];
	
	while(i--) {
		e = el[i];
		if ( e.className && tagNameRegex.test(e.className)) result.push(e);
	}
	
	return result;
}

function getClassList(el) {
	if ( el.className ) return el.className.split(/\s+/);
	return [];
}

function setClassList(el, classes) {
	el.className = classes.join(' ');
}

function hasClass(el, className) {
	var classes = getClassList(el);
	return classes.indexOf(className) > -1;
}

function addClass(el, className) {
	var classes = getClassList(el);
	if ( classes.indexOf(className) == -1 ) {
		classes[classes.length] = className;
	}
	setClassList(el, classes);
}

function removeClass(el, className) {
	var classes = getClassList(el), index;
	if ((index = classes.indexOf(className)) > -1) {
		delete classes[index];
	}
	setClassList(el, classes);
}

function replaceClass(el, oldclass, newclass) {
	var classes = getClassList(el), index;
	if ((index = classes.indexOf(oldclass)) > -1 && classes.indexOf(newclass) == -1)
	{
		classes[index] = newclass;
	}
	setClassList(el, classes);
}
