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)
}

/*
Adds a function to be called during an event on an object.
Works in all major browsers and allows multiple event handlers.  
Examples:
	addEvent(window, 'load', InitFunction);
	addEvent(document.getElementById('thebutton'), 'click', 'ButtonClick');
*/
function addEvent(obj, type, fn) {
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

function setMaxLength() {
	var x = document.getElementsByTagName('textarea');
	var counter = document.createElement('div');
	counter.className = 'counter';
	for (var i=0;i<x.length;i++) {
		if (x[i].getAttribute('maxlength')) {
			var counterClone = counter.cloneNode(true);
			counterClone.relatedElement = x[i];
			counterClone.innerHTML = '<span>0</span>/'+x[i].getAttribute('maxlength')+' characters';
			x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
			x[i].relatedElement = counterClone.getElementsByTagName('span')[0];

			x[i].onkeyup = x[i].onchange = checkMaxLength;
			x[i].onkeyup();
		}
	}
}

function checkMaxLength() {
	var maxLength = this.getAttribute('maxlength');
	var currentLength = this.value.length;
	if (currentLength > maxLength)
		this.value = this.value.substring(0,maxLength);
	else
		this.relatedElement.className = '';
	this.relatedElement.firstChild.nodeValue = currentLength;
	// not innerHTML
}

addEvent(window, 'load', setMaxLength);


/****************************************************************
**                                                             **
**                        AJAX                                 **
**                                                             **
****************************************************************/

//Creates a XMLHttpRequest object in any browser that supports it.
//Returns null on failure.
function CreateRequester() {
	var ret;
	try { ret = new XMLHttpRequest(); }
	catch(error) {
		try { ret = new ActiveXObject("Msxml2.XMLHTTP.5.0"); }
		catch(error) {
			try { ret = new ActiveXObject("Msxml2.XMLHTTP.4.0"); }
			catch(error) {
				ret = null;
			}
		}
	}
	return ret;
}