
// this part defines the object
function makeVerifyObject(fname,input_type,header,required,max_length,min_length,data_match_fields,data_match_value,data_type,required_value,required_value_operand,error_message)
{
	this.fname = fname;
	this.input_type = input_type;
	this.data_type = data_type;
	this.header = header;
	this.required = required;
	this.max_length = max_length;
	this.min_length = min_length;
	this.data_match_fields = data_match_fields;
	this.data_match_value = data_match_value;
	this.required_value = required_value;
	this.required_value_operand = required_value_operand;
	this.error_message = error_message;

	return(this);
}

function isArray()
{
  if (typeof arguments[0] == 'object')
  {  
    var criterion = arguments[0].constructor.toString().match(/array/i);
    alert( arguments[0].constructor.toString() );
   if(criterion != null){return true;}  
  }
  return false;
}
function get_field_value(inForm,fieldName,inputType){

	
	formField = inForm[fieldName];
	
	if(formField[0] && formField[0].name){	
		formField =formField[0];
	}
	var elName = formField.name;
	var elType = formField.type;
	var elValue = '';
	
//		alert (elName+' '+elType+' '+fieldName);

//	isArray(formField);
	
	
	if(inputType == 'radio_group'){
		for(var inCnt=0;inCnt < formField.length; inCnt++){
			if(formField[inCnt].checked){
				elValue = formField[inCnt].value;
			}
		}
	}else if(inputType == 'checkbox'){
		if(formField.checked){elValue = formField.value;}
	}else if(inputType == 'popup_menu' || elType == 'select-one'){
		if ((formField.options.selectedIndex) != -1)
		{


			elValue = formField.options[formField.options.selectedIndex].value;
		}
		else
		{
			elValue ="none";

			return elValue;
		}
	}else{

			elValue = formField.value;

	}

//alert(elValue);

	return elValue;
}



function verify_form(inForm,verify){

	var cc_num, cc_type,valueCheckMessage,requiredValueMessage;
	cc_num = '';
	cc_type='';

	for(verifyCnt=0;verifyCnt< verify.length; verifyCnt++)
	{
		var thisField = verify[verifyCnt];

		var data_field = get_field_value(inForm,thisField.fname,thisField.input_type); // get value from form
// alert(thisField.fname+' '+data_field+' '+verifyCnt+' '+thisField.required);
		if (data_field == 'none')
		{

			var err_msg = thisField.error_message || thisField.header + " field is required";
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}

		if(thisField.input_type == 'cc_type'){cc_type = data_field;}
		if(thisField.input_type == 'cc_num'){cc_num = data_field;}

		inputValues = new Array(data_field);
//		inputValues = data_field;


// used for making list of all failed fields
//		userFieldAlreadyChecked[thisField.name] = 1;
//		if(alreadyPushed[thisField.name] != 1){alreadyPushed[thisField.name] = 0;}

		for(var iVcnt=0;iVcnt < inputValues.length;iVcnt++)
		{
		formValue = inputValues[iVcnt];
//		alert(formValue);
		var dataMatchData = new Array();
		var dataMatchFields = new Array();
		var dataMatchFields = thisField.data_match_fields;
		var dataMatchData = thisField.data_match_value;

		var dataType = thisField.data_type;
		var valueCheck = thisField.required_value_operand;
		var requiredValue = thisField.required_value;
		var requiredValueMessage = requiredValue;

		if(valueCheck == '=~'){valueCheckMessage = "must contain";}
		else if(valueCheck == '!~'){valueCheckMessage = "must not contain";}
		else if(valueCheck == '>'){valueCheckMessage = "must be greater than";}
		else if(valueCheck == '>='){valueCheckMessage = "must be greater than or equal to";}
		else if(valueCheck == '<'){valueCheckMessage = "must be less than";}
		else if(valueCheck == '<='){valueCheckMessage = "must be less than or equal to";}
		else if(valueCheck == '='){valueCheckMessage = "must equal";}
		else if(valueCheck == '!='){valueCheckMessage = "must not equal";}

		if(requiredValue == '\w'){requiredValueMessage = "alphanumeric values including _";}
		else if(requiredValue == '\W'){requiredValueMessage = "non-alphanumeric values (e.g. \!\@\#\$\%\^\&\* and spaces)";}
		else if(requiredValue == '\s'){requiredValueMessage = "spaces";}
		else if(requiredValue == '\S'){requiredValueMessage = "non-space values";}
		else if(requiredValue == '\d'){requiredValueMessage = "numeric values";}
		else if(requiredValue == '\D'){requiredValueMessage = "non-numeric values";}
//		if(!(requiredValue.match(/^\\/))){requiredValueMessage = requiredValue;}


		var valueCheckPass = 0;
		if(valueCheck == ''){valueCheckPass = 1;}

		if(formValue == "" && thisField.required == 1)
		{
			var err_msg = thisField.error_message || thisField.header + " field is required";
			var fieldname = thisField.fname;
			if(thisField.input_type != 'radio_group'){
				 inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			}
			return(err_msg);
		}

		if(formValue != '' && formValue != 'undefined')
		{

		if(formValue.length > thisField.max_length	&& thisField.max_length > 0)
		{
// used for creating a list of failed fields... not necessary on client-side
//			push(@{$self->{failedFields}}, $userField) unless $self->{alreadyPushed}->{$userField};
//			$self->{alreadyPushed}->{$userField} = 1;
			var err_msg = thisField.error_message || thisField.header + " field exceeded maximum length of " +	thisField.max_length;
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}
		if(formValue.length < thisField.min_length)
		{
			var err_msg = thisField.error_message || thisField.header + " field did not meet minimum required length of " +	thisField.min_length;
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}

		if(formValue.match(/[^0-9.]+/) && dataType == 'number')
		{
			var err_msg = thisField.error_message || thisField.header + " field must be a numeric value ";
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}
		if(!(formValue.match(/(1[012]|[1-9])(\/|-)(([012][0-9]|3[01])|[0-9])(\/|-)([0-9][0-9][0-9][0-9]|[0-9][0-9])/))
			&& dataType == 'date')
		{
			var err_msg = thisField.error_message || thisField.header + " field must be in a valid date format";
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}
		}

		if(dataType == 'date' && valueCheck != '')
		{
			// used checking for a data > or < (or whatever) requiredValue
			// take date format of form and requiredValue
			// convert both to numbers, and put in YYYYMMDD format
			// then do numerical analysis <> etc
/*
			my $datetime = localtime(time);
			my ($sys_wday,$sys_mon,$sys_day,$sys_time,$sys_year) = split(/\s/, $datetime);
			my ($month, $day, $year);


			requiredValue =~ s/-/\//g;
			($month, $day, $year) = split(/\//, requiredValue);
			$month = "0" . $month if (length($month) < 2);
			$day = "0" . $day if (length($day) < 2);
			$year = $sys_year if (length($year) < 3);
			requiredValue = $year . $month . $day;

			formValue =~ s/-/\//g;
    	    ($month, $day, $year) = split(/\//, formValue);
			$month = "0" . $month if (length($month) < 2);
			$day = "0" . $day if (length($day) < 2);
			$year = $sys_year if (length($year) < 3);
			formValue = $year . $month . $day;
*/
		}
		if((dataType == 'date' || dataType == 'number') && valueCheck != '')
		{
			formValue = parseInt(formValue);
			requiredValue = parseInt(requiredValue);
			if (valueCheck == ">")
			{if(formValue > requiredValue){valueCheckPass = 1;}}
			if (valueCheck == "<")
	    	{ if (formValue < requiredValue){valueCheckPass = 1;} }
			if (valueCheck == ">=")
			{ if (formValue >= requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "<=")
			{ if (formValue <= requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "!=")
			{ if (formValue != requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "=")
			{ if (formValue == requiredValue){valueCheckPass = 1;} }
		}
		else if(valueCheck != '')
		{
			if((valueCheck == "=~" || valueCheck == "!~") && requiredValue.length == 1){
				requiredValue = "\\" + requiredValue;
			}

			if (valueCheck == "=~")
			{if (eval('formValue.match(/'+requiredValue+'/g)')){valueCheckPass = 1;} }
			if (valueCheck == "!~")
			{ if (!(eval('formValue.match(/'+requiredValue+'/g)'))){valueCheckPass = 1;}}
			if (valueCheck == ">")
			{ if (formValue > requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "<")
	    	{ if (formValue < requiredValue){valueCheckPass = 1;} }
			if (valueCheck == ">=")
			{ if (formValue >= requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "<=")
			{ if (formValue <= requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "!=")
			{ if (formValue != requiredValue){valueCheckPass = 1;} }
			if (valueCheck == "=")
			{ if (formValue == requiredValue){valueCheckPass = 1;} }
		}

		if(valueCheckPass != 1 && valueCheck != '')
		{
			var err_msg = thisField.error_message || thisField.header + " field " + valueCheckMessage + " " + requiredValueMessage;
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}


		if(dataMatchFields.length > 0 || dataMatchData.length > 0)
		{

			var matchPassed = 0;
			var fieldData = formValue;
			var altFieldErrMsg = new Array();
			var altDataErrMsg = new Array();

			for(var dMCnt=0;dMCnt < dataMatchData.length; dMCnt++)
			{
				var dataMatch = dataMatchData[dMCnt];
				altDataErrMsg[altDataErrMsg.length] = "'" + dataMatch + "'"
			}
			for(var dFCnt=0;dFCnt < dataMatchFields.length;dFCnt++)
			{
				dataMatch = dataMatchFields[dFCnt];
				var dataMatchCnt = '';
				for(vCnt=0;vCnt< verify.length; vCnt++)
				{
					if(dataMatch == verify[vCnt].fname){dataMatchCnt = vCnt;}
				}
				dataMatchData[dataMatchData.length] = get_field_value(inForm,verify[dataMatchCnt].fname,thisField.input_type);
				altFieldErrMsg[altFieldErrMsg.length] = "the " + verify[dataMatchCnt].header + " field";
			}
			for(var dMCnt=0;dMCnt < dataMatchData.length; dMCnt++)
			{
				dataMatch = dataMatchData[dMCnt];
				if(dataMatch == fieldData){
					matchPassed += 1;
				}
			}
			if(!(matchPassed))
			{
				var alt_err_msg = thisField.header + " field ";
				if(altFieldErrMsg.length > 0){
					alt_err_msg += "must match " + altFieldErrMsg.join(" OR ");
				}
				if(altDataErrMsg.length > 0 && altFieldErrMsg.length > 0){
						alt_err_msg += " OR " ;
				}
				if(altDataErrMsg.length > 0){
					alt_err_msg += "must be the value " + altDataErrMsg.join(" OR ");
				}

				var err_msg = thisField.error_message || alt_err_msg;
				var fieldname = thisField.fname;
				inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
				return(err_msg);
			}
		}
		}
		inputValues = new Array();
	}


	if(cc_num != '')
	{
		var verified = isValidCreditCard(cc_num);
		if(verified == false)
		{
			var err_msg = thisField.error_message || "Invalid Credit Card: Please verify the credit card type and credit card numbers";
			var fieldname = thisField.fname;
			inForm[fieldname][0] && inForm[fieldname][0].name  ? eval("inForm."+fieldname+"[0].focus()") : eval("inForm."+fieldname+".focus()");
			return(err_msg);
		}
	}

	return(0);
}

function typeOfCard(number) {
        /*
        //      Card Prefixes
        //
        //      Mastercard      51-55
        //      Visa            4
        //      AmEx            34,37
        //      Discover        6011
        */

        var firstNumber = number.substring(0,1);
        var firstThreeNumbers = number.substring(0,3);

        if (firstNumber == 4) {
                return "VISA";
        }

        var firstTwoNumbers = number.substring(0,2);
        if (firstTwoNumbers > 50 && firstTwoNumbers < 56) {
                return "MASTERCARD";
        }

        if (firstTwoNumbers == 34 || firstTwoNumbers == 37) {
                return "AMEX";
        }

        var firstFourNumbers = number.substring(0,4);
        if (firstFourNumbers == 6011) {
                return "DISCOVER";
        }
}

// Function that determines whether a credit card number is valid
// Please note that a valid credit card number is not essentially a
// credit card in good standing.

function isValidCreditCard(number) {

        var total = 0;
        var flag = 0;
        for (var i=(number.length - 1);i>=0; i--) {
                if (flag == 1) {
                        var digits = number.charAt(i) * 2;
                        if (digits > 9) digits -= 9;
                        total += digits;
//                      var reminder = digits % 10;
//                      var quotient = (digits - reminder) / 10;
//                      total = total + parseInt(reminder);
//                      total = total + parseInt(quotient);
                        flag = 0;
                } else {
                        total = total + parseInt(number.charAt(i));
                        flag = 1;
                }
        }
        if ((total%10) == 0) {
                return true;
        } else {
                return false;
        }
}

