//  Return a parent element's true number of child elements
function countChildElements(parentElement) {
	var numChildElements = 0;
	for (var i = 0; i < parentElement.childNodes.length; i++) {
		if (parentElement.childNodes[i].nodeType == 1) {
			++numChildElements;
		}
	}
	return numChildElements;
}

//  Return the first true child element of the passed parent
function getFirstChildElement(parentElement) {
	var firstChildElement = parentElement.childNodes[0];
	if (firstChildElement.nodeType != 1) {
		firstChildElement = parentElement.childNodes[1];
	}
	return firstChildElement;   
}

//  Return the last true child element of the passed parent
function getLastChildElement(parentElement) {
	var lastChildElement = parentElement.childNodes[parentElement.childNodes.length - 1];
	if (lastChildElement.nodeType != 1) {
		lastChildElement = parentElement.childNodes[parentElement.childNodes.length - 2];
	}
	return lastChildElement;
}

//  Get an array of elements based on an array of tag names
function getElementsByMultipleTagNames(tagNamesArray, containerElement) { 
	 
	//  Set the containerElement to document by default
	containerElement = setDefaultValue(containerElement, document);
	 
	// Initialize the return array	 
	var elementsArray = new Array();
	 
	//  Error check arguments
	if (arguments.length < 1) {
		tagNamesArray = "*";
	} 
	tagNamesArray = convertToArray(tagNamesArray);
	 
	//  Get all elements if no tag names are specified, otherwise loop through tag names and populate elements array
	if (tagNamesArray[0] == "*") {
		elementsArray = containerElement.getElementsByTagName("*");
	} else {
		for (var i = 0; i < tagNamesArray.length; i++) {
			tempElementsArray = containerElement.getElementsByTagName(tagNamesArray[i]);
			for (var n = 0; n < tempElementsArray.length; n++) {
				elementsArray[elementsArray.length] = tempElementsArray[n];   
			}
		}
	}
	 
	//  Return the populated elements array
	return elementsArray;

}

// Returns an array of elements based on a class name and tag (if specified)
function getElementsByClass(classNamesArray, tagNamesArray, containerElement) {
	 
	//  Initialize array of elements that are of the passed class
	var classElementsArray = new Array();
	 
	//  Get an array of all possible elements to check for the class
	var tempElementsArray = getElementsByMultipleTagNames(tagNamesArray, containerElement);
	 
	//  Loop through class names and convert them to regular expression objects
	classNamesArray = convertToArray(classNamesArray);
	for (var i = 0; i < classNamesArray.length; i++) {
		classNamesArray[i] = new RegExp(classNamesArray[i]);
	}
	 
	// Loop through all the elements and populate elements of the passed class	 
	for (var i = 0; i < tempElementsArray.length; i++) {
		for (var n = 0; n < classNamesArray.length; n++) {
			if (classNamesArray[n].test(tempElementsArray[i].className)) {
				classElementsArray[classElementsArray.length] = tempElementsArray[i];
				break;
			}
		}
	}

	//  Return an array of elements of the passed class
	return classElementsArray;

}

//  Add a class to an element
function addClass(obj,className) {
	var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)", "g");
	if (!pattern.test(obj.className)) {
		obj.className += " " + className;
	}
}

//  Remove a class from an element
function removeClass(obj,className) {
	var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)", "g");
	obj.className = obj.className.replace(pattern, "");
}
