var	String_LiteralContainerAlfa = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var	String_LiteralContainerDigit = "0123456789";
var	String_LiteralContainerSeparator = " `'~-_#()";
var	String_LiteralContainerEmailSymbol = "@.~_-&+";
var	String_LiteralContainerValidSQLspecial = " @.,|&#:/?\;%$";
var	String_LiteralContainersPecial = "~!@#$%^&*()_+|/`'";

var dont_check_first_name = false;
var dont_check_last_name = false;
var dont_check_email = false;
var dont_check_password = false;
var dont_check_address1 = false;
var dont_check_address2 = false;
var dont_check_address3 = false;
var dont_check_city = false;
var dont_check_state = false;
var dont_check_postcode = false;
var dont_check_country = false;
var dont_check_phone_contact = false;
var dont_check_phone_work = false;
var dont_check_phone_mobile = false;
var dont_check_fax = false;

var required_first_name = false;
var required_last_name = false;
var required_email = false;
var required_password = false;
var required_address1 = false;
var required_address2 = false;
var required_address3 = false;
var required_city = false;
var required_state = false;
var required_postcode = false;
var required_country = false;
var required_phone_contact = false;
var required_phone_work = false;
var required_phone_mobile = false;
var required_fax = false;

function fixElement(element, message) {
	alert(message);
	element.focus();
}

function StringReplace(str, strFrom, strTo) {
	var pos = str.indexOf(strFrom, 0);
	while (pos >= 0) {
		str = str.substring(0, pos) + strTo + str.substring(pos + strFrom.length, str.length);
		pos = str.indexOf(strFrom, 0);
	}
	return str;
}

function trimString (str) {
	while (str.charAt(0) == ' ')
		str = str.substring(1);
	while (str.charAt(str.length - 1) == ' ')
		str = str.substring(0, str.length - 1);
	return str;
}

function hyphenatePhone(obj) {
	obj.value = trimString(obj.value);
	obj.value = StringReplace(obj.value, "(", "");
	obj.value = StringReplace(obj.value, ")", "");

	if ( obj.value.length == 3 ) {
		obj.value += "-";
		return;
	} else if ( obj.value.length > 3) {

		obj.value = StringReplace(obj.value.substring(0, 4), " ", "-") + obj.value.substring(4, obj.value.length);

		if ( obj.value.charAt(3) != "-" ) obj.value = obj.value.substring(0, 3) + "-" + obj.value.substring(3, obj.value.length);
		if ( obj.value.length == 7 ) {
			obj.value += "-";
			return;
		} else if ( obj.value.length > 7) {
			obj.value = StringReplace(obj.value, " ", "");
			if ( obj.value.charAt(7) != "-" ) obj.value = obj.value.substring(0, 7) + "-" + obj.value.substring(7, obj.value.length);
		}
	}
	return;
}

function isLiteral(str, LiteralList, LiteralAddons) {
	var i, str_con, str_f, str_len;
	
	str_con = LiteralList;
	if ( LiteralAddons.length > 0 ) {
		if ( LiteralAddons.indexOf("a") >= 0 )
			str_con += String_LiteralContainerAlfa;
		if ( LiteralAddons.indexOf("d") >= 0 )
			str_con += String_LiteralContainerDigit;
		if ( LiteralAddons.indexOf("s") >= 0 )
			str_con += String_LiteralContainerSeparator;
		if ( LiteralAddons.indexOf("e") >= 0 )
			str_con += String_LiteralContainerEmailSymbol;
		if ( LiteralAddons.indexOf("v") >= 0 )
			str_con += String_LiteralContainerValidSQLspecial;
		if ( LiteralAddons.indexOf("p") >= 0 )
			str_con += String_LiteralContainersPecial;
	}
	if ( str.length == 0 || str_con.length == 0 )
		return false;
	else
		str_f = str;
	str_len = str_f.length;
	for ( i = 0; i <= str_len; i++ ) {
		if ( str_con.indexOf(str_f.substr(i,1)) < 0 ) {
			alert("Invalid symbol '"+str_f.substr(i,1)+"' in field!");
			return false;
		}
	}
	return true;
}

function isValidEmail(cemail) {
	var ees, email, eaf, edl, ec, eba, ll, s, sa, sb;
	ees = String_LiteralContainerEmailSymbol;
	email = cemail;

	if ( email.length == 0 || !isLiteral(email,ees,"ad") || cemail.length < 6 ) return false;
	eaf = email.indexOf("@");
	if ( eaf < 1 || eaf != email.lastIndexOf("@") ) return false;
	edl = email.lastIndexOf(".");
	if ( edl < 0 || edl < eaf || email.indexOf(".") < 1 ) return false;
	ec = email.substr(edl + 1, email.length - (edl + 1));
	if ( ec.length < 2 || ec.length > 3 || !isLiteral(ec, "", "a") ) return false;
	eba = email.substr(eaf - 1, 3);
	if ( !isLiteral(eba, ees, "ad") ) return false;
	ll = cemail.length - 1;
	for ( i = 1; i <= ll; i++ ) {
		s = cemail.substr(i,1);
		sb = cemail.substr(i-1,1);
		sa = cemail.substr(i+1,1);
		if ( ( s == "@" || s == "." ) && ( sb == "@" || sb == "." || sa == "@" || sa == "." ) ) return false;
	}
	return true;
}

function isValidName(str) { return isLiteral(str, " -'.~()_", "a"); }
function isValidAddress(str) { return isLiteral(str, ".,", "ads"); }

function phonePattern(str) {
	//???-???-????
	if ( str.length != 12 ) return false;
	if ( str.charAt(3) != "-" ) return false;
	if ( str.charAt(7) != "-" ) return false;
	return true;
}

function VerifyInput(formName){
	var val = "", password_conf = "";
	
	if (document.forms[formName].first_name && !dont_check_first_name) {
		val = trimString(document.forms[formName].first_name.value);
		if ( val.length == 0 && required_first_name ) {
			fixElement(document.forms[formName].first_name, "First Name can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidName(val) ) {
			fixElement(document.forms[formName].first_name, "Invalid Name!");
			return false;
		}
		// document.forms[formName].first_name.value = TitleCase(val);
	}
	if (document.forms[formName].last_name && !dont_check_last_name) {
		val = trimString(document.forms[formName].last_name.value);
		if ( val.length == 0 && required_last_name ) {
			fixElement(document.forms[formName].last_name, "Last Name can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidName(val) ) {
			fixElement(document.forms[formName].last_name, "Invalid Name!");
			return false;
		}
		// document.forms[formName].last_name.value = TitleCase(val);
	}
	if (document.forms[formName].email && !dont_check_email) {
		val = trimString(document.forms[formName].email.value);
		if ( val.length == 0 && required_email ) {
			fixElement(document.forms[formName].email, "E-mail address can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidEmail(val) ) {
			fixElement(document.forms[formName].email, "Invalid E-mail address format!");
			return false;
		}
	}
	if (document.forms[formName].password && document.forms[formName].password_conf && !dont_check_password) {
		val = trimString(document.forms[formName].password.value);
		password_conf = trimString(document.forms[formName].password_conf.value);
		if ( val.length == 0 && required_password) {
			fixElement(document.forms[formName].password, "Password can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, "", "ad") ) {
			document.forms[formName].password_conf.value = "";
			fixElement(document.forms[formName].password, "Password can contain only alfa/digit chars!");
			return false;
		}
		if ( val != password_conf ) {
			fixElement(document.forms[formName].password_conf, "Passwords do not match!");
			return false;
		}
	}
	if (document.forms[formName].address1 && !dont_check_address1) {
		val = trimString(document.forms[formName].address1.value);
		if ( val.length == 0 && required_address1 ) {
			fixElement(document.forms[formName].address1, "Address Line 1 can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidAddress(val) ) {
			fixElement(document.forms[formName].address1, "Invalid Address!");
			return false;
		}
		// document.forms[formName].address1.value = TitleCase(val);
	}
	if (document.forms[formName].address2 && !dont_check_address2) {
		val = trimString(document.forms[formName].address2.value);
		if ( val.length == 0 && required_address2 ) {
			fixElement(document.forms[formName].address2, "Address Line 2 can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidAddress(val) ) {
			fixElement(document.forms[formName].address2, "Invalid Address!");
			return false;
		}
		// document.forms[formName].address2.value = TitleCase(val);
	}
	if (document.forms[formName].address3 && !dont_check_address3) {
		val = trimString(document.forms[formName].address3.value);
		if ( val.length == 0 && required_address3 ) {
			fixElement(document.forms[formName].address3, "Address Line 3 can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidAddress(val) ) {
			fixElement(document.forms[formName].address3, "Invalid Address!");
			return false;
		}
		// document.forms[formName].address3.value = TitleCase(val);
	}
	if (document.forms[formName].city && !dont_check_city) {
		val = trimString(document.forms[formName].city.value);
		if ( val.length == 0 && required_city ) {
			fixElement(document.forms[formName].city, "City can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidAddress(val) ) {
			fixElement(document.forms[formName].city, "Invalid City!");
			return false;
		}
		// document.forms[formName].city.value = TitleCase(val);
	}
	if (document.forms[formName].state && !dont_check_state) {
		val = trimString(document.forms[formName].state.value);
		if ( val.length == 0 && required_state ) {
			fixElement(document.forms[formName].state, "Select state!");
			return false;
		}
	}
	if (document.forms[formName].postcode && !dont_check_postcode) {
		val = trimString(document.forms[formName].postcode.value);
		if ( val.length == 0 && required_postcode ) {
			fixElement(document.forms[formName].postcode, "Postcode can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, " ", "das") ) {
			fixElement(document.forms[formName].postcode, "Invalid Postcode!");
			return false;
		}
		document.forms[formName].postcode.value = val.toUpperCase();
	}
	if (document.forms[formName].country && !dont_check_country) {
		val = document.forms[formName].country.options[document.forms[formName].country.selectedIndex].value;
		if ( val == 0 && required_country ) {
			fixElement(document.forms[formName].country, "Country can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isValidAddress(val) ) {
			fixElement(document.forms[formName].country, "Invalid Country!");
			return false;
		}
		// document.forms[formName].country.value = TitleCase(val);
	}
	if (document.forms[formName].phone_contact && !dont_check_phone_contact) {
		document.forms[formName].phone_contact.value = StringReplace(document.forms[formName].phone_contact.value, " ", "-");
		val = trimString(document.forms[formName].phone_contact.value);
		if ( val.length == 0 && required_phone_contact ) {
			fixElement(document.forms[formName].phone_contact, "Phone Number can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, "-", "ds") ) {
			// fixElement(document.forms[formName].phone_contact, "Invalid Phone Number!");
			return false;
		}
		/* 
		if ( !phonePattern(val) ) {
			fixElement(document.forms[formName].phone_contact, "Phone Number must comply with ???-???-???? pattern!");
			return false;
		}
		*/
	}
	if (document.forms[formName].phone_work && !dont_check_phone_work) {
		document.forms[formName].phone_work.value = StringReplace(document.forms[formName].phone_work.value, " ", "-");
		val = trimString(document.forms[formName].phone_work.value);
		if ( val.length == 0 && required_phone_work ) {
			fixElement(document.forms[formName].phone_work, "Phone Number can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, "-", "ds") ) {
			// fixElement(document.forms[formName].phone_work, "Invalid Phone Number!");
			return false;
		}
		/* 
		if ( !phonePattern(val) ) {
			fixElement(document.forms[formName].phone_work, "Phone Number must comply with ???-???-???? pattern!");
			return false;
		}
		*/
	}
	if (document.forms[formName].phone_mobile && !dont_check_phone_mobile) {
		document.forms[formName].phone_mobile.value = StringReplace(document.forms[formName].phone_mobile.value, " ", "-");
		val = trimString(document.forms[formName].phone_mobile.value);
		if ( val.length == 0 && required_phone_mobile ) {
			fixElement(document.forms[formName].phone_mobile, "Phone Number can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, "-", "ds") ) {
			fixElement(document.forms[formName].phone_mobile, "Invalid Phone Number!");
			return false;
		}
		/* 
		if ( !phonePattern(val) ) {
			fixElement(document.forms[formName].phone_mobile, "Phone Number must comply with ???-???-???? pattern!");
			return false;
		}
		*/
	}
	if (document.forms[formName].fax && !dont_check_fax) {
		document.forms[formName].fax.value = StringReplace(document.forms[formName].fax.value, " ", "-");
		val = trimString(document.forms[formName].fax.value);
		if ( val.length == 0 && required_fax ) {
			fixElement(document.forms[formName].fax, "Fax Number can't be empty!");
			return false;
		}
		if ( val.length > 0 && !isLiteral(val, "-", "ds") ) {
			fixElement(document.forms[formName].fax, "Invalid Fax Number!");
			return false;
		}
		/*
		if ( !phonePattern(val) ) {
			fixElement(document.forms[formName].fax, "Fax Number must comply with ???-???-???? pattern!");
			return false;
		}
		*/
	}
	return true;
}

function TitleCase(str) {
	var t = "", tt = "";
	var p = 0, sp = 0;

	str = trimString(str);
	sp = str.indexOf(" ", p);
	if (sp < 0) {
		t += str.substr(p, 1).toUpperCase();
		if (str.length > 1) t += str.substr(1, (str.length - 1)).toLowerCase();
	} else {
		while (sp < str.length) {
			tt = str.substr(p, sp - p);
			t += TitleCase(tt);
			t += " ";
			p = sp + 1;
			sp = str.indexOf(" ", p);
			if (sp == -1) sp = str.length;
		}
		tt = str.substr(p, sp);
		t += TitleCase(tt);
		t += " ";
	}
	t = trimString(t);
	return t;
}
