/**
 * Pagina
 * ======
 *
 * Alcuni parametri sono impostati solo dinamicamente:
 * - il valore cliccato
 * - l'azione cliccata
 * - le finestre aperte cliccando
 *
 * Tutti gli altri possono essere trasferiti normalmente via XML
 *
 *
 * TIPOLOGIE DI INVIO AZIONE
 *
 * 1. Invio di un'azione senza redir nella stessa finestra:
 *  - si utilizza il metodo call(azione,valore)
 *  -> a esecuzione ultimata il caricamento chiudera' tutte le finestre
 *     aperte registrate come da chiudere, mentre lascia aperte le restanti
 * 
 * 2. Invio di un'azione con redir nella stessa finestra:
 *  - si utilizza il metodo call(azione,valore,...,xml), che oltre al
 *    al caso precedente puo' portarsi dietro l'XML della pagina chiamante
 *    oltre a quello corrente
 *  -> a esecuzione ultimata il caricamento chiudera' tutte le finestre aperte
 *
 * 3. Invio di un'azione con (o senza, ma improbabile) redir in un'altra finestra:
 *  - si imposta la finestra destinazione col metodo setWindow(finestra,proprieta)
 *  - si invoca il metodo call(azione,valore,...,xml)
 *  -> si apre una nuova finestra (aggiunta alla lista di quelle da chiudere o meno)
 *  -> a esecuzione ultimata la pagina caricata nella nuova finestra avra' impostate:
 *		- un XML aggiuntivo come specificato in xml
 *		- un'azione di ritorno
 *		- il nome della finestra chiamante (anche se si potrebbe risalire con window.opener)
 *
 * 4. Invio dell'azione di ritorno o in generale di un'azione nella finestra chiamante senza XML chiamante impostato
 *  - si invoca il metodo callParent(azione,valore)
 *  -> viene eseguita l'azione NELLA finestra chiamante (conservando quindi il suo XML e i suoi parametri) (necessario window.opener?)
 *  -> in questo modo si tengono in considerazione ulteriori modifiche fatte nella finestra chiamante
 *
 * 5. Invio dell'azione di ritorno o in generale di un'azione nella finestra chiamante con XML chiamante impostato
 *  - si imposta la finestra destinazione alla finestra chiamante: setWindow(callerWindow)
 *  - si copia l'XML chiamante sull'XML corrente, cancellandolo (lato server)
 *  - si invoca il metodo call(azione,valore)
 *  -> in questo modo NON si tengono in considerazione ulteriori modifiche fatte nella finestra chiamante
 * 
 *
 * GESTIONE DELLE FINESTRE
 * 
 * Ogni Pagina mantiene lo stato delle finestre figlie aperte. Per questo vengono
 * memorizzate dal client in un campo nascosto e spedito al server che lo ricarica
 * a ogni passaggio.
 * 
 *
 * GESTIONE XML CORRENTE E DI PAGINA PRECEDENTE 
 *
 * Ogni pagina contiene anche un riferimento alla pagina precedente, o chiamante.
 * 1. Invio nella stessa finestra:
 *  - l'XML corrente viene duplicato e l'azione inviata (in questo modo si conserva
 *    la pagina chiamante nelle successive richieste).
 *
 * 2. Invio in una nuova finestra:
 *  - Sorte analoga
 * 
 * 3. Invio nella finestra chiamante (invio inverso):
 *  - quello che si invia e' l'XML precedentemente copiato. L'XML salvato viene cancellato.
 *    Tutto questo viene eseguito nella finestra chiamante con i parametri della finestra
 *    di invio.
 *
 */
function Pagina(percorso,genitore,statica) {
	this.base = Contenitore ;
	this.base(percorso) ;
	this.windows = new Array() ;
	//this.closingWindows = new Array() ;
	this.parentWindow = genitore ;
	this.windowName = window.name ? window.name : "wm_main" ;
	this.staticPage = statica ;

	this.requiredFields = new Array() ;
	this.requiredTitles = new Array() ;

	this.popups = new Array() ;
        
        this.moveListeners = new Array() ;
	document.onmousemove = this.registerMoves ;
	document.onclick = this.registerClicks ;
        
}

/** Handler per l'onLoad */
Pagina.prototype.init = function() {
	//window.status = "'"+finestre+"'   '"+daChiudere+"'" ;
	window.name = this.windowName ;
	/*if(this.closingAction) {
		if(this.parentWindow)
			document.modulo.target = this.parentWindow ;
		else
			window.close() ;
	}*/
}

/** Handler per l'onUnload */
Pagina.prototype.finish = function() {
	//document.getElementById('wm_wait').style.visibility = 'visible' ;
	//chiude tutte le finestre da chiudere
	//while(this.closingWindows.length>0)
	//	this.closeWindow(this.closingWindows[0]) ;
	//alert("Finestre "+document.modulo["/finestre"].value) ;

	//chiude tutte le finestre aperte nella pagina correntemente attiva!
	this.closeWindows() ;
}

Pagina.prototype.registerMoves = function(evt) {
    if(!evt)
        evt = window.event ;
    pagina.mouseX = evt.clientX ;
    pagina.mouseY = evt.clientY ;
    pagina.fireMove(evt) ;
}

Pagina.prototype.registerClicks = function(evt) {
	if(!evt)
		evt = window.event ;

	if(pagina.popupShown) {
		var i ;
		var ret = true ;
		for(i=0;i<pagina.popups.length;i++)
			ret = pagina.popups[i].checkClick(evt) && ret ;
		if(ret)
			pagina.popupShown = false ;
	}
	
	pagina.selectClicked = false ;
}

/**
 * Richiama un'azione col valore passato
 *
 * @param perc il percorso dell'oggetto da cui e' stata invocata la chiamata
 * @param act l'azione da eseguire
 * @param val il valore associato all'azione
 * @param redir l'eventuale redirect
 * @param win la finestra in caso di invio in finestra diversa
 * @param prop le proprieta' della finestra in caso di apertura nuova finestra
 * @param close se true registra la finestra di invio nella pagina corrente come dipendente
 * @param check se true controlla che i campi obbligatori registrati nella pagina siano stati riempiti (sistema provvisorio)
 * @param confirmed chiede conferma prima di invocare
 * @param store salvataggio/ripristino xml di copia
 * @param autoClose chiudi la finestra corrente dopo aver eseguito l'azione (pericolo!)
 */
Pagina.prototype.call = function(
		perc,act,val,
		redir,win,prop,close,
		check,confirmed,
		store,autoClose
) {

	var req = "" ;
	if(check)
		req = this.checkRequiredFields() ;

	if((!check || req=="") && (!confirmed || confirm("Sei sicuro?"))) {

		var m = document.modulo ;

		var wo = this.setWindow(win,prop,close && !autoClose) ;

		if(this.staticPage) {

			if(wo)
				wo.location.href=redir+'?wm_staticval='+val ;
			else
				document.location.href = redir+'?wm_staticval='+val ;

		} else {

			if(!act)//azione non impostata
				act = "" ;
			if(act.indexOf('/')<0)//azione relativa al percorso
				act = perc+"/"+act ;

			//valori impostati direttamente dai parametri (non c'e' bisogno di riazzerarli)
			m.wm_action.value = act ;
			m.wm_value.value = val ;
			m.wm_window.value = this.windowName ;
			m.wm_newwindow.value = win ? win : "" ;
			m.wm_redir.value = redir ? redir : "" ;
			m.wm_storexml.value = store ? store : "" ;
			if(store=='ripristina' && (win==this.parentWindow || win=='_parent')) {
				//salvo l'xml chiamante in parametri temporanei
				var pm = window.opener.document.modulo ;
				m.wm_jlen.value = pm.wm_clen.value ;
				m.wm_jxml.value = pm.wm_callerxml.value ;
				//alert(m.wm_jlen.value) ;
			}
			m.submit() ;

			//ripristina il target e le finestre dopo l'invio (tutti questi parametri sono relativi alla pagina corrente)
			//m["@genitore"].value = this.parentWindow ;
			//m["@finestre"].value = this.windows.join(",") ;
			//m["@chiudi"].value = this.closingWindows.join(",") ;
			m.target = "" ;

			//da sperimentare
			if(autoClose)
				window.close() ;
		}

	} else {

		if(req)
			alert("Il campo '"+req+"' e' obbligatorio") ;

	}
}

Pagina.prototype.callByKeyEvent = function(evt, perc, act) {
	evt = evt ? evt : window.event ;
	if(evt.keyCode==13)
		this.call(perc,act) ;
}

/**
 * Imposta la finestra in cui richiamare le azioni
 */
Pagina.prototype.setWindow = function(win,prop,close) {
	var ret = null ;
	var m = document.modulo ;
	if(win && win!=window.name) {
		if(win=='_parent')
			win = this.parentWindow ? this.parentWindow : "_parent" ;
		var pos = "" ;
		//if(x>0 && y>0)
		//	pos = "left="+x+",top="+y+"," ;
		if(!prop)//proprieta di default
			prop = "menubar=no,toolbar=no,width=640,height=480,scrollbars=yes,statusbar=yes" ;
		if(prop.substr(0,10)=="fullscreen")//fullscreen meno fastidioso
			prop = "width="+getWidth()+",height="+getHeight()+",scrollbars=yes,statusbar=yes" ;
		prop = pos + prop ;

		//invio in finestra figlia
		if(win!=this.parentWindow) {
			ret = this.openWindow(win,prop,close) ;
			//m["@genitore"].value = window.name ;
			//m["@finestre"].value = "" ;
			//m["@chiudi"].value = "" ;
		//ritorno alla finestra genitore
		} else {
			//var gm = window.opener.document.modulo ;
			//m["@genitore"].value = gm["@genitore"].value ;
			//m["@finestre"].value = gm["@finestre"].value ;
			//m["@chiudi"].value = gm["@chiudi"].value ;
		}

		m.target = win ;

	} else {

		setTimeout("showWait()",500) ;
		m.target = "" ;

	}

	return ret ;
}

Pagina.prototype.openWindow = function(win,prop,close) {
	var ret = window.open('',win,prop) ;
	//ret.creator = window ;
	ret.focus() ;
	this.windows.push(ret) ;
	//if(close)
	//	this.closingWindows.push(win) ;

	//window.status = window.name+": '"+this.windows.join(",")+"'-'"+this.closingWindows.join(",")+"'" ;
	return ret ;
}

/*Pagina.prototype.closeWindow = function(win) {
	//alert("CLOSING: "+name+" IN "+window.name) ;
	//var win = window.open('',name) ;
	//if(win)
	//	win.close() ;
	//this.windows.remove(name) ;
	//this.closingWindows.remove(name) ;
}*/

Pagina.prototype.closeWindows = function() {
	var i ;
	for(i=0;i<this.windows.length;i++)
		this.windows[i].close() ;
	this.windows = new Array() ;
}

//-- MODO TEMPORANEO DI CONROLLARE I CAMPI OBBLIGATORI (in tutta la pagina!) ---
//
Pagina.prototype.addRequiredField = function(field) {
	//this.requiredTitles.push(title) ;
	this.requiredFields.push(field) ;
}

Pagina.prototype.checkRequiredFields = function() {
	var ret = "" ;
	var i ;
	for(i=0;ret=="" && i<this.requiredFields.length;i++) {
		var field = this.requiredFields[i] ;
		if(!field.check())
			ret = field.title ;//ATTEZIONE!! UN title VUOTO IMPLICA CHE IL CHECK NON VIENE FORZATO!
		//if(document.modulo[this.requiredFields[i]] && !document.modulo[this.requiredFields[i]].value)
		//	ret = this.requiredTitles[i] ;
	}
	return ret ;
}
//
//------------------------------------------------------------------------------


Pagina.prototype.addMoveListener = function(l) {
    this.moveListeners.push(l) ;
}

Pagina.prototype.fireMove = function(evt) {
    var i ;
    for(i=0;i<this.moveListeners.length;i++)
        this.moveListeners[i](evt) ;
}

Pagina.prototype.registerPopup = function(popup) {
	this.popups.push(popup) ;
}

Pagina.prototype.showPopup = function(popup) {
	var i ;
	for(i=0;i<this.popups.length;i++)
		if(this.popups[i]!=popup)
			this.popups[i].hide() ;
	this.popupShown = true ;
}

