var all_misc_char = "-=`~!@#$%^&*()_+[]\{}|;':\",./<>?";
var letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var numbers = "0123456789";
var alpha_numeric_char = numbers + letters;
var everything = all_misc_char + alpha_numeric_char;

var password_length = 6;
var user_length = 6;

var	msg_name = "Please enter a valid name.";
var	valid_name = letters + "-'. ";
var	msg_fname = "Invalid characters in first name. Please note that numbers and special characters (#, $, %, etc.) are not allowed.";
var	valid_fname = letters + "-'. ";
var	msg_lname = "Invalid characters in last name. Please note that numbers and special characters (#, $, %, etc.) are not allowed.";
var	valid_lname = letters + "-'. ";

var msg_address = "Please enter a valid address.";
var valid_address = everything + " ";

var msg_city = "Please enter a valid city.";
var valid_city = letters + " ";
var msg_state = "Please enter a valid state.";
var valid_state = letters + " ";
var msg_country = "Please enter a valid country.";
var valid_country = letters + " ";
var msg_zipcode = "Please enter a valid zip code.";
var valid_zipcode = numbers + "-";
var valid_other_size = numbers;
var msg_other_size = "Please enter a valid number."


var msg_generic="You did not fill in the form completely. Please do so now."
var m_override_msg=""

var valid_age = numbers;
var msg_age = "Please enter a valid age.";

var msg_zip = "Please enter a valid zip code.";
var valid_zip = numbers + "-";

var	msg_phonenumber = "Please enter a valid phone number.";
var	valid_phonenumber = numbers;

var	msg_email = "Please enter a valid email address.";
var	valid_email = alpha_numeric_char + "_-";
var msg_verifyemailaddress = "You did not fill in all required email address information. Please do so now.";
var	valid_verifyemailaddress = alpha_numeric_char + "_-";
var msg_confirm_email = "Your email and confirmation email do not match. Please re-check your entries.";

var msg_select = "Please answer all questions before proceeding.";

var msg_textbox = "Please fill in all required fields.";

var msg_radio = "Please answer all questions before proceeding.";
var msg_checkbox = "Please make at least one selection before proceeding.";

var msg_username = "Please enter a valid username.";
var valid_username = alpha_numeric_char;

var msg_password = "Please enter a valid password.";
var valid_password = alpha_numeric_char;
var empty_old_pw = "this_is_the_default_password_string";
var msg_confirm_new_password = "Your new password and the confirmation do not match. Please re-check your entries.";
var msg_old_password_match = "Your new password matches your old password. Please make your changes now.";
var msg_resetpassword = "You did not fill in all required password information. Please do so now.";
var msg_newpassword = "You did not fill in all required password information. Please do so now.";

var msg_invalid_password_length = "Your password must be at least " + password_length + " characters long. Please make your changes now.";
var msg_invalid_username_length = "Your username must be at least " + user_length + " characters long. Please make your changes now.";
var msg_invalid_phonenumber3_length = "This phone number field must contain no less than 3 digits. Please make your changes now.";
var msg_invalid_phonenumber4_length = "This phone number field must contain no less than 4 digits. Please make your changes now.";
var msg_invalid_zipcode5_length = "This zip code field must contain 5 digits. Please make your changes now.";
var msg_invalid_zipcode4_length = "This zip code field must contain 4 digits. Please make your changes now.";

function validate(formarray,formname) {

	var bvar;
	var override_msg;
	var domholder = document.forms[formname];
	var goodvalue = true;


	for (var i = 0; i < formarray.length; i++) {
		//alert(formarray[i][1]);
		bvar = domholder[formarray[i][1]];
		override_msg = formarray[i][2];

		goodvalue = choose_validate_type(bvar,formarray[i][0],domholder,formarray[i][1],override_msg);

		if (!goodvalue) {
			return;
		}
	}
	domholder.submit();
}

function choose_validate_type(bvar, type, domholder, elementname, override_msg) {
m_override_msg=override_msg;
	if (type == 'textbox') {
		return true;
	}
	else if (type == 'radio' || type == 'checkbox') {
		return validate_radio_checkboxes(bvar,type,override_msg);
	}
	else if (type == 'resetpassword' || type == 'newpassword') {
		return validate_password(set_password_type(type),type,domholder);
	}
	else if (type == 'verifyemailaddress') {
		return validate_emailaddress(domholder,type);
	}
	else if (type == 'select') {
		return validate_select(domholder,type,bvar,override_msg);
	}
	else if (type == 'phonenumber') {
		return validate_phonenumber(domholder,type,elementname);
	}
	else if (type == 'zipcode') {
		return validate_zipcode(domholder,type,elementname);
	}	
	else if (type == 'validmonthday'){
		return validatemonthday(domholder);
		}
	else {
		return generic_validate(bvar,type,elementname);
	}
}

function validate_radio_checkboxes(element_group,error_type,override_msg) {
	var bChecked=false;
	if (element_group.length) {
		for (var i = 0; i < element_group.length; i++) {
			if (element_group[i].checked == true) {
				bChecked=true;
			}
		}
		if (bChecked) {
			return true;
		} else {
			return error_handler(error_type);
		}
	} else {
		if (element_group.checked) {
			return true;
		} else if (!override_msg) {
			return error_handler(error_type);
		} else { 
			alert(override_msg);
			return false;
		}
	}
}

function validate_emailaddress(domholder,type) {

var bvar;
var emailaddress_array = ["email_new","email_confirmation"];
var email_holder = [];

	for (var i = 0; i < emailaddress_array.length; i++) {
		bvar = domholder[emailaddress_array[i]];
		email_holder[i] = bvar.value;
		if (bvar.value.length > 1) {
			if (!generic_validate(bvar,'email','')) {
				bvar.focus()
				return false;
			}
		}
		else {
			return error_handler(type);
		}
	}
	
	if (email_holder[0] != email_holder[1]) {
		return error_handler('confirm_email');
	}
	else {
		return true;
	}
}

function validate_phonenumber(domholder,type,elementname) {
	
var bvar_phone_area = domholder[elementname + "_phone_area"];
var bvar_phone_three = domholder[elementname + "_phone_3"];
var bvar_phone_four = domholder[elementname + "_phone_4"];

var phone_area_fieldvalue = bvar_phone_area.value;
var phone_three_fieldvalue = bvar_phone_three.value;
var phone_four_fieldvalue = bvar_phone_four.value;

	if (phone_area_fieldvalue.length > 0 || phone_three_fieldvalue.length > 0 || phone_four_fieldvalue.length > 0) {	
		if (phone_area_fieldvalue.length < 3) {
			bvar_phone_area.focus();
			return error_handler('invalid_phonenumber3_length');
		}
		else if (phone_three_fieldvalue.length < 3) {
			bvar_phone_three.focus();
			return error_handler('invalid_phonenumber3_length');
		}
	
		if (phone_four_fieldvalue.length < 4) {
			bvar_phone_four.focus();
			return error_handler('invalid_phonenumber4_length');
		}
	
		if (!generic_validate_loop(bvar_phone_area,type,elementname)) {
			bvar_phone_area.focus();
			return false;
		}
		else if(!generic_validate_loop(bvar_phone_three,type,elementname)) {
			bvar_phone_three.focus();
			return false;
		}
		else if (!generic_validate_loop(bvar_phone_four,type,elementname)) {
			bvar_phone_four.focus();
			return false;
		}
		return true;
	}
	else {
		if (!optional_field(bvar_phone_area,elementname,phone_area_fieldvalue)) {
			bvar_phone_area.focus();
			return false;
		}
		else if (!optional_field(bvar_phone_three,elementname,phone_three_fieldvalue)) {
			bvar_phone_three.focus();
			return false;
		} 
		else if (!optional_field(bvar_phone_four,elementname,phone_four_fieldvalue)) {
			bvar_phone_four.focus();
			return false;
		}	
		return true;
	}
}

function validate_zipcode(domholder,type,elementname) {

var bvar_zip = domholder[elementname];
var zip_fieldvalue = bvar_zip.value;

	if (zip_fieldvalue.length < 5) {
		bvar_zip.focus();
		return error_handler('invalid_zipcode5_length');
	}
	else {
		if (!generic_validate_loop(bvar_zip,type,elementname)) {
			bvar_zip.focus();
			return false;
		}
		else {
			return true;
		}
	}
}

function set_password_type(type) {

	if (type == 'resetpassword') {
		return ["new_password", "confirm_password","old_password"];
	}
	else {
		return ["new_password", "confirm_password", empty_old_pw];
	}
}

function validate_password(password_array,type,domholder) {

var default_pw_str = false;
var value_holder = [];

	for (var i = 0; i < password_array.length; i++) {
		value_holder[i] = domholder[password_array[i]];

		if (password_array[i] == empty_old_pw) {
			default_pw_str = true;
		}
		else {
			if (value_holder[i].value.length > 1) {
				if (!generic_validate(value_holder[i],'password','')) {
					value_holder[i].focus();
					return false;
				}
			}
		}
	}
	return pw_check(password_array,default_pw_str,type,value_holder);
}

function pw_check(password_array,default_pw_str,type,value_holder) {

var old_holder;
var new_holder = value_holder[0].value;
var new_confirm_holder = value_holder[1].value;

	if (!default_pw_str) {
		old_holder = value_holder[2].value;
		
		if (old_holder < 1) {
			value_holder[2].focus();
			return error_handler(type);			
		}
		else if (new_holder < 1) {
			value_holder[0].focus();
			return error_handler(type);
		}
		else if (new_confirm_holder < 1) {
			value_holder[1].focus();
			return error_handler(type);		
		}
		else if (old_holder == new_holder) {
			value_holder[0].focus();
			return error_handler('old_password_match');		
		}
		else if (old_holder == new_confirm_holder) {
			value_holder[1].focus();
			return error_handler('old_password_match');
		}
		else if (new_holder != new_confirm_holder) {
			value_holder[1].focus();
			return error_handler('confirm_new_password');
		}
		else {
			return true;
		}
	}
	else {
		if (new_holder < 1) {
			value_holder[0].focus();
			return error_handler(type);
		}
		else if (new_confirm_holder < 1) {
			value_holder[1].focus();
			return error_handler(type);		
		}
		else if (new_holder != new_confirm_holder) {
			value_holder[1].focus();
			return error_handler('confirm_new_password');
		}
		else {
			return true;
		}
	}
}

function validate_select(domholder,type,bvar,override_msg) {
	if (bvar.value == "Other") {
		return generic_validate(domholder["other_size"],"other_size","other_size");
	} else 	if (bvar.selectedIndex == 0) {
		if (!(bvar.name == "seg_ques_115")) {
			document.getElementById(bvar.name + "_label").style.fontWeight = "bold";
			//alert(bvar.name + "_missing");
			document.getElementById(bvar.name + "_missing").style.display = "inline";
		} else {
			document.getElementById("seg_ques_114_label").style.fontWeight = "bold";
			document.getElementById(bvar.name + "_missing").style.display = "inline";
		}
		if (override_msg != "") {
			alert(override_msg);
			return false;
		}
		else {
			return error_handler(type);	
		}
	}
	else {
		return true;
	}
}

function generic_validate(bvar,type,elementname) {

var fieldvalue = bvar.value;
	
	if (optional_field(bvar,elementname,fieldvalue)) {
		return generic_validate_loop(bvar,type,elementname);
	}
	
	return false;
}

function optional_field(bvar,elementname,fieldvalue) {

	if (fieldvalue.length < 1) {
		var phone_area = elementname + '_phone_area';
		var phone_three = elementname + '_phone_3';
		var phone_four = elementname + '_phone_4';
		var zip_four = elementname + '_zip_4';
		var msg =""
		if (m_override_msg.length==0)
			{msg=msg_generic}
		else
			{msg=m_override_msg}

		if (bvar.name != 'address2' && bvar.name != phone_area && bvar.name != phone_three && bvar.name != phone_four && bvar.name != zip_four && bvar.name != 'seg_ques_108') {
			alert(msg);
			bvar.focus();
			return false;
		}
	}
	return true;
}

function generic_validate_loop(bvar,type,elementname) {

var temp;
var email_checked = false;
var valid = get_valid_string(type);
var fieldvalue = bvar.value;

	if (fieldvalue.length < user_length && type == 'username') {
		bvar.focus();
		return error_handler('invalid_username_length');
	}
	else if (fieldvalue.length < password_length && type == 'password') {
		bvar.focus();
		return error_handler('invalid_password_length');
	}
	else {
		for (var i = 0; i < fieldvalue.length; i++) {
			temp = fieldvalue.charAt(i);
			if (valid.indexOf(temp).toString() == "-1") {
				if (type == 'email' && (temp == "@" || temp == ".")) {
					if (!email_checked) {
						if (!check_email_string(fieldvalue)) {
							bvar.focus();
							return error_handler(type);
						}
						else {
							email_checked = true;
						}
					}
				}
				else {
					bvar.focus();
					return error_handler(type);
				}
			}
		}
		if (email_checked == false && type == 'email') {
			bvar.focus();
			return error_handler(type);
		}
		else {
			return true;
		}
	}
}

function error_handler(type){
	alert(eval("msg_" + type));
	return false;
}

function get_valid_string(type){
	return eval("valid_" + type);
}

function check_email_string(email_string){
	return ((email_string.indexOf('@') > 0) && (email_string.lastIndexOf('.') < (email_string.length - 1)) && ((email_string.lastIndexOf('.') - email_string.indexOf('@')) > 1));
}


function validatemonthday(domholder) {

	var bvar_month_ob = domholder["month"];
	var bvar_day_ob = domholder["day"];
	
	var month_ob_fieldvalue = bvar_month_ob.value;
	var day_ob_fieldvalue = parseInt(bvar_day_ob.value);
	
	var msg="";	

	if (m_override_msg.Length==0)
		{msg="The specified date is invalid";}
	else
		{msg=m_override_msg;}

	if (month_ob_fieldvalue == 2 && day_ob_fieldvalue > 28) 
		{
		alert(msg);
		return false
		} 
	else if ((month_ob_fieldvalue == 9 || month_ob_fieldvalue == 4 || month_ob_fieldvalue == 6 || month_ob_fieldvalue == 11) && (day_ob_fieldvalue == 31)) 
		{
		alert(msg);
		return false
		} 
	else 
	{
		return true;
	}


}



