/**
 *
 * @fileoverview General purpose library
 *
 * @filename holjslib.js
 * @requires owjslib.js, YAHOO.lang.JSON
 * @created 2008-05-07
 * @original author Giampaolo Bellavite
 * @copyright Kemen s.r.l.
 * @license Mozilla Public License Version 1.1
 * @version 0.1
 * @$LastChangedDate: 2009-10-22 17:55:39 +0200 (Gio, 22 Ott 2009) $
 * $LastChangedRevision: 613 $
 * $LastChangedBy: faser $
*/

/* Shortcuts per YUI */
var Dom = YAHOO.util.Dom;
var Conn = YAHOO.util.Connect;
var JSON = YAHOO.lang.JSON;
var Effects = YAHOO.widget.Effects;
var Region = YAHOO.util.Region;

if(typeof(HOL) == 'undefined') {var HOL = {}};

HOL.utils = {};

/**
 * Carica l'elenco dei comuni partendo dalla provincia selezionata
 *  
 * @param {Select Element} selectProv Select che contiene la provincia selezionata
 * @param {Select Element} selectComuni Select in cui caricare l'elenco dei comuni
 */
HOL.utils.loadComuni = function(selectProv, selectComuni) {
	var provCodice = ow.form.getSelectValues(selectProv.name);
	if(provCodice=='0') {
		selectComuni.options.length=0;
		return false;
	};
	var callback = {
			success: function(oResult){
				var arrComuni = JSON.parse(oResult.responseText).DATA;
				var l = arrComuni.length;
				selectComuni.options[0] = new Option('',0);				
				for(var i=0;i<l;i++) {
					selectComuni.options[i+1] = new Option(arrComuni[i][1],arrComuni[i][0]);
				}
				HOL.forms.enableSubmit(selectProv.form);
			},
			failure: function(oResult){
				selectComuni.options.length = 0;
				selectComuni.options[0] = new Option('Errore nel caricamento',0);
				HOL.forms.enableSubmit(selectProv.form);
			}
		};
	HOL.forms.disableSubmit(selectProv.form);
	selectComuni.options.length=0;
	selectComuni.options[0] = new Option('Caricamento comuni...',0);
	var oConn = Conn.asyncRequest('GET', '/_ajax.common.cfm?_isXHR=true&method=listComuni&provincia_codice=' + provCodice, callback);
	return false;
};

/**
 * Carica un indirizzo di un cliente dal database, formattato HTML e lo inserisce in un elemento block
 * @param {form Element} form Elemento form con l'indirizzo
 * @param {Integer} idCliente ID del cliente
 * @param {String/HTML element} el Elemento in cui inserire l'indirizzo formattato. Deve contenere l'attiributo pkIndirizzo con il pk dell'indirizzo
 */
HOL.utils.saveAndDisplayAddress = function(form, idCliente, el, name) {
	var el = Dom.get(el);
	var pkIndirizzo = el.getAttribute('pkIndirizzo');
	var callback = {
			success: function(oResult){
				HOL.forms.enableSubmit(form);
				var parsedResponse = JSON.parse(oResult.responseText);
				if (parsedResponse.CFValidationError) {
					
					HOL.forms.catchValidationError(parsedResponse.CFValidationError, 'indirizzo-errore', form);
				}
				else {
					HOL.panels.dialog.hide();
					pkIndirizzo = parsedResponse;
					el.setAttribute('pkIndirizzo',pkIndirizzo);
					/* Ricevo l'indirizzo formattato dal server e lo sositutisco nel layer */
					var callback = {
							success: function(oResult){
								var parsedResponse = JSON.parse(oResult.responseText);
								Dom.get(el).innerHTML = parsedResponse.HTML;
								Dom.get(el).innerHTML += '<span class="more-details">- <a href="##" onclick="return HOL.panels.showAddress('+idCliente+',\''+el.id+'\','+parsedResponse.fatturazione+','+parsedResponse.spedizione+')">cambia</a></span>';
								if (name) {
									Dom.get(el).innerHTML += '<input name="'+name+'" value="'+parsedResponse.id+'" type="hidden">';
								};
							},
							failure: function(oResult){
								Dom.get(el).innerHTML = 'Errore nel caricamento';
							}
						};
					var oConn = Conn.asyncRequest('GET', '/_ajax.common.cfm?_isXHR=true&method=getIndirizzo&idCliente=' + idCliente + '&id=' + pkIndirizzo + '&name=' + name, callback);
				};
			},
			failure: function(oResult){
				HOL.panels.dialog.hide();
				HOL.forms.enableSubmit(form);
				Dom.get(el).innerHTML = 'Errore nel caricamento';
			}
		};
	HOL.forms.disableSubmit(form);
	HOL.forms.cleanValidationError(form,'indirizzo-errore');
	Conn.setForm(form);
	// TODO: validazione errori indirizzo
	var oConn = Conn.asyncRequest('POST', '/_ajax.common.cfm?_isXHR=true&method=updateIndirizzo&idCliente=' + idCliente + '&id=' + pkIndirizzo + '&name=' + name, callback);
	Conn.resetFormState(); 
	return false;
};

/**
 * Mostra/nasconde un layer
 * @param {String/HTML element} trigger Elemento che scatena l'evento
 * @param {String/HTML element} target Layer da mostrare/nascondere
 * @param {String} text1 Testo da mostrare nel trigger quando il layer viene mostrato
 * @param {String} text2 Testo da mostrare nel trigger quando il layer viene nascosto
 */
HOL.utils.showDetails = function(trigger, target, text1, text2) {
	var trigger = Dom.get(trigger);	
	var target = Dom.get(target);
	Dom.setStyle(target,'background-color','white'); // Corregge bug con "alpha" in IE6
	if(Dom.getStyle(target, 'display')!='block') {
		// mostro il target
		Dom.setStyle(target, 'display', 'block');
		Dom.setStyle(target, 'opacity', '100');
		Dom.setStyle(target, 'visibility', 'visible');
		YAHOO.util.Dom.replaceClass(trigger, 'arrow-left', 'arrow-down');
		trigger.innerHTML = text2;
	}
	else {
		var fade = new Effects.Fade(target, {
			seconds: 0.3
		});
		fade.onEffectComplete.subscribe(function(){		
			YAHOO.util.Dom.replaceClass(trigger, 'arrow-down', 'arrow-left');
			trigger.innerHTML = text1;
		});
	};
	return false;
};

/**
 * Invia un messaggio (l'utente deve avere fatto il login)
 * @param {String/HTML element} form Form che contiene il contenuto del messaggio
 * @param {Function} form Form che contiene il contenuto del messaggio
 */

HOL.utils.sendMessage = function (form, onSuccess) {
	if(typeof(onSuccess)!='function') {
		onSuccess = function() { alert('Messaggio inviato.')};
	};
	var form = Dom.get(form);
	var callback = {
			success: function(oResult) {
				HOL.forms.enableSubmit(form);
				var parsedResponse = JSON.parse(oResult.responseText);
				if (parsedResponse.CFValidationError) {
					HOL.forms.catchValidationError(parsedResponse.CFValidationError, 'messaggio-errore', form);
				}
				else {
					var f = onSuccess;
					f();
					
					// nascondo i panel in cui puo' trovarsi il messaggio.
					HOL.panels.dialog.hide();
					HOL.panels.dialogNotModal.hide();
				};		
			},
			failure: function(oResult){
				HOL.panels.showError(oResult);
				HOL.forms.enableSubmit(form);
			}
		};
	HOL.forms.disableSubmit(form);
	HOL.forms.cleanValidationError(form,'messaggio-errore');
	Conn.setForm(form);	
	var oConn = Conn.asyncRequest('POST', '/_ajax.account.cfm?_isXHR=true&method=sendMessage', callback);
	Conn.resetFormState(); 
	return false;
};

HOL.forms = {};

/**
 * Pone il focus sul primo input text trovato all'interno di container
 * 
 * @param {String/HTML Element} container Elemento che contiene il primo input text su cui fare il focus
 */
HOL.forms.focusOnFirst = function(container) {
	var aElements = ow.core.getElementsByTagNames('input,textarea,select', Dom.get(container));
	if (aElements.length) {
		for (var i = 0; i < aElements.length; i++) {
			try {
				if (!(aElements[i].tagName.toLowerCase() == 'input' && aElements[i].type == 'hidden')) {
					aElements[i].focus();
					return;
				};
							} 
			catch (e) {
			// IE6 sembra avere problemi con questo
			};
			};
	}
	return;
};

/**
 * Disattiva i pulsante di submit contenuti in form
 * 
 * @param {String/HTML Element} form Elemento che contiene i submit da disattivare
 */
HOL.forms.disableSubmit = function(form) {
	var aInputs = YAHOO.util.Dom.get(form).getElementsByTagName('input');
	
	if(aInputs.length) {
		for (var i = 0;i<aInputs.length;i++) {
			if(aInputs[i].type=='submit') {
				aInputs[i].disabled=true;
			}
		};
	};
	return;
};

/**
 * Attiva i pulsante di submit contenuti in form
 * 
 * @param {String/HTML Element} form Elemento che contiene i submit da attivare
 */
HOL.forms.enableSubmit = function(form) {
	var aInputs = YAHOO.util.Dom.get(form).getElementsByTagName('input');
	
	if(aInputs.length) {
		for (var i = 0;i<aInputs.length;i++) {
			if(aInputs[i].type=='submit') {
				aInputs[i].disabled=false;
			}
		};
	};
	return;
};


/**
 * Mostra gli errori di validazione di coldfusion
 * @param {object} oError Response da XHR dell'errore owui.validation
 * @param {String/HTML Element} id Elemento in cui mostrare il messaggi di errore
 * @param {String/HTML Element} form Form che ha generato l'errore
 */
HOL.forms.catchValidationError = function(oError, id, form){
	var form = Dom.get(form);
	Dom.addClass('tdError_'+oError.field, 'error');
	Dom.setStyle('tdError_'+oError.field, 'background-color', 'red');
	Dom.get(id).innerHTML = oError.message;
	try {
		form[oError.field].select();
	} 
	catch (e) {
	};

};

/**
 * Pulisce il form dagli errori di validazione
 * @param {String/HTML Element} form Form con i messaggi di errore
 * @param {String/HTML Element} id Elemento contentente il messaggio di errore
 */
HOL.forms.cleanValidationError = function(form,id){
	Dom.get(id).innerHTML = '';
	Dom.getElementsByClassName('error',
								null,
								form,
								function(el) {
									Dom.removeClass(el, 'error');
									Dom.setStyle(el, 'background-color', '');
								}
								);	
};

/**
 * Mostra le righe con class="className" di una tabella contenuta in un form
 * @param {String/HTML Element} form
 * @param {String} className
 * @return {boolean} false
 */	
HOL.forms.showRows = function(form, className){
	var firstSelected = false;
	Dom.getElementsByClassName(className, 'tr', form, function(el){
		Dom.setStyle(el, 'display', '');
	});	
	return false;
};

/**
 * Nasconde le righe con class="className" di una tabella contenuta in un form
 * @param {String/HTML Element} form
 * @param {String} className
 * @return {boolean} false
 */	
HOL.forms.hideRows = function(form, className){
	var firstSelected = false;
	Dom.getElementsByClassName(className, 'tr', form, function(el){
		Dom.setStyle(el, 'display', 'none');
	});	
	return false;
};

/**
 * Invia il form per la proposta
 */
HOL.forms.sendSuggestion = function() {
	var layer = Dom.get('layerSuggest');
	var form = document.forms.frmSuggest;
	var callback = {
		success: function(oResult) {
			HOL.forms.enableSubmit(form);
				var parsedResponse = JSON.parse(oResult.responseText);
				if (parsedResponse.CFValidationError) {
					HOL.forms.catchValidationError(parsedResponse.CFValidationError, 'suggestion-errore', form);
				}
				else {
					layer.innerHTML = '<br/><br/><h3 class="color-lightblue">La richiesta è stata inviata! Grazie!</h3><p><a href="suggest.cfm">Invia una nuova idea</a><br/><br/><br/><br/></p>';
				};
		},
		failure: function(oResult) {
			HOL.forms.cleanValidationError(form,'suggestion-errore');
			layer.innerHTML = "Errore nell'invio :(";
		}		
	};
	HOL.forms.cleanValidationError(form,'suggestion-errore');
	Conn.setForm(form);
	HOL.forms.disableSubmit(form);
	var oConn = Conn.asyncRequest('POST', '/_ajax.common.cfm?_isXHR=true&method=sendSuggestion', callback);
	return false;
};

/*** YUI Panels ***/

HOL.panels = {};

HOL.panels = {
	/**
 	* Inizializza i panels
 	*/
	init: function() {
		/* Panel di errore XHR */
		HOL.panels.error = new YAHOO.widget.Panel("panelError", { 	width:"350px", 
															visible:false, 
															constraintoviewport:true, 
															modal:true, 
															close:true,
															fixedcenter: true
														} );
		
		HOL.panels.error.setHeader("Si è verificato un errore");
		HOL.panels.error.setBody('Si è verificato un errore sul server.');
		HOL.panels.error.render("panelContainer");
		
		/* Finestra per messaggi */
		HOL.panels.dialog = new YAHOO.widget.Panel("panelDialog", { 	width:"450px", 
															visible:false, 
															constraintoviewport:true, 
															modal:true, 
															close:true,
															fixedcenter: true
														} );
		
		HOL.panels.dialog.setHeader("");
		HOL.panels.dialog.setBody("");
		HOL.panels.dialog.render("panelContainer");
		
		// Centra il panel nel viewport
		HOL.panels.dialog.changeBodyEvent.subscribe(function() {
			this.center();
    	});
		
		HOL.panels.dialogNotModal = new YAHOO.widget.Panel("panelDialogNotModal", { 	width:"450px", 
													visible:false, 
													constraintoviewport:true, 
													modal:false, 
													close:true,
													fixedcenter: true
												} );

		HOL.panels.dialogNotModal.setHeader("");
		HOL.panels.dialogNotModal.setBody("");
		HOL.panels.dialogNotModal.render("panelContainer");
	
		
		// Centra il panel nel viewport
		HOL.panels.dialogNotModal.changeBodyEvent.subscribe(function() {
			this.center();
    	});
		
		// alert('width:' + Dom.getViewportWidth() + ' height:' + Dom.getViewportHeight());
		
		/* Finestra per prezzi dei servizi */
		HOL.panels.listino = new YAHOO.widget.Panel("panelListino", { 	width:"450px", 
															visible:false, 
															constraintoviewport:true, 
															modal:false, 
															close:true,
															fixedcenter: true
														} );
		
		HOL.panels.listino.setHeader("");
		HOL.panels.listino.setBody("");
		HOL.panels.listino.render("panelContainer");
		
		
		/* Finestra esempio servizio */
		HOL.panels.docExample = new YAHOO.widget.Panel("panelExample", { 	width:"730px",
															visible:false, 
															constraintoviewport:true, 
															modal:false, 
															close:true,
															context: ['descr','tl', 'tl']
														} );
		
		HOL.panels.docExample.setHeader("Loading...");
		
		HOL.panels.docExample.setBody('<div id="docExample"></div>');
		HOL.panels.docExample.render("panelContainer");
		
		/* Finestra per le cartine del sav */
		HOL.panels.sav = new YAHOO.widget.Panel("sav", { 	width:"940px",
															visible:false, 
															constraintoviewport:true, 
															modal:false, 
															close:true,
															context: ['bd','tl', 'tl']
														} );
		
		HOL.panels.sav.setHeader("Loading...");
		
		HOL.panels.sav.setBody('');
		HOL.panels.sav.render("panelContainer");
		
				
		/* Finestra per individuare le conservatorie */
		HOL.panels.conservatoria = new YAHOO.widget.Panel("panelConservatoria", { 	width:"350px",
															visible:false, 
															constraintoviewport:true, 
															modal:false, 
															close:true,
															fixedcenter: false
														} );
		
		HOL.panels.conservatoria.setHeader("Cerca la conservatoria corretta");
		HOL.panels.conservatoria.setBody("");
		HOL.panels.conservatoria.render("panelContainer");

		
		/* Finestra guida home on line */
		HOL.panels.help = new YAHOO.widget.Panel("panelHelp", { 	width:"350px", 
															height:"400px;", 
															visible:false, 
															constraintoviewport:true, 
															modal:false, 
															close:true
														} );
		
		HOL.panels.help.setHeader("Guida Home On Line");
		HOL.panels.help.setBody('Si è verificato un errore sul server.');
		HOL.panels.help.setFooter('<a href="/hol/contact.cfm" target="_blank">Contatta un operatore</a> | <a href="/help" target="_blank">Aiuto/FAQ</a>');
		HOL.panels.help.render("panelContainer");
		HOL.panels.help.moveTo(Dom.getViewportWidth(), 0);	
	},
	
	/**
	 * Mostra il panel con l'errore
	 * @param {object} oResult Result proveniente da YAHOO.util.Connect
	 */
	showError: function (oResult) {
		var parsedResponse = {};
		var body  = "";
		
		try {
			parsedResponse = JSON.parse(oResult.responseText);
			if(typeof(parsedResponse.CFRequestError)!==null) {
				var errorNumber = parsedResponse.CFRequestError.errorNumber;
				body += parsedResponse.CFRequestError.body;
				body += "<p>Il webmaster è stato avvisato dell'errore.</p>";
				body += "<p align='center' style='margin-top:4px'><a href='javascript:;' onclick='HOL.panels.error.hide()'><b>Chiudi</b></a> o <a href='javascript:location.reload()'>ricarica la pagina</a></p>";
				
				HOL.panels.error.setBody(body);
			};
		}
		catch (err) {
			if(oResult.statusText=='communication failure') return;
			body += "Messaggio di errore: " + oResult.statusText;
			body += "<p style='margin-top:10px;text-align:center'>";
			body += "<a href='javascript:;' onclick='HOL.panels.error.hide()' class='color-lightblue'>";
			body += "<b>Chiudi</b></a></p>";			
			HOL.panels.error.setBody(body);
		};
		
		HOL.panels.error.show();
	},
	/**
	 * Carica il prezzo dei servizi
	 * @param {numeric} id Id del servizio
	 * @param {string} titolo Titolo del servizio
	 * @param {string/HTML Element} el Elemento vicino al quale posizionare il prezzo
	 */
	showPrezzi: function (id, titolo, el) {
		var panel = HOL.panels.listino;
		var region = Dom.getRegion(el);
		var panelWidth = panel.cfg.getProperty('width').replace('px','');
		panel.setBody('Caricando...');
		panel.setHeader('Prezzi di ' + titolo);
		var callback = {
			success: function(oResult) {
				panel.setBody(oResult.responseText);
			},
			failure: function(oResult) {
				panel.setBody('Errore nel caricamento.');
			}			
		};
		var oConn = Conn.asyncRequest('GET', '/_ajax.common.cfm?_isXHR=true&method=prezzoServizio&id='+id, callback);
		panel.show();
		// sposto la finestra accanto all'elemento
		panel.moveTo(region.right-panelWidth, region.top);
	},
	
	/*
	 * Mostra un panel con un messaggio
	 */
	showMessage: function (header, body) {		
		HOL.panels.dialog.setHeader(header);
		HOL.panels.dialog.setBody(body);		
		HOL.panels.dialog.show();
	},
	
	/*
	 * Carica un template e lo mostra nel panel message
	 */
	showDialogContent: function(title, url, modal, panel) {
		if(modal===undefined) {
			modal=true;
		};
		if (panel === undefined) {
			var panel = modal ? HOL.panels.dialog : HOL.panels.dialogNotModal;
		};
		panel.setHeader(title);			
		panel.setBody('Caricando...');		
		var callback = {
			success: function(oResult) {
				panel.setBody(oResult.responseText);
				HOL.forms.focusOnFirst(panel.body);
			},
			failure: function(oResult) {
				panel.setBody('Errore nel caricamento.');
			}			
		};
		var oConn = Conn.asyncRequest('GET', url, callback);		
		panel.show();
		return false;
	},
	
	
	/**
	 * Mostra il panel con la guida in linea
	 * @param {string} pkVoce Voce di cui mostrare la guida
	 * @param {string/HTML Element} trigger Elemento che cliccato richiama la guida
	 */
	showHelp: function (pkVoce, trigger) {
		var panel = HOL.panels.help;		
		
		if(trigger) {
			trigger = Dom.get(trigger);
			var region = Dom.getRegion(trigger);
			panel.moveTo(region.right+350, region.top);			
		};
		panel.setBody('Caricando...');		
		var callback = {
			success: function(oResult) {
				var parsedResponse = JSON.parse(oResult.responseText);
				panel.setBody('<h3 class="color-lightblue">'+parsedResponse.header+'</h3>'+'<p>'+parsedResponse.body+'</p>');
			},
			failure: function(oResult) {
				panel.setBody('Errore nel caricamento.');		
				//HOL.panels.showError(oResult);
			}			
		};
		var oConn = Conn.asyncRequest('GET', '/_ajax.common.cfm?_isXHR=true&method=getVoce&id='+pkVoce, callback);		
		panel.show();
	},
	
	/**
	 * Mostra il panel con i dati del bonifico bancario
	 */
	showDatiBonifico: function () {
		return HOL.panels.showDialogContent('Bonifici bancari a Home On Line', 
										    '/_ajax.common.cfm?_isXHR=true&method=datiBonifico', 
									        false);
	},
	/**
	 * Mostra il panel con gli orari di apertura
	 */
	showOrariApertura: function () {
		return HOL.panels.showDialogContent('Orari di apertura dei nostri uffici', 
										    '/_ajax.common.cfm?_isXHR=true&method=orariApertura', 
								         	 false);
	},
	
	/**
	 *  Alert temporaneo per malfunzionamento numero verder
	 */
	showAlertNumeroVerde: function() {
		return HOL.panels.showDialogContent('Temporanei problemi tecnici', 
										    '/_ajax.common.cfm?_isXHR=true&method=alertNumeroVerde', 
								         	 false);		
	},
	
	/**
	 * Mostra la finestra per modificare/inserire un indirizzo
	 * @param {integer} idCliente Id del cliente
	 * @param {string} el ID dell'elemento HTML in cui mostrare l'indirizzo. Deve avere un attributo pkIndirizzo con il pk dell'indirizzo
	 * @param {boolean} fatturazione Indica se l'indirizzo e' da usare per la fatturazione
	 * @param {boolean} spedizione Indica se l'indirizzo e' da usare per la spedizione
	 * @param {string} name Nome del campo hidden con l'id dell'indirizzo 
	 */
	showAddress: function (idCliente, el, fatturazione, spedizione, name) {
		var pkIndirizzo = Dom.get(el).getAttribute('pkIndirizzo');
		var title = pkIndirizzo!=0 ? 'Modifica indirizzo' : 'Aggiungi indirizzo';
		var url = '/_ajax.common.cfm?_isXHR=true&method=windowEditIndirizzo&id='+pkIndirizzo+'&idCliente='+idCliente+'&el='+el+'&spedizione='+spedizione+'&fatturazione='+fatturazione+'&name='+name;
		return HOL.panels.showDialogContent(title, url, true);
	},
	
	/**
	 * Mostra la finestra con l'informativa sulla privacy
	 * @param {HTML element} id id della checkbox da da checckare cliccando su Accetto
	 */
	showPrivacy: function (id) {
		return HOL.panels.showDialogContent('Informativa sulla privacy', 
										     '/_ajax.common.cfm?_isXHR=true&method=privacy&id='+id, 
								         	 false);
	},	
		
	/**
	 * Mostra la finestra per recuperare la password
	 */
	showRecoverPassword: function () {
		var callback = {
			success: function(oResult){
				HOL.panels.dialog.setBody(oResult.responseText);
				Dom.get('recover_email').focus();				
			},
			failure: function(oResult){			
				HOL.panels.dialog.setBody("Errore nel caricamento.");
			}
		};
		HOL.panels.showMessage('Recupera la password', 'Loading...');
		var oConn = Conn.asyncRequest('POST', 
									  '/_ajax.common.cfm?_isXHR=true&method=showRecoverPassword', 
									  callback);							  
		return false;
	}
	
};

// Inizializza i panels al caricamento della pagina.
YAHOO.util.Event.addListener(window, "load", HOL.panels.init);
