/*
	Autore: Danilo Cicognani
	Script: lookup.js
	Applicazione: AscomDoc
	Versione: 1.02
	Data: 11/08/2009
	Scopo: Funzioni per la gestione del lookup
	Copyright (c) 2008-2009 CicoNET di Danilo Cicognani
*/

// Variabili utilizzate per conservare lo stato
var blnLookupStarted = false;
var $objLookupInput;
var $objLookupIdInput;
var $objLookupCall;
var $objLookupDiv;
var objLookupPopup;
var objLookupData;

/**
 * Lancia il lookup
 *
 * @param objInput Il campo di input contenente il valore di ricerca e in cui inserire il valore restituito dal lookup
 * @param strQueryString La querystring da passare allo strUrl per eseguire il lookup: a questa viene accodato il value di objInput
 * @param strUrl L'url da chiamare (tramite Ajax) per eseguire il lookup (ci si aspetta che ritorni un array di oggetti JSON formattato in modo preciso, come voluto dal lookup)
 * @param objIdInput Il campo di input che dovra' contenere l'id corrispondente al valore restituito dal lookup (se il valore restituito e' singolo sara' un campo hidden, altrimenti sara' un campo select
 * @param blnFeedback Se il lookup deve comunque fornire un feedback all'utente, anche se non e' necessario rilanciare il lookup (tipicamente sull'onblur lo si pone a folse, mentre sul click sul pulsante lo si mette a tru)
 * @param strNewUrl L'eventuale url da chiamare in finestra per la creazione di un nuovo oggetto del tipo cercato, se viene lasciato vuoto ('') allora il link "Nuovo" non sara' presente
 */
function lookup(objInput, strQueryString, strUrl, objIdInput, blnFeedback, strNewUrl, blnMustCompile) {
	if ((! blnLookupStarted) || (document.getElementById($objLookupIdInput.attr('id')) == null)) {	// Se non e' in corso un altro lookup
		$objLookupIdInput = $(objIdInput);
		if ((objInput.value == '') && blnMustCompile) {	// Se il campo e' vuoto non faccio partire il lookup
			strLookupSelectInput = '<input type="hidden" name="' + $objLookupIdInput.attr('name') + '" id="' + $objLookupIdInput.attr('id') + '" value=""';
			if (typeof($objLookupIdInput.attr('alternate')) != 'undefined')
				strLookupSelectInput += ' alternate="' + $objLookupIdInput.attr('alternate') + '"';
			if (typeof($objLookupIdInput.attr('class')) != 'undefined')
				strLookupSelectInput += ' class="' + $objLookupIdInput.attr('class') + '"';
			strLookupSelectInput += ' />';
			$objLookupIdInput.after(strLookupSelectInput).remove();	// Svuoto il campo con l'id
			if (blnFeedback) {	// Devo dare un feedback
				alert('Digitare prima qualche carattere nel campo di ricerca.');
				objInput.focus();
			}
			return;
		}
		var objLookupValue = objInput.getAttribute('lookupValue');
		if (objLookupValue != null) {	// Su questo campo era stato lanciato in precedenza un lookup
			if (objInput.value == objLookupValue) {	// Nessun cambiamento nel valore dall'ultimo lookup
				if (! blnFeedback)	// Se non devo dare un feedback non faccio neanche partire il lookup
					return;
			}
		}
		$objLookupInput = $(objInput);
		$objLookupIdInput.hide();
		blnLookupStarted = true;
		intTop = 0;
		if ((navigator.appVersion.indexOf("MSIE 6.0") > 0) || (navigator.appVersion.indexOf("MSIE 7.0") > 0))
			intTop = $objLookupInput.height() + 9;
		intLeft = $objLookupInput.offset().left;
		if ($objLookupInput.parents('div#popajax_window').length > 0) {
			intLeft = intLeft - $('div#popajax_window').offset().left;
		}
		// Aggiungo il box del lookup
		$objLookupDiv = $('<div id="lookup"><div id="lookup-loading"><img src="' + FWCONFIG_PresentationIMG + 'lookup-loading.gif" /><br/>Ricerca... <strong><a href="javascript:stopLookup()">Annulla</a></strong></div><ul id="lookup-results"></ul></div>')
			.css('width', $objLookupInput.width() + 2)
			.css('margin-top', intTop)
			.css('left', intLeft)
			.insertAfter($objLookupInput)
			.animate({height: 'show', opacity: 'show'}, 'normal');
		// Lancio la chiamata Ajax
		$objLookupCall = $.ajax({
			'url': strUrl,
			'data': strQueryString + objInput.value,
			'dataType': 'json',
			'type': 'POST',
			'success': function(data) {
				if (document.getElementById('lookup') == null)	// Non c'e' piu' il div del lookup... lasciamo perdere tutto
					stopLookup();
				objLookupData = data;
				if (data.length == 1) {	// Un solo risultato: nascondo il box e riempio il campo
					returnLookup(0);
				}
				else if ((strNewUrl != '') || (data.length > 1)) {
					$objLookupResults = $('ul#lookup-results');
					$objLookupResults.empty();
					if ((data.length > 9) || ((strNewUrl != '') && data.length > 8)) {
						$objLookupResults.css('height', '190px');
					}
					if (strNewUrl != '') {
						$('<li><strong><a class="command" href="javascript:void(0);" onclick="objLookupPopup = window.open(\'' + strNewUrl + '\', \'lookuppopup\', \'directories=0,height=350,location=0,menubar=0,resizable=1,scrollbars=0,status=0,toolbar=0,width=750\');">Nuovo</a></strong></li>').appendTo($objLookupResults);
					}
					$('<li><strong><a class="command" href="javascript:stopLookup()">Annulla</a></strong></li>').appendTo($objLookupResults);
					$.each(data, function(index, objValue) {
						toAppend = '<li><a href="javascript:returnLookup(' + index + ')">' + objValue.titolo + '</a>';
						if(typeof(objValue.link) != 'undefined')
							toAppend += '&nbsp;' + objValue.link;
						toAppend += '</li>';
						$(toAppend).appendTo($objLookupResults);
					});
					$objLookupResults.fadeIn('normal', function() {
						$('div#lookup-loading').hide();
					});
				}
				else {	// Nessun risultato: nascondo il box e setto il focus
					$objLookupDiv.animate({height: 'hide', opacity: 'hide'}, 'normal', function() {
						alert('Nessun risultato trovato corrispondente ai criteri di ricerca');
						objInput.focus();
						blnLookupStarted = false;	// Mi segno che il lookup non e' in corso
						$objLookupDiv.remove();	// Elimino il box dal DOM in modo da poterlo ricreare in seguito senza problemi
					});
				}
			},
			'error': function(data) {
				alert("Error get data from:"+this.url)

				blnLookupStarted = false;	// Mi segno che il lookup non e' in corso
				$objLookupDiv.remove();	// Elimino il box dal DOM in modo da poterlo ricreare in seguito senza problemi
			}
		});
	}
}

/**
 * Lancia il lookup multiplo (ovvero con vari radio tra cui scegliere il tipo di lookup da eseguire): presuppone che il combinando il <nome del campo radio> + '_' + <value del campo radio checked> si ottenga il nome di un input nascosto il cui value splittato in base al separatore '|' fornisca i 3 parametri per lanciare la ricerca (strQueryString, strUrl, strNewUrl)
 *
 * @param objRadio Il nome dei vari campi radio per la selezione del tipo di lookup da eseguire
 * @param objInput Il campo di input contenente il valore di ricerca e in cui inserire il valore restituito dal lookup
 * @param objIdInput Il campo di input che dovra' contenere l'id corrispondente al valore restituito dal lookup (se il valore restituito e' singolo sara' un campo hidden, altrimenti sara' un campo select
 * @param blnFeedback Se il lookup deve comunque fornire un feedback all'utente, anche se non e' necessario rilanciare il lookup (tipicamente sull'onblur lo si pone a folse, mentre sul click sul pulsante lo si mette a tru)
 */
function multiLookup(objRadio, objInput, objIdInput, blnFeedback) {
	for (i = 0; i < objRadio.length; i++) {
		if (objRadio[i].checked) {
			objParamsInput = objInput.form[objRadio[i].name + '_' + objRadio[i].value];
			aryParams = objParamsInput.value.split('|');
			lookup(objInput, aryParams[0], aryParams[1], objIdInput, blnFeedback, aryParams[2]);
		}
	}
}

/**
 * Interrompe il lookup e ferma la chiamata Ajax (chiamata internamente)
 */
function stopLookup() {
	if (blnLookupStarted) {	// Posso fermare il lookup solo se e' in corso!
		$objLookupCall.abort();	// Fermo la chiamata Ajax
		$objLookupDiv.animate({height: 'hide', opacity: 'hide'}, 'normal', function() {	// Nascondo il box
			$objLookupInput.focus();	// Setto il focus
			blnLookupStarted = false;	// Mi segno che il lookup non e' in corso
			$objLookupDiv.remove();	// Elimino il box dal DOM in modo da poterlo ricreare in seguito senza problemi
		});
	}
}

/**
 * Restituisce il risultato del lookup (chiamata internamente)
 *
 * @param index L'indice nell'array objLookupData del risultato da tornare
 */
function returnLookup(index) {
	if (blnLookupStarted) {	// Posso completare il lookup solo se e' in corso!
		$objLookupDiv.animate({height: 'hide', opacity: 'hide'}, 'normal', function() {
			strValue = objLookupData[index].titolo;
			if (typeof(objLookupData[index].value) != 'undefined') {
				if (objLookupData[index].value.length > 0)
					strValue = objLookupData[index].value;
			}
			$objLookupInput.val(strValue);	// Riempio il campo con il titolo
			if ((objLookupData[index].list != null) && (objLookupData[index].list.length > 1)) {	// Risultato multiplo: l'input con l'id deve essere un select
				strLookupSelectInput = '<select name="' + $objLookupIdInput.attr('name') + '" id="' + $objLookupIdInput.attr('id') + '"';
				if (typeof($objLookupIdInput.attr('alternate')) != 'undefined')
					strLookupSelectInput += ' alternate="' + $objLookupIdInput.attr('alternate') + '"';
				if (typeof($objLookupIdInput.attr('class')) != 'undefined')
					strLookupSelectInput += ' class="' + $objLookupIdInput.attr('class') + '"';
				strLookupSelectInput += '>';
				objLookupList = objLookupData[index].list;
				for (idx = 0; idx < objLookupList.length; idx++)
					strLookupSelectInput += '<option value="' + objLookupList[idx].id + '">' + objLookupList[idx].titolo + '</option>';
				strLookupSelectInput += '</select>';
				$objLookupIdInput.after(strLookupSelectInput).remove();
			}
			else {	// Risultato singolo: l'input con l'id deve essere un input hidden
				strLookupSelectInput = '<input type="hidden" name="' + $objLookupIdInput.attr('name') + '" id="' + $objLookupIdInput.attr('id') + '" value="' + objLookupData[index].id + '"';
				if (typeof($objLookupIdInput.attr('alternate')) != 'undefined')
					strLookupSelectInput += ' alternate="' + $objLookupIdInput.attr('alternate') + '"';
				if (typeof($objLookupIdInput.attr('class')) != 'undefined')
					strLookupSelectInput += ' class="' + $objLookupIdInput.attr('class') + '"';
				strLookupSelectInput += ' />';
				$objLookupIdInput.after(strLookupSelectInput).remove();
			}
			$objLookupIdInput.show();
			$objLookupInput.attr('lookupValue', strValue);	// Mi segno il valore attuale per evitare futuri lookup inutili all'onblur
			blnLookupStarted = false;	// Mi segno che il lookup non e' in corso
			$objLookupDiv.remove();	// Elimino il box dal DOM in modo da poterlo ricreare in seguito senza problemi
		});
	}
}

/**
 * Callback del "Nuovo": quando creo un nuovo oggetto do' per scontato di volere quello come risultato del lookup, quindi lo restituisco direttamente
 *
 * @param data L'oggetto JSON contenente il dato da restituire
 */
function closeLookup(data) {
	objLookupData = data;
	returnLookup(0);
	setTimeout('objLookupPopup.close()', 1000);
}