La nostra messagebox ora ben si presta ad essere usata in applicazioni.
Tuttavia ancora ha un difetto non indifferente: posso creare una sola istanza (ovvero, i metodi di callback accedono genericamente all'oggetto msgBox, senza avere una possibilità di identificarne l'origine).
Quindi: per poter posizionare dinamicamente la messagebox a seconda delle necessità dovrò invocare il metodo di posizionamento ad ogni chiamata: isolo la funzione e mi creo un paio di proprietà per accedere all'allineamento dal metodo esterno:
this.horizontalAlign = "center"
this.verticalAlign = "center"
E creo la nuova funzione setDivAlign() che verrà invocata automaticamente da show()
_msgBox.prototype.setDivAlign = function()
{
with (this)
{
// centro il message box
var aLayerWidth = divMsgBox.style.width;
var aLayerHeight = divMsgBox.style.height;
var cleft = parseInt(windowWidth)/2-parseInt(aLayerWidth)/2+'px';
var ctop = parseInt(windowHeight)/2-parseInt(aLayerHeight)/2+'px';
switch (horizontalAlign)
{
case "left":
cleft = "1px";
break;
case "right":
cleft = "" + parseInt(windowWidth)-parseInt(aLayerWidth) + "px";
break;
}
switch (verticalAlign)
{
case "top":
ctop = "1px";
break;
case "bottom":
ctop = "" + parseInt(windowHeight)-parseInt(aLayerHeight) + "px";
break;
}
divMsgBox.style.left = cleft;
divMsgBox.style.top = ctop;
}
}
Ecco fatto. Ora ho un workaround per il problema (posso usare un'unica msgBox e visualizzarla in posizioni diverse; sarà sufficiente posizionarla con
msgBox.horizontalAlign = 'center';
msgBox.ask('dormi?', elaboraRisposta, 'una domanda')
prima dell'invocazione.
I file descritti in questo articolo si possono scaricare dall'introduzione