/**
 * 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;
			case 'date':
			if(form.elements[rules[i].field].value.length > 0 && !form.elements[rules[i].field].value.match('^\\d\\d\/\\d\\d\/\\d\\d\\d\\d$')){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}
			break;
			case 'match' :
				v1 = form.elements[rules[i].field].value;
				v2 = form.elements[rules[i].expr].value;
				if( v1 != v2){
					ok = false;
					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);
				}
			break;
			case 'minlength':
				len = form.elements[rules[i].field].value.length;
				if(len > 0 && len < 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(typeof(window.ctar) != 'undefined'){
		for(var i = 0; i < ctar.length; i++){
			form.elements[ctar[i]].disabled = false;
		}
	}
}

// for multiple image widget
gf_mimage_ar = [];
gf_mimage_containers = [];

function gf_mimage(name, id, file, percent, web, def){
	this.name = name;
	this.id = id;
	this.file = file;
	this.percent = percent;
	this.web = web;
	this.def = def;
}

function gf_multipleImageDisplay(container, imgs, formname){
	var html = "";
	for(i = 0; i < imgs.length; i++){
		col = i + 1;
		html += gf_midhtml(imgs[i], formname);
		if(i > 0 && col % 3 == 0 || i == imgs.length - 1)
			html += "<div style=\"width: 100%\">&nbsp;</div>\n";
	}
	container.innerHTML = html;
}

function gf_midhtml(img, formname){
	html = "<div style='float: left; margin: 4px; border: 1px solid black; text-align: center; padding: 2px;'>\n";

	html += "<input type=\"hidden\" name=\""+img.name+"[]\" value=\""+img.id+"\">";
	if(img.def == 1)
		s = 'checked';
	else
		s ='';
	html += "<input type=\"radio\" name=\""+img.name+"_defaultid\" value=\""+img.id+"\" "+s+"> Default<br>\n";
	html += "<img style=\"padding: 4px;\" src=\""+def_path+"imageout?file="+escape(img.web+"/"+img.file)+"&scaletype=percent&percent="+img.percent+"\"><br>\n";
	html += "<span style='font-size: 9px; padding: 4px;'>"+img.file+"</span><br>\n";
	html += "<input type=\"button\" name=\"delete_"+img.id+"\" value=\"Delete\" onclick=\"if(window.confirm('Really Delete?')){gf_midelete("+img.id+", '"+img.name+"', '"+formname+"');}\">\n";
	html += "</div>\n";
	return html;
}

function gf_midelete(id, name, formname){
	pid = $('pid-id').value;
	url = def_path + 'formwidget/multipleimagedeleteimage';
	pars = 'id='+id+'&name='+name+'&form='+formname
	req = new Ajax.Request(
		url,
		{
				method: 'post',
				parameters: pars,
				onComplete: gf_midelete_response
		}
	);
}

function gf_midelete_response(resp){
	if(resp.responseText.length > 0){
		r = eval('(' + resp.responseText + ')');
		if(r.success){
			var t = [];
			for(i = 0; i < gf_mimage_ar[r.name].length; i++){
				if(gf_mimage_ar[r.name][i].id != r.id)
					t[t.length] = gf_mimage_ar[r.name][i];
			}
			// make sure an image is selected as default
			def = false;
			for(i = 0; i < t.length; i++){
				if(t.def == 1)
					def = true;
			}
			if(!def && t.length > 0)
				t[0].def = 1;
			gf_mimage_ar[r.name] = t;
			gf_multipleImageDisplay(gf_mimage_containers[r.name], gf_mimage_ar[r.name], r.formname);
		}
	}
}
