// -------------------------------------
// Nome: 	fwform.js
// Descrizione:	Codice JSCript di supporto a  pagine applicative (cFWForm)
// Versione JS:	1.3 (Supported by IE 5.0)
// Copyright:	Futuria Informatica Srl
// Ultima Mod:	28.04.2010
// -------------------------------------


// Application Page Variables
// -------------------------------------

// Keep alive timeout
var g_nKeepAliveTimeout = 120;

// Flag submit della pagina in corso
var m_bPageSubmitPending = false;

// Buffer UserTimes registrate e da inviare al server
var g_anUserTimes = new Array();


// Crea il codice HTML per un link "Add To Bookmark"
function CreateLink_AddToBookmark(p_sSiteUrl, p_sSiteName)
{
	var sHtml='';
	var txt = "Bookmark This page";
	var ver = navigator.appName;
	var num = parseInt(navigator.appVersion);
	if ((ver == "Microsoft Internet Explorer")&&(num >= 4))
	{
	   sHtml += ('<A HREF="javascript:window.external.AddFavorite(\''+p_sSiteUrl+'\',\''+p_sSiteName+'\');" ');
	   sHtml += ('>'+ txt + '</a>');
	}
	else
	{
	   txt += "  (Ctrl+D)";
	   sHtml += (txt);
	}
	return sHtml;
} 


// Funzioni pubbliche (invocabili dalla Form)
// ----------------------------------------------

// Funzione che permette di aprire una Message Box
// p_sTitle:	Testo titolo
// p_sMessage:	Testo Messaggio
// p_sButtons:	opzionale, descrittore pulsanti da inserire in coda con il formato
//				PB1_Name|PB1_Text|PB1_OnClickEvt&PB2_Name|PB2_Text|PB2_OnClickEvt&.....
//				default: PB1|Close|window.close()
// per la gestione degli stili utilizza il file styles.css
function WebMsgBox(p_sTitle, p_sMessage, p_sButtons)
{
	// Costruisce contenuto html del Dialog
	if ((p_sTitle == null) || (p_sTitle=='')) p_sTitle = "Message Box";
	if ((p_sButtons == null) || (p_sButtons=='')) p_sButtons = 'CLOSE'; /*'PB1|Close|mdClose()'*/;

	var sHtmlButtons = '<div style="padding-top:8px; padding-bottom:4px; text-align:center; white-space: nowrap;">'; //'<p><form method="POST" name="MD" action="aa'+p_sAction+'">';
	asPbList = p_sButtons.split('&');
	for (var i=0; i<asPbList.length; i++)
	{
		asPbItems = asPbList[i].split('|');
		if (asPbItems.length==1)
		{
			// Gestisce tipologie predefinite di buttons (CLOSE,OK)
			if (asPbItems[0]=='CLOSE') asPbItems = new Array('PB'+i, WMB_PB_CLOSE, 'mdClose()');
			if (asPbItems[0]=='OK') asPbItems = new Array('PB'+i, WMB_PB_OK, 'mdClose()');
		}
		
		if (asPbItems.length==3)
		{
			// asPbItems[0] : Name
			// asPbItems[1] : Value
			// asPbItems[2] : OnClick Event handler
			if (asPbItems[2] == null) asPbItems[2] = 'onClick="mdClose()"';
			else asPbItems[2] = 'onClick="'+asPbItems[2]+'"';
			sHtmlButtons = sHtmlButtons + ' <button class="pb_std" type="button" '+ asPbItems[2] +' name="'+asPbItems[0]+'">'+asPbItems[1]+'</button>';
		}
	}
	sHtmlButtons = sHtmlButtons + '</div>';
	
	var sMsg = p_sMessage + sHtmlButtons;
	
	mdShow(p_sTitle, sMsg);
	return true;
}


// Apre una wait box durante l'esecuzione di una operazione lunga
function WebWaitBox(p_sTitle, p_sMessage)
{
	var sImg = '<img style="border:0; margin:12px;" src="'+g_PSV_sRootUrl+'/img/library/progress_bar1.gif'+'">';
	var sMsg = '<div style="text-align:center;">' + p_sMessage + '<br>' + sImg + '</div>';

	mdShow(p_sTitle, sMsg);
	return true;
}


// Permette l'apertura di una risorsa su internet
function OpenUrl(p_sURL, p_sParams)
{
	//alert(sURL);
	if (p_sURL.substr(0,7) == 'mailto:')
	{
		if (p_sURL.substr(7)!='') window.location = p_sURL;
		return;
	}

	if (p_sURL.substr(0,7)=='http://')
	{
		if (p_sURL.substr(7)!='') window.open(p_sURL, "", "");
		return;
	}

	if (p_sURL.substr(0,8)=='https://')
	{
		if (p_sURL.substr(8)!='') window.open(p_sURL, "", "");
		return;
	}

	if (p_sURL != '')
	{
		p_sURL = top.location.protocol + '//' + top.location.hostname + (top.location.port?':'+top.location.port:'') + p_sURL;
		//alert(p_sURL);
		window.open(p_sURL, "", "");
	}
}


// Apre una finestra per un Url e ne restituisce l'handle
function OpenWindow(p_sUrl, p_nWidth, p_nHeight, p_bCenter, p_sParams)
{
	p_nWidth = (p_nWidth) ? p_nWidth : 400;
	p_nHeight = (p_nHeight) ? p_nHeight : 300;
	nPosLeft = (screen.width) ? (screen.width-p_nWidth)/2 : 0;
	nPosTop = (screen.height) ? (screen.height-p_nHeight)/2 : 0;
	sSettings ='height='+p_nHeight+',width='+p_nWidth+',top='+nPosTop+',left='+nPosLeft+',screenX=' + nPosLeft + ',screenY=' + nPosTop
	sSettings += ',' + p_sParams;

	if ((p_sUrl.substr(0,5)!='http:') && (p_sUrl.substr(0,6)!='https:'))
	{
		// se non trova http:// lo considera come indirizzo relativo e quindi
		// gli appende l'host base col protocollo dell'applicazione
		p_sUrl = parent.g_sHost + p_sUrl;
	}
	//alert(p_sUrl);
	return window.open(p_sUrl, '', sSettings );
}


// Funzione di caricamento di una pagina in un Frame
// sFormParams = ParName=ParValue|ParName=ParValue|... (old...)
// sFormParams = ParName=ParValue&ParName=ParValue&...
/*
function LoadForm(sFormName, sTargetFrame, sFormParams)
{
   //alert("Loading Form [" + sFormName + "] to Frame [" + sTargetFrame + "]");
   sMsg = "?form="+sFormName+"&FRAME="+sTargetFrame;
   if (sFormParams) sMsg += "&"+sFormParams;
   NotifyFormMsg(m_sFormName, sMsg);
   
}
*/

// Esegue un submit per l'oggetto indicato
// Può essere invocata come:
// - DoAction(ObjSender, FieldName, FieldValue)
// - DoAction(ObjSender, FieldName)
// - DoAction( )
// Il Name deve essere passato esplicitamente perchè in Netscape non è accessibile come hField.name
function DoAction(p_oSender, p_sFieldName, p_sFieldValue)
{
	// se il sender è passato attraverso il suo ID lo risolve
	if (typeof(p_oSender)=='string') p_oSender=GetItemFromId(p_oSender);
	
	if (p_sFieldName==null) p_sFieldName = '';
	if (p_sFieldValue==null) p_sFieldValue = '';
	
	
	if ((p_sFieldName!='') && (p_sFieldValue=='')) p_sFieldValue = "submit";
	//if ((p_sFieldName==null) && (p_oSender!=null)) {p_sFieldName=p_oSender; p_oSender=null;} // funzione invocata solo con FieldName
	if (p_oSender==null) {p_sFieldName=''} // funzione invocata senza parametri (esegue un semplice submit)

	var oSenderForm = FindMyForm(p_oSender);
	if (!oSenderForm) {Alert('DoAction() - Sender form not found'); return;};

	SubmitRequest(oSenderForm, p_sFieldValue, p_sFieldName);
}


function SendFormMsg(p_oSender, /*p_sFormTarget, */p_sMsg/*, p_sMsgParamStr*/)
{
	// se il sender è passato attraverso il suo ID lo risolve
	if (typeof(p_oSender)=='string') p_oSender=GetItemFromId(p_oSender);
	
	if (!p_oSender) {Alert('SendFormMsg() - Sender not specified'); return;}
	var oSenderForm = FindMyForm(p_oSender);
	if (!oSenderForm) {Alert('SendFormMsg() - Sender form not found'); return;};
	//alert(hSenderForm.id);
	
	//sMsgTarget = '';
	//NotifyFormMsg(oSenderForm, p_sMsg/*, p_sMsgParamStr, sMsgTarget*/);
	SubmitRequest(oSenderForm, p_sMsg);
}


// identifica la Form a cui appartiene l'item passato
// Restituisce null (se non identifica) oppure un oggetto {Form:handle, SubForm:string}
function FindMyForm(p_oItem)
{
	var oItem = p_oItem;
	var sSubform = '';
	if (!oItem) return null;
	while (oItem)
	{
		//alert(oParent.tagName);
		if ((oItem.tagName=='DIV') && (oItem.className=='SubForm')) {sSubform = oItem.id;}
		if (oItem.tagName == 'FORM')
			return {form:oItem, subform:sSubform};
		oItem = oItem.parentNode;
	}
	return null;
}


// Funzioni private (o utilizzate dal sistema)
// ----------------------------------------------

// Output messaggi di debug/trace (Utilizza funzione in file trace.js)
//function Trace (sMsg) { parent.Trace(sMsg); }
//function DebugAlert (sTitle, sText) { parent.DebugAlert(sTitle, sText); }


// inizializzazioni da eseguire al caricamento della pagina
function InitPage()
{
	// Set/refresh cookie di sessione se abilitato
	SetCookie('serviceUrl', g_PSV_sRootUrl);
	if (g_PSV_nCookieSessionLife)
	{
		SetCookie('sessionkey', g_PSV_sSessionKey, g_PSV_nCookieSessionLife);
	}
	
	// Inizializza supporto per validazione dati (fwform_validation.js)
	FormValidation_OnPageLoad();
	// Esegue la registrazione della funzione di gestione delle Layout Rule
	DynLayout_OnPageLoad();
	
	// Se configurato il relativo periodo attiva la funzionalità di Keep Alive della sessione
	setTimeout('_SendKeepAlive()', g_nKeepAliveTimeout*1000);

	// Restore page vertical scrolling position
	_ScrollPosRestore();
}


// Handler evento OnLoad della pagina
// Invocato da Form.OnLoad event
function OnLoadForm(p_sFormName)
{
	//alert('OnLoadForm:'+p_sFormName);
	var sSelector = '#'+p_sFormName+' #DivContent';
	var hDivContent = $(sSelector)[0];
	//alert(hDivContent.id);

	// Popola lista form presenti sulla pagina
	var hForm = GetItemFromId(p_sFormName);
	
	/*
	var oForm = {};
	oForm.name = p_sFormName;
	oForm.form = hForm;
	oForm.frame = '';
	g_aForms.push(oForm);
	*/

	// Ogni Form che viene caricata sulla pagina acquisice il timestamp della richiesta al server
	// e salva il riferimento ActionId:Time in modo che questo possa essere inviato al server
	// con la successiva richiesta
	var nRequestTs = GetCookie('RequestTs')*1.0;
	var dNow = new Date();
	var nRequestTime = dNow.getTime()-nRequestTs;
	//alert('last request ts: ' + nRequestTs + '; Request time: ' + nRequestTime + ' ms.');
	if ((hForm.ACTIONID.value>0) && (nRequestTs>0)) _AddStatUserTime(hForm.ACTIONID.value, nRequestTime);


	// set content scroll-pos (in async mode)
	//var hDivContent = GetItemFromId('DivContent');
	if (hDivContent) setTimeout("$('"+sSelector+"')[0].scrollTop="+hForm.SCROLLPOS.value+";", 50);

	return true;
}


// Funzione di verifica invocata prima del submit dal form processing standard 
// restituisce false per inibire questo tipo di submit
// Invocata da Form.OnSubmit event
function CheckOnFormSubmit( )
{
	return false;
}


// funzione principale di submit
// Ritorna 1 se il submit è stato eseguito
//         2 se il submit è stato bufferizzato
//         0 se è stato ignorato
function SubmitRequest(p_oSenderForm, p_sMsgValue, p_sMsgName)
{
	if (!p_oSenderForm) {Alert('SubmitRequest() - Sender form not specified'); return;};
	//alert('submitting form: ' + p_oSenderForm.id);
	
	// Ignora submit se un'altro è in corso
	if (m_bPageSubmitPending) return;

	// Aggiorna stato submitting
	m_bPageSubmitPending = true;

	if (p_sMsgName == null) p_sMsgName = '';
	
	oForm = p_oSenderForm.form;

	// esecuzione eventuali handler definiti sui children della form
	for(i=0; i<oForm.elements.length; i++)
	{
		oElem = oForm.elements[i];
		var bRet = false;
		var sCode = oElem.getAttribute('fwonformsubmit');
		if (sCode!=null)
		{
			eval('bRet='+sCode);
			if (!bRet) {m_bPageSubmitPending=false; return false;}
		}
	}
		
		
	// Save page vertical scrolling position
	_ScrollPosSave()

	
	// Salva request timestamp
	var dRequestTs = new Date();
	//alert('Request Timestamp: ' + dRequestTs.getTime());
	SetCookie('RequestTs', dRequestTs.getTime(), 30);
	
	// Salva Stat User times registrati
	oForm.STAT_USERTIMES.value = g_anUserTimes.join(':');
	oForm.SCROLLPOS.value = '';
	oForm.FRMMSG.value = p_sMsgValue;
	if (p_sMsgName != '') oForm.FRMMSG.name = p_sMsgName;  

	if (p_oSenderForm.subform!='')
	{
		oForm.Form.value=p_oSenderForm.subform;
		//alert("Submitting Subform ["+p_oSenderForm.subform+"]");
	}
	
	//oForm.target = sMsgTarget;			
	// Esegue submit
	oForm.submit();

	//Trace(m_sFormName + " - Submitted command [" + sMsgValue + '/' + sMsgName + "]");		
	return true;	
}


// Salva nell'array degli user times una coppia ActionId/ActionTime se non è già presente
function _AddStatUserTime(p_nActionId, p_nActionTime)
{
	for(var n=0; n<g_anUserTimes.length; n+=2)
		if (g_anUserTimes[n] == p_nActionId) return true;

	g_anUserTimes.push(p_nActionId);
	g_anUserTimes.push(p_nActionTime);
	return true;
}



// Handler invocato da funzione SendFormMsg(...)
/*
function NotifyFormMsg(p_oFormSender, p_sMsg)
{
	if (!p_oFormSender) return;
	
	//Trace(m_sFormName + " - Notifying Message [" + sMsg + "("+sMsgParamStr+")] to Module [" + m_sFormName + "]");
	SubmitRequest(p_oFormSender, p_sMsg, '');
}
*/


// Invia un messaggio di Keep alive per tenere in vita la sessione
function _SendKeepAlive()
{
	if (!m_bPageSubmitPending)
	{	
		var oHTTP = GetObjXMLHttp();
		if(oHTTP == null) return false;
	
		var nNextKeepAliveTimeout = g_nKeepAliveTimeout*1000;
		var sFormDynReqUrl = document.forms[0].CWDDynUrl.value;
		// Appende all'url un parte variabile perche altrimenti IE 7 esegue solo la prima richiesta
		// POST works properly with multiple requessts to the [same object]. GET does not
		// http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx
		var sDynReqUrl = sFormDynReqUrl + 'KEEPALIVE&rnd=' + StrRandom(16);
		
		// Effettua richiesta HTTP PUT synchronous (open(..,..,false))
		try
		{
			oHTTP.open("GET", sDynReqUrl, false);
			oHTTP.send();
			//alert('SendKeepAlive http response: ' + oHTTP.responseText);
		}
		catch(e)
		{
			// In caso di fallimento ritenta dopo soli 10 secondi per non fare scadere la sessione
			nNextKeepAliveTimeout = 10*1000;
		}
	}
		
	// rischedula l'invio del keep-alive
	//alert('restart timer ' + nNextKeepAliveTimeout);
	setTimeout('_SendKeepAlive()', nNextKeepAliveTimeout);
}


// Ripristina, se possibile la scrolling position
function _ScrollPosRestore()
{
	nScrollPos = GetCookie('ScrollPos');
	if ((nScrollPos == null) || (nScrollPos == '')) return;

	//alert('ScrollPos to restore: ' + nScrollPos);
	if (window.frameElement)
		// Se la pagina è contenuta in un frame o iframe la variabile window.frameElement ne contiene il riferimento
		window.frameElement.contentWindow.document.documentElement.scrollTop = nScrollPos;
	else
		document.documentElement.scrollTop = nScrollPos;

}

// Salva Scroll Position corrente per eventuale restore dopo il reload
function _ScrollPosSave()
{
	if (window.frameElement)
		nScrollPos = window.frameElement.contentWindow.document.documentElement.scrollTop;
	else
		nScrollPos = document.documentElement.scrollTop;
		
	//alert('ScrollPos saved: ' + nScrollPos);
	SetCookie('ScrollPos', nScrollPos);
}

function ShowLayer(sLayerName, bShow)
{
	if (bShow)	document.all[sLayerName].style.visibility="visible";
	else		document.all[sLayerName].style.visibility="hidden";	
}

/*
function OnResizeWindow()
{
	var hDivToolbar = GetItemFromId('DivToolbar');
	var hDivContent = GetItemFromId('DivContent');
	var hDivPrintCtrl = GetItemFromId('DivPrintCtrl');
	var nClientWidth = GetWndWidth();
	var nClientHeight = GetWndHeight();

	//alert('OnResizeWindow ' + m_sFormName + ' ' +nClientWidth + ' ' + nClientHeight);

	if ( (hDivToolbar) && (hDivContent) )
	{
		hDivToolbar.style.left=0;
		hDivToolbar.style.top=GetWndScrollY();
		//hDivToolbar.style.width=nClientWidth;
		
		hDivContent.style.left=0;
		hDivContent.style.top=GetWndScrollY() + GetItemHeight(hDivToolbar);
		//hDivContent.style.width=nClientWidth;
		hDivContent.style.height=nClientHeight - GetItemHeight(hDivToolbar);
	}

	else if ( (hDivPrintCtrl) && (hDivContent) )
	{
		hDivContent.style.left=0;
		hDivContent.style.top=0;
		//hDivContent.style.width=nClientWidth;
		hDivContent.style.height=nClientHeight - 90;

		hDivPrintCtrl.style.left=0;
		hDivPrintCtrl.style.top=nClientHeight - 90;
		hDivPrintCtrl.width=nClientWidth;
		hDivPrintCtrl.style.height=90;
	}

	else if (hDivContent)
	{
		hDivContent.style.left=0;
		hDivContent.style.top=GetWndScrollY();
		//hDivContent.style.width=nClientWidth;
		hDivContent.style.height=nClientHeight;
	}
}
*/

// Funzione per il controllo dinamico del Layout
function DynLayout_CheckLayoutRule(p_Item)
{
	if (p_Item==null) p_Item=this;
	
	sLayoutRule = p_Item.layout_rule;
	if (!sLayoutRule) return;

	// Determina Item Type
	sItemType = p_Item.type;
	
	// Determina Item Value
	if (sItemType=='select-one')
	{
		sItemValue = p_Item.options[p_Item.selectedIndex].value;
		if (!sItemValue)
			sItemValue = p_Item.options[p_Item.selectedIndex].text;
	}

	sItemValue = StrTrim(sItemValue);
	
	// Esegue tokenize layout_rule
	aTok = sLayoutRule.split(';');
	
	if (aTok[0] == 'show-if-value')
	{
		// sintassi: show-if-value; ID1,ID2:Value1,ValueN; ID3,IDn:Value1,ValueN; ....
		for(var n=1; n<aTok.length; n++)
		{
			aTok1 = aTok[n].split(':');
			aCtrledItemId = aTok1[0].split(',');
			aCtrlingValues = aTok1[1].split(',');
			for(var m=0; m<aCtrledItemId.length; m++)
			{
				sCtrledItemId = StrTrim(aCtrledItemId[m]);
				pCtrledItem = GetItemFromId(sCtrledItemId);
				
				if (pCtrledItem)
				{
					bShow = false;
					for(var i=0; i<aCtrlingValues.length; i++)
						if (aCtrlingValues[i]==sItemValue) {bShow=true; break;}
					SetItemVisible(sCtrledItemId, bShow);
					//alert('ItemId: '+sCtrledItemId+': '+bShow);
				}
			}
		}
	}
	else
		return;
}


// Al caricamento della pagina esegue settaggio iniziale layout e registra l'event handler
// Valutare che tale event handler non vada in conflitto con quello relativo alla validazione
function DynLayout_OnPageLoad()
{
	nFormItems = document.forms[0].elements.length;
	for(var i=0; i<nFormItems; i++)
	{
		if (document.forms[0].elements[i].layout_rule)
		{
			//alert(document.forms[0].elements[i].name);
			DynLayout_CheckLayoutRule(document.forms[0].elements[i]);
			document.forms[0].elements[i].onchange=DynLayout_CheckLayoutRule;
		}
	}

}

// Gestisce Reside dinamico content
//window.onresize=OnResizeWindow;