// Validation.js
// 04/12/2006
// John Fortman, john@dataexperts.net
//
//	Field Tests:
//		Empty: 			/[\w\W]+/
//		Email Address:	/[\w\d]+@[\w\d]+.[\w\d]+/
//		Phone Number:	/\D/,""
//		SSN:
//	
//		string.match( regexp )
//		string.replace( regexp, "replace text" )

	var fields;
	var types;

	function getID( fieldname ) {
		var field = null;
		if( document.getElementById ) {	// Standard DOM
			field = document.getElementById( fieldname );
		} else if( document.all ) {		// Pre-Standard IE 4
			field = document.all[ fieldname ];
		} else if( document.layers ) {	// Pre-Standard NS 4
			field = document.layers[ fieldname ];
		}
		return field;
	}
	
	function clear_all_fields() {
		var i;
		var field, field1;
	
		for( i = 0; i < fields.length; i++ ) {
			if( types[ i ] == "C" ) {
				field = getID( fields[ i ] + "_y" );
				field1 = getID( fields[ i ] + "_n" );
				if( field && field1 ) {
					field.checked = false;
					field1.checked = false;
				}
			} else {
				field = getID( fields[ i ] );
				if( field ) {
					if( field.value.match( /[\w\W]+/ )) alert( field.value );
					field.value = "";
				}
			}
		}
	}
	
	function activate_types( flist, tlist, activate ) {
		var i, j;
		//alert( flist[ 0 ] + " " + tlist.join() );
		for( j = 0; j < fields.length; j++ ) {
			for( i = 0; i < flist.length; i++ ) {
				if( flist[ i ] == fields[ j ] ) {
					if( activate ) {
						//alert( flist[ i ] + " == " + fields[ j ] + " -> " + tlist[ i ] );
						types[ j ] = tlist[ i ];
					} else {
						//alert( flist[ i ] + " == " + fields[ j ] + " -> ? (" + tlist[ i ] + ")" );
						types[ j ] = "?";
					}
				}
			}
		}
	}
	
	function copy_values( from, to ) {
		var i;
		var field, field1;

		for( i = 0; i < from.length; i++ ) {
			field = getID( to[ i ] );
			field1 = getID( from[ i ] );
			if( field && field1 ) {
				field.value = field1.value;
			}
		}
	}

	function empty( field ) {
		if( !field.value.match( /^[\w\W]+$/ )) {
			return true;
		}
		return false;
	}

	function require( field ) {
		if( empty( field )) {
			alert( "This is a required field: " + field.name );
			field.focus();
			return false;
		}
		return true;
	}
	
	function selection( field ) {
		//alert( field.name + " = " + field.value );
		if( ( field.value == "--" ) || 
		    ( field.value == "0:00" ) ||
		    ( field.value == "0" ) ||
		    ( !field.value.match( /[\w\W]+/ ))
		) {
			alert( "Please select a value: " + field.name );
			field.focus();
			return false;
		}
		return true;
	}
	
	function choice( field1,field2,req ) {
		if( field1.checked || field2.checked ) {
			return true;
		} else if( req ) {
			alert( "This is a required field: " + field1.name + " or " + field2.name );
			field1.focus();
		}
		return false;
	}

	function currency( field, req ) {
		if( !empty( field )) {
			if( field.value.match( /^-?[\d]+\.?[\d]*$/ )) {
				return true;
			}
			alert( "Invalid numerical value: " + field.name );
			field.focus();
		} else if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}
	
	function valid_date( field, req ) {
		if( !empty( field )) {
			if( field.value.match( /^\d\d?.\d\d?.\d\d\d\d$/ )) {
				return true;
			}
			alert( "Valid date format is: MM/DD/YYYY" );
			field.focus();
		} else if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}

	function ssn( field, req ) {
		if( !empty( field )) {
			field.value = field.value.replace( /\D/g,"" );
			if( field.value.match( /^\d{3}\d{2}\d{4}$/ )) {
				field.value = field.value.substr( 0,3 ) + "-" + 
					field.value.substr( 3,2 ) + "-" +
					field.value.substr( 5,4 );
					return true;
			}
			alert( "Invalid Social Security Number: " + field.name );
			field.focus();
		} else if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}

	function zip( field, req ) {
		if( !empty( field )) {
			field.value = field.value.replace( /\D/g,"" );
			if( field.value.match( /^\d{5}\d{4}$/ )) {
				field.value = field.value.substr( 0,5 ) + "-" + field.value.substr( 5,4 );
				return true;
			} else if( field.value.match( /^\d{5}$/ )) {
				return true;
			}
			alert( "Invalid zip code: " + field.name );
			field.focus();
		} else if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}

	function phone( field, req ) {
		if( !empty( field )) {
			field.value = field.value.replace( /\D/g,"" );
			if( field.value.substr( 0,1 ) == "1" ) {
				field.value = field.value.substr( 1 );
			}
			if( field.value.length == 10 ) {
				field.value = "(" + field.value.substr( 0,3 ) + ") " + 
					field.value.substr( 3,3 ) + "-" +
					field.value.substr( 6,4 );
					return true;
			}
			if( field.value.length == 7 ) {
				alert( "Please include an area code." );
			} else {
				alert( "Invalid Phone Number: " + field.name );
			}
			field.focus();
		} if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}

	function email( field, req ) {
		if( !empty( field )) {
			if( field.value.match( /^[\w\d]+@[\w\d]+.[\w]+$/ )) {
				return true;
			} 
			alert( "Invalid Email Address: " + field.name );
			field.focus();
		} else if( req ) {
			alert( "This is a required field: " + field.name );
			field.focus();
		}
		return false;
	}
		
	function validate() {
		var i;
		var id;
		var type;
		var field, field1;
		for( i = 0; i < fields.length; i++ ) {
			id = fields[ i ];
			type = types[ i ];

			if( type == "C" ) {
				field = getID( fields[ i ] + "_y" );
				field1 = getID( fields[ i ] + "_n" );
			} else if( type != "?" ) {
				field = getID( fields[ i ] );
			} else {
				field = null;
			}

			if( field || type == "?" ) {
				if(( type == "T" ) && !require( field )) {
					return false;
				} else if(( type == "E" ) && !email( field,true )) {
					return false;
				} else if(( type == "S" ) && !selection( field )) {
					return false;
				} else if(( type == "Z" ) && !zip( field,true )) {
					return false;
				} else if(( type == "P" ) && !phone( field,true )) {
					return false;
				} else if(( type == "N" ) && !ssn( field,true )) {
					return false;
				} else if(( type == "C" ) && !choice( field,field1,true )) {
					return false;
				} else if(( type == "A" ) && !currency( field,true )) {
					return false;
				} else if(( type == "D" ) && !valid_date( field,true )) {
					return false;
				}
				// if( type == "?" ) do not return an error!
			} else {
				alert( "Unknown field " + fields[ i ] );
				return false;
			}
		}
		return true;
	}

