/** * 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 'password':				if(!$('password1').value == $('password2').value){					ok = false;					failed[failed.length] = new gf_fail(rules[i].field, rules[i].message);				}			break;			case 'terms':				if($('terms').checked == false){					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);		}	}}/** * Handle textlist widget order change */function gf_textlist_onchange(me){	var elem = $(me+'-ul');	var items = Sortable.sequence(elem).toString();	var order = items.split(',');	var vals = [];	var value = '';	for(var i=0; i < order.length && items; i++){		workelem = me+'-val_'+order[i];		vals[vals.length] = $(workelem).innerHTML;	}	value = vals.join('|');	$(me+'-id').value = value;}function gf_textlist_makeedit(e){	elem = Event.element(e);	ar = elem.id.split('-');	// extract the base name	name = ar[0];	gf_textlist_removeclicks(name);	seq = Sortable.sequence(name+'-ul');	Sortable.destroy(name+'-ul');	current = elem.innerHTML;	inp = "<input type='text' value=\""+current+"\" id=\""+name+"-newvalue\" size='40'>";	inp += "<input type='button' value='save' onClick=\"gf_textlist_save('"+elem.id+"', '"+name+"')\">";	inp += "<input type='button' value='delete' onClick=\"gf_textlist_delete('"+elem.id+"', '"+name+"')\">";	inp += "<input type='button' value='cancel' onClick=\"gf_textlist_cancel('"+elem.id+"', '"+name+"')\">";	elem.innerHTML = inp;	gf_textlist_currentval[name] = current;}function gf_textlist_save(id, name){	val = $(name+'-newvalue').value;	if(val != ''){		elem = $(id);		elem.innerHTML = val;		gf_textlist_createsortable(name);		gf_textlist_onchange(name);		gf_textlist_currentval[name] = null;	} else {		alert('Entry may not be blank');	}}function gf_textlist_delete(id, name){	gf_textlist_currentval[name] = null;	Element.remove(id);	gf_textlist_createsortable(name);	gf_textlist_onchange(name);}function gf_textlist_cancel(id, name){	elem = $(id);	elem.innerHTML = gf_textlist_currentval[name];	gf_textlist_currentval[name] = null;	gf_textlist_createsortable(name);}function gf_textlist_addclicks(name){	list = Element.descendants(name+'-ul');	for(i = 0; i < list.length; i++){		Event.observe(list[i], 'dblclick', gf_textlist_makeedit);	}}function gf_textlist_removeclicks(name){	list = Element.descendants(name+'-ul');	for(i= 0 ; i < list.length; i++){		Element.stopObserving(list[i], 'dblclick', gf_textlist_makeedit);	}}function gf_textlist_getnextid(name){	list = Element.descendants(name+'-ul');	max = 0;	for(i = 0; i < list.length; i++){		ar = list[i].id.split('-val_');		var val = parseInt(ar[ar.length-1]);		if( max < val)			max = val;	}	max++;	return max;}function gf_textlist_add(me){	valelem = $(me+'-add-id');	val = valelem.value;	if(val.length > 0){		items = $(me+'-ul');		nextid = gf_textlist_getnextid(me);		newchild = Builder.node('li', {id:me+'-val_'+nextid});		newchild.innerHTML = val;		items.appendChild(newchild);		gf_textlist_createsortable(me);		valelem.value = '';		gf_textlist_onchange(me);	}}function gf_textlist_createsortable(name){	gf_textlist_removeclicks(name);	gf_textlist_addclicks(name);	Sortable.create(name+'-ul',	{		onChange: function(){			gf_textlist_onchange(name);		}	});}gf_textlist_currentval = [];