
// Funzione che permette di selezionare/deselezionare tutti gli input checkbox
// di un form in base al valore del checkbox allBoxName
function checkAll(form, name, allBoxName) {

	var inputs= jQuery('#' + form).find('input[id$=":'+name+'"]');
	var allBox = jQuery('#' + form).find('input[id$=":'+allBoxName+'"]');
	
	inputs.each(
		function() {
			if (!this.disabled)
				this.checked = allBox[0].checked;
		}
	)
	 
}

function clearAllBox(form, allBoxName){
	var allBox = jQuery('#' + form).find('input[id$=":'+allBoxName+'"]');
	allBox[0].checked = false;
}

// Porta il cursore alla fine dell'input (usato dai filtri nei pannelli)
function setCaretToEnd (e) {
	var control = $((e.target ? e.target : e.srcElement).id);
    if (control.createTextRange) {
    	var range = control.createTextRange();
        range.collapse(false);
        range.select();
    }
    else if (control.setSelectionRange) {
    	control.focus();
        var length = control.value.length;
        control.setSelectionRange(length, length);
    }
    control.selectionStart = control.selectionEnd = control.value.length;
} 


// Gestione dei cookie
var Cookie = {
	data: {},
	options: {expires: "", domain: "", path: "", secure: false},

	init: function(options, data) {
	  Cookie.options = Object.extend(Cookie.options, options || {});

	  var payload = Cookie.retrieve();
	        if(payload) {
	            Cookie.data = payload.evalJSON();
	        }
	        else {
	            Cookie.data = data || {};
	        }
	        Cookie.store();
    },
    getData: function(key) {
        return Cookie.data[key];
    },
    setData: function(key, value) {
        Cookie.data[key] = value;
        Cookie.store();
    },
    removeData: function(key) {
        delete Cookie.data[key];
        Cookie.store();
    },
    retrieve: function() {
        var start = document.cookie.indexOf(Cookie.options.name + "=");

        if(start == -1) {
            return null;
        }
        if(Cookie.options.name != document.cookie.substr(start, Cookie.options.name.length)) {
            return null;
        }

        var len = start + Cookie.options.name.length + 1;   
        var end = document.cookie.indexOf(';', len);

        if(end == -1) {
            end = document.cookie.length;
        } 
        return unescape(document.cookie.substring(len, end));
    },
    store: function() {
        var expires = '';

        if (Cookie.options.expires) {
            var today = new Date();
            expires = Cookie.options.expires * 86400000;
            expires = ';expires=' + new Date(today.getTime() + expires);
        }

        document.cookie = Cookie.options.name + '=' + escape(Object.toJSON(Cookie.data)) + Cookie.getOptions() + expires;
    },
    erase: function() {
        document.cookie = Cookie.options.name + '=' + Cookie.getOptions() + ';expires=Thu, 01-Jan-1970 00:00:01 GMT';
    },
    getOptions: function() {
        return (Cookie.options.path ? ';path=' + Cookie.options.path : '') + (Cookie.options.domain ? ';domain=' + Cookie.options.domain : '') + (Cookie.options.secure ? ';secure' : '');      
    }
};

// Alert per le comunicazioni
//
// Utilizzo MessageAlert.init({delay: 1000, interval: 10000, alertShowTime:5000})
// delay: tempo (ms) dopo il quale viene effettuata la prima richiesta getNumMessaggiNonLetti()
// interval: tempo (ms) dopo il quale vengono effettuate la successive richieste getNumMessaggiNonLetti()
//           0 corrisonde a non effettuare ulteriori richieste
// alertShowTime : tempo(ms) in cui rimane visibile l'alert dei nuovi messaggi
// 
//  I componenti sono definiti in /sharedpages/comunicazione/alertMessage.xhtml

var MessageAlert = {

		options: {conversationId: '', delay: 1000, interval: 300000, alertShowTime:20000},

		init: function(options) {
			
			MessageAlert.options = Object.extend(MessageAlert.options, options || {});

			jQuery(document).ready(function() {
				
				Seam.Remoting.displayLoadingMessage = function() {};
				Seam.Remoting.hideLoadingMessage = function() {};
				Seam.Remoting.displayError = function(code) {};
				
				if (MessageAlert.options.conversationId != ''){
					Seam.Remoting.getContext().setConversationId(MessageAlert.options.conversationId);
				}
				
				Cookie.init({name: 'JPORTAL', path : '/'});
				if (Cookie.getData('numMessaggiNonLetti') == null){
					Cookie.setData('numMessaggiNonLetti', 0);
				}
			});
			
			setTimeout("MessageAlert.getNumMessaggiNonLetti()", MessageAlert.options.delay);
	},
	getTextMessage : function(messaggi){
		if (messaggi == 1){
			return "1 messaggio non letto";
		}
		else {
			return messaggi + ' messaggi non letti'
		}
	},
	manageMessage: function(messaggi){
		
		if (messaggi > 0){
			$('comunicazioniComponent:tooltipNewComunicazioni').update(MessageAlert.getTextMessage(messaggi));

			$('comunicazioniComponent:iconComunicazioni').hide();
			$('comunicazioniComponent:iconNewComunicazioni').show();

		}
		if (messaggi == 0){
			$('comunicazioniComponent:iconNewComunicazioni').hide();
			$('comunicazioniComponent:iconComunicazioni').show();
		}
		if (messaggi > Cookie.getData('numMessaggiNonLetti')){
			$('comunicazioniComponent:textAlert').update(MessageAlert.getTextMessage(messaggi));
			
			showAlertComunicazioni();
			pulsateIconNewComunicazioni();
			
			setTimeout("hideAlertComunicazioni()", MessageAlert.options.alertShowTime);
		}
		
		Cookie.setData('numMessaggiNonLetti', messaggi); 
		
		if (MessageAlert.options.interval != 0){
			setTimeout("MessageAlert.getNumMessaggiNonLetti()", MessageAlert.options.interval);
		}
	},
	getNumMessaggiNonLetti: function(){
		Seam.Component.getInstance("comunicazioneHelper").countMessaggiRicevutiNonLetti(MessageAlert.manageMessage);
	}
}


// Funzioni di supporto alle combobox di richfaces
var RichfacesSupport = {
	
	comboBoxOnSubmitEvent: function(comboBox, e) {
		var ev = e || window.event;
		var myChar = ev.keyCode || ev.keyChar;
		if (myChar == 40) {
			if (!comboBox.comboList.visible()) {
				comboBox.showList();
				comboBox.comboList.doActiveItem(0);
			} else {
				comboBox.comboList.changeItem();
			}
		}
		if ((myChar == 13) || (37 <= myChar && myChar <= 40)) {
			return false;
		}
		return true;
	}

}


// Aggiunge funzioni di supporto per permettere di espandere tramite click
// il DropDownMenu di richfaces 
//
// Utilizzo:
// var dropDownMenuOnClick = new RichfacesSupport.DropDownMenuOnClick('#{contextPath}','gruppoMenu1',5000);
// 
// <s:div styleClass="gruppoMenu1" rendered="....">
// 		<div class="link" onclick="dropDownMenuOnClick.abilitaMenu();">....</div>
//		<div class="menu" style="display:none;" onclick="dropDownMenuOnClick.disabilitaMenu();">
//			<rich:dropDownMenu hideDelay="400" 
//				oncollapse="dropDownMenuOnClick.onCollapse()" 
//				onexpand="dropDownMenuOnClick.onExpand()" 
//				onmouseover="dropDownMenuOnClick.onMouseOver(this);">...</rich:dropDownMenu>
//		<div>
// </s:div>
// 
// In pratica, all'apertura della pagina viene visualizzato il div con class link che, quando
// cliccato, si nasconde e mostra il dropDownMenu che funziona di default con onMouseOver
// 
// Lo script ricerca tutti i div con il dropDownStyleClass passato nel costruttore (di default
// il valore è 'dropDownMenu'), la struttura html dovrà essere quindi sempre come quella dell'esempio.
// 
// Il contesto dell'applicazione serve per costruire l'url di un'immagine trasparente necessaria per 
// correggere un bug di ie

RichfacesSupport.DropDownMenuOnClick = Class.create({

	// Costruttore
	initialize: function(context, dropDownStyleClass, millsDelay) {

		// Contesto dell'applicazione (es. /portalestd)
		this.context = context;
		
		// Utile se è necessario gestire più gruppi di dropDownMenu
		if (dropDownStyleClass){
			this.dropDownStyleClass = dropDownStyleClass;
   		}
   		else{
   			this.dropDownStyleClass = 'dropDownMenu';
   		}
		
		// Di default il tempo di attesa per considerare chiuso il menu
		// dopo un collapse è di 2 secondi
		if (millsDelay){
			this.millsDelay = millsDelay;
   		}
   		else{
   			this.millsDelay = 2000;
   		}

		this.menuAttivo = false;
		this.idTimeout='';
		
		// Aggiunta di un'immagine trasparente sopra al div link per correggere
		// il problema di cattura dell'evento onmouseover di ie
		if (Prototype.Browser.IE){
			Event.observe(window, "load",function() {
				
				$$('div.' + this.dropDownStyleClass + ' > div.link').each(function(item) {
					  item.insert({
						  bottom: '<img class="dropDownSpacer" src="' + context + '/img/spacer.png"/>'
					  });
				});
				
			}.bind(this));
		}
		
	},

	onMouseOver: function(object){
		RichFaces.Menu.Layers.layers[object.id + '_menu'].highlightLabel();
	},
	
	onExpand: function(){
		this.menuAttivo = true;
		window.clearTimeout(this.idTimeout);
	},
	
	// Quando un dropDownMenu viene collassato, verrà eseguita la funzione verificaMenuAttivo
	// dopo millsDelay millisecondi e se il menu sarà ancora chiuso, verrà disabilitato il
	// onMouseOver e abilitato il onclick
	onCollapse: function(){
		this.menuAttivo = false;
		this.idTimeout = setTimeout(function (){this.verificaMenuAttivo()}.bind(this), this.millsDelay);
	},
	
	verificaMenuAttivo: function(){
		if (this.menuAttivo == false)
			this.disabilitaMenu();
	},
	
	abilitaMenu: function(){
		// Nasconde i link
		$$('div.' + this.dropDownStyleClass + ' > div.link').each(function(item) {
			  item.hide();
		});

		// Mostra i dropDownMenu
		$$('div.' + this.dropDownStyleClass + ' > div.menu').each(function(item) {
			  item.show();
		});
		
		this.menuAttivo = true;
	},
	
	disabilitaMenu: function(){
		
		// Nasconde i dropDownMenu
		RichFaces.Menu.Layers.shutdown();
		$$('div.' + this.dropDownStyleClass + ' > div.menu').each(function(item) {
			item.hide();
		});
		
		// Mostra i link
		$$('div.' + this.dropDownStyleClass + ' > div.link').each(function(item) {
			  item.show();
		});

		window.clearTimeout(this.idTimeout);
		this.menuAttivo = false;
	}
	
})


// Mappe di Google:

// Mostra il widget modal panel con la Google map
function showGoogleMap(address) {
	$('googleMap').src = getGoogleMap(address);
	Richfaces.showModalPanel('googleMapModalPanel');
}

// Restituisce l'indirizzo della Google map
function getGoogleMap(address) {
	return "http://maps.google.it/maps?q=" + 
			escape(address) + "&output=embed";
}


// funzioni javascript di supporto per la gestione filtri
var MMBFilters = {
	
	writeLink : function(filterId, filterElement) {
		if (filterId > 0) {
			var browserUrl = window.location.href;
			var queryParams = browserUrl.toQueryParams();
			if (queryParams.filter) {
				queryParams.filter = filterId;

				var url = browserUrl.substring(0, browserUrl.indexOf('?') + 1) + Object.toQueryString(queryParams);
			} else {
				
				var url = browserUrl + '&filter=' + filterId;
			}
			if (filterElement.firstChild == null) {
				var text = null;
				filterElement.appendChild(document.createTextNode(text));
			}
			filterElement.firstChild.nodeValue = url;
		}
	},
	
	checkFilterModified : function(filterCommandLink) {
		if (filterCommandLink != null && filterCommandLink.firstChild) {
			var value = filterCommandLink.firstChild.nodeValue;
			if (value.length > 0 && value.indexOf('*') < 0) {
				filterCommandLink.firstChild.nodeValue = value + '*';
			}
		}
	},
	
	textSelectAll : function(element) {
		
		var childNode = element.firstChild;
		if (childNode != null && childNode.nodeValue != null) {
			element.activate();
		}
	}
	
}
