function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}



function textCounter(field, countfield, maxlimit) {
	if (field.value.length > maxlimit) // if too long...trim it!
		field.value = field.value.substring(0, maxlimit);
		// otherwise, update 'characters left' counter
	else 
		countfield.value = maxlimit - field.value.length;
}

function init(){
	
	
	if ( document.getElementsByTagName('textarea') ) {
		textareas = document.getElementsByTagName('textarea');
		for ( var e = 0 ; e < textareas.length ; e++ ) {
			if ( textareas[e].className.indexOf('maxlength_') > -1 ) {
				var theseClasses = textareas[e].className.split(' ');
				var maxLength = 0;
				for ( var c = 0 ; c < theseClasses.length ; c++ ) {
					if ( theseClasses[c].indexOf('maxlength_') == 0 ) {
						maxLength = theseClasses[c].split('_')[1];
					}
				}
				var maxdiv = document.createElement('span');
				maxdiv.innerHTML = '<input type="text" size="3" readonly="readonly" value="'+maxLength+'" name="'+textareas[e].name+'_maxlength" /> chars';
				insertAfter(textareas[e].parentNode,maxdiv,textareas[e]);
				textareas[e].maxlength = maxLength;
				textareas[e].countfield = textareas[e].name + '_maxlength';
				textareas[e].onkeydown = function() {textCounter(this,this.form[this.countfield],this.maxlength)};
				textareas[e].onkeyup = function() {textCounter(this,this.form[this.countfield],this.maxlength)};
			}
		}
	}
	
	if ( document.getElementsByTagName('form') ) {
		theForms = document.getElementsByTagName('form');
		for ( f = 0 ; f < theForms.length ; f++ ) {
			theForms[f].oldsubmit = ( typeof theForms[f].onsubmit == 'function' ) ? theForms[f].onsubmit : function(){};
			theForms[f].onsubmit = function() {
				if ( domValidateForm(this) ) {
					return this.oldsubmit();
				} else return false;
			}
		}
	}
	
	function domValidateForm(thisForm) {
		var theReturn = true;
		var thisClass = "";
		var thisName = "";
		var thisValue = "";
		var emailReg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		var dateReg = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2,4}$/;
		for ( r = 0 ; r < thisForm.elements.length ; r++ ) {
			thisClass = " " + thisForm.elements[r].className + " ";
			thisName = ( thisForm.elements[r].title != '' ) ? thisForm.elements[r].title : thisForm.elements[r].name;
			if ( thisClass.indexOf(' required ') > -1 ) {
				if ( ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length == 0 ) {
					alert(thisName + ' is required before submitting the form');
					theReturn = false;
				} else if ( thisForm.elements[r].type == 'select-one' && thisForm.elements[r].options[thisForm.elements[r].selectedIndex].value == '' ) {
					alert(thisName + ' is required before submitting the form');
					theReturn = false;
				} else if ( thisForm.elements[r].type == 'select-multiple' && thisForm.elements[r].selectedIndex == -1 ) {
					alert(thisName + ' is required before submitting the form');
					theReturn = false;
				}
			}
			if ( thisClass.indexOf(' integer ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( thisForm.elements[r].value.length > 0 && ( parseInt(thisForm.elements[r].value) != thisForm.elements[r].value-0 ) ) {
					alert(thisName + ' must be a proper number');
					theReturn = false;
				}
			}
			if ( thisClass.indexOf(' numeric ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( thisForm.elements[r].value.length > 0 && ( parseFloat(thisForm.elements[r].value) != thisForm.elements[r].value-0 ) ) {
					alert(thisName + ' must be a proper number');
					theReturn = false;
				}
			}
			if ( thisClass.indexOf(' email ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( !emailReg.test(thisForm.elements[r].value) ) {
					alert(thisName + ' must be a valid email address to submit the form');
					theReturn = false;
				}
			}
			if ( thisClass.indexOf(' date ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( !dateReg.exec(thisForm.elements[r].value) ) {
					alert(thisName + ' must be a valid date to submit the form, like "mm/dd/yy"');
					theReturn = false;
				}
			}
		}
		return theReturn;
	}
}

window.onload = init; 