/*
FUNZIONI CONTROLLO FORM
*/
function setup() {
	xmlDoc = null ;
	err_div = document.getElementById('mess_err');
	std_color = "#FFFFFF";
	err_color = "yellow";

	// messaggi di errore
	errMess = new Object();
	errMess.vuoto = "[ nessun valore ]";
	errMess.flag_obblig = "obbligatorio inserire un valore";
	errMess.lung_max = "lunghezza superiore al massimo";
	errMess.lung_min = "lunghezza inferiore al minimo";
	errMess.tipo_var_N = "inserito un valore non numerico";
	errMess.tipo_var_D = "inserita una data errata";
	errMess.tipo_var_E = "indirizzo di email errato";
	errMess.tipo_var_F = "errore nel caricamento del file";
	errMess.tipo_var_U = "indirizzo web errato";
	errMess.check_func = "valore non corretto o non ammesso";
	errMess.range = "valore esterno all'intervallo consentito";
	errMess.min_max_val = "valori min/max errati";
	errMess.min_max = "valori min/max incongruenti";
	errMess.max_opt = "scelte troppe opzioni";
	// gestione CAP, Provincia
	errMess.CAPnok = 'CAP inesistente';
	errMess.lenCAPnok = 'Lunghezza CAP errata';
	// template mess. err.
	errMess.template = new Template('#{label} = #{value} : #{mess}');

	// creazione oggetti Controllo
	setupFormControls();
	ctr_fields = new Array;
	var el;
	for (var i=0; i< thisForm.elements.length; i++) {
		el = thisForm.elements[i];
		if(typeof(el.ctr) == 'undefined') continue;
		if(el.ctr.default_value) el.value = el.ctr.default_value;
		if (el.type == 'textarea') {
			if(el.ctr.maxlength > 0) {
				el.onkeydown = el.onkeyup = checkMaxlength;
				el.onblur = hideMaxlengthCounter;
			}
		}
		else {
			el.onkeypress = function(event) {return checkInputChar(this, event)};
		}
		ctr_fields.push(el);
	}
	
	// labels da modificare per segnalare errori o char count
	var doc_labels = document.getElementsByTagName('label');	
	var label, field_name;
	for (var i=0; i < doc_labels.length; i++) {
		label = doc_labels[i];

		field_name = label.htmlFor;
		// l'attributo "htmlFor" contiene il nome del campo
		if( el = $(field_name) ) {
			el.ctr.label_for = label;
			el.ctr.flag_obblig == 1 ? 
				label_content = el.ctr.label+' '+mandatory_field_icon :
				label_content = el.ctr.label ;
			if (debug) {
				label_content = "<a href=\"#\" onclick=\"show_controllo('"+field_name+"'); Effect.Appear('debug_div');" +'return false;">'+label_content+"</a>";
			}
			label.innerHTML = label_content ;			
		}
	}
}

function show_controllo(field_name) {
	$('debug_div_inner').innerHTML = $(field_name).ctr.toString('<br />');
}

// oggetto controllo - inizializza tutte le var
function Controllo(label, flag_obblig, tipo_var, num_dec, maxlength, check_func, min, max, default_value, allow_html) {
	this.label = label||'campo';
	this.flag_obblig = flag_obblig||0;
	this.tipo_var = tipo_var;
	this.num_dec = num_dec||0;
	this.maxlength = maxlength||0;
	this.check_func = check_func||'';
	this.min = min||0;
	this.max = max||0;
	this.default_value = default_value||'';
	this.allow_html = (allow_html==1)||false;
	this.charset = null;
	this.label_for = null;
	this.charset = null;
	this.char_left_div = null;
}

// oggetto controllo
Controllo.prototype.toString = function(sep) {
	sep = sep||"\n";
	var props = new Array('label', 'flag_obblig', 'tipo_var', 'num_dec', 'maxlength', 'check_func', 'min', 'max', 'default_value', 
		'allow_html', 'charset', 'char_left_div');
	var ctr_template = '';
	for (var i=0;i<props.length;i++) {
		ctr_template += props[i]+' = #{'+props[i]+'}'+sep;
	}
	ctr_template = new Template(ctr_template);
	return ctr_template.evaluate(this);
}

function stringFill(s, fill_char, n_pos, side) {
	side |= 'l';
	var filling = '';
	n_pos.times( function () {filling += fill_char} )
	if (side == 'r') return (s+filling).substring(0,n_pos);
	return (filling+s).slice(-n_pos);
}


//	ONSUBMIT: controllo finale
function checkSubmit () {
	var retval = true;
	var field_control_result, el;
	err_div.innerHTML = '';
	for (var i=0; i<ctr_fields.length; i++) {
		el = ctr_fields[i];
		field_control_result = checkMandatoryField(el);
		if (field_control_result) {
			if (el.value.empty()) continue;
			field_control_result = checkFieldRange(el);
			field_control_result = field_control_result && checkFieldFunc(el);
		}
		field_control_result ? el.style.backgroundColor=std_color : el.style.backgroundColor=err_color;
		retval &= field_control_result;
	}

	if (retval) {
		if (! (checkCAPLen()) ) {
			retval = false;
			addErrMess($('cap').ctr.label, $('cap').value, errMess.lenCAPnok);
		}
	}
	return (retval==1);
}

// ONRESET
function resetForm () {
	thisForm.reset;
	for (var i=0; i< ctr_fields.length; i++) {
		var el = ctr_fields[i];
		el.style.backgroundColor=std_color;
		if (el.ctr.default_value) {
			el.value = el.ctr.default_value;
		}
	}
	err_div.innerHTML = '';
}

// CONTROLLI SUI CAMPI

// controllo su car. input
function checkInputChar(el,evt) {
	var keynum, keychar, pattern;
	// IE
	if(window.event) {
		keynum = window.event.keyCode;
	}
	// Netscape/Firefox/Opera
	else if(evt.which)	{
		keynum = evt.which;
	}
	// caratteri speciali - da testare
	if (keynum === undefined || keynum < 32 ) return true;
	keychar = String.fromCharCode(keynum);
	// pattern_text non specificato
	if(el.ctr.charset) {
		pattern = new RegExp(el.ctr.charset);
	}
	else {	
		switch (el.ctr.tipo_var) {
			case 'N':
				pattern = new RegExp("\\d");
				break;
			case 'D':
				pattern = new RegExp("(\\d|-|/)");
				break;
			case 'U':
			case 'E':
				pattern = new RegExp("[^ ]");
				break;
			default:
				return true;
		}
	}
	return pattern.test(keychar);
}


// campo obbligatorio ?
function checkMandatoryField(el) {
	if(el.ctr.flag_obblig != 1) return true;
	switch (el.type) {
		case 'radio':
			if (el.checked) return true;
			break;
		case 'select-one':
			if (el.options[ el.selectedIndex ].value != '') return true;
			break;
		case 'checkbox':
			alert(el.checked);
			if (el.checked) return true;
			break;
		case 'select-multiple':
			for (op in el.options) {
				if (op.selected) return true;
			}
			break;
		default:
			if (el.value > '') return true;
			break;
	}
	addErrMess(el.ctr.label, '[ vuoto ]', errMess.flag_obblig);
	return false;
}

// check_func finale
function checkFieldFunc(el) {
	if(el.ctr.check_func) {
		if (typeof(el.ctr.check_func) == 'function') {
			el.ctr.check_func();
		}
		else {
			var pattern = new RegExp(el.ctr.check_func);
			if (! (pattern.test(el.value))) {
				addErrMess(el.ctr.label, el.value, errMess.check_func);
				return false;
			}
		}
	}
	return true;
}

// valore entro un range
function checkFieldRange(el) {
	var retval = true;
	if(el.ctr.min) retval = (el.value >= el.ctr.min);
	if(el.ctr.max) retval &= (el.value <= el.ctr.max);
	if (! retval) addErrMess(el.ctr.label, el.value, errMess.range);
	return retval;
}

// controlla lungh. max di textarea e scrive il contatore
function checkMaxlength() {
	retval = true;
	if(this.ctr.maxlength >0) {
		if (this.value.length > this.ctr.maxlength) {
			this.value = this.value.substring(0, this.ctr.maxlength);
			retval = false;
		}
		else {
			// sezione da creare
			if (! (this.ctr.char_left_div) ) {
				this.ctr.char_left_div = document.createElement("div");
				this.ctr.char_left_div.setAttribute('id', this.name+"_char_left");
				insertAfter(this.ctr.label_for, this.ctr.char_left_div);
			}
			var char_left = this.ctr.maxlength-this.value.length;
			this.ctr.char_left_div.innerHTML="caratteri residui <b>"+ char_left +"</b><br />su <b>"+this.ctr.maxlength+"</b> disponibili";
		}
	}
	return retval;
}

function hideMaxlengthCounter() {
	if(this.ctr.char_left_div) {
		this.ctr.char_left_div.innerHTML="inseriti <b>"+ this.value.length +"</b> caratteri<br />su <b>"+this.ctr.maxlength+"</b> disponibili";
	}
}

// aggiunge mess. di errore all'area
function addErrMess(field_label, field_value, mess) {
	err_div.innerHTML += errMess.template.evaluate({ label:field_label, value:field_value, mess:mess})+'<br />';
}

// aggiunge newNode a referenceNode
function insertAfter( referenceNode, newNode ) {
	referenceNode.parentNode.insertBefore( newNode, referenceNode.nextSibling );
}

/*
	GESTIONE CAP+COMUNE+PROVINCIA
*/

function loadXML(url, process) {
	new Ajax.Request(url, {
		method: 'get',
		onComplete: function(transport) { process(transport.responseXML); },
		onFailure: function(transport) {alert("Errore caricamento XML:"+transport.status);}
	});
}


// get file XML con lista dei comuni se CAP = 5
function loadComuni() {
	if (checkCAPLen()) {
		loadXML('http://www.aster.it/eventi/sel_CAP.php?CAP='+$('cap').value, getListaComuni);
		return true;
	}
	alert(errMess.lenCAPnok);
	return false;
}

function checkCAPLen () {
	if ($('cap').value.length == 5) return true;
	return false;
}

// get file XML con dati del comune scelto
function getPt(id_com) {
//	loadXML('http://www.aster.it/eventi/sel_CAP.php?COD='+$('lista_com').value, getComune);
	loadXML('http://www.aster.it/eventi/sel_CAP.php?COD='+id_com, getComune);
}

// crea lista comuni
function getListaComuni(xmlDoc) {
	var oplist = xmlDoc.getElementsByTagName('comune');
	if (oplist.length == 0) {
		resetComuni();
		alert(errMess.CAPnok);
		return false;
	}
	
	popList($('lista_com'), oplist);
	if (oplist.length == 1) {
		getPt($('lista_com')[0].value);
	}
	return true;
}

// get file XML con dati del comune scelto
function getComune(xmlDoc) {
	var comune = xmlDoc.getElementsByTagName('comune');
	var pt_txt = getNodePt(comune[0], 'nome');
	$('comune').value = comune[0].childNodes[pt_txt].firstChild.nodeValue;
	pt_txt = getNodePt(comune[0], 'provincia');
	$('provincia').value = comune[0].childNodes[pt_txt].firstChild.nodeValue;
/*	pt_txt = getNodePt(comune[0], 'prefTel');
	$('Pref_Tel').value = comune[0].childNodes[pt_txt].firstChild.nodeValue;
	if (! typeof(Pref_Fax) === 'undefined') 	$('Pref_Fax').value = $('Pref_Tel').value;
*/
	return true;
}

function empty(form_element) {
	if (typeof(form_element) === 'undefined') return;
	form_element.value = '' ;
}


function popList (list, oplist) {
	pt_txt = getNodePt(oplist[0], 'text');
	pt_val = getNodePt(oplist[0], 'value');
	list.length = 0;
	for (i=0;i<oplist.length;i++) {
		list.options[i] = new Option(oplist[i].childNodes[pt_txt].firstChild.nodeValue, oplist[i].childNodes[pt_val].firstChild.nodeValue);
	}
}

function getNodePt (node, varName) {
	for (i = 0; i < node.childNodes.length; i++)	{
		if (node.childNodes[i].nodeName == varName) {
			return i;
		}
	}
}

function resetComuni() {
	$('provincia').clear();
	$('comune').clear();
//	$('Pref_Tel').clear();
//	$('Pref_Fax').clear();
	$('lista_com').length = 0;
	$('lista_com').options[0] = new Option('-- inserisci il CAP --', '');
}

