// Validate basic input checks

function validate_email(email){
	return (/^([0-9a-z]([-_\.\w]*[0-9a-z])*@(([0-9a-z])+([-\w]*[0-9a-z])*\.)+[a-z]{2,9})$/i.test(email)) ? "" : "Invalid email address";
}

function validate_password(password, username){
	if(password.length < 6){
		return "Must be 6+ characters";
	}
	
	if(password.length > 16){
		return "Must be &lt;17 characters";
	}
	
	if(/^[a-z0-9_!@]{6,16}$/i.test(password)){
		if(username.length > 0 && password == username){
			return "Password cannot match username";
		}
	}
	else{
		return "Invalid characters";
	}
	
	return "";
}

function validate_name(name){
	return (/^([a-z0-9\.\']{1,}(\.|,|\-){0,1}( ){0,1}){1,4}(jr(\.){0,1}|i{1,3}){0,1}$/i.test(name)) ? "" : "Invalid name";
}

function validate_company(company){
	if(!/^([0-9a-z\'\.\-]{1,64}(,|\.|\!){0,1}( |&| & ){0,1}){1,10}$/i.test(company)){
		return "Invalid Company";
	}
	
	if(company.length > 64){
		return "Company name too long";
	}
	
	return "";
}

function validate_address_1(address_1){
	if(!/^([0-9\-]{0,8}([a-z0-9]{0,10})(\.|,){0,1}( [0-9a-z]{1,28}(\.){0,1}){1,6})|(((po|p\.o\.|p o) box|pob) (#){0,1}[0-9]{1,8})$/i.test(address_1)){
		return "Invalid Address";
	}
	
	if(address_1.length > 32){
		return "Address must be &lt;33 characters";
	}
	
	return "";
}

function validate_address_2(address_2){
	return (address_2.length > 32) ? "Address 2 must be &lt;33 characters" : "";
}

function validate_city(city){
	if(!/^([a-z]{1,24}(\.|,){0,1}( ){0,1}){1,5}$/i.test(city)){
		return "Invalid city";
	}
	
	if(city.length > 32){
		return "City must be &lt;33 characters";
	}
	
	return "";
}

function validate_state(state){
	if(!/^[a-z]{2,32}( [a-z]{3,32}){0,1}$/i.test(state)){
		return "Invalid state";
	}
	
	if(state.length > 32){
		return "State must be &lt;33 characters";
	}
	
	return "";
}

function validate_country(country){
	if(!/^[a-z]{2,32}( [a-z]{3,32}){0,1}$/i.test(country)){
		return "Invalid country";
	}
	
	if(country.length > 32){
		return "Country must be &lt;33 characters";
	}
	
	return "";
}

function validate_phone(phone){
	phone.gsub(/[^0-9]/, "");
	return (phone.length < 10 || phone.length > 16) ? "Invalid phone number" : "";
}

function validate_credit_card(cc_number){
	var card_regexes = new Hash({"Visa": /^4\d{12}(\d\d\d){0,1}$/,
								"Mastercard": /^5[12345]\d{14}$/,
								"Amex": /^3[47]\d{13}$/,
								"Discover": /^6011\d{12}$/});
	
	var card_type = "";
	card_regexes.each(function(pair){
		if(pair.value.test(cc_number)){
			card_type = pair.key;
		}
	});
	
	if(card_type.length == 0){
		return "Invalid card number";
	}
	
	var revcode = cc_number.split("").reverse();
	var checksum = 0;
	
	for(var i = 0; i < revcode.length; i++){
		var current_num = revcode[i];
		
		if(i & 1){
			current_num *= 2;
		}
		checksum += current_num % 10;
		if(current_num > 9){
			checksum += 1;
		}
	}
	if(checksum % 10 != 0){
		return "Invalid "+card_type+" card number";
	}
	return "";
}