//	FormValidate
//	v. 1.0
//	
//	Javascript form validation for FormComponent 2.x
//

var formNotValid = false;
var formCommonsName = "";


function showError(elp,el,msg){
	errmsg = document.createElement("div");
	errmsg.className = "error";
	errmsg.id = el.name+"div";
	errmsg.innerHTML = eval(msg+"_"+el.name);
	elp.appendChild(errmsg);

}

function  requiredField(el){

	type = el.type;
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);

	if(document.getElementById(el.name+"div") && (el.name+"0"==el.id || el.name == el.id)){ elp.removeChild(document.getElementById(el.name+"div")); }

	//	Check if the text fields are not empty
	if((type=="text" || type=="textarea" || type=="password") && el.value==''){
		formNotValid = true;
		showError(elp,el,"fvmsg");
	//	Check if one non-dummy option has been selected
	} else if( (type=="select-one" || type=="select-multiple") && el.value==""){
		formNotValid = true;
		showError(elp,el,"fvmsg");
	//	Check if the 'other' field is filled
	}  else if( (type=="select-one" || type=="select-multiple") && el.value=="_other_"){
		el2 = document.getElementById(el.name+"other");
		if(el2 && el2.value==""){
			formNotValid = true;
			showError(elp,el,"fvmsg2");
		}

	//	Check if a radio button has been selected
	} else if(type=="radio" && formCommonsName!=el.name){
		formCommonsName = el.name;
		groupcheck = false; j=0;

		if(document.getElementById){
			//	Check the whole group for at least one selected
			while(groupcheck==false && document.getElementById(el.name+""+j)){
				e = document.getElementById(el.name+""+j);
				j++; if(e.checked==true) groupcheck=true;
			}
		} else { groupcheck = true; }

		if(groupcheck==false){
			showError(elp,el,"fvmsg");
			formNotValid = true;
		}
	//	Check if a checkbox has been selected
	} else if(type=="checkbox" && formCommonsName!=el.name){
		formCommonsName = el.name;
		alternate = el.name;
		groupcheck = false; j=0;
		if(formCommonsName.indexOf('_')!=-1){
			start = 0;
			lasthook = -1;
			while(formCommonsName.indexOf('_',start)!=-1){
				lasthook = formCommonsName.indexOf('_',start);
				start = formCommonsName.indexOf('_',start);
				start++;
			};
			alternate = formCommonsName.substr(0,lasthook);
		}


		if(document.getElementById){
			//	Check the whole group for at least one selected
			if(!document.getElementById(alternate+"_0")){
				//	Checkboxes can occure without a group
				if(document.getElementById(el.name) && document.getElementById(el.name).checked==true) groupcheck=true
			} else {
				while(groupcheck==false && document.getElementById(alternate+"_"+j)){
					e = document.getElementById(alternate+"_"+j);
					j++; if(e.checked==true) groupcheck=true;
				}
			}
		} else { groupcheck = true; }

		if(groupcheck==false){
			showError(elp,el,"fvmsg");
			formNotValid = true;
		}
	}
}


function  requiredFieldCond(el){ if(document.getElementById){
	condition = eval("fvcond_"+el.name+"");

	isreq = 0;
	rule = condition.split(",");
	for(j=0;j<rule.length;j++){
		//	Equasion rule
		if(rule[j].indexOf("=")!=-1){
			if(rule[j]=="*=*"){
				isreq++;
			} else {
				keyval = rule[j].split("=");
				elval = document.getElementById(keyval[0]).value;
				if(document.getElementById(keyval[0]).type=="checkbox" || document.getElementById(keyval[0])=="radio"){
					if(document.getElementById(keyval[0]).checked==true) isreq++;
				} else {
					if(keyval[1]=="[NOTNULL]" && elval!=""){ isreq++; } else if(elval==keyval[1]){ isreq++; }
				}
			}
		}
		//	Inclusion rule
		if(rule[j].indexOf("~")!=-1){
			keyval = rule[j].split("~");
			elval = new String(document.getElementById(keyval[0]).value);
			if(keyval[1]=="[NOTNULL]") keyval[1] = "";
			if(document.getElementById(keyval[0]).type=="checkbox" || document.getElementById(keyval[0])=="radio"){
				if(document.getElementById(keyval[0]).checked==true) isreq++;
			} else {
				if(elval.match(keyval[1])){ isreq++; }
			}
		}
	}

	if(isreq!=false && isreq==rule.length) requiredField(el);

}}


function  validateCond(el){ if(document.getElementById){
	condition = eval("fvcond2_"+el.name+"");

	//	Get type and rules
	phook = condition.indexOf("|");
	if(phook!=-1){
		type = condition.substr(0,phook);
		rules = condition.substr(phook+1);
	} else {
		type = null;
		rules = condition;
	}

	isreq = 0;
	rule = rules.split(",");
	for(j=0;j<rule.length;j++){
		//	Equasion rule
		if(rule[j].indexOf("=")!=-1){
			if(rule[j]=="*=*"){
				isreq++;
			} else {
				keyval = rule[j].split("=");
				elval = document.getElementById(keyval[0]).value;
				if(document.getElementById(keyval[0]).type=="checkbox" || document.getElementById(keyval[0])=="radio"){
					if(document.getElementById(keyval[0]).checked==true) isreq++;
				} else {
					if(keyval[1]=="[NOTNULL]" && elval!=""){ isreq++; } else if(elval==keyval[1]){ isreq++; }
				}
			}
		}
		//	Inclusion rule
		if(rule[j].indexOf("~")!=-1){
			keyval = rule[j].split("~");
			elval = new String(document.getElementById(keyval[0]).value);
			if(document.getElementById(keyval[0]).type=="checkbox" || document.getElementById(keyval[0])=="radio"){
				if(document.getElementById(keyval[0]).checked==true) isreq++;
			} else {
				if(keyval[1]=="[NOTNULL]" && elval!=""){ isreq++; } else if(elval.match(keyval[1])){ isreq++; }
			}
		}
	}

	//	Validate field
	if(isreq!=false && isreq==rule.length){
		if(type=="ukpostcode") validateUKPostcode(el);
		if(type=="password") validatePass(el);
		if(type=="email") validateEmail(el);
		if(type=="username") validateUsername(el);
		if(type=="date") validateDate(el);
		if(type=="phone") validatePhone(el);
	}
}}


function validateEmail(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	//	Check for a valid email address
	str = el.value;
	if(str!=""){
		test = (str.indexOf(".",str.indexOf("@")) > 2) && (str.indexOf(".",str.indexOf("@"))<(str.length-2)) && (str.indexOf("@") > 0 ) && (str.indexOf("@") < (str.length-4) );
		if(test==false){
			formNotValid = true;
			showError(elp,el,"fvvmsg");
		}
	}

	}
}

function validateUsername(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	//	Check for a valid email address, username should not be an email
	str = el.value;
	if(str!=""){
		test = (str.indexOf(".",str.indexOf("@")) > 2) && (str.indexOf(".",str.indexOf("@"))<(str.length-2)) && (str.indexOf("@") > 0 ) && (str.indexOf("@") < (str.length-4) );
		if(test==false){
			formNotValid = true;
			showError(elp,el,"fvvmsg");
		}
	}

	}
}

function validatePhone(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	re = /^\b[\(\)0-9 \+\-]+\b$/
	//	Ugly test to escpae the first +/-
	if(new String("1"+el.value).match(re)!= "1"+el.value){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}

/*
	re = /\b[a-zA-Z0-9]{2,4} [a-zA-Z0-9]{3}\b/
	if(new String(el.value).match(re)!= el.value){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}
*/
	}
}

function validateUKPostcode(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	re = /\b[a-zA-Z0-9]{2,4} [a-zA-Z0-9]{3}\b/
	if(new String(el.value).match(re)!= el.value){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}

	}
}


function validateTime(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	re = /\b[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}\b/
	if(new String(el.value).match(re)!= el.value){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}

	}
}


function validateDate(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	re = /\b[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}\b/
	if(new String(el.value).match(re)!= el.value){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}

	}
}

function validateDate2(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	re = /\b[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}\b/
	if(new String(el.value).match(re)!= el.value && el.value!=""){
		formNotValid = true;
		showError(elp,el,"fvvmsg");
	}

	}
}

function validatePass(el){
	elnum = eval("fvnum_"+el.name+"");
	elp = document.getElementById("frow"+elnum);
	if(!document.getElementById(el.name+"div")){

	//	Password length
	if(el.value.length<=5 && el.value.length>0 ){
		formNotValid = true;
		showError(elp,el,"fvmsg2");
		return false;
	}

	//	Check if confirmation password is the same as original
	if(document.getElementById && document.getElementById(el.name+"_confirm")){
		e = document.getElementById(el.name+"_confirm");
		if(e.value!=el.value){
			formNotValid = true;
			showError(elp,el,"fvmsg3");
		}
	}

	}
}


function validateForm(){

//	els = getElementsByClassName("error");
//	for(i=0;i<els.length;i++) removeChild(els[i]);

	//	Required fields
	els = getElementsByClassName("jsRequired");
	for(i=0;i<els.length;i++) requiredField(els[i]);

	els = getElementsByClassName("jsCondRequired");
	for(i=0;i<els.length;i++) requiredFieldCond(els[i]);

	//	Validation
	els = getElementsByClassName("jsValidateEmail");
	for(i=0;i<els.length;i++) validateEmail(els[i]);

	els = getElementsByClassName("jsValidateUser");
	for(i=0;i<els.length;i++) validateUsername(els[i]);

	els = getElementsByClassName("jsValidatePhone");
	for(i=0;i<els.length;i++) validatePhone(els[i]);

	els = getElementsByClassName("jsValidatePostcode");
	for(i=0;i<els.length;i++) validateUKPostcode(els[i]);

	els = getElementsByClassName("jsValidateDate");
	for(i=0;i<els.length;i++) validateDate(els[i]);
	els = getElementsByClassName("jsValidateDate2");
	for(i=0;i<els.length;i++) validateDate2(els[i]);

	els = getElementsByClassName("jsValidateTime");
	for(i=0;i<els.length;i++) validateTime(els[i]);

	els = getElementsByClassName("jsValidatePassword");
	for(i=0;i<els.length;i++) validatePass(els[i]);

	els = getElementsByClassName("jsCondValidate");
	for(i=0;i<els.length;i++) validateCond(els[i]);

	if(formNotValid==true){
		formNotValid = false;
		formCommonsName = "";
		return false;
	} else {
		return true;
	}
}

