// generic client side validation 
function _validate(list, forms_index){

	if(!forms_index){
		forms_index = 0;
	}

	var arr = list.split("|");

	if(arr.length == 0 || arr.length % 2 != 0){
		alert("programmer error: _validate()'s 1st argument; a string of items to validate in the following paired format: 'field_name1|title1|field_name2|title2'");
		return false;
	}

	var i = 0;
	var j = 0;
	var title = "";
	var field_name = "";
	var field_value = "";
	var obj = null;
	var msg = "";
	var focused = false;
	var focusable = true;
	var regexp = '';
	var error_bg_color = "#FFAAAA"; 

	for(i = 0; i < arr.length; i++){

		focusable = true;
		field_name = arr[i];
		field_value = "";
		i++;
		title = arr[i];
		obj = null;
		
		obj = eval("document.forms[" + forms_index + "].elements['" + field_name + "']");

		if(!obj){
			alert("programmer error: _validate() cannot find input named " + field_name + "\nAlso, check forms_index: " + forms_index);
			return false;
		}

		// get value from radio, select or text
		if(obj.type == "select-one"){
			field_value = obj.options[obj.selectedIndex].value;  // select boxes
		}
		else if(obj.length > 1){
			focusable = false;
			for(j = 0; j < obj.length; j++){
				if(obj[j].checked){
					field_value = obj[j].value; 
				}
			}
		}
		else{	
			field_value = obj.value; // text inputs 
		}

		// error messages
		if(field_value.length == 0){
			msg = msg + title + " is required\n";
			if(obj.style){
				obj.style.backgroundColor = error_bg_color; 
			}
			if(!focused && focusable){
				obj.focus();
			}
		}
		else if(field_name.match(/e-?mail/i)){
			if(!field_value.match(/^([a-z0-9_\.\-])+\@(([a-z0-9\-])+\.)+([a-z0-9]{2,4})+$/i)){
				msg = msg + title + " appears to be invalid\n";
				if(obj.style){
					obj.style.backgroundColor = error_bg_color; 
				}
				if(!focused && focusable){
					obj.focus();
				}
			}
		}

		// flag so we only set focus once
		if(msg.length > 0)
			focused = true;
	}

	if(msg.length == 0){
		return true;
	}

	alert(msg);
	return false;

}
