// ijAjax, copyright 2008+ Ludovico Grossi - intelliJAM S.r.l.
var Ajaxobj;
function richiestaAjax(url, funzioneLetturaRisposta, tipo) {
    // effettua una richiesta http Ajax all'url specificata, e passa il contenuto alla funzione funzioneLetturaRisposta
    // tipo  opzionale e pu essere "Text" o "XML" - di default "Text"
    if (tipo != 'XML') tipo = 'Text';
    if (window.XMLHttpRequest) {Ajaxobj = new XMLHttpRequest();    }
    else if(window.ActiveXObject) {Ajaxobj = new ActiveXObject("Microsoft.XMLHTTP");}
    else {alert("Il tuo browser non supporta gli oggetti XmlHttpRequest. Meglio aggiornare a Firefox.");return false;}
    callbackF = funzioneLetturaRisposta;
    if (Ajaxobj.readyState == 4 || Ajaxobj.readyState == 0) {
        Ajaxobj.open("GET", url, true);
        Ajaxobj.onreadystatechange = function() { if (Ajaxobj.readyState == 4) eval(callbackF+'(Ajaxobj.response'+tipo+');'); };
        Ajaxobj.send(null);
    }
}

function dgebi(id) {
	return document.getElementById(id);
}

/* presa da php.js "porting php to javascript" tutte o quasi le funzioni di php fatte in js */
function ucfirst( str ) {
    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1, str.length-1);
}
function isDefined(variable) {
    return (typeof(variable) == "undefined")?  false: true;
}

function trim(stringa)	{
	while (stringa.substring(0,1) == ' ')	{	stringa = stringa.substring(1, stringa.length);	}
	while (stringa.substring(stringa.length-1, stringa.length) == ' ')	{	stringa = stringa.substring(0,stringa.length-1);	}
	return stringa;
}
function checkTelefono() {
	var telefono = document.getElementById('telefono').value;
	telefono = trim(telefono);
	if (telefono) {
		var filter = /^((\+[0-9]{2})|(00[0-9]{2}))?[0-9 \./-]{8,20}$/;
		if (!filter.test(telefono))	{
			return false;
		} else {
			formattaTelefono(); // prima controllo e poi formatto: se facessi il contrario otterei quasi sempre qualcosa di corretto
		}
	}
	return true;
}

function formattaTelefono() {
	var telefono = document.getElementById('telefono').value;
	// tolgo tutto ci che non sono numeri (spazio, punto, trattino, slash - altrimenti non sarei qui) o un iniziale "+"
	telefono = telefono.replace(' ','');
	telefono = telefono.replace('.','');
	telefono = telefono.replace('-','');
	telefono = telefono.replace('/','');
	document.getElementById('telefono').value = telefono;
	// avendo usato un replace semplice, devo vedere se  il caso di continuare le sostituzioni
	var filter = /^(\+)?[0-9]{8,20}$/; // attenzione alla lunghezza, deve essere maggiore o uguale a quella della regexp del controllo, altrimenti entro in ciclo infinito
	if (!filter.test(telefono))	{
		return formattaTelefono();
	}
	return true;
}



var timeoutRicerca;
var timeoutEvidenziaRisultati;
var flagEvidenziaRisultati = true;
function ajaxCercaCliente() {
	// effettua una ricerca x secondi (x circa 0.5) dopo l'ultima pressione di un tasto
	// quindi se uno sta scrivendo un nome con una velocit normale, la ricerca partir solo alla fine della parola
	clearTimeout(timeoutRicerca);
	timeoutRicerca = setTimeout(_doAjaxCercaCliente,550);
}
function _doAjaxCercaCliente() {
	// effettua la ricerca in ajax
	nome = document.getElementById('nome').value;
	cognome = document.getElementById('cognome').value;
	telefono = document.getElementById('telefono').value;
	email = document.getElementById('email').value;
	if (!nome && !cognome && !telefono && !email) {
		mostraSuggerimenti('standard');
		return; // non cerco se non metto nulla
	}
	richiestaAjax('../ajax_call/cerca_cliente.php?nome='+escapeAjax(nome)+'&cognome='+escapeAjax(cognome)+'&telefono='+escapeAjax(telefono)+'&email='+escapeAjax(email)+'', '_ajaxContent');

	if (flagEvidenziaRisultati) {
		mostraEvidenziaRisultati();
		// nascondo il layer con l'avviso dopo tot secondi
		setTimeout(nascondiEvidenziaRisultati,6000);
	}
}

function escapeAjax(stringa) {
	return escape(stringa).replace(/\+/g, '%2B').replace(/\%U20AC/gi, '%80');
}

function _ajaxContent(content) {
	document.getElementById('ajax_zone').innerHTML = content;
}
function nascondiEvidenziaRisultati() {
	if (flagEvidenziaRisultati) {
		flagEvidenziaRisultati = false;
		$('evidenzia_risultati').fade(0);
	}
}
function mostraEvidenziaRisultati() {
	$('evidenzia_risultati').fade(1);
}


function ajaxCercaEditTable() {
	// effettua una ricerca x secondi (x circa 0.5) dopo l'ultima pressione di un tasto
	// quindi se uno sta scrivendo un nome con una velocit normale, la ricerca partir solo alla fine della parola
	clearTimeout(timeoutRicerca);
	timeoutRicerca = setTimeout(_doAjaxCercaEditTable,550);
}
function _doAjaxCercaEditTable() {
	// effettua la ricerca in ajax
	q = document.getElementById('editTableArg').value;
	table = document.getElementById('editTableTable').value;
	start = document.getElementById('editTableStart').value;
	limit = document.getElementById('editTableLimit');
	if (limit != null) limit = limit.value
	else limit = 20;
	richiestaAjax('../ajax_call/editTable.php?table='+escapeAjax(table)+'&q='+escapeAjax(q)+'&start='+escapeAjax(start)+'&limit='+escapeAjax(limit), '_ajaxEditTable');
}
function _ajaxEditTable(content) {
	document.getElementById('editTableArea').innerHTML = content;
}

function ajaxDeleteMulti() {
	// manda in ajax una richiesta per cancellare pi� elementi di una tabella
	tmp = '';
	counter = 0;
	// prendo tutti gli id da cancellare
	frm = document.getElementById('editform');
	for(i = 0; i < frm.elements.length; i++) {
		if(frm.elements[i].type=="checkbox" && frm.elements[i].checked) {
			tmp += 'ids[]='+frm.elements[i].value+'&';
			counter++;
		}
	}
	if (tmp == '') {
		alert('Selezionare almeno un elemento');
		return false;
	}
	if (counter == 1) {
		if (!confirm('Cancellare l\'elemento selezionato?')) return false;
	} else {
		if (!confirm('Cancellare i '+counter+' elementi selezionati?')) return false;
	}

	table = document.getElementById('editTableTable').value;

	richiestaAjax('../ajax_call/cancella_record.php?'+tmp+'tabella='+table, '_doAjaxCercaEditTable');

	// magari cancellavo messaggi impostati: aggiorno l'header
	ajaxRefreshHeader(3);
}



function compilaFormDati(idrubrica, nome, cognome, telefono, email) {
	document.getElementById('idrubrica').value = idrubrica;
	document.getElementById('nome').value = nome;
	document.getElementById('cognome').value = cognome;
	document.getElementById('telefono').value = telefono;
	document.getElementById('email').value = email;
	aggiornaCorpoMessaggio();
	nascondiEvidenziaRisultati();
	_doAjaxCercaCliente();
}

function mostraSuggerimenti(quali) {
	try {
		document.getElementById('ajax_zone').innerHTML = document.getElementById('suggerimenti_'+quali).innerHTML;
	} catch (err) {
		// ignoro.
	}
}

function testIE6() {
	// restituisce true se il browser � explorer 6 o minore
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
	 var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
	 if (ieversion <= 6) return true;
	 return false;
	 /*if (ieversion>=8)
	  document.write("You're using IE8 or above")
	 else if (ieversion>=7)
	  document.write("You're using IE7.x")
	 else if (ieversion>=6)
	  document.write("You're using IE6.x")
	 else if (ieversion>=5)
	  document.write("You're using IE5.x")*/
	}
}
function testIE8() {
	// restituisce true se il browser � explorer 8 o maggiore
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
		var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
		if (ieversion >= 8) return true;
		return false;
	}
}

// contenitore moderno e flessibile
// va gestito completamente, sopratutto per chiuderlo se serve con ijOverlayClose()
function ijOverlay(htmlcontent) {
	document.getElementById("overlay_content").innerHTML = htmlcontent;
	if (testIE6()) document.getElementById('main').style.display = 'none';
	document.getElementById("ijOverlay").style.display = '';
}
function ijOverlayClose() {
	if (testIE6()) document.getElementById('main').style.display = '';
	document.getElementById("ijOverlay").style.display = 'none';
}
// utilizza ijOverlay per mostrare un messaggio con pulsante per chiudere
function niceAlert(message, then) {
	return ijOverlay('<div class="niceAlert">'+message+'<br><input type="button" class="ok_button" value="Ok" OnClick="ijOverlayClose();'+then+'"></div>');
}
function niceConfirm(message, then) {
	return ijOverlay('<div class="niceConfirm">'+message+'<br><input type="button" class="ok_button" value="Ok" OnClick="ijOverlayClose();'+then+'"> <input type="button" class="close_button" value="Annulla" OnClick="ijOverlayClose();"></div>');
}

function setFascia(fascia) {
	// metto il valore nel campo hidden
	document.getElementById('fascia_oraria').value=fascia;
	// metto i pulsanti nel giusto stato
	m = document.getElementById('fascia_mattina');
	p = document.getElementById('fascia_pomeriggio');
	s = document.getElementById('fascia_sera');
	subito = document.getElementById('fascia_subito');
	m.className = p.className = s.className = subito.className = 'fascia_up';
	document.getElementById('fascia_'+fascia).className = 'fascia_down';
}

function checkCompilazioneMessaggio() {
	// se sto compilando un messaggio e sto uscendo dalla pagina (quindi perdendo quello che ho scritto), mostro un avviso
	if (document.getElementById('nome') && document.getElementById('cognome')) {
		// se non ho scritto nome o cognome...
		if (document.getElementById('nome').value=='' && document.getElementById('cognome').value=='') {
			//alert('prego');
			return;
		}
		// se sto cambiando volontariamente pagina per�..
		if (document.getElementById('form_target').value=='scelta_modello') return;

		return 'Uscendo dalla pagina si perderanno i cambiamenti correnti'; // questo viene richiamato sull'onUnload
	}
	return;
}

function aggiornaDataScelta() {
	// prendo i campi nascosti con il vero valore delle date

	// e' il modello standard, quello con la data di anticipo?
	if (document.getElementById('text_anticipo')) {
		var data = document.getElementById('data_appuntamento').value;
		var anticipo = document.getElementById('data_avviso').value;
		// poi i campi "scritti", utiliz solo nell'interfaccia
		var text = document.getElementById('text_data_scelta');
		var text_anticipo = document.getElementById('text_anticipo');
		var offset_anticipo = document.getElementById('offset_anticipo');

		if (data == '') return;
		// devo aggiornare anche l'anticipo, se cambio la data lo rimetto un giorno prima
		num_giorni_anticipo = 1; // variabile globale
		aggiornaAnticipo();
	} else {
		var data = document.getElementById('data_avviso').value;
		// poi i campi "scritti", utiliz solo nell'interfaccia
		var text = document.getElementById('text_data_scelta');

		if (data == '') return;
	}
	if (document.getElementById('ricorrenza')) {
		aggiornaTermineRicorrenza();
	}

	// data  nel formato aaaa-mm-dd
	// la devo trasformare in Feb 01, 2009
	tmp = new Date();

	tmp.setYear(data.substr(0,4));
	tmp.setMonth(parseInt(data.substr(5,2), 10) - 1, parseInt(data.substr(8,2), 10)); // il mese si setta con un numero di meno.. ma che roba!
	text.innerHTML = dateFormat(tmp, "ddd dd mmmm yyyy");

	showAnticipo();
	toggleFasciaSubito();
	aggiornaCorpoMessaggio();
}
function showAnticipo() {
	if (!document.getElementById('invio_promemoria')) return;
	document.getElementById('invio_promemoria').style.filter = "alpha(opacity=100)";
	document.getElementById('invio_promemoria').style.opacity = 1;
}
function hideAnticipo() {
	if (!document.getElementById('invio_promemoria')) return;
	document.getElementById('invio_promemoria').style.filter = "alpha(opacity=50)";
	document.getElementById('invio_promemoria').style.opacity = 0.5;
}
function toggleFasciaSubito() {
	// abilita o meno la visualizzazione della fascia subito
	var oggi = new Date();
	var impostata = document.getElementById('data_avviso').value;
	var puls_subito = document.getElementById('fascia_subito');

	// se tmp � uguale ad oggi (almeno nel giorno, mese ed anno...) allora abilito subito, altrimenti disabilito
	if (dateFormat(oggi,"yyyy-mm-dd") == impostata) {
		puls_subito.style.display = 'inline';
	} else {
		puls_subito.style.display = 'none';
		// se il pulsante "subito" era selezionato, lo rimetto a qualcos'altro
		if (document.getElementById('fascia_oraria').value == 'subito') setFascia('mattina');
	}

}
function showCorpoMessaggio() {
	document.getElementById('corpo_messaggio').style.opacity = 1;
	document.getElementById('corpo_messaggio').style.filter = "alpha(opacity=100)";
}
function hideCorpoMessaggio() {
	document.getElementById('corpo_messaggio').style.opacity = 0.5;
	document.getElementById('corpo_messaggio').style.filter = "alpha(opacity=50)";
}
function clickOnCorpoMessaggio() {
	// se clicco sul corpo messaggio, ma non ho ancora compilato i dati, avviso.
	if (document.getElementById('corpo_messaggio').style.opacity == 0.5) {
		niceAlert('Inserisca prima tutti i dati richiesti: <br>il messaggio si comporr&agrave; automaticamente.<br><br>Subito dopo potr&agrave; modificare il messaggio a piacere!');
	}
}
function aggiornaOraScelta() {
	if (!document.getElementById('ora_appuntamento')) return;
	var ora_appuntamento = document.getElementById('ora_appuntamento');
	var hh = document.getElementById('hh');
	var mm = document.getElementById('mm');
	ore = hh.options[hh.selectedIndex].value;
	min = mm.options[mm.selectedIndex].value;
	ora_appuntamento.value = ore+':'+min;
	aggiornaCorpoMessaggio();
}

var num_giorni_anticipo = 1;
var avviso_anticipo_elevato = 0;
function aggiornaAnticipo() {
	var data = document.getElementById('data_appuntamento').value;
	var anticipo = document.getElementById('data_avviso');
	// poi i campi "scritti", utiliz solo nell'interfaccia
	var text_anticipo = document.getElementById('text_anticipo');
	var offset_anticipo = document.getElementById('offset_anticipo');
	if (data == '') return;

	tmp = new Date();
	tmp.setYear(data.substr(0,4));
	tmp.setMonth(parseInt(data.substr(5,2), 10) - 1, data.substr(8,2)); // il mese si setta con un numero di meno.. ma che roba!

	tmpanticipo = new Date(tmp.getTime() - num_giorni_anticipo*1000*60*60*24);
	if (tmpanticipo < new Date()) return anticipoNext();

	anticipo.value = dateFormat(tmpanticipo, "yyyy-mm-dd");
	text_anticipo.innerHTML = dateFormat(tmpanticipo, "ddd dd mmm");

	toggleFasciaSubito();

	if (num_giorni_anticipo == 0) offset_anticipo.innerHTML = '(il giorno stesso)';
	else if (num_giorni_anticipo == 1) offset_anticipo.innerHTML = '(1 giorno prima)';
	else offset_anticipo.innerHTML = '('+num_giorni_anticipo+' giorni prima)';
}
function anticipoPrev() {
	// scorre di un giorno prima la data di anticipo
	if (avviso_anticipo_elevato == 0 && num_giorni_anticipo > 4) {
	 if (!confirm('Un messaggio inviato troppo in anticipo potrebbe non essere utile al cliente. Sicuri di voler continuare?')) {
	 	return;
	 } else {
	 	avviso_anticipo_elevato=1;
	 }
	}
	num_giorni_anticipo += 1; // variabile globale
	return aggiornaAnticipo();
}
function anticipoNext() {
	// scorre di un giorno dopo la data di anticipo
	if (num_giorni_anticipo <= 0) return;
	if (num_giorni_anticipo < 4) avviso_anticipo_elevato = 0;
	num_giorni_anticipo -= 1; // variabile globale
	return aggiornaAnticipo();
}

function textCounter(field_id, cont_id, max) {
	if (!max) max = max_lunghezza_testo_messaggio_editabile;
	campo = document.getElementById(field_id);
	contatore = document.getElementById(cont_id);
	lunghezza_gsm = gsmLenght(campo.value);
	if (lunghezza_gsm > max) {
		tmp = max;
		while (gsmLenght(campo.value.substring(0, tmp)) > max) tmp--;
		campo.value = campo.value.substring(0, tmp);
	} else contatore.innerHTML = max - lunghezza_gsm;
}

function gsmLenght(stringa) {
	// conta i caratteri così come li vede il charset gms
	var filter = /[\u20ac\[\]\\\^\{\}\~\n\|]/g;
	var re = new RegExp(filter);
	return stringa.replace(re, '  ').length;
}

function gotoScegliModello() {
	document.getElementById('form_target').value='scelta_modello';
	document.getElementById('form_nuovo_avviso').submit();
}
function gotoFormMessaggio(modello_scelto) {
	document.getElementById('modello').value=modello_scelto;
	document.getElementById('corpo').value='';
	document.getElementById('form_target').value='nuovo';
	document.getElementById('form_nascosto_modello').submit();
}
function aggiornaCorpoMessaggio() {
	nome = document.getElementById('nome').value;
	cognome = document.getElementById('cognome').value;

	var corpo_messaggio = document.getElementById('corpo_messaggio');
	var str = document.getElementById('copia_corpo_messaggio').value;
	var data_appuntamento;
	var ora_appuntamento;
	var data_avviso;

	// e' il modello standard, quello con la data e l'ora dell'appuntamento?
	if (document.getElementById('data_appuntamento')) {
		data_appuntamento = document.getElementById('data_appuntamento').value;
		ora_appuntamento = document.getElementById('ora_appuntamento').value;

		// la data andr formattata
		if (data_appuntamento) {
			tmp = new Date();
			tmp.setYear(data_appuntamento.substr(0,4));
			tmp.setMonth(parseInt(data_appuntamento.substr(5,2), 10) - 1, data_appuntamento.substr(8,2)); // il mese si setta con un numero di meno.. ma che roba!
			data_appuntamento = dateFormat(tmp, "dddd dd mmmm");
		}
		if (data_appuntamento) str = str.replace(/<giorno>/gi,data_appuntamento);
		if (ora_appuntamento) str = str.replace(/<ore>/gi,ora_appuntamento);
	} else {
		data_avviso = ora_appuntamento = document.getElementById('data_avviso').value;;
	}

	if (nome) str = str.replace(/<nome>/gi,nome);
	if (cognome) str = str.replace(/<cognome>/gi,cognome);

	if (document.getElementById('data_appuntamento') && nome && cognome && data_appuntamento && ora_appuntamento) {
		showCorpoMessaggio();
	} else if (!document.getElementById('data_appuntamento') && nome && cognome && data_avviso) {
		showCorpoMessaggio();
	} else hideCorpoMessaggio();

	corpo_messaggio.value = str;
	textCounter('corpo_messaggio','chars_left');
}

function impostaSelect(idselect, valore_da_selezionare) {
	tmp = document.getElementById(idselect);
	for(var i = 0; i < tmp.options.length; i++) {
		if (tmp.options[i].value == valore_da_selezionare) {
			tmp.options[i].selected = true;
			aggiornaTermineRicorrenza(); // potenzialmente un ciclo di ricorsioni tra funzioni, ma  ok
			return true;
		}
	}
	return false;
}
function aggiornaTermineRicorrenza() {
	// se la ricorrenza e' X mesi, impedisco al termine della ricorrenza di essere espresso in giorni
	// quindi impedisco la selezione di unit di misura inferiori a quella dell'intervallo
	ricorrenza_unit = document.getElementById('ricorrenza_unit');
	ricorrenza_unit_sel = ricorrenza_unit.options[ricorrenza_unit.selectedIndex].value;
	ricorrenza_value = document.getElementById('ricorrenza');
	ricorrenza_value_sel = ricorrenza_value.value;//options[ricorrenza_value.selectedIndex].value;

	termine_unit = document.getElementById('termine_unit');
	termine_unit_sel = termine_unit.options[termine_unit.selectedIndex].value;
	termine_value = document.getElementById('termine');
	termine_value_sel = termine_value.value;//options[termine_value.selectedIndex].value;

	// ripuliamo le cose che non vanno.
	if (parseInt(ricorrenza_value_sel,10) <= 0) {
		ricorrenza_value.value = '1';
		return aggiornaTermineRicorrenza(); // cos� riprendo i dati puliti
	}
	if (parseInt(termine_value_sel,10) <= 0) {
		termine_value.value = '1';
		return aggiornaTermineRicorrenza(); // cos� riprendo i dati puliti
	}



	switch (ricorrenza_unit_sel) {
		case "giorni":
			if (termine_unit_sel == 'giorni' && parseInt(termine_value_sel,10) < parseInt(ricorrenza_value_sel,10)) {
				//return impostaSelect('termine', ricorrenza_value_sel);
				termine_value.value = ricorrenza_value_sel;
			}
			break;
		case "settimane":
			if (termine_unit_sel == 'giorni') impostaSelect('termine_unit', ricorrenza_unit_sel);

			if (termine_unit_sel == 'settimane' && parseInt(termine_value_sel,10) < parseInt(ricorrenza_value_sel,10)) {
				//return impostaSelect('termine', ricorrenza_value_sel);
				termine_value.value = ricorrenza_value_sel;
			}
			break;
		case "mesi":
			if (termine_unit_sel == 'giorni') impostaSelect('termine_unit', ricorrenza_unit_sel);
			if (termine_unit_sel == 'settimane') impostaSelect('termine_unit', ricorrenza_unit_sel);

			if (termine_unit_sel == 'mesi' && parseInt(termine_value_sel,10) < parseInt(ricorrenza_value_sel,10)) {
				//return impostaSelect('termine', ricorrenza_value_sel);
				termine_value.value = ricorrenza_value_sel;
			}
			break;
		case "anni":
			if (termine_unit_sel == 'giorni') impostaSelect('termine_unit', ricorrenza_unit_sel);
			if (termine_unit_sel == 'settimane') impostaSelect('termine_unit', ricorrenza_unit_sel);
			if (termine_unit_sel == 'mesi') impostaSelect('termine_unit', ricorrenza_unit_sel);

			if (termine_unit_sel == 'anni' && parseInt(termine_value_sel,10) < parseInt(ricorrenza_value_sel,10)) {
				//return impostaSelect('termine', ricorrenza_value_sel);
				termine_value.value = ricorrenza_value_sel;
			}
			break;
	}


	// aggiorno la data di ultimo invio
	data_ora_invio = document.getElementById('data_avviso').value;
	if (!data_ora_invio) return;
	richiestaAjax('../ajax_call/calcolaUltimoInvio.php?data_ora_invio='+data_ora_invio+'&ricorrenza='+ricorrenza_value_sel+'&ricorrenza_unit='+ricorrenza_unit_sel+'&termine='+termine_value_sel+'&termine_unit='+termine_unit_sel+'', 'aggiornaTextTermineRicorrenza');
}
function aggiornaTextTermineRicorrenza(valore) {
	document.getElementById('text_termine_ricorrenza').innerHTML = valore;
}

function execFormMessaggio() {
	// effettua i controlli sui campi del form di inserimento nuovo avviso
	idrubrica = document.getElementById('idrubrica');
	replace_avviso = document.getElementById('replace_avviso');
	nome = document.getElementById('nome');
	cognome = document.getElementById('cognome');
	telefono = document.getElementById('telefono');
	email = document.getElementById('email');
	fascia_oraria = document.getElementById('fascia_oraria');
	data_avviso = document.getElementById('data_avviso');
	corpo_messaggio = document.getElementById('corpo_messaggio');
	modello = document.getElementById('modello');

	// facoltativi
	data_appuntamento = document.getElementById('data_appuntamento');
	ora_appuntamento = document.getElementById('ora_appuntamento');
	if (data_appuntamento) data_appuntamento_value = data_appuntamento.value; else data_appuntamento_value = '';
	if (ora_appuntamento) ora_appuntamento_value = ora_appuntamento.value; else ora_appuntamento_value = '';

	// obbligatori in alcuni casi
	var ricorrenza;
	var ricorrenza_unit;
	var termine;
	var termine_unit;

	tmp = document.getElementById('ricorrenza');
	if (tmp != null) ricorrenza = tmp;//.options[tmp.selectedIndex];
	if (!isDefined(ricorrenza)) ricorrenza = ''; else ricorrenza=ricorrenza.value;

	tmp = document.getElementById('ricorrenza_unit');
	if (tmp != null) ricorrenza_unit = tmp.options[tmp.selectedIndex];
	if (!isDefined(ricorrenza_unit)) ricorrenza_unit = ''; else ricorrenza_unit=ricorrenza_unit.value;

	tmp = document.getElementById('termine');
	if (tmp != null) termine = tmp;//.options[tmp.selectedIndex];
	if (!isDefined(termine)) termine = ''; else termine=termine.value;

	tmp = document.getElementById('termine_unit');
	if (tmp != null) termine_unit = tmp.options[tmp.selectedIndex];
	if (!isDefined(termine_unit)) termine_unit = ''; else termine_unit=termine_unit.value;

	var arr_dati_mcancanti = new Array();
	// eventuali avvisi.
	if (!nome.value) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "il nome del cliente";
		//niceAlert('Indicare il nome del cliente','nome.focus()');
		//return false;
	}
	if (!cognome.value) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "il cognome del cliente";
		//niceAlert('Indicare il cognome del cliente','cognome.focus()');
		//return false;
	}
	if (!telefono.value && !email.value) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "un numero di telefono o un indirizzo email del cliente";
		//niceAlert('Indicare il numero di telefono o un indirizzo email del cliente','telefono.focus()');
		//return false;
	}
	if (!data_avviso.value) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "la data del messaggio";
		//niceAlert(data_avviso.value+' &Egrave; necessario impostare la data del messaggio','data_avviso.focus()');
		//return false;
	}
	if (ora_appuntamento && !ora_appuntamento.value) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "l'ora dell'appuntamento";
		//niceAlert('&Egrave; necessario impostare l\'ora dell\'appuntamento','ora_appuntamento.focus()');
		//return false;
	}
	if (telefono.value && !checkTelefono()) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "un numero di telefono valido";
		//niceAlert('Formato del numero di telefono non riconosciuto','telefono.focus()');
		//return false;
	}
	if (email.value && !testEmail(email.value)) {
		arr_dati_mcancanti[arr_dati_mcancanti.length] = "un indirizzo email valido";
		//niceAlert('Formato email non valido', 'email.focus()');
		//return false;
	}

	if (arr_dati_mcancanti.length > 0) {
		tmp = '&Egrave; necessario specificare ';
		for (i = 0; i < (arr_dati_mcancanti.length - 1); i++) {
			if (i > 0) tmp += ', ';
			tmp += arr_dati_mcancanti[i];
		}
		if (arr_dati_mcancanti.length > 1) tmp += ' e ';
		tmp += arr_dati_mcancanti[i];
		niceAlert(tmp);
		return false;
	}


	// se sono qui  andato tutto bene. Richiesta ajax per salvare il messaggio
	richiestaAjax('../ajax_call/salva_avviso.php?corpo_messaggio='+escapeAjax(corpo_messaggio.value)+'&idrubrica='+idrubrica.value+'&replace_avviso='+replace_avviso.value+'&nome='+escapeAjax(nome.value)+'&cognome='+escapeAjax(cognome.value)+'&cellulare_destinatario='+escapeAjax(telefono.value)+'&email_destinatario='+escapeAjax(email.value)+'&data_appuntamento='+data_appuntamento_value+'&ora_appuntamento='+ora_appuntamento_value+'&data_avviso='+data_avviso.value+'&fascia_oraria='+fascia_oraria.value+'&ricorrenza='+escapeAjax(ricorrenza)+'&ricorrenza_unit='+ricorrenza_unit+'&termine='+escapeAjax(termine)+'&termine_unit='+termine_unit+'&modello='+modello.value+'','confermaSalvataggio');
	mostraSuggerimenti('salvataggio');

	// aggiorno l'header
	ajaxRefreshHeader(3);
	return false; // perch cos non esegue il form che ha richiamato questa funzione
}
function continuaExecFormMessaggio(azione) {
	// usato quando il salvataggio si interrompe a causa della domanda sull'utente da aggiornare.
	// non fa controlli, assumendo siano stati fatti prima
	// prende tutti i campi, il form li avr� tutti per semplicit�.
	// i campi sono tutti hidden in questo caso, non ci sono i select.

	// in pi� ho solo l'eventuale utente scelto

	idrubrica = document.getElementById('idrubrica');
	replace_avviso = document.getElementById('replace_avviso');
	nome = document.getElementById('nome');
	cognome = document.getElementById('cognome');
	telefono = document.getElementById('cellulare_destinatario');
	email = document.getElementById('email_destinatario');
	fascia_oraria = document.getElementById('fascia_oraria');
	data_avviso = document.getElementById('data_avviso');
	corpo_messaggio = document.getElementById('corpo_messaggio');

	data_appuntamento = document.getElementById('data_appuntamento');
	ora_appuntamento = document.getElementById('ora_appuntamento');

	ricorrenza = document.getElementById('ricorrenza');
	ricorrenza_unit = document.getElementById('ricorrenza_unit');
	termine = document.getElementById('termine');
	termine_unit = document.getElementById('termine_unit');

	// se sono qui  andato tutto bene. Richiesta ajax per salvare il messaggio
	richiestaAjax('../ajax_call/salva_avviso.php?corpo_messaggio='+escapeAjax(corpo_messaggio.value)+'&nome='+escapeAjax(nome.value)+'&cognome='+escapeAjax(cognome.value)+'&cellulare_destinatario='+escapeAjax(telefono.value)+'&email_destinatario='+escapeAjax(email.value)+'&data_avviso='+data_avviso.value+'&fascia_oraria='+fascia_oraria.value+'&ricorrenza='+escapeAjax(ricorrenza.value)+'&ricorrenza_unit='+ricorrenza_unit.value+'&termine='+escapeAjax(termine.value)+'&termine_unit='+termine_unit.value+'&idrubrica='+idrubrica.value+'&replace_avviso='+replace_avviso.value+'&azione='+azione,'confermaSalvataggio');
	mostraSuggerimenti('gestione_rubrica');

	// aggiorno l'header
	ajaxRefreshHeader(3);
	return false; // perch cos non esegue il form che ha richiamato questa funzione
}
function confermaSalvataggio(content) {
	document.getElementById('blocco_nuovo_avviso').innerHTML = content;
}
function cancellaAvvisoImpostato(id_avviso) {
	// cancella un avviso impostato e rilancia la ricerca per aggiornare
	richiestaAjax('../ajax_call/cancella_avviso.php?id='+id_avviso+'','_doAjaxCercaCliente');
	// aggiorno l'header
	ajaxRefreshHeader(3);
}

function testEmail(email) {
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	return filter.test(email);
}


function deleteRecordEditTable(id, tabella) {
	// cancella un record rilancia la ricerca per aggiornare
	richiestaAjax('../ajax_call/cancella_record.php?id='+id+'&tabella='+tabella,'_doAjaxCercaEditTable');
	// aggiorno l'header
	ajaxRefreshHeader(3);
}


function editForm(id, tipo) {
	// mostra il giusto form di modifica per la tabella specificata.
	richiestaAjax('../ajax_call/scheda_'+tipo+'.php?id='+id+'','ijOverlay');
}
function editFormModello(id, tipo) {
	// mostra il giusto form di modifica per la tabella specificata.
	richiestaAjax('../ajax_call/scheda_modello.php?id='+id+'&tipo='+tipo,'ijOverlay');
}
function deleteModello(id) {
	richiestaAjax('../ajax_call/cancella_modello.php?id='+id,'ajaxRefreshPage');
}
function submitEditForm(tipo) {
	// prendo tutti i campi e li mando al layer stesso
	var qs = '';
	switch (tipo) {
		case "rubrica":
			qs += '&id='+document.getElementById('fld_id').value;
			qs += '&nome='+escapeAjax(document.getElementById('fld_nome').value);
			qs += '&cognome='+escapeAjax(document.getElementById('fld_cognome').value);
			qs += '&cellulare='+escapeAjax(document.getElementById('fld_cellulare').value);
			qs += '&email='+escapeAjax(document.getElementById('fld_email').value);
			qs += '&telefono_fisso='+escapeAjax(document.getElementById('fld_telefono_fisso').value);
			qs += '&alias='+document.getElementById('fld_alias').value;
			qs += '&codice_fiscale='+document.getElementById('fld_codice_fiscale').value;
			qs += '&data_di_nascita='+document.getElementById('fld_data_di_nascita').value;

			qs += '&upd_cellulare='+document.getElementById('upd_cellulare').checked;
			qs += '&upd_email='+document.getElementById('upd_email').checked;

			break;
		case "modello":
			qs += '&id='+document.getElementById('fld_id').value;
			qs += '&nome='+document.getElementById('fld_nome').value;
			qs += '&tipo='+document.getElementById('fld_tipo').value;
			qs += '&testo='+document.getElementById('fld_testo').value;

			break;
	}
	// mando i dati a questo layer, a tutto penser� il php
	richiestaAjax('../ajax_call/scheda_'+tipo+'.php?'+qs,'showOrCloseOverlay');
}
function showOrCloseOverlay(content) {
	// se in content trova "errori", mostra ijOverlay, altrimenti chiude ijOverlay
	var myRegExp = /"errori"/;
	if (content.search(myRegExp) >= 0) {
		ijOverlay(content);
	} else {
		ijOverlayClose();
		myRegExp = /modifica_rubrica/;
		if (content.search(myRegExp) >= 0) _doAjaxCercaEditTable();
		else ajaxRefreshPage();
	}
}

function ajaxRefreshPage() {
	// aggiorna tutta la pagina senza dover usare document.location etc che a volte viene bloccato
	richiestaAjax(document.location,'wholePage');
}
var headerUpdateCount = 0;
function ajaxRefreshHeader(quantevolte) {
	// aggiorna l'header ad intervalli regolari per un massimo di "quantevolte" volte
	if (quantevolte > 0) {
		headerUpdateCount = quantevolte;
		// la prima esecuzione la faccio ritardata, altrimenti potrebbe andare in conflitto con altre richieste ajax
		setTimeout('ajaxRefreshHeader()', 3000);
		return false;
	}
	headerUpdateCount--;
	if (headerUpdateCount < 0) return; // ho terminato le esecuzioni
	richiestaAjax('index.php?sub=soloheader','updateHeader');
	// imposto la prossima esecuzione
	setTimeout('ajaxRefreshHeader()', 3000);
}
function wholePage(content) {
	// usata da ajaxRefreshPage, rimpiazza tutto il contenuto della pagina
	tmp = document.getElementsByTagName('body');
	tmp[0].innerHTML = content;
}
function updateHeader(content) {
	// usata da ajaxRefreshPage, rimpiazza tutto il contenuto della pagina
	document.getElementById('head').innerHTML = content;
}

function addTagModello(tag) {
	obj = document.getElementById('fld_testo');
	// se � giorno o ore, vale solo per il modello standard
	if (tag == 'giorno' || tag == 'ore') {
		tipo = document.getElementById('fld_tipo').value;
		if (tipo != 'standard') {
			alert('Questo tag viene utilizzato solo nel modello standard');
			return false;
		}
	}
	obj.value = trim(trim(obj.value) + ' <'+tag+'>');
	textCounter('fld_testo','chars_left');
	aggiornaAnteprimaModificaModello();
}

function layerCondizioni() {
	richiestaAjax('../index.php?sez=ONLYMAIN&sub=condizioni','niceAlert');
}
function layerPrivacy() {
	richiestaAjax('index.php?sez=ONLYMAIN&sub=privacyregistrati','niceAlert');
}

function showCalendar(id) {
	// il pulsante del calendario ha id 'pulsantecal'+id
	document.getElementById('pulsantecal'+id).click();
}

function ajaxSalvaPostit() {
	// effettua una ricerca x secondi (x circa 0.5) dopo l'ultima pressione di un tasto
	// quindi se uno sta scrivendo un nome con una velocit normale, la ricerca partir solo alla fine della parola
	clearTimeout(timeoutRicerca);
	timeoutRicerca = setTimeout(_doAjaxSalvaPostit,2000);
}
function _doAjaxSalvaPostit() {
	// salva il testo
	testo = document.getElementById('postit').value;
	testo = escapeAjax(testo);
	richiestaAjax('../ajax_call/salva_postit.php?testo='+testo, '_ajaxSalvaPostit');
}
function _ajaxSalvaPostit(content) {
	document.getElementById('postit_notice').innerHTML = content;
	setTimeout("document.getElementById('postit_notice').innerHTML = ''",3000);
}

function impostaModelloPredefinito(id) {
	// richiamo ajax e aggiorno la pagina
	richiestaAjax('../ajax_call/imposta_modello_predefinito.php?id='+id, 'ajaxRefreshPage');
}



function apriChiudiDiv(div_id) {
	tmp = document.getElementById(div_id);
	if (tmp.style.display == 'none') tmp.style.display = 'block';
	else tmp.style.display = 'none';
}

function aggiornaAnteprimaModificaModello() {
	testo_finale = document.getElementById('fld_testo').value;
	testo_finale = testo_finale.replace(/<nome>/gi,'Mario');
	testo_finale = testo_finale.replace(/<cognome>/gi,'Rossi');
	testo_finale = testo_finale.replace(/<giorno>/gi,'Lunedi 15 marzo');
	testo_finale = testo_finale.replace(/<ore>/gi,'16:30');
	document.getElementById('anteprima_modello').innerHTML = testo_finale;
}


function aggiornaAnteprimaMessEFirma() {
	document.getElementById('anteprima_mittente').innerHTML = document.getElementById('intestazione_messaggio').value;
	document.getElementById('anteprima_firma').innerHTML = document.getElementById('firma_messaggio').value;
}

function annullaRichiestaGestioneAccount(email) {
	richiestaAjax('../ajax_call/annulla_richiesta_gestione.php?email='+email, 'ajaxRefreshPage');
}
function annullaRichiestaGestoreAccount(id) {
	richiestaAjax('../ajax_call/annulla_richiesta_gestore.php?id='+id, 'ajaxRefreshPage');
}
function confermaRichiestaGestioneAccount(id) {
	richiestaAjax('../ajax_call/conferma_richiesta_gestione.php?id='+id, 'ajaxRefreshPage');
}
function annullaGestioneAccount(id) {
	richiestaAjax('../ajax_call/cancella_gestione_account.php?id='+id, 'ajaxRefreshPage');
}
function annullaGestoreAccount(id) {
	richiestaAjax('../ajax_call/cancella_gestore_account.php?id='+id, 'ajaxRefreshPage');
}
