/**
 *
 * @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:: 2011-02-14#$
 * $LastChangedRevision: 4107 $
 * $LastChangedBy: andrea $
*/

/* 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, usevalue) {
	// se usevalue è false le option hanno sia il value che la label proveniente dal campo letterale.
	var usevalue = (usevalue == undefined) ? false : usevalue;
	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++) {
					if(!usevalue) {
						selectComuni.options[i + 1] = new Option(arrComuni[i][1], arrComuni[i][0]);
					}else{
						selectComuni.options[i + 1] = new Option(arrComuni[i][1], arrComuni[i][1]);
					}
				}
				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 {
					$.fancybox.close();
					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.windowBox.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){
				$.fancybox.close();
				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;
};

/**
 * Aggiunge e configura cluetip a tutti gli elementi a con classe "help"
 */
HOL.utils.setTooltip = function(){
	$('a.help').cluetip({
		showTitle: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.
					$.fancybox.close();					
				};		
			},
			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 e button 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].type=='button' ) {
				aInputs[i].disabled=true;
				aInputs[i].setAttribute("disabled","disabled");
			}
		};
	};
	return;
};

/**
 * Attiva i pulsanti di submit e button 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].type=='button') {
				aInputs[i].disabled=false;
				aInputs[i].removeAttribute("disabled");
			}
		};
	};
	return;
};


/**
 * Mostra gli errori di validazione di coldfusionswitch() {
	case x:
		break;
	case y:
		break;
}

 * @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){	
	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){
	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();
		});
		
		
		/* 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");
		
	},
	
	/**
	 * 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='$.fancybox.close()'><b>Chiudi</b></a> o <a href='javascript:location.reload()'>ricarica la pagina</a></p>";
				
		
			};
					} 
		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='$.fancybox.close()' class='color-lightblue'>";
			body += "<b>Chiudi</b></a></p>";
		
		};
		
		$.fancybox({
			autoDimensions:false,			
			width:400,	
			height: 200,			
			content : body		
		})		
		
		
	},
	
	/*
	 * Carica un template e lo mostra nel panel message
	 */
	showDialogContent: function(title, url, modal, panel){
		HOL.windowBox.showDialogContent(title, url, modal, panel);
	}

};

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


// Finestre di dialogo e modali
HOL.windowBox = {}

/**
 * Mostra il panel con le info per l'assistenza e gli orari d'apertura  
 */
HOL.windowBox.showAssistenza = function() {
	$.fancybox({
			href	: "/_ajax.common.cfm?_isXHR=true&method=assistenza",
			autoDimensions:false,			
			width:500,	
			height: 350,			
			ajax : {
		    	type : "GET"					    
			}
		});		
};

/**
 * Mostra il panel con gli orari di apertura
 */
HOL.windowBox.showOrariApertura = function() {
	$.fancybox({
			href  : "/_ajax.common.cfm?_isXHR=true&method=orariApertura",
			autoDimensions:false,				
			width:500,	
			height: 350,		
			ajax  : {
		    	type : "GET"					    
			}
		});    	 
	
};


/**
 * Mostra la finestra con l'informativa sulla privacy
 * @param {HTML element} id id della checkbox da checckare cliccando su Accetto
 */
HOL.windowBox.showPrivacy = function(id){
	$.fancybox({
		href: '/_ajax.common.cfm?_isXHR=true&method=privacy&id=' + id,
		autoDimensions:false,			
		width:500,	
		height: 400,		
		ajax: {
			type: "GET"
		}
	});
}		  
	

/**
 * Mostra la finestra con le condizioni generali di utilizzo
 * @param {HTML element} id id della checkbox da checckare cliccando su Accetto
 */
HOL.windowBox.showCondizioniGenerali = function(){
	$.fancybox({
		href: '/_ajax.common.cfm?_isXHR=true&method=condizioni_generali',
		autoDimensions:false,			
		width:500,	
		height: 400,		
		ajax: {
			type: "GET"
		}
	});
}	


/**
 * Mostra la finestra con il form per inviare feedbacks
 */
HOL.windowBox.showFeedbackForm = function(){
	$.fancybox({
		href: '/_ajax.common.cfm?_isXHR=true&method=feedback',
		autoDimensions:false,			
		width:740,	
		height: 450,
		centerOnScroll : true,
		ajax: {
			type: "GET"
		}
	});
}	


/**
 * Apre la finestra Invia ad un amico
 */
HOL.windowBox.showTellAFriend = function(uri,titolo){
	$.fancybox({
		href: '/_ajax.common.cfm?_isXHR=true&method=showTellAFriend&uri=' + uri + '&titolo=' + titolo,
		autoDimensions:false,			
		width:580,	
		height: 480,
		ajax: {
			type: "GET"
		}
	});
}	


/**
 * Mostra la finestra per recuperare la password
 */
HOL.windowBox.showRecoverPassword = function(){
	$.fancybox({	
		href: '/_ajax.common.cfm?_isXHR=true&method=showRecoverPassword',
		autoDimensions:false,
		width:400,				
		height:220,		
		ajax: {
			type: "POST"		
		}
	});
}


HOL.windowBox.showMessage = function (header, body) {		
	$.fancybox({
		autoDimensions:false,		
		width:400,
		height:350,		
		content : "<div class='bgpanel'><div align='center'><strong>" + header + "</strong></div>" + body + "</div>"		
	})		
};


/**
 * Mostra il panel con i dati del bonifico bancario
 */
HOL.windowBox.showDatiBonifico = function(){
	$.fancybox({
		href: '/_ajax.common.cfm?_isXHR=true&method=datiBonifico',
		autoDimensions:false,		
		width:400,
		height:350,		
		ajax: {
			type: "GET"
		}
	});
}

/**
 * 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 
 */
HOL.windowBox.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;
		
		$.fancybox({
			href: url,			
			autoDimensions:false,			
			width:350,
			height:450,			
			ajax: {
				type: "GET"
			}
		});		
}


HOL.windowBox.showDialogContent = function(title, url, modal, panel,w,h){

	$.fancybox({
		href: url,
		autoDimensions:false,		
		width: w || 400,
		height: h || 300,	
		ajax: {
			type: "GET"
		}
	});	
}	


HOL.windowBox.showChatAlert = function(title, url, modal, panel,w,h){

	$.fancybox({
		href: url,
		autoDimensions:false,
		width: w || 400,
		height: h || 300,
		ajax: {
			type: "GET"
		}
	});
}

