/**
 * 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; 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 = [];
