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 openWin( windowURL, windowName, windowFeatures ) { 
	return window.open( windowURL, windowName, windowFeatures ) ; 
} 

var amp = '&';
var loading = false;

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('em');
				maxdiv.className = "maxlength";
				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)};
			}
		}
	}
	
	var theLinks = document.getElementsByTagName('a');
	for ( var a = 0 ; a < theLinks.length ; a++ ) {
		if ( theLinks[a].className.indexOf('popup_') === 0 ) {
			theLinks[a].onclick = function(){
				var theHREF = this.href;
				var width = this.className.split('_')[1];
				var height = this.className.split('_')[2];
				if ( theHREF.indexOf('?') > 0 ) {
					theHREF += '&method=ajax';
				}
				newWindow = openWin( theHREF, 'popup', 'width='+width+',height='+height+',toolbar=0,location=0,directories=0,status=1,menuBar=0,scrollBars=1,resizable=1' ); 
				newWindow.focus();
				return false;
			}
		}
	}
	
	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}$/;
		var phoneReg = /^([0-9+ ()-])+/;
		var handled = {};
		var checked = false;
		for ( var 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].type == 'textarea' || thisForm.elements[r].type == 'file' ) && 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;
				} else if ( thisForm.elements[r].type == 'radio' || thisForm.elements[r].type == 'checkbox' ) {
					if ( typeof handled[thisForm.elements[r].name] == 'undefined' ) {
						checked = false;
						if ( typeof thisForm[thisForm.elements[r].name].length == 'undefined' ) {
							checked = ( thisForm.elements[r].checked == true );
						} else {
							for ( var e = 0 ; e < thisForm[thisForm.elements[r].name].length ; e++ ) {
								if ( thisForm[thisForm.elements[r].name][e].checked == true ) {
									checked = true;
									break;
								}
							}
						}
						if ( !checked ) {
							alert(thisName+' is required before submitting the form');
							theReturn = false;
						}
						handled[thisForm.elements[r].name] = true;
					}
				}
			}
			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(' phone ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( !phoneReg.test(thisForm.elements[r].value) ) {
					alert(thisName + ' must be a valid phone number like "(555) 555-5555"');
					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;
				}
			}
			if ( thisClass.indexOf(' confirm ') > -1 && ( thisForm.elements[r].type == 'text' || thisForm.elements[r].type == 'password' ) && thisForm.elements[r].value.length > 0 ) {
				if ( r > 0 && thisForm.elements[r].value != thisForm.elements[r-1].value ) {
					alert(thisName + ' and ' + prevName + ' must have the same values');
					theReturn = false;
				}
			}
			prevName = thisName;
		}
		return theReturn;
	}
}

var theOnload = ( typeof window.onload == 'function' ) ? window.onload : function(){};
window.onload = function() {
	theOnload();
	init();
}; 


