username_check = new RegExp( "[^a-zA-Z0-9\_]" );
email_check = new RegExp( "[^a-zA-Z0-9\100\.\_\-]" );
alpha_check = new RegExp( "[^a-zA-Z\.\,\ ]" );
numeric_check = new RegExp( "[^0-9\.\,\-]" );
integer_check = new RegExp( "[^0-9\,]" );
integerNoComma_check = new RegExp( "[^0-9]" );
date_check = new RegExp( "[^0-9]" );

var validate_array = Array();

function validate( name_string, field_string, type_string )
{
	if( type_string.indexOf( "," ) > 0 )
	{
		end = type_string.indexOf( "," );
		temp_type_string = type_string;
		
		while( temp_type_string.indexOf( "," ) > 0 )
		{
			validate_array[validate_array.length] = { name:name_string, field:field_string, type:temp_type_string.slice( 0, end ) };
			temp_type_string = temp_type_string.slice( end + 1, temp_type_string.length );
			end = temp_type_string.indexOf( "," );
		}
		validate_array[validate_array.length] = { name:name_string, field:field_string, type:temp_type_string };
	}
	else
	{
		validate_array[validate_array.length] = { name:name_string, field:field_string, type:type_string };
	}
}

function submit_validate( form_string, confirm_string )
{
	var submit_prompt = false;
	var form_error = false;
	var field_error = false;
	
	switch( arguments.length )
	{
		case 0:
			alert( "Please pass the validator a form name" );
			form_error = true;
			break;
		case 1:
			break;
		case 2:
			submit_prompt = true;
			break;
		default:
			alert( "Function submit_validate() was passed too many (" + arguments.length + ") arguments" );
			break;
	}
	
	if( typeof document.forms[form_string] == "undefined" && !form_error )
	{
		alert( "Form " + form_string + " does not exist" );
		form_error = true;
	}
	
	if( !form_error )
	{
		for( var i=0; i < validate_array.length; i++ )
		{
			if( typeof document.forms[form_string].elements[validate_array[i]['field']] == "undefined" )
			{
				alert( "Field " + validate_array[i]['field'] + " does not exist" );
				field_error = true;
			}
		}
	}
	
	if( !field_error && !form_error )
	{
		for( var i = 0; i < validate_array.length; i++ )
		{
			switch( validate_array[i]['type'] )
			{
				case 'email':
					if( email( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'username':
					if( username( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'alpha':
					if( alpha( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'numeric':
					if( numeric( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'integer':
					if( integer( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'integerNoComma':
					if( integerNoComma( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;											
				case 'date':
					if( date( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'required':
					if( required( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;
				case 'compldate':
					if( compldate( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					if( date( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
					break;				
				case 'none':
					break;
				default:
					alert( validate_array[i]['type'] + " is not a supported validation type." );
					break;
			}
		}
		if( submit_prompt )
			return confirm( confirm_string );
		else
			return true;
	}
	else
	{
		return false;
	}
}

function required( field_string, name_string, form_string )
{
	if( typeof document.forms[form_string].elements[field_string].length == "undefined" )
	{
		if( document.forms[form_string].elements[field_string].value.length == 0 )
		{
			document.forms[form_string].elements[field_string].focus();
			alert( name_string + " is required" );
			return true;
		}
		else return false;
	}
	else
	{
		if( document.forms[form_string].elements[field_string][0].type == "checkbox" ||
			document.forms[form_string].elements[field_string][0].type == "radio" )
		{
			array_size = document.forms[form_string].elements[field_string].length;
			for( var i=0; i < array_size; i++ )
			{
				if( document.forms[form_string].elements[field_string][i].checked )
				{
					return false;
				}
			}
			document.forms[form_string].elements[field_string][0].focus();
			alert( name_string + " is required" );
			return true;
		}
		else if( document.forms[form_string].elements[field_string].type == "select-one" )
		{
			if( document.forms[form_string].elements[field_string][document.forms[form_string].elements[field_string].selectedIndex].value.length == 0 )
			{
				document.forms[form_string].elements[field_string].focus();
				alert( name_string + " is required" );
				return true;
			}
			else return false;
		}
	}
}

function email( field_string, name_string, form_string )
{
	var valid_email = true;

	if( email_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " contains invalid characters" );
		return true;
	}
	else if( document.forms[form_string].elements[field_string].value.indexOf( "@" ) < 1
			|| document.forms[form_string].elements[field_string].value.indexOf( "." ) < 1 )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " is not a valid address" );
		return true;
	}
	else return false;
}

function username( field_string, name_string, form_string )
{
	if( username_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " may only contain alphanumeric and underscore characters" );
		return true;
	}
	else return false;
}

function alpha( field_string, name_string, form_string )
{
	if( alpha_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " may only contain text characters" );
		return true;
	}
	else return false;
}

function TwoDots(S) { return /\..*\./.test(S) }

function numeric( field_string, name_string, form_string )
{
	var testMe=document.forms[form_string].elements[field_string].value;
	if( numeric_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " may only contain numeric characters" );
		return true;
	}
	else if ( TwoDots( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " is invalid and must be numeric" );
		return true;
	}
	else if ( document.forms[form_string].elements[field_string].value.indexOf('.') == 0 && document.forms[form_string].elements[field_string].value.length == 1)
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot begin with a period" );
		return true;
	}		
	else if ( document.forms[form_string].elements[field_string].value.indexOf(',') == 0 )
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot begin with a comma" );
		return true;
	}
	else if ( document.forms[form_string].elements[field_string].value.indexOf(',')>0 && document.forms[form_string].elements[field_string].value.indexOf(',')+1 == document.forms[form_string].elements[field_string].value.length )
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot end with a comma" );
		return true;
	}			
	else return false;
}

function integer( field_string, name_string, form_string )
{
	if( integer_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " may only contain numeric characters" );
		return true;
	}
	else if( document.forms[form_string].elements[field_string].value > 2147483647 )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " is not valid" );
		return true;
	}
	else if ( TwoDots( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " is invalid and must be numeric" );
		return true;
	}
	else if ( document.forms[form_string].elements[field_string].value.indexOf('.') == 0 && document.forms[form_string].elements[field_string].value.length == 1)
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot begin with a period" );
		return true;
	}			
	else if ( document.forms[form_string].elements[field_string].value.indexOf(',') == 0 )
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot begin with a comma" );
		return true;
	}
	else if ( document.forms[form_string].elements[field_string].value.indexOf(',')>0 && document.forms[form_string].elements[field_string].value.indexOf(',')+1 == document.forms[form_string].elements[field_string].value.length )
	{	
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " cannot end with a comma" );
		return true;
	}		
	else return false;
}

function integerNoComma( field_string, name_string, form_string )
{
	if( integerNoComma_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " may only contain numeric characters" );
		return true;
	}
	else if( document.forms[form_string].elements[field_string].value > 2147483647 )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " is not valid" );
		return true;
	}
	else return false;
}

function compldate( field_string, name_string, form_string )
{
	if( getCheckedValue(document.forms[form_string].elements['undconst']) > 0 )
	{
		if( document.forms[form_string].elements[field_string].value.length == 0 )
		{
			document.forms[form_string].elements[field_string].focus();
			alert( name_string + " is required" );
			return true;
		}
		else return false;	
	}
}

function date( field_string, name_string, form_string )
{
	if( !Date.parse( document.forms[form_string].elements[field_string].value ) )
	{
		if( document.forms[form_string].elements[field_string].value.length )
		{
			document.forms[form_string].elements[field_string].select();
			alert( name_string + " must be formatted like this: MM-DD-YYYY" );
			return true;
		}
		else
		{
			return false;
		}
	}
	else if( !check_format( document.forms[form_string].elements[field_string].value ) && document.forms[form_string].elements[field_string].value.length > 0 )
	{
		document.forms[form_string].elements[field_string].select();
		alert( name_string + " does not contain a valid date." );
		return true;
	}
	else
	{
		return false;
	}
}

function check_format( date_string )
{
	if( date_string.indexOf( "-" ) )
	{
		date_string = date_string.replace( /\-/g, "/" );
	}
	
	end = date_string.indexOf( "/" );
	month = date_string.slice( 0, end );
	
	start = end + 1;
	end = date_string.indexOf( "/", start );
	day = date_string.slice( start, end );
	
	start = end;
	end = date_string.length;
	year = date_string.slice( start + 1, end );
	
	if( year < 100 )
	{
		year = Number( year ) + 2000;
	}
	
	if( date_check.test( year ) )
	{
		return false;
	}
	else if( year < 1 || year > 9999 )
	{
		return false;
	}
	else if( date_check.test( month ) )
	{
		return false;
	}
	else if( month < 1 || month > 12 )
	{
		return false;
	}
	else if( date_check.test( day ) )
	{
		return false;
	}
	
	var max_day = 31;

	if ( month == 4 || month == 6 || month == 9 || month == 11 )
	{
		max_day = 30;
	}
	else if ( month == 2 )
	{
		if ( year % 4 > 0 )
		{
			max_day = 28;
		}
		else if ( year % 100 == 0 && year % 400 > 0)
		{
			max_day = 28;
		}
		else
		{
			max_day = 29;
		}
	}
	
	if( day < 1 || day > max_day )
	{
		return false;
	}
	else
	{
		return true;
	}
}

function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

function comma_inserter( target )
{
	comma_check = new RegExp( "[\,+]", "g" );
	if( !isNaN( target.value.replace( comma_check, "" ) ) )
	{
		temp_string = "";
		target_string = target.value.replace( comma_check, "" );
		loop_index = 0;
		if( target.value.indexOf( "." ) > 0 )
		{
			decimal_string = target_string.slice( target_string.indexOf( "." ), target_string.length );
			target_string = target_string.slice( 0, target_string.indexOf( "." ) );
		}
		for( var i = target_string.length - 1; i >= 0; i-- )
		{
			if( loop_index % 3 == 0 && loop_index != 0 )
			{
				temp_string = "," + temp_string;
			}
			temp_string = target_string.charAt( i ) + temp_string;
			loop_index++;
		}
		if( target.value.indexOf( "." ) > 0 )
		{
			temp_string = temp_string + decimal_string;
		}
		target.value = temp_string;
	}
}

