// form validation written by
// andrew relkin
// prmo@relkin.com

function check(form)
	{

	var doneYet = true;

	if (doneYet) doneYet = doneYet && salutation(form);

	if (doneYet) doneYet = doneYet && bfname(form);

	if (doneYet) doneYet = doneYet && blname(form);

	if (doneYet) doneYet = doneYet && baddress1(form);

	if (doneYet) doneYet = doneYet && bcity(form);

	if (doneYet) doneYet = doneYet && bstate(form);
	
	if (doneYet) doneYet = doneYet && bzip(form);

	if (doneYet) doneYet = doneYet && bcountry(form);

	if (doneYet) doneYet = doneYet && bemail(form);

	if (doneYet) doneYet = doneYet && chargetotal(form);

	if (doneYet) doneYet = doneYet && CCNum(form);

	if (doneYet) doneYet = doneYet && CCMExpire(form);
	
	if (doneYet) doneYet = doneYet && CCYExpire(form);

	return doneYet;
	
	}

// ------------------------------ 

// salutation
function salutation(form)
	{
	if (form.SALUTATION)
		{
		salut_count = 0;
		for (s = 0; s < form.SALUTATION.length; s++)
			{ if (form.SALUTATION[s].checked == 1) salut_count = 1; }
		if (salut_count != 1)
			{
			alert("Please select a salutation.");
			form.SALUTATION[0].focus();		
			return false;
			}
		}
	return true;
	}

// first name
function bfname(form)
	{
	if ( (form.bfname) && (form.bfname.value.length == 0) )
		{
		alert("Please enter your first name.");
		form.bfname.focus();
		return false;
		}
	return true;
	}

// last name
function blname(form)
	{
	if ( (form.blname) && (form.blname.value.length == 0) )
		{
		alert("Please enter your last name.");
		form.blname.focus();
		return false;
		}
	return true;
	}

// street address
function baddress1(form)
	{
	if ( (form.baddress1) && (form.baddress1.value.length == 0) )
		{
		alert("Please enter your street address.");
		form.baddress1.focus();
		return false;
		}
	return true;
	}

// city
function bcity(form)
	{	
	if ( (form.bcity) && (form.bcity.value.length == 0) )
		{
		alert("Please enter your city.");
		form.bcity.focus();
		return false;
		}
	return true;
	}

// state
function bstate(form)
	{	
	if ( (form.bstate) && (form.bstate.value.length == 0) )
		{
		alert("Please enter your state.");
		form.bstate.focus();
		return false;
		}
	return true;
	}

// zip code
function bzip(form)
	{	
	if ( (form.bzip) && (form.bzip.value.length == 0) )
		{
		alert("Please enter your zip / postal code.");
		form.bzip.focus();
		return false;
		}
	return true;
	}


// country
function bcountry(form)
	{	
	if ( (form.bcountry) && (form.bcountry.value.length == 0) )
		{
		alert("Please enter the name of your country.");
		form.bcountry.focus();
		return false;
		}
	return true;
	}
	
// email
function bemail(form)
	{
	if (form.bemail)
		{
		var filter = /^[A-Za-z0-9][A-Za-z0-9\_\-\.]*\@[A-Za-z0-9][A-Za-z0-9\_\-\.]*\.[A-Za-z]{2,3}$/;
		var filter2 = /(\.\.+)|(\@\@+)|(\_\_+)|(\-\-+)/;
		if( (!filter.test( form.bemail.value ))  || ( filter2.test( form.bemail.value )) )
			{
			alert("Please enter a valid email address.")
			form.bemail.focus();
			return false;
			}
		}
	return true;
	}
	
// donation amount
function chargetotal(form)
	{
	var filter = /[0-9.]/;
	if ( form.chargetotal && (form.chargetotal.value.length == 0 || form.chargetotal.value < 0 || !filter.test( form.chargetotal.value ) ) )
		{
		alert("Please enter a donation amount.");
		form.chargetotal.focus();
		return false;
		}
	return true;
	}

// credit card number
function CCNum(form)
	{

	if ( (form.CCNum) && (form.CCNum.value.length == 0) )
		{
		alert("Please enter your credit card number.");
		form.CCNum.focus();
		return false;
		}

    if  (!_CF_checkcreditcard(form.CCNum.value))
        {
        if  (!_CF_onError(form, form.CCNum, form.CCNum.value, "Please enter a valid credit card number."))
            {
			form.CCNum.focus();
            return false; 
            }
        }
	return true;
	}

function _CF_onError(form_object, input_object, object_value, error_message)
    {
        alert(error_message);
        return false;   
    }

function _CF_hasValue(obj, obj_type)
    {
    if (obj_type == "TEXT" || obj_type == "PASSWORD")
        {
        if (obj.value.length == 0) 
                return false;
        else 
                return true;
        }
    else if (obj_type == "SELECT")
        {
        for (i=0; i < obj.length; i++)
                {
                if (obj.options[i].selected)
                        return true;
                }

        return false;   
        }
    else if (obj_type == "SINGLE_VALUE_RADIO" || obj_type == "SINGLE_VALUE_CHECKBOX")
        {

                if (obj.checked)
                        return true;
                else
                return false;   
        }
    else if (obj_type == "RADIO" || obj_type == "CHECKBOX")
        {

        for (i=0; i < obj.length; i++)
                {
                if (obj[i].checked)
                        return true;
                }

        return false;   
        }
	}

function _CF_checkinteger(object_value)
    {
    //Returns true if value is a number or is NULL
    //otherwise returns false   

    if (object_value.length == 0)
        return true;

    //Returns true if value is an integer defined as
    //   having an optional leading + or -.
    //   otherwise containing only the characters 0-9.
        var decimal_format = ".";
        var check_char;

    //The first character can be + -  blank or a digit.
        check_char = object_value.indexOf(decimal_format)
    //Was it a decimal?
    if (check_char < 1)
        return _CF_checknumber(object_value);
    else
        return false;
    }

function _CF_checknumber(object_value)
    {
    //Returns true if value is a number or is NULL
    //otherwise returns false   

    if (object_value.length == 0)
        return true;

    //Returns true if value is a number defined as
    //   having an optional leading + or -.
    //   having at most 1 decimal point.
    //   otherwise containing only the characters 0-9.
        var start_format = " .+-0123456789";
        var number_format = " .0123456789";
        var check_char;
        var decimal = false;
        var trailing_blank = false;
        var digits = false;

    //The first character can be + - .  blank or a digit.
        check_char = start_format.indexOf(object_value.charAt(0))
    //Was it a decimal?
        if (check_char == 1)
            decimal = true;
        else if (check_char < 1)
                return false;
        
        //Remaining characters can be only . or a digit, but only one decimal.
        for (var i = 1; i < object_value.length; i++)
        {
                check_char = number_format.indexOf(object_value.charAt(i))
                if (check_char < 0)
                        return false;
                else if (check_char == 1)
                {
                        if (decimal)            // Second decimal.
                                return false;
                        else
                                decimal = true;
                }
                else if (check_char == 0)
                {
                        if (decimal || digits)  
                                trailing_blank = true;
        // ignore leading blanks

                }
                else if (trailing_blank)
                        return false;
                else
                        digits = true;
        }       
    //All tests passed, so...
    return true
    }

function _CF_checkcreditcard(object_value)
    {
        var white_space = " -";
        var creditcard_string="";
        var check_char;


    if (object_value.length == 0)
        return true;

        // squish out the white space
        for (var i = 0; i < object_value.length; i++)
        {
                check_char = white_space.indexOf(object_value.charAt(i))
                if (check_char < 0)
                        creditcard_string += object_value.substring(i, (i + 1));
        }       

        // if all white space return error
    if (creditcard_string.length == 0)
        return false;
         
                
        // make sure number is a valid integer
        if (creditcard_string.charAt(0) == "+")
        return false;

        if (!_CF_checkinteger(creditcard_string))
                return false;

    // now check mod10

        var doubledigit = creditcard_string.length % 2 == 1 ? false : true;
        var checkdigit = 0;
        var tempdigit;

        for (var i = 0; i < creditcard_string.length; i++)
        {
                tempdigit = eval(creditcard_string.charAt(i))

                if (doubledigit)
                {
                        tempdigit *= 2;
                        checkdigit += (tempdigit % 10);

                        if ((tempdigit / 10) >= 1.0)
                        {
                                checkdigit++;
                        }

                        doubledigit = false;
                }
                else
                {
                        checkdigit += tempdigit;
                        doubledigit = true;
                }
        }       
        return (checkdigit % 10) == 0 ? true : false;

    }
	
// expiration month	
function CCMExpire(form)
	{
	if ( (form.CCMExpire) && (form.CCMExpire.value.length == 0) )
		{
		alert("Please enter the month that your credit card expires.");
		form.CCMExpire.focus();
		return false;
		}

	if ( form.CCMExpire && (form.CCMExpire.value < 1 || form.CCMExpire.value > 12) )
		{
		alert("Please enter the month that your credit card expires.");
		form.CCMExpire.focus();
		return false;
		}	
	return true;
	}

// expiration year	CCYExpire
function CCYExpire(form)
	{
	if ( (form.CCYExpire) && (form.CCYExpire.value.length == 0) )
		{
		alert("Please enter the year that your credit card expires.");
		form.CCYExpire.focus();
		return false;
		}
	return true;
	}


// expiration date
//function ccExpire(form)
//	{
//	// month
//	if ( form.EXP_MONTH && (form.EXP_MONTH.value < 1 || form.EXP_MONTH.value > 12) )
//		{
//		alert("Please enter the month that your credit card expires.");
//		form.EXP_MONTH.focus();
//		return false;
//		}
//	// year
//	if ( form.EXP_YEAR && (form.EXP_YEAR.value < 2002 || form.EXP_YEAR.value.length < 4) )
//		{
//		alert("Please enter the year that your credit card expires.");
//		form.EXP_YEAR.focus();
//		return false;
//		}
//	return true;
//	}

// credit card type (pull down)
//function ccType(form)
//	{
//	if ( (form.CC_TYPE) &&  (form.CC_TYPE.options[form.CC_TYPE.options.selectedIndex].value == "") )
//		{
//		alert("Please select your credit card type.");
//		form.CC_TYPE.focus();		
//		return false;
//		}
//	if (form.CC_TYPE.options[form.CC_TYPE.options.selectedIndex].value == "Visa" || form.CC_TYPE.options[form.CC_TYPE.options.selectedIndex].value == "Mastercard")
//		var x = "16";
//	if (form.CC_TYPE.options[form.CC_TYPE.options.selectedIndex].value == "American Express")
//		var x = "15";
//	if (form.CC_TYPE.options[form.CC_TYPE.options.selectedIndex].value == "Diner's Club")
//		var x = "14";
//	if ( form.CCNum && (form.CCNum.value.length == 0 || form.CCNum.value.length < x ) )
//		{
//		alert("Please enter your credit card number as one continuous number.\n \nYour credit card number should be " + x + " digits long.");
//		form.CCNum.focus();
//		return false;
//		}
//	return true;
//	}	

//function bstate(form)
//	{
//	if ( (form.bstate) && (form.bstate.options[form.bstate.options.selectedIndex].value == "") )
//		{
//		alert("Please select your state.");
//		form.bstate.focus();		
//		return false;
//		}
//	return true;
//	}

// american and canadian zip codes
//function zip(form)
//	{
//	if (form.ZIP_CODE)
//		{
//		// usa zip code format: ##### or #####-####
//		var filter = /^[0-9]{5}$/;
//		if( !filter.test(form.ZIP_CODE.value) )
//			{
//			alert("Please enter a valid zip code.")
//			form.ZIP_CODE.focus();
//			return false;
//			}
//		}
//	return true;
//	}
	