smcAddEvent(window, "load", smcSetupVal, false) ;
var smcErrorText, matchFieldsDone, smcWhatForm ;
function smcSetupVal() {
	var valFields = smcGetElementsByClassName(document, "*", "validate") ;
	for (var i=0; i<valFields.length; i++) {
		var parentForm = smcClimbDom(valFields[i], "form") ;
		if (parentForm && !smcClassContains(parentForm, "requiresValidation")) {
			smcAddEvent (parentForm, "submit", smcValidateForm, false) ;
			smcAddClass(parentForm, "requiresValidation") ;
		}
	}
	// Set up handlers for matching validation
	var valLiveFields = smcGetElementsByClassName(document, "*", "live") ;
	for (var i=0; i<valLiveFields.length; i++) {
		smcAddEvent(valLiveFields[i], "change", smcValidateLive, false) ;
	}
}

function smcValidateLive(e) {
	var myTarget = smcGetTarget(e) ;
	if (!myTarget) {
		smcCancelEvent(e) ;
		return false ;
	}
	smcWhatForm = smcClimbDom(myTarget, "form") ;
	smcErrorText = "" ;
	matchFieldsDone = new Array() ;
	smcValidateField(myTarget) ;
}

function smcValidateForm(e) {
	smcErrorText = "" ;
	var myTarget = smcGetTarget(e) ;
	if (!myTarget) {
		smcCancelEvent(e) ;
		return false ;
	}
	smcWhatForm = smcClimbDom(myTarget, "form") ;
	var valFields = smcGetElementsByClassName(smcWhatForm, "*", "validate") ;
	matchFieldsDone = new Array() ;
	for (var i=0; i<valFields.length; i++) {
		smcValidateField(valFields[i], matchFieldsDone) ;
	}
	if (smcErrorText.length) {
		alert("Errors found:\n" + smcErrorText) ;
		smcCancelEvent(e) ;
		return false ;
	}
	else return true ;
}

function smcValidateField(myField) {
	var allClassNames = myField.className.split(" ") ;
	for (var j=0; j<allClassNames.length; j++) {
		if (allClassNames[j].indexOf("val-") != 0) continue ;
		// This is a validation rule
		var validationRule = allClassNames[j].substring(4) ;
		// Debug: alert("Testing " + validationRule) ;
		if (validationRule.indexOf("match") == 0) {
			valMatchSuffix = validationRule.substring(5) ;
			validationRule = "match" ;
		}
		else if (validationRule.indexOf("minlength") == 0) {
			valMinLen = parseInt(validationRule.substring(9)) ;
			validationRule = "minlength" ;
		}
		switch (validationRule) {
			case "nonblank" :
				if (myField.options) {
					if (myField.options[myField.selectedIndex].value.length == 0) {
						smcAddError(myField, j) ;
					}
					else smcValidatedOK(myField) ;
				}
				else if (myField.value.length == 0) {
					smcAddError(myField, j) ;
				}
				else smcValidatedOK(myField) ;
			break ;
			case "minlength" :
				if (myField.value.length < valMinLen) {
					smcAddError(myField, j) ;
				}
				else smcValidatedOK(myField) ;
			break ;
			case "nonzero" :
				if (myField.value== 0) {
					smcAddError(myField, j) ;
				}
				else smcValidatedOK(myField) ;
			break ;
			case "email" :
				var str = myField.value ;
				var at="@" ;
				var dot="." ; 
				var lat=str.indexOf(at) ; 
				var lstr=str.length ;
				var ldot=str.indexOf(dot) ;
				if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr || str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr || str.indexOf(at,(lat+1))!=-1 || str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot || str.indexOf(dot,(lat+2))==-1 || str.indexOf(" ")!=-1 ) {
					smcAddError(myField, j) ;
				}
				else smcValidatedOK(myField) ;
			break ;
			case "checked" :
				if (!myField.checked) {
					smcAddError(myField, j) ;
				}
				else smcValidatedOK(myField) ;
			break ;
			case "radioselected" :
				var radioChecked = false ;
				var childRadios = myField.getElementsByTagName("input") ;
					for (var k=0; k<childRadios.length; k++) {
						if (childRadios[k].checked) radioChecked = true ;
					}
				if (!radioChecked) smcAddError(myField, j) ;
				else smcValidatedOK(myField) ;
			break ;
			case "match" :
				for (var mfd=0; mfd<matchFieldsDone.length; mfd++) {
					if (matchFieldsDone[mfd] == valMatchSuffix) {
						return false ;
					}
				}
				// Find all other fields with the className "val-match..."
				var matchFields = smcGetElementsByClassName(smcWhatForm, "*", allClassNames[j]) ;
				var matchVal = matchFields[0].value ;
				for (var mfi=1; mfi<matchFields.length; mfi++) {
					if (matchFields[mfi].value != matchVal) {
						smcAddError(myField, j) ;
					}
					else smcValidatedOK(myField) ;
				}
				// Record in Array
				matchFieldsDone[matchFieldsDone.length] = valMatchSuffix ;
			break ;
			default :
				continue ;
			break ;
		}
	}
}

function smcAddError(myField,pos) {
	var errorMsg = myField.title.split("|")[pos-1] ;
	if (smcErrorText.indexOf(errorMsg + "\n") == -1) {
		smcErrorText += " - " + errorMsg + "\n" ;
	}
	smcStripClass(myField.parentNode, "valid") ;
	smcAddClass(myField.parentNode, "invalid") ;
}

function smcValidatedOK(myField) {
	smcStripClass(myField.parentNode, "invalid") ;
	smcAddClass(myField.parentNode, "valid") ;
}

function smcCancelEvent(e) {
	// Cross-browser cancel event
	if (e && e.preventDefault) e.preventDefault(); // DOM style
	else return false; // IE style ;
}