/**
 * General form validation functions
 * For use with GeneralForm.php class
 */

function gf_validate(form, rules){
	var ok = true;
	var failed = [];
	for(i = 0; i < rules.length; i++){
		switch(rules[i].type){
			case 'required':
			if(form.elements[rules[i].field].value.length == 0){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}
			break;
			case 'email':
				if(!gf_check_email(form.elements[rules[i].field].value)){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}
			break;
			case 'cardexp':
				m = parseInt(form.elements[rules[i].field + '_mnth'].value);
				y = parseInt(form.elements[rules[i].field + '_yr'].value);
				today = new Date();
				if(m < today.getMonth() + 1 && y <= today.getFullYear()){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}

			break;
			case 'allowed':
				if(form.elements[rules[i].field].value.length > 0 && !form.elements[rules[i].field].value.match(rules[i].expr)){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}
			break;
		}
	}
	if(!ok){
		// this is where we call the fail action to show form failures
		// this will eventually be customized as a configurable switch
		gf_clear_error_display(form, rules);
		for(i = 0; i < failed.length; i++){
			gf_error_display(failed[i].field, failed[i].message);
			if(i == 0 && form.elements[failed[0].field])
				form.elements[failed[0].field].focus();
		}
	} else {
		gf_enableFields(form);
	}
	return ok;
}

function gf_rule(field, type, expr, message){
	this.field = field;
	this.type = type;
	this.expr = expr;
	this.message = message;
}

function gf_fail(field, message){
	this.field = field;
	this.message = message;
}

function gf_clear_error_display(form, rules){
	// first unhighlight all fields
	for(var i = 0; i < rules.length; i++){
		Element.hide(rules[i].field+'-error');
		$(rules[i].field+'-error').innerHTML = '';
	}
}

function gf_error_display(field, message){
	$(field+'-error').innerHTML = message + '<br>\n';
	Element.show(field+'-error');
}

function gf_check_email(email){
	    var AtSym = email.indexOf('@');
	  var dot = email.lastIndexOf('.');
	  var space = email.indexOf(' ');
	  var length = email.length - 1;
	if(email.length > 0){
	    if ((AtSym < 1 ) ||   // '@' can't be first
	    	 (dot <= AtSym +1 ) || //one char between '@' and '.'
		     (dot == length - 1) ||  //one char after '.'
		     (space  != -1))  //no spaces allowed
		  {
		  	return false;
		  }
	}
	 return true;
}

function gf_copy_fields(form, elem, cfr, cto){
	cfar = cfr.split(',');
	ctar = cto.split(',');
	for(var i = 0; i < cfar.length; i++){
		if(elem.checked){
			gf_copy_single_field(form, cfar[i], ctar[i]);
			form.elements[ctar[i]].disabled = true;
			eval("form.elements[cfar[i]].onchange = function(){gf_copy_single_field(form, '"+cfar[i]+"', '"+ctar[i]+"');}");
		} else {
			form.elements[ctar[i]].disabled = false;
			form.elements[cfar[i]].onchange = '';
		}

	}
}

function gf_copy_single_field(form, fr, t){
	form.elements[t].value = form.elements[fr].value;
}

function gf_enableFields(form){
	if(ctar){
		for(var i = 0; i < ctar.length; i++){
			form.elements[ctar[i]].disabled = false;
		}
	}
}