

function clear_val_errors(){

	// clear all validation error paragraphs
	var ctls = document.getElementsByTagName("p");
	for (var i=ctls.length-1;i>=0;i--){
		if (ctls[i].className=='val_error') ctls[i].parentNode.removeChild(ctls[i]);
    }
	// clear any highlighted select boxes
	ctls = document.getElementsByTagName("select");
	for (var i=ctls.length-1;i>=0;i--){
		if (ctls[i].className=='ctl_error')	ctls[i].className="";
    }
	// clear any highlighted input boxes
	ctls = document.getElementsByTagName("input");
	for (var i=ctls.length-1;i>=0;i--){
		if (ctls[i].className=='ctl_error')	ctls[i].className="";
	}
	// clear any highlighted textareas
	ctls = document.getElementsByTagName("textarea");
	for (var i=ctls.length-1;i>=0;i--) {
		if (ctls[i].className=='ctl_error')	ctls[i].className="";
	}
}


function validate() {
	var pass_val = true;

	AjaxRequest.get(
			{
			 'url': $F('ctl_app_path')+'validate_load.asp'
			,'async' : false
			,'onSuccess':function(req){
									   xmlval = req.responseXML;
									   var nl_controls = xmlval.getElementsByTagName("control")
									   var datasettype = document.getElementById("ctl_doc_datasettype").value

									   // loop through all controls

										for (var i=0;i<nl_controls.length;i++){
											// get the control name and title
											var ctlid = nl_controls[i].getAttribute("name")
											var ctltitle = nl_controls[i].getElementsByTagName("title")[0].firstChild.nodeValue;

											//alert(ctlid+' - '+ctltitle)
											var ctldisplay = '';
											var ctlvalidate = '';

											// get the control properties
											ctldisplay = get_node_val ('display', nl_controls[i], datasettype)
											//alert('display = '+ctldisplay)
											ctlvalidate = get_node_val ('validate', nl_controls[i], datasettype)
											ctlerrormsg = get_node_val ('errormsg', nl_controls[i], datasettype)

											// if the control is visible
											if (ctldisplay!='none' && ctldisplay!='error no display property found'){
												var ctl
												var ctlname
												var check_control = false
												var check_mandatory
												// decide if the control needs to be checked
												switch (ctldisplay){
													case 'mandatory':

														ctl=document.getElementById(ctlid)
														ctlname = ctl.name
														check_control = true;
														check_mandatory = true;
														break;

													case 'optional':
														ctl=document.getElementById(ctlid)
														if (ctl != null) {
															ctlname = ctl.name

															check_mandatory = false
															if (ctlname.substr(0,4) == "arr_"){
																if (ctl.value > 0) check_control = true;
															} else {
																if (ctl.value != '') check_control = true;
															}
														}
														break;

													case 'mandatory_if_visible':
														// control may not exist

														if (ctl_exists(ctlid)){
															ctl=document.getElementById(ctlid)
															ctlname = ctl.name
															check_control = true;
															check_mandatory = true;
														}
														break;
													default:
														break;
												}


												if (check_control){
													//check the control value is valid
													if (ctlname.substr(0,4) == "arr_"){
														// if the control is an array of controls
														var arr_count = ctl.value
														for (j=1;j<=arr_count;j++){
															//loop through the array
															// only check th contol if it exists as some controls may have been deleted
															if (ctl_exists('ari_'+ctlid+'_'+j)){

																var ctlarr = document.getElementById('ari_'+ctlid+'_'+j)

																if (validate_ctl(ctlarr,ctlvalidate,ctlerrormsg,check_mandatory)==false) {
																	pass_val = false;
																}
															}
														}
													} else {
														/// single control

														if (validate_ctl(ctl,ctlvalidate,ctlerrormsg,check_mandatory)==false) {
															pass_val = false;
														}
													}
												} // if (check_control)
											} //if
										}// for


									  }
			,'onError':function(req){alert('validate_load.asp')}
			}
		);

		return (pass_val)
}


function getRegExp(pattern){



	switch (pattern)
		{
		case 'year_month':
			return /^\d{4}(0[1-9]|1[012])$/
			break;
		case 'year_month_day':
			return /^(\d{4})(0[1-9]|1[012])(3[01]|0[1-9]|[12][0-9])$/
			break;0
		case 'year_month_optday':
			return /^(\d{4})(0[1-9]|1[012])(3[01]|0[1-9]|[12][0-9])?$/
			break;
		case 'year_optmonth_optday':
			return /^(\d{4})(0[1-9]|1[012])?(3[01]|0[1-9]|[12][0-9])?$/
			break;
		case 'string':
			return /^(\w|\W)+$/
			break;
		case 'integer':
			return /^([0123456789])+$/
			break;
			
		case 'error no vaidate property found':
			return / /
			break;


		default:
			return new RegExp(pattern)
		}


}



function validate_ctl(ctl, ctlvalidate, errormsg, check_mandatory){

var pattern = getRegExp(ctlvalidate)


	if (ctlvalidate == 'list'){
		// check the control against the xml list
		 var codelist = $F(ctl.id+'_codelist')
		 var list_pass = false

		 AjaxRequest.get(
			{
			 'url': $F('ctl_app_path')+'fetchcodelist.asp?id='+codelist+'&rt=xml'
			,'async' : false
			,'onSuccess':function(req){

					 xmlval = req.responseXML;
					 var objs = xmlval.getElementsByTagName("object")

					 for (var i=0;i<objs.length;i++){
						if (objs[i].getAttribute("name")==document.getElementById(ctl.id+'_view').value) list_pass = true;
					 }

					if (!list_pass){
						document.getElementById(ctl.id+'_view').className = 'ctl_error';
						ctl.className = 'ctl_error';
						var errorctl = document.createElement('p')

						var attr = document.createAttribute('class');
						attr.value = 'val_error';
						errorctl.setAttributeNode(attr);

						var attr = document.createAttribute('id');
						attr.value = 'err_'+ctl.id;
						errorctl.setAttributeNode(attr);

						errorctl.innerHTML = errormsg

						ctl.parentNode.insertBefore(errorctl,ctl.nextSibling)
					}

			 }
			,'onError':function(req){
				    alert('fetchcodelist.asp?id='+codelist+'&rt=xml')}
			 }
		 );


		 return(list_pass)

	} else {
		if (!ctl.value.match(pattern) | (check_mandatory && ctl.value=='')){
			// if ctl does not have a valid value highlight the control


			switch (ctlvalidate.substr(0,4))
				{
				case 'year':

				document.getElementById(ctl.id+'_day').className = 'ctl_error';
				document.getElementById(ctl.id+'_month').className = 'ctl_error';
				document.getElementById(ctl.id+'_year').className = 'ctl_error';
				break;

				case 'list':
				document.getElementById(ctl.id+'_view').className = 'ctl_error';
				break;
				}

			ctl.className = 'ctl_error';
			var errorctl = document.createElement('p')

			var attr = document.createAttribute('class');
			attr.value = 'val_error';
			errorctl.setAttributeNode(attr);

			var attr = document.createAttribute('id');
			attr.value = 'err_'+ctl.id;
			errorctl.setAttributeNode(attr);

			errorctl.innerHTML = errormsg

			ctl.parentNode.insertBefore(errorctl,ctl.nextSibling)

			return false
		} else {
			return true
		}
	}

}



