// uniValidate: Universal form validator -- 16May2007 Jason Justian
//     EXAMPLES:
//     <form onsubmit="return uniValidate(this)">
//         <input type="text" name="your_name" class="required" />                  (a required field)
//         <input type="text" name="phone" class="required-if-not:email" />         (either phone OR email is required)
//         <input type="text" name="email" class="required-if-not:phone" />
//         <input type="text" name="best_time_to_call" class="required-if:phone" /> (required if phone is filled)
//         <input type="text" name="age_in_years" class="required-nonzero" />       (a nonzero value is required)
//
//     CHECKBOX EXAMPLES
//     (1) Require the college_name field if the college checkbox is selected
//         <input type="checkbox" name="education[]" value="high_school" />
//         <input type="checkbox" name="education[]" value="college" />
//         <input type="text" name="college_name" class="required-if-checked:education[]=college" />
//
//     (2) Require at least one color to be selected
//         <input type="checkbox" name="color[]" value="maize" class="require-choice" />
//         <input type="checkbox" name="color[]" value="blue" class="require-choice" />
//
function uniValidate(f)
{
    var highlight_color = 'yellow';
	var err = 0;
	for (var i=0; i < f.elements.length; i++)
	{
		var e = f.elements[i]; // current element
		var c = e.className.split(' '); // array of class names
		var invalid = false;
		for (var j=0; j<c.length; j++)
		{
		    if (c[j] == 'required' && e.value == '') {invalid = true;}
		    if (c[j] == 'required-nonzero' && !parseFloat(e.value)) {invalid = true;}
		    if (c[j].indexOf('required-if') > -1) {
		        var sc = c[j].split(':'); // sc[0] is the operation; sc[1] is the field name
		        if (sc[0] == 'required-if'     && f[sc[1]].value != '' && e.value == '') {invalid = true;}
		        if (sc[0] == 'required-if-not' && f[sc[1]].value == '' && e.value == '') {invalid = true;}
		        if (sc[0] == 'required-if-checked') {
		        	var isc = sc[1].split('='); // isc[0] is the field name; isc[1] is the value
		        	b = document.getElementsByName(isc[0]);
		        	for (var k = 0; k < b.length; k++)
		        	{
		        		if (b[k].checked == true && b[k].value == isc[1] && !e.value) {invalid = true;}
		        	}
		        }		
		    }
		    if (c[j] == 'require-choice') {
		        var n = e.name;
		        siblings = document.getElementsByName(n);
		        chk = false;
		        for (k = 0; k < siblings.length; k++)
		        {
		            if (siblings[k].checked) {chk = true;}
		        }
		        if (!chk) {invalid = true;}
		    }           
		}
		if (e.nextSibling && e.nextSibling.nodeName == 'LABEL') {
			e.nextSibling.style.backgroundColor = invalid ? highlight_color : '';
		}
		e.style.backgroundColor = invalid ? highlight_color : '';
		err += invalid;
	}
	if (err) {
		alert('Please complete the highlighted field' + (err > 1 ? 's' : ''));
		return false;
	}
	return true;
}