// ---

/*

    Written by Jonathan Snook, http://www.snook.ca/jonathan

    Add-ons by Robert Nyman, http://www.robertnyman.com

*/

function getElementsByClassName(oElm, strTagName, strClassName){

	var arrElements = (strTagName == "*" && oElm.all)? oElm.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)

}

// ---

// Revised version May 11th 2007

function getElementsByClassName(className, tag, elm){

	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");

	var tag = tag || "*";

	var elm = elm || document;

	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);

	var returnElements = [];

	var current;

	var length = elements.length;

	for(var i=0; i<length; i++){

		current = elements[i];

		if(testClass.test(current.className)){

			returnElements.push(current);

		}	

	}

	return returnElements;

}

// ---

/*

	Revised to support looking for multiple class names,

	no matter in which order they're applied to the element

*/

function getElementsByClassName(oElm, strTagName, oClassNames){

	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);

	var arrReturnElements = new Array();

	var arrRegExpClassNames = new Array();

	if(typeof oClassNames == "object"){

		for(var i=0; i<oClassNames.length; i++){

			arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));

		}

	}

	else{

		arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));

	}

	var oElement;

	var bMatchesAll;

	for(var j=0; j<arrElements.length; j++){

		oElement = arrElements[j];

		bMatchesAll = true;

		for(var k=0; k<arrRegExpClassNames.length; k++){

			if(!arrRegExpClassNames[k].test(oElement.className)){

				bMatchesAll = false;

				break;

			}

		}

		if(bMatchesAll){

			arrReturnElements.push(oElement);

		}

	}

	return (arrReturnElements)

}

// ---

// Array support for the push method in IE 5

if(typeof Array.prototype.push != "function"){

	Array.prototype.push = ArrayPush;

	function ArrayPush(value){

		this[this.length] = value;

	}

}

// ---

/*

	Examples of how to call the function:

	

	To get all a elements in the document with a "info-links" class:

    getElementsByClassName(document, "a", "info-links");

    

	To get all div elements within the element named "container", with a "col" and a "left" class:

    getElementsByClassName(document.getElementById("container"), "div", ["col", "left"]);

*/

// ---
