
/*************************
* We need to supply an array with validation rules
* [element][condition]
* conditions may be: NOT_EMPTY, EMAIL, MAX_*, MIN_*, NUMERIC, ALPHA_NUMERIC, SA_ID
*
**************************/
var complete_conditions = new Array();

function clear_conditions(){

	for (a in complete_conditions) {
			
		if (complete_conditions[a].typeOf!='function'){
			
			delete complete_conditions[a];
		
		}
		
	}
	
 return true;

}

function add_condition(element, conditions){
	
	complete_conditions[element]=conditions;
	
 return true;

}

function get_elem_type(d, a){
	
	elem=d.elements[a];
	elem_type=elem.type;
	
	if (!elem_type){
		
		elem_type=elem[0].type;
		
	}
	
	return elem_type;
	
}

function give_elem_focus(d, a){
	
	elem_type=get_elem_type(d, a);
	elem=d.elements[a];
	
	switch (elem_type.toLowerCase()){
		
		case 'radio':
			
			elem[0].focus();
		
			break;
			
		default:
			
			elem.focus();
			
			break;
		
	}
	
	return true;
	
}

function check_conditions(formname){
	
	var values = "";
	var i, a;
	var form_value= "";
	var d=document.forms[formname];
	
	for (a in complete_conditions) {
			
		// looping through complete_conditions
		// we've got unique form fields here, lets get the value
		
		
		
			if (d.elements[a].typeOf!='function'){
			
				var form_value=get_form_value(d, a);
		
			}
		
		
			
		conditions=complete_conditions[a];
		
		for (e=0;e<conditions.length;e++){
				
			var condition;
			var parameter;
			var pos;
				
			condition=conditions[e];
				
			if ((!condition.search('MAX_')==-1) || (condition.search('MAX_')===0)){
				
				parameter=condition.substring(4);
				condition='MAX';
				
			}else if((condition.search('MIN_')!=-1) || (condition.search('MAX_')===0)){
			
				condition='MIN';
				parameter=condition.substring(condition.indexOf('MIN_'));
			
			}
			
			switch (condition){
			
				case 'NOT_EMPTY':
					
					if (form_value==''){
					
						alert('Please enter all required fields');
						give_elem_focus(d, a)
						return false;
					
					}
					
					break;
				
				case 'MAX':
				
					if (form_value.length>parameter){
					
						alert('You may only use '+parameter+' characters in this field');
						give_elem_focus(d, a)
						return false;
					
					}
				
					break;
					
				case 'MIN':
				
					if (form_value.length>parameter){
					
						alert('You must have at least '+parameter+' characters in this field');
						give_elem_focus(d, a)
						return false;
					
					}
					
					break;
					
				case 'EMAIL':
					
					if (form_value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/)==-1){
						
						alert('Please enter a valid email address');
						give_elem_focus(d, a)
						return false;
						
					}
				
					break;
					
				case 'NUMERIC':
					
					if (isNaN(form_value)){
					
						alert('Please only enter numeric values into this field');
						give_elem_focus(d, a)
						return false;
					
					}
					
					break;
				
				case 'ALPHA_NUMERIC':
					
					if (form_value.search(/^[a-zA-Z_0-9]$/)==-1){
						
						alert('Please enter a valid email address');
						give_elem_focus(d, a)
						return false;
						
					}
					
					break;
				
				case 'RSA_ID':
					
					if (form_value.length>13){
					
						alert('Not a valid South African ID Number: must be 13 digits');
						give_elem_focus(d, a)
						return false;
						
					}
					
					if (isNaN(form_value)){
					
						alert('Not a valid South African ID Number: must be numeric');
						give_elem_focus(d, a)
						return false;
					
					}
					
					if (!check_RSA_ID_checksum(form_value)){
					
						alert('Not a valid South African ID Number: checksum digit mismatch');
						give_elem_focus(d, a)
						return false;
					
					}
					
					break;
			
			}
			
		}	
		
	
	}
	return true;
}

function check_RSA_ID_checksum(form_value){

	// add un-even numbers
	var sum_of_uneven=0;
			
	for (u=0;u<form_value.length;u=u+2){
					
		if (u!=12){
								
			var uneven=form_value.substring(u, u+1);
			uneven=parseInt(uneven);
					
			sum_of_uneven=sum_of_uneven+uneven;
							
		}
							
	}
							
	var list_of_even='';
							
	for (u=1;u<form_value.length;u=u+2){
					
		list_of_even+=form_value.substring(u, u+1);
							
	}
							
	list_of_even=String(list_of_even*2);
							
	var sum_of_even=0;
							
	for (u=0;u<list_of_even.length;u++){
							
		var even=list_of_even.substring(u, u+1);
		even=parseInt(even);
							
		sum_of_even=sum_of_even+even;
							
	}

	var sum_total=String(sum_of_uneven+sum_of_even);
	//alert(sum_total);
	var checksum_digit=String(10-parseInt((sum_total.substring(sum_total.length-1))));
	//var checksum_digit=String(10-sum_total);
	//checksum_digit = checksum_digit.substring(checksum_digit.length-1)
	if(checksum_digit.length > 1){
		
		checksum_digit = checksum_digit[checksum_digit.length - 1]; 
	}
	
	var last_digit=form_value.substring(form_value.length-1);
	
	if (last_digit==checksum_digit){
	
		return true;
	
	}
	
	return false;

}

function get_form_value(d, a){
	
	elem_type=get_elem_type(d, a);
	
	form_value='';
	
	switch (elem_type.toLowerCase()){
		
		case 'text':
		
			form_value=d.elements[a].value;
			break;
		
		case 'textarea':
		
			form_value=d.elements[a].value;
			break;
		
		case 'checkbox':
		
			form_value = d.elements[a].checked ? 'on' : '';
			break;
	
		case 'radio':
		
			// check which one is checked and return its value - else ''
			/*
			for (var i in elem){
				
				if (elem[i].checked){
			
					return elem[i].value;
					
				}
				
			}
			*/
			for (var i=0;i<d.elements[a].length;i++){
			
				if (elem[i].checked){
				
				
					return elem[i].value;
				
				}
			
			}
			
			break;
		
		case 'file':
		
			form_value=d.elements[a].value;
			break;	
		
		// selects without multiple keyword	
		case 'select-one':
		
			form_value = d.elements[a].options[d.elements[a].selectedIndex].value;
			break;	
		
		// selects with mutliple keyword
		case 'select-multiple':
		
			for (a=0; a<d.elements[a].options.length; a++) {
		   
				if (d.elements[a].options[a].selected){
				
					form_value=d.elements[a].options[a].value;					
				}
		    
				if (form_value != ''){
					
					values=values+d.elements[a].name+"="+form_value;
					
					if (a!=(d.elements[a].options.length-1)){
					
						values=values+"&";
					
					}				
				}					
			}
		
			form_value="";
			break;	
	
		default:
		
			form_value=d.elements[a].value;
			break;
	
	}
	
	return form_value;
	
}