// vc_id = "$Id: validation.js 12544 2009-04-23 22:57:39Z jgiven $"
var username_check = new RegExp( "[^a-zA-Z0-9\_]" );
var email_check = new RegExp( "[^a-zA-Z0-9\100\+\.\_\-]" );
var alpha_check = new RegExp( "[^a-zA-Z\.\,\ ]" );
var numeric_check = new RegExp( "[^0-9\.\,]" );
var areanumber_check = new RegExp( "[^0-9\.\,\-]" );
var date_check = new RegExp( "[^0-9]" );
var word_check = /[0-9a-zA-Z]/;

if( typeof validate_array == "undefined" ){ var validate_array = Array(); }
if( typeof minMax_array == "undefined" ){ var minMax_array = Array(); }


function checkSub(){
	return(confirm("Are you sure? Click OK to continue or CANCEL to go back."))
}


function clearValidate(startNumber) {
	//for( var i=0; i < validate_array.length; i++ ) {
		//alert(validate_array[i]['field']);
		//alert(validate_array.splice(1));
		validate_array.splice(startNumber,validate_array.length)
	//}
}

function validate( name_string, field_string, type_string, form_string )
{
	if( type_string.indexOf( "," ) > 0 )
	{
		end = type_string.indexOf( "," );
		temp_type_string = type_string;
		
		while( temp_type_string.indexOf( "," ) > 0 )
		{
			if( arguments.length == 4 )
				validate_array[validate_array.length] = { name:name_string, field:field_string, type:temp_type_string.slice( 0, end ), form:form_string };
			else
				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( "," );
		}
		if( arguments.length == 4 )
			validate_array[validate_array.length] = { name:name_string, field:field_string, type:temp_type_string, form:form_string };
		else
			validate_array[validate_array.length] = { name:name_string, field:field_string, type:temp_type_string };
	}
	else
	{
		if( arguments.length == 4 )
			validate_array[validate_array.length] = { name:name_string, field:field_string, type:type_string, form:form_string };
		else
			validate_array[validate_array.length] = { name:name_string, field:field_string, type:type_string };
	}
}

function minMax( name_string1, field_string1, name_string2, field_string2, type_string )
{
	if( type_string.indexOf( "," ) > 0 )
	{
		end = type_string.indexOf( "," );
		temp_type_string = type_string;
		
		while( temp_type_string.indexOf( "," ) > 0 )
		{
			minMax_array[minMax_array.length] = { name:name_string1, field:field_string1, name:name_string2, field:field_string2, 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( "," );
		}
		minMax_array[minMax_array.length] = { name1:name_string1, field1:field_string1, name2:name_string2, field2:field_string2, type:temp_type_string };
	}
	else
	{
		minMax_array[minMax_array.length] = { name1:name_string1, field1:field_string1, name2:name_string2, field2:field_string2, type:type_string };
	}
}

function greaterThan(  name_string1, field_string1, name_string2, field_string2, form_string )
{	
	if(document.forms[form_string].elements[field_string2].value > 0)
	{
		if( new Number(document.forms[form_string].elements[field_string1].value) > new Number(document.forms[form_string].elements[field_string2].value))
		{
			alert( name_string1 + " must be less than " + name_string2 );
			document.forms[form_string].elements[field_string1].focus();
			return true;
		}
		else return false;
	}
}

function submit_validate( form_string, confirm_string )
{
	var confirm_submit = false;
	var form_error = false;
	var field_error = false;
	
	switch( arguments.length )
	{
		case 0:
			form_string = document.forms[0].name;
			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++ )
		{
			var check_element = true;
			if( typeof validate_array[i]['form'] != "undefined" )
			{
				if( validate_array[i]['form'] != form_string )
					check_element = false;
			}

			if( typeof document.forms[form_string].elements[validate_array[i]['field']] == "undefined"
				&& check_element )
			{
				alert( "Field " + validate_array[i]['field'] + " does not exist" );
				field_error = true;
			}
		}
	}
	
	if( !field_error && !form_error )
	{
		for( var i = 0; i < minMax_array.length; i++ )
		{
			var check_element = true;
			if( typeof minMax_array[i]['form'] != "undefined" )
			{
				if( minMax_array[i]['form'] != form_string )
					check_element = false;
			}
			
			if( check_element )
			{
				switch( minMax_array[i]['type'] )
				{
					case 'greaterThan':
						if( greaterThan( minMax_array[i]['name1'], minMax_array[i]['field1'], minMax_array[i]['name2'], minMax_array[i]['field2'], form_string ) ) return false;
						break;
					case 'none':
						break;
					default:
						alert( minMax_array[i]['type'] + " is not a supported validation type." );
						break;
				}
			}
		}	
	}
	if( !field_error && !form_error )
	{
		for( var i = 0; i < validate_array.length; i++ )
		{
			var check_element = true;
			if( typeof validate_array[i]['form'] != "undefined" )
			{
				if( validate_array[i]['form'] != form_string )
					check_element = false;
			}
			
			if( check_element )
			{
				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 'word':
						if( word( validate_array[i]['field'], validate_array[i]['name'], form_string ) ) return false;
						break;
					case 'cc':
						if( credit_card( 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 'singleNumeric':
						if( singleNumeric( 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 'areanumber':
						if( areanumber( 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 'none':
						break;
					default:
						alert( validate_array[i]['type'] + " is not a supported validation type." );
						break;
				}
			}
		}
	}
	else
	{
		return false;
	}
	
	if( confirm_submit )
		return confirm( confirm_string );
	else
		return true;
}

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 )
		{
			alert( name_string + " is required, please enter a value to continue." );
			document.forms[form_string].elements[field_string].select();
			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;
				}
			}
			alert( name_string + " is required, please click on a value to continue." );
			document.forms[form_string].elements[field_string][0].focus();
			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 )
			{
				alert( name_string + " is required, please select a value to continue." );
				document.forms[form_string].elements[field_string].focus();
				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 ) )
	{
		alert( name_string + " contains invalid characters." );
		document.forms[form_string].elements[field_string].select();
		return true;
	}
	else if( document.forms[form_string].elements[field_string].value.indexOf( "@" ) < 1
			|| document.forms[form_string].elements[field_string].value.indexOf( "." ) < 1 )
	{
		alert( name_string + " is not a valid address." );
		document.forms[form_string].elements[field_string].select();
		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 ) )
	{
		alert( name_string + " may only contain alphanumeric and underscore characters." );
		document.forms[form_string].elements[field_string].select();
		return true;
	}
	else return false;
}

function word( field_string, name_string, form_string )
{
        var rcode = true;
	if( word_check.test( document.forms[form_string].elements[field_string].value ) ) {
		rcode = false;
	} else {
	    alert( name_string + " must contain at least one letter or number." );
	    document.forms[form_string].elements[field_string].select();	
	}
	return rcode;
}

function credit_card( field_string, name_string, form_string )
{
	var valid_card = true;
	if( document.forms[form_string].elements[field_string].value.length )
	{
		if( document.forms[form_string].elements[field_string].value.slice( 0, 1 ) == "3" )
		{
			if( document.forms[form_string].elements[field_string].value.length != 14 && document.forms[form_string].elements[field_string].value.length != 15 && document.forms[form_string].elements[field_string].value.length != 16 )
				valid_card = false;
		}
		else if( document.forms[form_string].elements[field_string].value.slice( 0, 1 ) == "4" )
		{
			if( document.forms[form_string].elements[field_string].value.length != 13 && document.forms[form_string].elements[field_string].value.length != 16 )
				valid_card = false;
		}
		else if( document.forms[form_string].elements[field_string].value.slice( 0, 1 ) == "5" )
		{
			if( document.forms[form_string].elements[field_string].value.length != 16 )
				valid_card = false;
		}
		else if( document.forms[form_string].elements[field_string].value.slice( 0, 4 ) == "6011" )
		{
			if( document.forms[form_string].elements[field_string].value.length != 14 && document.forms[form_string].elements[field_string].value.length != 16 )
				valid_card = false;
		}
	}
		
	if( valid_card )
		return false;
	else
	{
		alert( name_string + " is not valid." );
		document.forms[form_string].elements[field_string].select();
		return true;
	}
}

function alpha( field_string, name_string, form_string )
{
	if( alpha_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		alert( name_string + " may only contain text characters." );
		document.forms[form_string].elements[field_string].focus();
		document.forms[form_string].elements[field_string].select();
		return true;
	}
	else return false;
}

function numeric( field_string, name_string, form_string )
{
	if( numeric_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		alert( name_string + " can only contain numeric characters separated by a comma without spaces." );
		document.forms[form_string].elements[field_string].focus();
		document.forms[form_string].elements[field_string].select();
		return true;
	}
	else return false;
}

function singleNumeric( field_string, name_string, form_string )
{
	if( numeric_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		alert( name_string + " can only contain numeric characters." );
		document.forms[form_string].elements[field_string].focus();
		document.forms[form_string].elements[field_string].select();
		return true;
	}
	else return false;
}

function areanumber( field_string, name_string, form_string )
{
	if( areanumber_check.test( document.forms[form_string].elements[field_string].value ) )
	{
		alert( name_string + " can only contain numeric characters separated by a comma or a dash without spaces." );
		document.forms[form_string].elements[field_string].select();
		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 )
		{
			alert( name_string + " must be formatted like this: MM/DD/YYYY." );
			document.forms[form_string].elements[field_string].select();
			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 )
	{
		alert( name_string + " does not contain a valid date." );
		document.forms[form_string].elements[field_string].select();
		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 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;
	}
}

