var submitcount=0;
var foundchecked='';

var fields = {
	FNAM:"",
	LNAM:"",
	EMAL:"",
	CMAL:"",
    ADD1:"",
    ADD2:"",
	CITY:"",
	STAT:"",
	ZIPC:"",
	PROV:"",
    CZIP:"",
	PHON:"",
	CTRY:"",
	FQUS:"",
    PTYP:"",
	NMKT:"",
	MODL:"",
	NEMA:"",
	REGQ:"",
	SRNU:"",
	IATC:""
};

var msg = {
  req_edt            : "The selected field must be filled in. ",
  req_edt1           : "",
  req_edt2           : "",
  req_sel            : "A selection from the list must be made.",
  req_diffsel        : "A different selection from the list must be made.",
  req_other          : "Please provide a value for the selected field.",
  req_gen            : "All required fields must be completed before registering",
  req_nonhead        : "Items marked with --- cannot be selected",
  req_stat			 : "Please make a selection from the state/province list",
  req_loc			 : "Please select a purchase location",
  req_num_only       : "The selected field accepts numbers only.",
  req_min_size       : "The selected field requires ",
  req_min_size2      : "The selected field requires either ",
  req_min_is_max     : "The selected field must be completely filled in.",
  req_valid_email    : "A valid e-mail address is required. Example: name@myaccount.com",
  badphone			 : "A valid phone number is required. Example: (123-456-7890)",
  badzip			 : "Please enter a valid zip code. Example (12345 or 12345-1234)",
  badsrnu			 : "Invalid Serial number, please click \"Help\" to \n see how you can find your Serial Number",
  bad_email_match    : "Email addresses do not match.\nPlease confirm that your email address is correct.",
  bad_password_match : "Passwords do not match.\nPlease confirm that your password is correct.",
  req_gooddate       : "You have entered an invalid date.\nPlease verify you have the correct date for your Date of Birth.",
  req_missing_addr   : "Please complete all address fields",
  req_checkbox       : "At least one options must be checked.",
  req_iatc           : "Please acknowledge that you have read the terms of use.",
  req_zip_5_long         : "Please enter a 5 digit or 9 digit zip code.",
  req_zip_4_long         : "Please enter a 5 digit or 9 digit zip code.",
  req_zip_num_only       : "The %s field accepts numbers only.",
  bad_CA_postal_length    : "The Postal Code must contain 6 characters.",
  bad_CA_postal_format    : "The %s field should look like A0A0A0 or A0A 0A0.",
  returns            : ".\n\n"
};


function validate(formid, fields) {
    if (submitcount === 0) 
    {
        submitcount++;
        var error='';
        var br="\n";

        var form = document.getElementById(formid);
        
        for (var field in fields) 
        {
            var obj = form.elements[field];
         
            if (obj) { obj.className=''; }

            var fieldspan = field+"_SPAN";

            if (typeof(obj) == "undefined")  
            {
                //alert('obj type undef');
                continue;
            }
            else if (document.getElementById && document.getElementById(fieldspan) && document.getElementById(fieldspan).style.visibility == 'hidden') 
            { 
                // field (obj) is hidden - ignore
                // alert('Skipping ' + obj.name + ' because it is hidden...');
                continue;
		    }
            else if (obj.type == "text") 
            {
                if (obj.value === "") 
                {
                    switch (field) 
                    {

                    case 'ADD1':
                    case 'ADD2':
                    case 'CITY':
                    case 'ZIPC':
                    case 'CZIP':
                    case 'PHON':
                    case 'SRNU':
                        
                        // skip these fields - we only want to validate if it has a value
                        break;

                     default:
                        error='missingreq';
                        break;
                    }
                }
                else if (field == "EMAL" && (!echeck(form.EMAL.value) || hasWhitespace(obj.value)) || field == "CMAL" && (!echeck(form.CMAL.value) || hasWhitespace(obj.value))) 
                { 
                    error='bademail'; 
                }
                else if (field == "CMAL" && (form.EMAL.value !== obj.value)) 
                { 
                    error='emailmatch'; 
                }
                else
                {
                    switch (field) 
                    {
                    case 'PHON':
                        
                        if (obj.value !== "" && bad_US_CA_phone(obj.value))
                        {
                            error='badphone';           
                        }
                        break;

// 						case 'SRNU':
                        
//     					if (obj.value !== "" && !validateNumeric(obj.value))
//                        {
//       					 error='badnumeric';
//   					 }
//      				break;

                    case 'ADD1':
                    case 'ADD2':
                    case 'CITY':
                    case 'ZIPC':
                    case 'CZIP':

                        // only process fields with values
                        if (obj.value !== "")
                        {
                            var ctry = form.elements['CTRY'];

                            // check the associated field values and return error if any
                            // of them are empty - Canada first
                            var assoc_fields = '';
                            if (ctry.value == 'CA')
                            {
                                assoc_fields = {ADD1:'',CITY:'',PROV:'',CZIP:'',CTRY:''};                            
                            }
                            else
                            {
                                // default is USA
                                assoc_fields = {ADD1:'',CITY:'',STAT:'',ZIPC:'',CTRY:''};                            
                            }

                            for (var assocfield in assoc_fields)
                            {
                                if (assocfield)
                                {
                                    var assocobj = form.elements[assocfield];
                                    
                                    if (assocobj.value === '')
                                    {
                                        obj = assocobj;
                                        error='missingreqaddr';
                                        break;
                                    }
                                }
                            }

                            var ziperror = '';
                            // validate US Zip Codes
                            if (field == "ZIPC")
                            { 
                                ziperror = US_Good(field, obj);
                                if (ziperror !== '')
                                {
                                    error = ziperror;
                                }    
                            }

                            // validate CA Postal Codes
                            if (field == "CZIP")
                            { 
                                ziperror = CA_Good(obj);
                                if (ziperror !== '')
                                {
                                    //alert(ziperror);
                                    error = ziperror;
                                }    
                            }

                            if ((field == 'STAT'|| field == 'PROV' || field == 'CTRY') && (obj.selectedIndex <= -1 || obj.options[obj.selectedIndex].value === "")) 
                            {
                                error='missingstat';
                            }
                        }
                        break;

                    default:
                        
                        break;
                    }
                }
            } 
            else if (obj.type == "select-one") 
            {
                switch (field)
                {
                case 'STAT':
                case 'PROV':
                case 'CTRY':
                    // ignored unless other address info present
                    break;

                default:

                      if (obj.selectedIndex <= -1 || obj.options[obj.selectedIndex].value === "") 
                    {
                        error='missingsel';
                    }
                }
            }
                else if (field == "YEAR") 
                { 
                    error = badDate(form.YEAR.options[form.YEAR.selectedIndex].value, form.MNTH.options[form.MNTH.selectedIndex].value, form.DAYS.options[form.DAYS.selectedIndex].value, "2007", "08", "31"); 
                }
            else if (obj.type == "checkbox") 
            {
                foundchecked=0;

                // BeginSenseo checkbox validation
                switch(field)
                {
 
 //                case "LF01":
//                     if (!form.LF01.checked && !form.LF02.checked && !form.LF03.checked && 
//                         !form.LF04.checked)
//                     {
//                         error='requiredcheckbox';
//                     }
//                     break;

                case "IATC":
                    if (obj.checked) 
                    {
                        foundchecked=1;
                    } 
                    else if (!foundchecked) 
                    {
                        error='missingiatc';
                    }
                    break;

                default:
                    if (obj.checked) 
                    {
                        foundchecked=1;
                    } 
                    else if (!foundchecked) 
                    {
                        error='missingcheckbox';
                    }
                }
            }
            else if (obj[0] && obj[0].type == "radio") 
            {
                foundchecked=0;
                for (var i=0; i < obj.length; i++) 
                {
                    if (obj[i].checked) {
                        foundchecked=1;
                        break;
                    }
                }
                if (!foundchecked) 
                {
                    error='missingradio';
                }
            }

            // Begin error > response logic
            if (error) 
            {
                window.scroll(0,0);
                if (error == 'missingradio') 
                {
                    obj[0].focus();
                }
                else 
                {
                    obj.focus();
                }
                switch (error) 
                {
                case 'req_num_only':
                case 'min_size2':
                case 'min_size4':
                    alert( msg.error + br + msg.req_gen );
                    break;
                case 'badphone':
                    alert( msg.badphone + br + msg.req_gen );
                    break;
                case 'badzip':
                    alert( msg.badzip + br + msg.req_gen );
                    break;
                case 'badnumeric':
                    alert( msg.req_num_only + br + msg.req_gen );
                    break;
                case 'badserial':
                    alert( msg.badsrnu + br + msg.req_gen );
                    break;
                case 'bademail':
                    alert( msg.req_valid_email + br + msg.req_gen );
                    break;
                case 'emailmatch':
                    alert( msg.bad_email_match + br + msg.req_gen );
                    break;
                case 'month':
                case 'day':
                case 'year':
                    alert( msg.req_diffsel );
                    break;
                case 'missingsel':
                case 'missingradio':
                    alert( msg.req_sel + br + msg.req_gen );
                    break;
                case 'missingradio':
                    alert( msg.req_sel + br + msg.req_gen );
                    break;
                case 'requiredcheckbox':
                case 'missingcheckbox':
                    alert( msg.req_checkbox + br + msg.req_gen );
                    break;
                case 'missingreqaddr':
                    alert( msg.req_missing_addr + br + msg.req_gen );
                    break;
                case 'missingreq':
                    alert( msg.req_edt + br + msg.req_gen );
                    break;
                case 'missingstat':
                    alert( msg.req_stat + br + msg.req_gen );
                    break;
                case 'missingiatc':
                    alert( msg.req_iatc + br + msg.req_gen );
                    break;
                case 'ZIP_5_long':
                    alert( msg.req_zip_5_long + br + msg.req_gen );
                    break;
                case 'ZIP_4_long':
                    alert( msg.req_zip_4_long + br + msg.req_gen );
                    break;
                case 'ZIP_num_only':
                    alert( msg.req_zip_num_only + br + msg.req_gen );
                    break;
                case 'bad_CA_postal_length':
                    alert( msg.bad_CA_postal_length + br + msg.req_gen );
                    break;
                case 'bad_CA_postal_format':
                    alert( msg.bad_CA_postal_format + br + msg.req_gen );
                    break;
                default:
                    alert( msg.req_edt + br + msg.req_gen );
                    break;
                }
                obj.className='unsatisfied';
                --submitcount;
                return false;
            }
        }
        --submitcount;
        //alert('loop finished...');
        return true;
    } 
    else
    {
        // alert('submit count exceeded' + br + submitcount);
        return false;
    }
    // default is to return false
    return false;
}

var DHTML = (document.getElementById || document.all || document.layers);

function getObj(name) {
    if (document.getElementById) {
          return document.getElementById(name);
    }
    else if (document.all) {
          return document.all[name];
    }
    else if (document.layers){
          return document.layers[name];
    }
}


function field_switch(the_caller, to_switch, the_key)
{
    //	alert(the_caller.value);

    var ts_array = new Array(to_switch);

	if (the_caller.value == the_key)
	{
		Block_Array_HideShowClear(ts_array, new Array(''), 'show');
	}
    else 
 	{
 		Block_Array_HideShowClear(ts_array, new Array(''), 'hide');
 	}
	
    return;
}


// Numeric Only Validation
function validateNumeric(field){
var valid = "0123456789";
for (var i=0; i < field.length; i++) 
	{
	temp = "" + field.substring(i, i+1);
	    if (temp == "-") { return false; }
	if (valid.indexOf(temp) == "-1") 
		{
		return false;
		}
	}
return true;
}


// Serial Number Validation
function validateSRNU(field){
var valid = "0123456789";
for (var i=0; i < field.length; i++) 
	{
	temp = "" + field.substring(i, i+1);
	    if (temp == "-") { return false; }
	if (valid.indexOf(temp) == "-1") 
		{
		return false;
		}
	}
return true;
}


// Zip Code Validation

function validateZIPC(field) {
var valid = "0123456789-";
var hyphencount = 0;

if (field.length!=5 && field.length!=10) {
    //alert('incorrect length');
    return false;
}
for (var i=0; i < field.length; i++) {
temp = "" + field.substring(i, i+1);
    if (temp == "-") { hyphencount++; }
if (valid.indexOf(temp) == "-1") {
    //alert('invalid index');
return false;
}
if ((hyphencount > 1) || ((field.length==10) && "" + field.charAt(5)!="-")) {
    // alert('incorrect hiphen position');
return false;
   }
}
return true;
}




//Taken from bad_US_CA_phone js common - modified to take string and return boolean
function bad_US_CA_phone(str) 
{
    for (var i=0; i <str.length; i++){
        if (i == 3 || i == 7 ){
      	    if (str.substring(i, i+1)!='-') { return true; }
        }else if (isNaN(str.substring(i, i+1)) || (str.length!=12 && str!='') ){
            return true;
        }
    }
    return false;
}

function swapStatProv(select_name)
{
    //alert('swap activated....');

    var obj = getObj(select_name);
    var val =  obj.options[obj.selectedIndex].value;

    switch(val)
    {
        
    case "CA":
        Block_Array_HideShowClear(new Array('CA_statzip','STPR_CA'),new Array(''),'show');
        Block_Array_HideShowClear(new Array('US_statzip','STPR_US'),new Array('STAT','ZIPC','STPR'),'hide');
        break;
        
    default:
        Block_Array_HideShowClear(new Array('CA_statzip','STPR_CA'),new Array('PROV','CZIP','STPR'),'hide');
        Block_Array_HideShowClear(new Array('US_statzip','STPR_US'),new Array(''),'show');
    }

}