this.step = 0;
fields = new Array();
n_fields = 0;
debug = 0;

// *** ESTENSIONE REGEXP ***
RegExp.prototype.rtest = function (str)
{
	pos1 = this.source.indexOf('{') + 1;
	pos2 = this.source.indexOf(',', pos1) + 1;
	pos3 = this.source.indexOf('}', pos1);
	
	if(pos1 > 1) {
		if(pos2 > 1) {
			minl = this.source.substr(pos1, pos2 - pos1 - 1);
			if(this.source.substr(pos2, pos3 - pos2) != "")
				maxl = this.source.substr(pos2, pos3 - pos2);
			else
				maxl = 0;
		} else
			minl = maxl = this.source.substr(pos1, pos3 - pos1 - 1);
	} else {
		minl = 0;
		maxl = 0;
	}
		
	if(str.length < minl && minl != maxl) {
		car = minl;
		return 1;
	}
	if(str.length > maxl && maxl > 0 && minl != maxl) {
		car = maxl;
		return 2;
	}
	if(str.length != minl && minl == maxl && minl != 0) {
		car = minl;
		return 3;
	}
	if(!this.test(str))
		return 4;
	else
		return 0;
}

// *** FUNZIONI CAMPI ***
function Field (ref, form_id, nome, id, validose, hidden_value, ischeckbox, inquery) {
	this.field_id = ref;
	this.form_id = form_id;
	this.nome = nome;
	this.id = id;
	this.validose = validose;
	this.hidden_value = hidden_value;
	this.ischeckbox = ischeckbox;
	this.inquery = inquery;

	this.valido = 0;
	this.ajax_interval = 0;
	this.ajax_wait = 0;
	this.ajax_result = -1;
	this.start_value = 'asd';
	if (this.hidden_value.length == 0)
		this.key_color = document.getElementById(this.id + '_key').style['color'];
}

Field.prototype.value = function () {
	if (this.hidden_value.length != 0)
		return this.hidden_value;
	else if (this.ischeckbox == 1) {
		i = 1;
		ret = '';
		while (document.getElementById('f_' + this.form_id + '_' + this.id + '_' + i) != undefined) {
			if (document.getElementById('f_' + this.form_id + '_' + this.id + '_' + i).checked)
				ret += i + ',';
			i++;
		}
		ret = ret.substr(0, ret.length - 1);
		return ret;
	}
	else
		return document.getElementById('f_' + this.form_id + '_' + this.id).value;
}

Field.prototype.set_value = function (val) {
	if (this.hidden_value.length == 0 && this.ischeckbox == 0) {
		document.getElementById('f_' + this.form_id + '_' + this.id).value = val;
		this.start_value = val;
	}
}

Field.prototype.field_error = function (num_err) {
	this.valido = 0;
	if (num_err == 1)
		error = 'Il campo ' + this.nome + ' è troppo corto, minimo ' + car + ' caratteri';
	else if (num_err == 2)
		error = 'Il campo ' + this.nome + ' è troppo lungo, massimo ' + car + ' caratteri';
	else if (num_err == 3)
		error = 'Il campo ' + this.nome + ' non è valido, deve essere di ' + car + ' caratteri';
	else if (num_err == 4)
		error = 'Il campo ' + this.nome + ' non è valido, inserire un valore valido';
	else if (num_err == 50)
		error = 'Il campo ' + this.nome + ' contiene un valore che non esiste';
	else if (num_err == 51)
		error = 'Il campo ' + this.nome + ' è stato già utilizzato in precedenza';
	else if (num_err == 6)
		error = 'Il campo ' + this.nome + ' non è uguale a quello precedente';
	else if (num_err == 7)
		error = 'Per il campo ' + this.nome + ' hai selezionato insufficienti opzioni, minimo ' + car;
	else if (num_err == 8)
		error = 'Per il campo ' + this.nome + ' hai selezionato troppe opzioni, massimo ' + car;
	else if (num_err == 9)
		error = 'Per il campo ' + this.nome + ' hai selezionato un numero non valido opzioni, devi selezionarne ' + car;
	else
		error = 'Errore generico, contattare l\'amministratore di sistema indicando l\'indirizzo della pagina in cui si è verificato ed il seguente codice: E'+num_err+'.F'+this.field_id;
	if (this.hidden_value.length == 0) {
		document.getElementById(this.id + '_error').innerHTML = '<font color="#C00">' + error + '</font>';
		document.getElementById(this.id + '_key').style['color'] = '#C00';
	}
}
	
Field.prototype.field_confirm = function () {
	this.valido = 1;
	if (this.hidden_value.length == 0) {
		document.getElementById(this.id + '_error').innerHTML = '';
		document.getElementById(this.id + '_key').style['color'] = this.key_color;
	}
}

Field.prototype.field_reset = function () {
	this.valido = 0;
	if (this.hidden_value.length == 0) {
		document.getElementById(this.id + '_error').innerHTML = '';
		document.getElementById(this.id + '_key').style['color'] = this.key_color;
	}
}

Field.prototype.field_check = function (form_id) {
	if (form_id != this.form_id || (this.value() == this.start_value && this.start_value.length > 0)) {
		this.field_confirm();
		return;
	}

	if (this.validose.charAt(1) == 'p' && this.validose.charAt(2) == 'c')
		return;
		
	if (this.ischeckbox == 1) {
		if (this.value().length > 0) {
			num_arr = this.value().split(',');
			num_vals = num_arr.length;
		} else
			num_vals = 0;
			
		valido_app = ' ' + this.validose;
		pos1 = valido_app.indexOf('{') + 1;
		pos2 = valido_app.indexOf(',', pos1) + 1;
		pos3 = valido_app.indexOf('}', pos1);
		
		if(pos1 > 1) {
			if(pos2 > 1) {
				minl = valido_app.substr(pos1, pos2 - pos1 - 1);
				if(valido_app.substr(pos2, pos3 - pos2) != "")
					maxl = valido_app.substr(pos2, pos3 - pos2);
				else
					maxl = 0;
			} else
				minl = maxl = valido_app.substr(pos1, pos3 - pos1 - 1);
		} else {
			minl = 0;
			maxl = 0;
		}
		
		if (num_vals < minl && minl != maxl) {
			car = minl;
			this.field_error(7);
		
		} else if (num_vals > maxl && maxl > 0 && minl != maxl) {
			car = maxl;
			this.field_error(8);
		
		} else if (num_vals != minl && minl == maxl && minl != 0) {
			car = minl;
			this.field_error(9);
		
		} else
			this.field_confirm();
			
		return;
	}
	
	var totest = this.value();
	if (this.ajax_wait == 0){
		var espressione_est = '';
		if (this.validose.charAt(0) == "%") {
			if (this.validose.charAt(1) == 't' && this.validose.charAt(2) == 's')
				espressione_est = '([01][0-9]|2[0-3])[. :][0-5][0-9]';
			
			else if (this.validose.charAt(1) == 't' && this.validose.charAt(2) == 'v')
				espressione_est = '[0-5][0-9][. :][0-5][0-9]';
			
			else if (this.validose.charAt(1) == 't')
				espressione_est = '([01][0-9]|2[0-3])[. :][0-5][0-9][. :][0-5][0-9]';
			
			else if (this.validose.charAt(1) == 'd')
				espressione_est = '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d';
			
			else if (this.validose.charAt(1) == 'r' && this.validose.charAt(2) == 's')
				espressione_est = '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d ([01][0-9]|2[0-3])[. :][0-5][0-9]';
			
			else if (this.validose.charAt(1) == 'r')
				espressione_est = '(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d ([01][0-9]|2[0-3])[. :][0-5][0-9][. :][0-5][0-9]';
			
			else if (this.validose.charAt(1) == 'v')
				espressione_est = '([1-9][0-9]*|0)[,.]\\d\\d';
			
			else if (this.validose.charAt(1) == 'e')
				espressione_est = '[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+';
			
			else if (this.validose.charAt(1) == 'w')
				espressione_est = '(www.)?[a-z0-9-](\.[a-z0-9-]+)+(.*)';
			
			else if (this.validose.charAt(1) == 'b')
				espressione_arr = new Array(this.validose);

			else if (this.validose.charAt(1) == 'n' ||
					 this.validose.charAt(1) == 'p') {
				if (this.validose.indexOf('(') > 0)   //)
					espressione_char = '(';   //)
				else
					espressione_char = '[';   //]
				espressione_arr = this.validose.split(espressione_char);
				if (this.validose.charAt(1) == 'n' && this.validose.charAt(2) == 'e')
					espressione_est = '[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+';
				else if (this.validose.charAt(1) == 'n' && this.validose.charAt(2) == 'w')
					espressione_est = '(www.)?[a-z0-9-](\.[a-z0-9-]+)+(.*)';
				else
					espressione_est = espressione_char + espressione_arr[1];
			}
			
			if (espressione_est.length > 0) {
				var espressione = new RegExp ('^' + espressione_est + '$');
				if (!espressione.rtest(totest))
					this.field_confirm();
				else
					this.field_error(espressione.rtest(totest));
					
				if (this.valido == 0)
					return;
			}
			
			if (this.validose.charAt(1) == 'b' ||
				this.validose.charAt(1) == 'n') {
				this.ajax_result = -1;
				this.table_check = espressione_arr[0].substr(espressione_arr[0].indexOf('=') + 1);
				if (this.value().length > 0) {
					this.field_ext_check();
					this.ajax_interval = setInterval('fields['+this.field_id+'].field_check_waiting()', 200);
				}
				return;
			}
			
			if (this.validose.charAt(1) == 'p' && this.validose.charAt(2) == 'p') {
				if (fields[this.field_id + 1].value() != this.value()) 
					fields[this.field_id + 1].field_error(6);
				else
					fields[this.field_id + 1].field_confirm();
			}

			return;
		}
		var espressione = new RegExp ('^' + this.validose + '$');
		if (!espressione.rtest(totest))
			this.field_confirm();
		else
			this.field_error(espressione.rtest(totest));

	} else {
		this.field_reset();
		if (this.validose.charAt(1) == 'p' && this.validose.charAt(2) == 'p')
			fields[this.field_id + 1].field_reset();
	}
}

Field.prototype.field_check_waiting = function() {
	if (this.ajax_result != -1) {
		this.ajax_wait = 0;
		clearInterval(this.ajax_interval);
		if ((this.ajax_result == 0 && this.validose.charAt(1) == 'n') ||
			(this.ajax_result == 1 && this.validose.charAt(1) == 'b'))
			this.field_confirm();
		else
			this.field_error(5 + this.ajax_result);
	}
}

Field.prototype.field_ext_check = function (){
	this.ajax_wait = 1;
	var ref = this.field_id;
	var ajax = assegnaXMLHttpRequest();
	if(ajax) {
		ajax.open("post", config_ajax_form_path + "config.ajax_form.php", true);
		ajax.setRequestHeader("connection", "close");

		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		data  = 'param_type=30&';
		data += 'param_table=' + this.table_check + '&';
		data += this.id + "=" + this.value();
		ajax.send(data);

		ajax.onreadystatechange = function() {
			if(ajax.readyState === readyState.COMPLETATO) {
				// verifica della risposta da parte del server
				if(statusText[ajax.status] === "OK") {
					// operazione avvenuta con successo
					result = ajax.responseText;
					fields[ref].ajax_result = result;
				}
			}
		}
	}
	return;
}


// *** FUNZIONI FORM ***
/* VARIABILE this.form_type
 *   10: visualizza elenco
 *     11: inserisci da elenco
 *     12: modifica da elenco
 *       121: popola campi per modifica
 *     13: elimina da elenco
 *   21: inserisci diretto
 *   22: modifica diretto
 *   23: elimina diretto
 *   30: controllo con restituzione id
 *   40: controllo semplice validità campi
 */
function Form () {
	this.form_id = 0;
	this.form_type = -1;
	this.msg_err = '';
	this.msg_conf = '';
	this.table = '';
	this.redirect = '';

	this.step = 0;
	this.valido = 0;
	this.ajax_interval = 0;
	this.ajax_wait = 0;
	this.ajax_result = 0;
	this.query_row = -1;
}

Form.prototype.initialize = function (id, type, msg_err, msg_conf, table, redirect) {
	this.form_id = id;
	this.form_type = type;
	this.msg_err = msg_err;
	this.msg_conf = msg_conf;
	this.table = table;
	this.redirect = redirect;
}

Form.prototype.form_check = function (row) {
	this.ajax_wait = 1;
	f_id = this.form_id;
	var ajax = assegnaXMLHttpRequest();
	if(ajax) {
		ajax.open("post", config_ajax_form_path + "config.ajax_form.php", true);
		ajax.setRequestHeader("connection", "close");

		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		data  = 'param_type=' + this.form_type + '&';
		data += 'param_table=' + this.table + '&';
		if (row >= 0)
			data += 'param_row=' + row + '&';
		data += ' ';
		if (this.form_type == 30) {
			for (i = 0; i < n_fields; i++)
				if (fields[i].validose == '%r' && fields[i].form_id == this.form_id)
					data += fields[i].id + '=' + fields[i].value() + '& ';
		} else {
			for (i = 0; i < n_fields; i++)
				if (fields[i].inquery == 1 && fields[i].form_id == f_id && fields[i].value() != fields[i].start_value)
					data += fields[i].id + '=' + fields[i].value() + '& ';
		}
		ajax.send(data);
		if (debug == 1)
			alert('DATA: ' + data);

		ajax.onreadystatechange = function() {
			if(ajax.readyState === readyState.COMPLETATO) {
				// verifica della risposta da parte del server
				if (debug == 1)
					alert('PAGINA: ' + statusText[ajax.status]);
				if (statusText[ajax.status] === "OK") {
					// operazione avvenuta con successo
					result = ajax.responseText;
					if (debug == 1)
						alert('RESULT: ' + result);
					setTimeout('form_' + f_id + ".ajax_wait = 0;", 0);
					setTimeout('form_' + f_id + '.ajax_result = "' + result + '";', 0);
				}
			}
		}
	}
	return;
}

// Controllo campi
Form.prototype.form_submit = function () {
	if (this.step == 0) {
		document.getElementById('form_error').innerHTML = '';
		this.step = 1;
		if (this.form_type != 30)
			for (i = 0; i < n_fields; i++)
				fields[i].field_check(this.form_id);
			
		this.ajax_interval = setInterval('form_' + this.form_id + ".form_submit_1_wait()", 200);
	}
}

Form.prototype.form_submit_1_wait = function () {
	if (this.step == 1) {
		if (this.form_type != 30) {
			this.ajax_wait = 0;
			for (i = 0; i < n_fields; i++)
				this.ajax_wait = Math.max(this.ajax_wait, fields[i].ajax_wait);
		}
		
		if (this.ajax_wait == 0) {
			clearInterval(this.ajax_interval);
			this.form_submit_2();
		}
	}
}

// Controllo form
Form.prototype.form_submit_2 = function () {
	if (this.step == 1) {
		if (this.form_type != 30) {
			this.valido = 1;
			for (i = 0; i < n_fields; i++)
				this.valido = Math.min(this.valido, fields[i].valido);
			if (this.valido == 0) {
				this.step = 0;
				return;
			}
		}

		if (this.form_type != 40)
			this.form_check();
		this.ajax_interval = setInterval('form_' + this.form_id + ".form_submit_2_wait()", 200);
	}
}

Form.prototype.form_submit_2_wait = function () {
	if (this.step == 1) {
		if (this.ajax_wait == 0) {
			clearInterval(this.ajax_interval);
			this.form_submit_3();
		}
	}
}

// Ultimi controlli e Conferma form
Form.prototype.form_submit_3 = function () {
	if (this.step == 1) {
		if (this.form_type == 30)
			this.valido = Number(this.ajax_result);
		if (this.valido == 1) {
			if (this.msg_conf.length > 0)
				document.getElementById('form_error').innerHTML = '<font color="#090">' + this.msg_conf + '</font>';
			document.getElementById('form_' + this.form_id).action = this.redirect;
			document.getElementById('form_' + this.form_id).submit();
		} else {
			if (this.msg_err.length > 0)
				document.getElementById('form_error').innerHTML = '<font color="#C00">' + this.msg_err + '</font>';
		}

		this.step = 0;
	}
}


// *** FUNZIONI FORM: MODIFICHE E CANCELLAZIONI ***
Form.prototype.populate = function (row) {
	f_id = this.form_id;
	prev_type = this.form_type;
	this.form_type = 121;
	this.ajax_wait = 1;
	var ajax = assegnaXMLHttpRequest();
	if(ajax) {
		ajax.open("post", config_ajax_form_path + "config.ajax_form.php", true);
		ajax.setRequestHeader("connection", "close");

		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		data  = 'param_type=' + this.form_type + '&';
		data += 'param_table=' + this.table + '&';
		data += 'p=' + row + '&';
		data += 'fields=';
		for (i = 0; i < n_fields; i++)
			if (fields[i].inquery == 1)
				data += fields[i].id + ',';
		ajax.send(data);
		if (debug == 1)
			alert('POPULATE DATA: ' + data);

		ajax.onreadystatechange = function() {
			if(ajax.readyState === readyState.COMPLETATO) {
				// verifica della risposta da parte del server
				if (debug == 1)
					alert('POPULATE PAGINA: ' + statusText[ajax.status]);
				if(statusText[ajax.status] === "OK") {
					// operazione avvenuta con successo
					result = ajax.responseText;
					if (debug == 1)
						alert('POPULATE RESULT: ' + result);
					result_array = result.split('|||');
					for (i = 0; i < result_array.length / 2 - 1; i++) {
						for (f = 0; f < n_fields; f++)
							if (fields[f].id == result_array[i * 2])
								break;
						
						if (fields[f].validose == '%d')
							fields[f].set_value(result_array[i * 2 + 1].substr(0, 10));
						else 
							fields[f].set_value(result_array[i * 2 + 1]);
					}
					setTimeout('form_' + f_id + ".ajax_wait = 0;", 0);
					setTimeout('form_' + f_id + ".form_type = " + prev_type + ";", 0);
					visualizza('form_' + f_id, 1);
				}
			}
		}
	}
	return;
}

Form.prototype.row_edit = function (row) {
	if (this.form_type == 12)
		visualizza('form_list_' + this.form_id, 0);
	this.populate(row);
}

Form.prototype.row_delete = function (row) {
	this.form_type = 13;
	this.query_row = row;
	confirm('Sicuro di voler cancellare la riga ' + row + '?');
}

Form.prototype.back_list = function () {
	this.form_type = 10;
	this.query_row = -1;
	visualizza('form_list_' + this.form_id, 1);
	visualizza('form_' + this.form_id, 0);
}
