=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.client.css'
--- old/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.client.css	2024-08-30 12:25:38 +0000
+++ new/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.client.css	2025-12-19 22:15:54 +0000
@@ -2,13 +2,14 @@
 ** Module   : p2j.client.css
 ** Abstract : Common CSS styles for the web client.
 **
-** Copyright (c) 2021-2024, Golden Code Development Corporation.
+** Copyright (c) 2021-2025, Golden Code Development Corporation.
 **
 ** -#- -I- --Date-- ------------------------------Description----------------------------------
 ** 001 SBI 20210629 Added the web client CSS styles.
 ** 002 HC  20231005 Implemented focus transfer when opening modal windows on top of driver
 **                  widgets.
 ** 003 SB  20240627 Add class for dynamically setting cursor property.
+** 004 SBI 20251220 Added new styles to support dojo based dialogs.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -103,11 +104,12 @@
                       position: fixed;
                       background: white;
                       width: 300px;
-                      height: 200px;
+                      height: auto;
                       display: flex;
                       flex-direction: column;
                       flex-wrap: nowrap;
                       align-items: flex-start;
+                      overflow: auto;
                    }
          .title    {
                       position   : relative;
@@ -131,6 +133,7 @@
                       position   : relative;
                       background : white;
                       text-align : center;
+                      padding : 5px;
                    }
          .buttons  {
                       position   : relative;
@@ -141,6 +144,7 @@
                       justify-content : space-around;
                    }
          .button  {
+                      display : inline;
                       position   : relative;
                       align-self : center;
                       text-align : center;
@@ -160,3 +164,60 @@
          canvas:focus {
                       outline: none;
          }
+         .dijitDialog.noTitleBar .dijitDialogTitleBar {
+                 /* hide title bar */
+                 display: none !important;
+         }
+
+         .dijitDialog.noTitleBar .dijitDialogPaneContent {
+           /* adjust spacing when titlebar is hidden */
+                       padding-top: 0px;
+         }
+         .dijitDialogPaneContent.dijitDialogSingleChild {
+                       padding: 0 !important;
+         } 
+         .dialogFWDOverride {
+                      width: 300px;
+                      height: auto;
+         }
+         .borderContainerFWDOverride {
+                      height: auto;
+                      margin: 0 !important;
+                      border: none !important;
+                      padding: 0 !important;
+         }
+         .centerPaneFWDOverride {
+                      font-size  : 14px;
+                      height: auto;
+                      overflow: auto !important;
+                      margin: 0 !important;
+                      border: none !important;
+                      padding: 0 !important;
+                      width: 100%;
+                      position: relative;
+         }
+         .topPaneFWDOverride {
+                      height: auto;
+                      margin: 0 !important;
+                      border: none !important;
+                      width : 100%;
+                      padding: 0 !important;
+         }
+         .bottomPaneFWDOverride {
+                      height: auto;
+                      margin: 0 !important;
+                      border: none !important;
+                      width : 100%;
+                      padding: 0 !important;
+                      overflow: auto !important;
+         }
+         .hidePane {
+                      display : none !important;
+         }
+         .loadingDialogTitleFWDOverride {
+            padding : 1px 0px 1px 0px !important;
+            font-size: 12px !important;
+         }
+         .loadingDialogFWDOverride {
+            font-size: 12px !important;
+         }

=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js'
--- old/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js	2025-12-10 12:29:35 +0000
+++ new/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.js	2025-12-19 21:56:27 +0000
@@ -72,6 +72,8 @@
 ** 029 PMP 20250916 Initialized networkSocket module. 
 ** 030 SB  20251113 Remove the cursor overlay on mouse clicks as well if there was no previous mouse move.
 ** 031 SBI 20251210 Added repeat key.(refs: #10984, #10982, #10836)
+** 032 SBI 20251220 Reused dojo dialogs, fixed isDialogDisplayed to block user events
+**                  to be sent to the java web client if ModalDialog is displayed. 
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -171,13 +173,13 @@
    
    /** The dialog identifiers */
    const DIALOGS = { OPENPOPUP : "openMimeResource"}
-      
-   /** The instance of the unique copy/cut/paste notification dialog. */
-   var dialog;
    
    /** The open popup dialog */
    var openPopupDialog;
    
+   /** The set of displayed ModalDialogs */
+   var dialogs = new Set();
+   
    /** The notification templates to prompt a user to do an action */
    var prompts = {};
    
@@ -594,17 +596,22 @@
       var loadingProgressBar = new dijit.ProgressBar(
          {
             maximum: 100,
-            style: "font-weight: bold"
+            style: "font-weight: bold;"
          });
       var loadingDialog = new ModalDialog(id,
             document.body,
             "",
             "",
-            true);
+            true,
+            {"noTitle" : false, "closable" : false});
       var progressTimer;
       
       function setLoadingCheckpoint(value)
       {
+         if (loadingDialog.isDisposed())
+         {
+            return;
+         }
          loadingProgressBar.set({"value" : value});
          var v0 = loadingProgressBar.get("value");
          var time = 1;
@@ -645,8 +652,8 @@
       loadingDialog.setTitle(i18n.gettext("Loading..."));
       loadingDialog.setContent({htmlElement : loadingProgressBar.domNode});
       loadingProgressBar.startup();
-      loadingDialog.overrideDialogStyle({"height" :"40px"});
-      loadingDialog.overrideTitleStyle({"padding" :"1px"});
+      loadingDialog.overrideDialogStyle("loadingDialogFWDOverride");
+      loadingDialog.overrideTitleStyle("loadingDialogTitleFWDOverride");
       loadingDialog.show();
       setLoadingCheckpoint(0);
       
@@ -1198,7 +1205,7 @@
     */
    function createInternalDialog(id, container, text, tooltip, keyDownHandler)
    {
-      var dlg = new ModalDialog(id, container, text, tooltip, false);
+      var dlg = new ModalDialog(id, container, text, tooltip, false, {"noTitle" : true, "closable" : false});
       
       if (keyDownHandler)
       {
@@ -1209,11 +1216,11 @@
    };
    
    /**
-    * Tests if the clipboard dialog is active.
+    * Tests if there is an active modal dialog.
     */
    function isDialogDisplayed()
    {
-      return (dialog != null) && (dialog != undefined);
+      return dialogs.size > 0;
    }
    
    me.isDialogDisplayed = isDialogDisplayed;
@@ -1228,7 +1235,7 @@
     */
    function createOpenPopupDialog(keyDownHandler)
    {
-      if (!openPopupDialog || openPopupDialog.disposed)
+      if (!isDialogDisplayed())
       {
          openPopupDialog = createInternalDialog(DIALOGS[OPENPOPUP],
                                                 document.body,
@@ -1345,6 +1352,7 @@
                                if (openPopupDialog)
                                {
                                   openPopupDialog.close();
+                                  openPopupDialog = null;
                                }
                             }
                          });
@@ -1952,98 +1960,317 @@
     * @param    {Boolean} hidden
     *           True value indicates that the new created dialog must be hidden. So it requires to
     *           invoke its show()/hide() methods to control its visibility.
+    * @param    {Object} titleOption
+    *           Title option object with the following properties:
+    *           noTitle  true or false - the dialog title is hidden or not
+    *           closable true or false - the X cancel button is displayed or not
     */
-   function ModalDialog (id, container, text, tooltip, hidden)
+   function ModalDialog (id, container, text, tooltip, hidden, titleOption)
    {
-      var overlayId = getOverlayId(id);
-      var zIndex = getMaxZIndex();
-      var overlay = createOverlayPanel(overlayId, zIndex, container);
-      var dialog = document.createElement("div");
-      dialog.id = id;
-      var titleEl = document.createTextNode("");
-      /** header panel */
-      var titleDiv = document.createElement("div");
-      titleDiv.appendChild(titleEl);
-      titleDiv.className = "title";
-      dialog.appendChild(titleDiv);
-      /** content panel */
-      var contentDiv = document.createElement("div");
-      contentDiv.className = "content";
-      //fill text content
-      setTextContent(text);
-      dialog.appendChild(contentDiv);
-      dialog.tabIndex = 1;
-      dialog.className    = "dialog centered";
-      dialog.style.zIndex = zIndex + 1;
-      dialog.title = tooltip;
-      container.appendChild(dialog);
+      var that = this;
+      that.id = id;
+      that.text = text;
+      that.tooltip = tooltip;
+      that.noTitle = (titleOption && titleOption.noTitle) ? true : false;
+      that.closable = (titleOption && titleOption.closable) ? true : false;
+      that.container = container;
+      
       // create application events listeners map
-      dialog.listeners = new Map();
+      that.listeners = new Map();
       // create html document events triggers map
-      dialog.triggers = new Map();
+      that.triggers = new Map();
       // save the overlay panel instance
-      dialog.overlay  = overlay;
+      var titleDiv;
+      var contentDiv;
       /** buttons panel */
       var buttonsDiv;
       /** footer panel */
       var footerDiv;
       /** disposed state */
-      dialog.disposed = false;
+      that.disposed = false;
       /** visibility state */
-      dialog.visible = false;
+      that.visible = false;
       /** Represents the locked state that must protect dialog from modifications */
-      dialog.locked = false;
+      that.locked = false;
       /** Stack of postponed actions applied to this dialog */
-      dialog.postponedActions = [];
+      that.postponedActions = [];
+      
+      /** Create backbone dojo dialog */
+      function createDojoDialog(container)
+      {
+         dojo.require("dojo.Deferred");
+         var createDialogDeferred = new dojo.Deferred();
+         
+         require(["dojo/dom","dojo/dom-style", "dojo/dom-class", "dojo/dom-attr", "dojo/dom-construct", "dijit/registry", "dijit/Dialog", "dijit/layout/ContentPane", "dijit/layout/BorderContainer", "dijit/form/Button", "dojo/domReady!"],
+         function(dom, domStyle, domClass, domAttr, domConstruct, registry, Dialog, ContentPane, BorderContainer, Button)
+         {
+            try
+            {
+               var dojoDialog = new Dialog(
+                     { 
+                       id : that.id,
+                       className: "dialogFWDOverride",
+                       autofocus: false,
+                       refocus: false,
+                       closable: that.closable,
+                      });
+               var borderContainer = new BorderContainer(
+                     {
+                        design: 'headline',
+                        className: 'borderContainerFWDOverride',
+                      });
+               var centerPane = new ContentPane({
+                  region: 'center',
+                  className: 'centerPaneFWDOverride',
+                });
+               
+               var textDiv = domConstruct.create('div', { className: 'text' }, centerPane.containerNode);
+               textDiv.appendChild(document.createTextNode(text));
+               var topPane = new ContentPane({
+                  region: 'top',
+                  className: 'topPaneFWDOverride',
+                });
+               hidePane(topPane.domNode, true);
+               var footerPane = new ContentPane({
+                  region: 'bottom',
+                  className: 'bottomPaneFWDOverride',
+                });
+               hidePane(footerPane.domNode, true);
+   
+               borderContainer.addChild(centerPane);
+               borderContainer.addChild(topPane);
+               borderContainer.addChild(footerPane);
+               borderContainer.placeAt(dojoDialog.containerNode);
+               centerPane.startup();
+               topPane.startup();
+               footerPane.startup();
+               borderContainer.startup();
+               
+               
+               function computeDialogSize()
+               {
+                  // max 80% of viewport
+                  var maxHeight = Math.round(window.innerHeight * 0.8);
+                  var maxWidth = Math.round(window.innerWidth * 0.8);
+                  
+                  if(!borderContainer.domNode)
+                  {
+                     return {
+                               "height" : maxHeight,
+                               "width" : maxWidth,
+                               "titleHeight" : 0,
+                               "contentHeight" : 0, 
+                               "topHeight" : 0, 
+                               "footerHeight" : 0,
+                               "borderContainerTop" : 0,
+                               "centerPaneTop" : 0
+                            };
+                  }
+   
+                  borderContainer.domNode.style.height = 'auto';
+   
+                  var centerNode = centerPane.domNode;
+                  var contentHeight = 0;
+                  var contentWidth = 0;
+                  if(centerNode)
+                  {
+                     contentHeight = Math.max(centerNode.scrollHeight, centerNode.offsetHeight || 0);
+                     contentWidth = Math.max(centerNode.scrollWidth, centerNode.offsetWidth || 0);
+                  }
+                  
+                  var topHeight = topPane.domNode ? topPane.domNode.offsetHeight : 0;
+                  var footerHeight = footerPane.domNode ? footerPane.domNode.offsetHeight : 0;
+                  var footerInnerHeight = footerPane.containerNode ? footerPane.containerNode.offsetHeight : 0;
+                  var footerOnlyChild = footerPane.containerNode.firstElementChild;
+                  if (footerOnlyChild)
+                  {
+                     footerHeight = Math.max(footerHeight, footerOnlyChild.offsetHeight);
+                     //console.debug("footerOnlyChild.offsetHeight=" + footerOnlyChild.offsetHeight);
+                  }
+                  footerHeight = Math.max(footerHeight, footerInnerHeight);
+                  var titleBar = dojoDialog.titleBar;
+                  var titleHeight = titleBar ? titleBar.offsetHeight : 0;
+   
+                  var dialogHeight = titleHeight + topHeight + contentHeight + footerHeight;
+   
+   
+                  return {
+                     height : Math.min(dialogHeight, maxHeight),
+                     width: contentWidth,
+                     titleHeight : titleHeight,
+                     contentHeight : contentHeight, 
+                     topHeight: topHeight, 
+                     footerHeight : footerHeight,
+                     borderContainerTop : borderContainer.domNode.offsetTop,
+                     centerPaneTop : centerNode.offsetTop
+                  };
+               }
+               
+               function toggleCssForNode(node, cssStyleName, value)
+               {
+                  domClass.toggle(node, cssStyleName, value);
+               }
+               that.toggleCssForNode = toggleCssForNode;
+               
+               function toggleTitle(value)
+               {
+                  toggleCssForNode(dojoDialog.domNode, 'noTitleBar', value);
+               }
+               that.toggleTitle = toggleTitle;
+               
+               function hidePane(paneNode, value)
+               {
+                  toggleCssForNode(paneNode, 'hidePane', value);
+               }
+               that.hidePane = hidePane;
+               
+               function unregistry()
+               {
+                  var still = registry.byId(that.id);
+                  if(still)
+                  {
+                    try
+                    {
+                      registry.remove(that.id); 
+                    }
+                    catch(e)
+                    {
+                      console.error('registry.remove failed', e);
+                    }
+                  }
+               }
+               that.unregistry = unregistry;
+               
+               function doDialogLayout()
+               {
+                  var dim = computeDialogSize();
+//                  console.debug("doDialogLayout(): dim=" + JSON.stringify(dim));
+                  topPane.domNode.style.height = dim.topHeight + 'px';
+                  footerPane.domNode.style.height = dim.footerHeight + 'px';
+                  dojoDialog.domNode.style.height = dim.height + 'px';
+      
+                  var topPanelHeight = topPane.domNode.offsetHeight;
+                  var centerPanelHeight = centerPane.domNode.offsetHeight;
+                  centerPane.domNode.style.top = topPane.domNode.offsetHeight + 'px';
+                  footerPane.domNode.style.top = (topPane.domNode.offsetHeight + centerPane.domNode.offsetHeight) + 'px';
+                  
+                  var centerPanelWidth = Math.max(centerPane.domNode.scrollWidth, centerPane.domNode.offsetWidth);
+                  var topPanelWidth = Math.max(topPane.domNode.scrollWidth, topPane.domNode.offsetWidth);
+                  var footerPanelWidth = Math.max(footerPane.domNode.scrollWidth, footerPane.domNode.offsetWidth);
+                  var borderPanelWidth = Math.max(borderContainer.domNode.scrollWidth,borderContainer.domNode.offsetWidth);
+                  borderPanelWidth = Math.max(dim.width, topPanelWidth, centerPanelWidth, footerPanelWidth, borderPanelWidth);
+      
+                  borderContainer.domNode.style.width = borderPanelWidth + 'px';
+                  borderContainer.resize();
+                  //dojoDialog.resize();
+               }
+               that.doDialogLayout = doDialogLayout;
+               
+               dojoDialog.on('show', doDialogLayout);
+               
+               if (that.noTitle)
+               {
+                  domClass.add(dojoDialog.domNode, 'noTitleBar');
+                  domAttr.set(dojoDialog.domNode, 'aria-label', that.tooltip);
+               }
+               dojoDialog.placeAt(container);
+               dojoDialog.startup();
+               that.dojoDialog = dojoDialog;
+               that.centerPane = centerPane;
+               that.footerPane = footerPane;
+               that.topPane = topPane;
+               contentDiv = centerPane.containerNode;
+               footerDiv = footerPane.containerNode;
+               buttonsDiv = topPane.containerNode;
+               titleDiv = dojoDialog.titleBar;
+               createDialogDeferred.resolve(true);
+            }
+            catch(e)
+            {
+               createDialogDeferred.reject(e);
+            }
+         });
+         return createDialogDeferred;
+      }
       
       setVisible(false);
       
       function setVisible(status)
       {
-         dialog.visible = status;
-         //console.debug(dialog.id + " visible = " + dialog.visible);
+         that.visible = status;
+//         console.debug(that.id + " visible = " + that.visible);
       }
       
       // initial state is hidden
-      changeDisplayStyle(overlay, "none");
-      changeVisibilityStyle(dialog, "collapse");
+      var createDialogAction = createDojoDialog(container);
       
       if (!hidden)
       {
          show();
       }
       
+      function logError(msg)
+      {
+         return function (e)
+         {
+            console.error(msg, e);
+         }
+      }
+      
+      function updateLayout()
+      {
+         if (that.disposed)
+         {
+            return;
+         }
+         
+         createDialogAction.then(() =>
+         {
+            that.doDialogLayout();
+         }, logError("createDojoDialog() failed"));
+      }
+      
+      this.updateLayout = updateLayout;
+      
       function show()
       {
-         if (dialog.disposed)
+         if (that.disposed || that.visible)
          {
             return;
          }
          
-         if (!isVisible())
+         createDialogAction.then(() =>
          {
-            updateZIndex();
-            changeDisplayStyle(overlay, "block");
-            changeVisibilityStyle(dialog, "visible");
-            setVisible(true);
-         }
+            that.dojoDialog.show().then(function()
+            {
+               setVisible(true);
+               dialogs.add(that.id);
+//               console.debug("show " + that.id + " " + dialogs.size);
+            }, logError("dojoDialog.show() failed"));
+         }, logError("createDojoDialog() failed"));
       }
       
       this.show = show;
-      
       function hide()
       {
-         if (isVisible())
-         {
-            changeDisplayStyle(overlay, "none");
-            changeVisibilityStyle(dialog, "collapse");
-            setVisible(false);
-            var listener = dialog.listeners.get("onHide");
-            if (listener)
+         if (!isVisible())
+         {
+            return;
+         }
+         createDialogAction.then(() =>
+         {
+            that.dojoDialog.hide().then(() => 
             {
-               listener();
-            }
-         }
+               var listener = that.listeners.get("onHide");
+               if (listener)
+               {
+                  listener();
+               }
+               setVisible(false);
+               dialogs.delete(that.id);
+//               console.debug("hide "  + that.id + " " + dialogs.size);
+            }, logError("dojoDialog.hide() failed"));
+         }, logError("createDojoDialog() failed"));
       }
       
       this.hide = hide;
@@ -2053,31 +2280,31 @@
        */
       function isVisible()
       {
-         return dialog.visible;
+         return that.visible;
       }
       
       this.isVisible = isVisible;
       
-      /**
-       * Update z-index
-       */
-      function updateZIndex()
-      {
-         var zIndex = getMaxZIndex();
-         overlay.style.zIndex = zIndex;
-         dialog.style.zIndex = zIndex + 1;
-      }
-      
-      function overrideDialogStyle(styleObject)
-      {
-         setStyleForElement(dialog, styleObject);
+      function overrideDialogStyle(cssStyleName)
+      {
+         createDialogAction.then(
+               function()
+               {
+                  that.toggleCssForNode(that.dojoDialog.domNode, cssStyleName, true);
+               },
+               logError("createDojoDialog() failed"));
       }
       
       this.overrideDialogStyle = overrideDialogStyle;
       
-      function overrideTitleStyle(styleObject)
+      function overrideTitleStyle(cssStyleName)
       {
-         setStyleForElement(titleDiv, styleObject);
+         createDialogAction.then(
+               function()
+               {
+                  that.toggleCssForNode(titleDiv, cssStyleName, true);
+               },
+               logError("createDojoDialog() failed"));
       }
       
       this.overrideTitleStyle = overrideTitleStyle;
@@ -2104,12 +2331,16 @@
        */
       function setContent(component)
       {
-         removeAllChildren(contentDiv);
-         
-         if (component.htmlElement)
+         createDialogAction.then(function(resolved)
          {
-            contentDiv.appendChild(component.htmlElement);
-         }
+            removeAllChildren(contentDiv);
+            
+            if (component.htmlElement)
+            {
+               contentDiv.appendChild(component.htmlElement);
+            }
+         },
+         logError("createDojoDialog() failed"));
       }
       
       this.setContent = setContent;
@@ -2122,13 +2353,17 @@
        */
       function setTextContent(text)
       {
-         removeAllChildren(contentDiv);
-         
-         var textEl = document.createTextNode(text);
-         var textDiv = document.createElement("div");
-         textDiv.appendChild(textEl);
-         textDiv.className = "text centered";
-         contentDiv.appendChild(textDiv);
+         createDialogAction.then(function(resolved)
+               {
+                  removeAllChildren(contentDiv);
+                  
+                  var textEl = document.createTextNode(text);
+                  var textDiv = document.createElement("div");
+                  textDiv.appendChild(textEl);
+                  textDiv.className = "text";
+                  contentDiv.appendChild(textDiv);
+               },
+               logError("createDojoDialog() failed"));
       }
       
       this.setTextContent = setTextContent;
@@ -2141,44 +2376,39 @@
        */
       function setButtons(components)
       {
-         if (buttonsDiv)
+         createDialogAction.then(
+         function(resolved)
          {
+            if (that.topPane.domNode)
+            {
+               that.hidePane(that.topPane.domNode, false);
+            }
             removeAllChildren(buttonsDiv);
-         }
-         else
-         {
-            buttonsDiv = document.createElement("div");
-            buttonsDiv.className = "buttons spring";
-            dialog.appendChild(buttonsDiv);
-         }
-         if (!Array.isArray(components))
-         {
-            return;
-         }
-         for (var i = 0; i < components.length; i++)
-         {
-            var component = components[i];
-            var buttonElem;
-            if (component.type == "button")
-            {
-               buttonElem = document.createElement("button");
-               buttonElem.className = "button";
-               buttonElem.type = "button";
-               var labelText = document.createTextNode(component.label);
-               buttonElem.appendChild(labelDiv);
-               buttonElem.tabIndex = 0;
-               buttonElem.onclick = component.onclick;
-               
-            }
-            else
-            {
-               buttonElem = document.createElement("div");
-               buttonElem.className = "button";
-               //add html element
-               buttonElem.appendChild(component.htmlElement);
-            }
-            buttonsDiv.appendChild(buttonElem);
-         }
+            for (var i = 0; i < components.length; i++)
+            {
+               var component = components[i];
+               var buttonElem;
+               if (component.type == "button")
+               {
+                  buttonElem = document.createElement("button");
+                  buttonElem.className = "button";
+                  buttonElem.type = "button";
+                  var labelText = document.createTextNode(component.label);
+                  buttonElem.appendChild(labelText);
+                  buttonElem.tabIndex = 0;
+                  buttonElem.onclick = component.onclick;
+               }
+               else
+               {
+                  buttonElem = document.createElement("div");
+                  buttonElem.className = "button";
+                  //add html element
+                  buttonElem.appendChild(component.htmlElement);
+               }
+               buttonsDiv.appendChild(buttonElem);
+            }
+         },
+         logError("createDojoDialog() failed"));
       }
       
       this.setButtons = setButtons;
@@ -2191,21 +2421,24 @@
        */
       function setFooter(component)
       {
-         if (footerDiv)
-         {
-            removeAllChildren(footerDiv);
-         }
-         else
-         {
-            footerDiv = document.createElement("div");
-            footerDiv.className = "footer spring";
-            dialog.appendChild(footerDiv);
-         }
-         
-         if (component.htmlElement)
-         {
-            footerDiv.appendChild(component.htmlElement);
-         }
+         createDialogAction.then(
+         function(resolved)
+         {
+            if (that.footerPane)
+            {
+               that.hidePane(that.footerPane.domNode, false);
+            }
+            if (footerDiv)
+            {
+               removeAllChildren(footerDiv);
+            }
+            
+            if (component.htmlElement)
+            {
+               footerDiv.appendChild(component.htmlElement);
+            }
+         },
+         logError("createDojoDialog() failed"));
       }
       
       this.setFooter = setFooter;
@@ -2244,20 +2477,23 @@
        */
       function setTitle(title)
       {
-         removeAllChildren(titleDiv);
          if (title)
          {
-            title = title.trim();
-            titleDiv.appendChild(document.createTextNode(title));
+          title = title.trim();
+          that.noTitle = title.length == 0;
+         }
+         createDialogAction.then(
+         function(resolved)
+         {
+            that.toggleTitle(that.noTitle);
             if (title)
             {
-               var baseClass = titleDiv.className;
-               if (baseClass.indexOf("spring") < 0)
-               {
-                  titleDiv.className = baseClass + " spring";
-               }
+               title = title.trim();
+               
+               that.dojoDialog.set("title", title);
             }
-         }
+         },
+         logError("createDojoDialog() failed"));
       }
       
       this.setTitle = setTitle;
@@ -2277,19 +2513,19 @@
       {
          if (documentListener)
          {
-            var chainedListeners = dialog.triggers.get(eventType);
+            var chainedListeners = that.triggers.get(eventType);
             if (!chainedListeners)
             {
                chainedListeners = new ChainedListeners();
-               dialog.triggers.set(eventType, chainedListeners);
+               that.triggers.set(eventType, chainedListeners);
                var wrappedChainedListener = function(event)
                {
-                  dialog.locked = true;
+                  that.locked = true;
                   chainedListeners.handle(event);
-                  dialog.locked = false;
-                  while(dialog.postponedActions.length > 0)
+                  that.locked = false;
+                  while(that.postponedActions.length > 0)
                   {
-                     var action = dialog.postponedActions.pop();
+                     var action = that.postponedActions.pop();
                      action();
                   }
                }
@@ -2310,7 +2546,7 @@
          }
          else
          {
-            dialog.listeners.set(eventType, handler);
+            that.listeners.set(eventType, handler);
          }
       };
       
@@ -2324,15 +2560,15 @@
        */
       function removeTrigger(eventType)
       {
-         var chainedListeners = dialog.triggers.get(eventType);
+         var chainedListeners = that.triggers.get(eventType);
          if (chainedListeners)
          {
             window.removeEventListener(eventType, chainedListeners.wrappedChainedListener, true);
-            dialog.triggers.delete(eventType);
+            that.triggers.delete(eventType);
          }
          else
          {
-            dialog.listeners.delete(eventType);
+            that.listeners.delete(eventType);
          }
       };
       
@@ -2343,48 +2579,67 @@
        */
       function close()
       {
-         if (dialog.locked)
-         {
-            dialog.postponedActions.push(function() {close();});
-            return;
-         }
-         if (!dialog.disposed)
-         {
-            hide();
-            dialog.parentNode.removeChild(dialog);
-            var overlay = dialog.overlay;
-            if (overlay)
-            {
-               overlay.parentNode.removeChild(overlay);
-            }
-            if (buttonsDiv)
-            {
-               removeAllChildren(buttonsDiv);
-            }
-            if (footerDiv)
-            {
-               removeAllChildren(footerDiv);
-            }
-            var listener = dialog.listeners.get("onClose");
-            
-            dialog.triggers.forEach(
-            function(handler, eventType, triggers)
-            {
-               removeTrigger(eventType);
-            });
-            dialog.listeners.forEach(
-            function(handler, eventType, triggers)
-            {
-               removeTrigger(eventType);
-            });
-            
-            dialog.disposed = true;
-            
-            if (listener)
-            {
-               listener();
-            }
-         }
+//         console.debug("close() " + that.id);
+         if (that.locked)
+         {
+            that.postponedActions.push(function() {close();});
+            return;
+         }
+         if (that.disposed)
+         {
+            return;
+         }
+         createDialogAction.then(() =>
+         {
+//            console.debug("close() dispose part: " + that.id);
+            that.dojoDialog.hide().then(()=>
+            {
+               if (that.dojoDialog)
+               {
+                  that.dojoDialog.destroyRecursive();
+               }
+               if (that.dojoDialog.domNode)
+               {
+                  that.container.removeChild(that.dojoDialog.domNode);
+               }
+               
+               if (buttonsDiv)
+               {
+                  removeAllChildren(buttonsDiv);
+               }
+               buttonsDiv = null;
+               if (footerDiv)
+               {
+                  removeAllChildren(footerDiv);
+               }
+               footerDiv = null;
+               that.dojoDialog = null;
+               
+               var listener = that.listeners.get("onClose");
+               
+               that.triggers.forEach(
+               function(handler, eventType, triggers)
+               {
+                  removeTrigger(eventType);
+               });
+               that.listeners.forEach(
+               function(handler, eventType, triggers)
+               {
+                  removeTrigger(eventType);
+               });
+               
+               if (listener)
+               {
+                  listener();
+               }
+               that.unregistry();
+               that.disposed = true;
+               dialogs.delete(that.id);
+//               console.debug("close() " + that.id + " " + dialogs.size);
+           },
+            logError("dojoDialog.hide() failed"));
+         },
+         logError("createDojoDialog() failed"));
       };
       
       this.close = close;
@@ -2394,54 +2649,11 @@
        */
       function isDisposed()
       {
-         return dialog.disposed;
+         return that.disposed;
       }
       
       this.isDisposed = isDisposed;
       
-      /**
-       * Creates the overlay panel that must cover the displayed page.
-       * 
-       * @param    {String} id
-       *           The element unique identifier.
-       * @param    {Number} zIndex
-       *           The maximal z-index calculated for the current page.
-       * @param    {HtmlElement} container
-       *           The container element.
-       * 
-       * @return   The overlay panel.
-       */
-      function createOverlayPanel(id, zIndex, container)
-      {
-         var overlayPanel = document.getElementById(id);
-         
-         if (!overlayPanel)
-         {
-            overlayPanel    = document.createElement("div");
-            overlayPanel.id = id;
-            overlayPanel.className = "overlay";
-         }
-         if (!container.contains(overlayPanel))
-         {
-            container.appendChild(overlayPanel);
-         }
-         overlayPanel.style.zIndex  = zIndex;
-         
-         return overlayPanel;
-      };
-      
-      /**
-       * Gets the modal dialog overlay panel unique identifier.
-       * 
-       * @param    {String} dialogId
-       *           The dialog unique identifier.
-       * 
-       * @return   The overlay element unique identifier.
-       */
-      function getOverlayId(dialogId)
-      {
-         return dialogId + "_overlay";
-      }
    };
    
    /**

=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js'
--- old/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js	2024-11-26 15:07:25 +0000
+++ new/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.logger.js	2025-12-19 21:57:54 +0000
@@ -18,6 +18,7 @@
 **                  dojo library has been loaded.
 ** 006 SBI 20220518 Added enable()/disable() logging functionality.
 ** 007 PMP 20241126 Removed unused createClipboardDialog and replaced its usage with requestClipboardWrite.
+** 008 SBI 20251220 Fixed the dialog size to fit the screen view port.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -107,7 +108,7 @@
       require(["dojo/dom","dojo/dom-style", "dojo/dom-construct", "dijit/Dialog", "dijit/form/Textarea", "dijit/form/Button", "dojo/domReady!"],
             function(dom, domStyle, domConstruct, Dialog, Textarea, Button)
             {
-               var style = "width:800px;height:600px;display:flex;flex-direction:column;";
+               var style = "width:80vw;height:80vh;display:flex;flex-direction:column;";
                var div = domConstruct.create("div", { style: style });
                dialog = new Dialog(
                {
@@ -131,7 +132,7 @@
                
                dialog.addLogs = addLogs;
                
-               style = "width:100%;height:100px;display:flex;flex-direction: row;padding:10px;";
+               style = "width:100%;height:50px;display:flex;flex-direction: row;padding:10px;";
                var buttonPanelDiv = domConstruct.create("div", { style: style }, div);
                var button = domConstruct.create("button", { }, buttonPanelDiv);
                button.id = "copyLogsToClipboard";

=== modified file 'src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js'
--- old/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js	2025-07-24 14:30:18 +0000
+++ new/src/com/goldencode/p2j/ui/client/driver/web/res/p2j.socket.js	2025-12-19 22:14:36 +0000
@@ -195,6 +195,8 @@
 **                  information sent by client to the JS web client.
 **     IMS 20250527 Added SET_WINDOW_STATE instead of SET_ICONIFICATIO_STATE. Modified 
 **		              SET_WINDOW_STATE for treating window state information sent by client to the JS web client.
+** 078 SBI 20251220 Changed ModalDialog parameters, hide the restore connection dialog 
+**                  if the server unavailable dialog is shown.
 */
 
 /*
@@ -5503,6 +5505,15 @@
             {
                if (!serverUnavailableDialog.isDisposed())
                {
+                  if (hideRestoreConnectionDialog)
+                  {
+                     clearTimeout(hideRestoreConnectionDialog);
+                  }
+                  if (restoreConnectionDialog)
+                  {
+                     restoreConnectionDialog.hide();
+                  }
+
                   serverUnavailableDialog.show();
                }
             });
@@ -5626,7 +5637,7 @@
                                                     document.body,
                                                     tryToConnectMessage + " " + p2j.pressEscape,
                                                     p2j.pressEscape,
-                                                    true);
+                                                    true, {"noTitle" : false, "closable" : false});
       restoreConnectionDialog.addTrigger("keydown", function(event)
       {
          if (event.keyCode == keys.ESCAPE)
@@ -5639,6 +5650,7 @@
             }
             restoreConnectionDialog.close();
             connectivityTimer.kill();
+            
             // Redirect to the logout page if a user cancels this dialog
             doRedirectToLogoutPage();
          }
@@ -5648,7 +5660,7 @@
                                                      document.body,
                                                      connectionRestoredMessage + " " + p2j.pressAnyKey,
                                                      p2j.pressAnyKey,
-                                                     true);
+                                                     true, {"noTitle" : true, "closable" : false});
       connectionRestoredDialog.addTrigger("keydown", function(event)
       {
          p2j.consumeEvent(event);
@@ -5660,7 +5672,7 @@
                                                     document.body,
                                                     serverUnavailableMessage + " " + p2j.pressEscape,
                                                     p2j.pressEscape,
-                                                    true);
+                                                    true, {"noTitle" : true, "closable" : false});
       serverUnavailableDialog.addTrigger("keydown", function(event)
       {
          if (event.keyCode == keys.ESCAPE)

=== modified file 'src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js'
--- old/src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2025-08-18 08:24:19 +0000
+++ new/src/com/goldencode/p2j/ui/client/gui/driver/web/res/p2j.screen.js	2025-12-19 21:54:09 +0000
@@ -253,7 +253,8 @@
 **                  owner of the dialog/alert box is a modal window.
 ** 096 IMS 20250527 Added a new state in window class. {@code "this.windowState = commonWindowState.UNINITIALIZED"}
 **                  referring to an invalid or uninitialized windowState value. Added an enum object with window states. 
-**                  Added a new method updateWindowState to update the window state. Refs #9973a.     
+**                  Added a new method updateWindowState to update the window state. Refs #9973a.
+** 097 SBI 20251220 Improved the logic to show Uploading notification dialog.
 */
 
 /*
@@ -1839,7 +1840,7 @@
                         document.body,
                         SignatureWidget.warning + " " + p2j.pressEscape,
                         p2j.pressEscape,
-                        true);
+                        true, {"noTitle" : true, "closable" : false});
                   var hideAlertDialog = setTimeout(function()
                   {
                      alertDialog.close();
@@ -7350,7 +7351,7 @@
                document.body,
                p2j.i18n.gettext("Grant access to upload/select system files?"),
                "",
-               true);
+               true, {"noTitle" : false, "closable" : false});
          dialog.setTitle(p2j.i18n.gettext("Security Warning"));
          
          const label =  p2j.i18n.gettext("OK");
@@ -7399,7 +7400,7 @@
                document.body,
                "",
                "",
-               true);
+               true, {"noTitle" : false, "closable" : false});
          actionResultsDialog.setTitle(p2j.i18n.gettext("Uploading..."));
          actionResultsDialog.setContent({htmlElement : l.domNode});
          
@@ -7410,16 +7411,49 @@
             dojo.query(".dojoxUploaderFileList").style({ border: "0px", "min-height": "0px" });
             dojo.query(".dojoxUploaderFileListTable").style({ display: "none" });
          }
+         // 1 onChange: 
+         //    Fires when files are selected
+         //    Event is an array of last files selected
+      
+         // 2 onBegin: 
+         //    Fires when upload begins
+      
+         // 3 onProgress:
+         //    Fires on upload progress. Event is a normalized object of common properties
+         //    from HTML5 uploaders and the Flash uploader. Will not fire for IFrame.
+         // customEvent:
+         //    - bytesLoaded: Number:
+         //       Amount of bytes uploaded so far of entire payload (all files)
+         //    - bytesTotal: Number:
+         //       Amount of bytes of entire payload (all files)
+         //    - type: String:
+         //       Type of event (progress or load)
+         //    - timeStamp: Number:
+         //       Timestamp of when event occurred
+      
+         // 4 onComplete:
+         //    Fires when all files have uploaded
+         // 5 onCancel:
+         //    Fires when dialog box has been closed
+         //    without a file selection
+         // 6 onAbort
+         //    Fires when upload in progress was canceled
+         // 7 onError: 
+         //    Fires on errors
 
          dojo.connect(u, "onBegin", function (files)
          {
-            //console.debug("onBegin");
+//            console.debug("onBegin");
             closeButton.set('disabled', true);
          });
          
          var closeTimeout;
          var closeAction = function()
          {
+            if (closeTimeout)
+            {
+               clearTimeout(closeTimeout);
+            }
             actionResultsDialog.close();
             dialog.close();
          }
@@ -7428,29 +7462,33 @@
          
          dojo.connect(u, "onProgress", function (event)
          {
-            //console.debug("onProgress");
-            if (event.type == "load")
-            {
-               //console.debug("onProgress --> " + JSON.stringify(event));
-               if (closeTimeout)
-               {
-                  clearTimeout(closeTimeout);
-               }
-               closeAction();
+//            console.debug("onProgress");
+            if (actionResultsDialog.isVisible())
+            {
+               actionResultsDialog.updateLayout();
+            }
+            else
+            {
+               actionResultsDialog.show();
             }
          });
          dojo.connect(u, "onError", function (error)
          {
-            //console.debug("onError");
-            var errorString = JSON.stringify(error);
-            console.error(errorString);
+//            console.debug("onError");
+            var errorString = error ? JSON.stringify(error) : "";
+
             var resultDiv = dojo.create('div',
                   { innerHTML: p2j.i18n.ngettext("Error '%2' when uploading %1 file.",
                                                  "Error '%2' when uploading %1 files.",
                                                  actionResultsDialog.files.length,
                                                  errorString)});
+            resultDiv.className = "text";
             actionResultsDialog.setFooter({htmlElement : resultDiv});
-            if (!actionResultsDialog.isVisible())
+            if (actionResultsDialog.isVisible())
+            {
+               actionResultsDialog.updateLayout();
+            }
+            else
             {
                actionResultsDialog.show();
             }
@@ -7462,13 +7500,20 @@
 
          dojo.connect(u, "onChange", function (files)
          {
-            //console.debug("onChange");
+//            console.debug("onChange");
             if (upload)
             {
                var result = checkUploadedFiles(u.getFileList());
                if (result["status"])
                {
-                  u.upload();
+                  try
+                  {
+                     u.upload();
+                  }
+                  catch(e)
+                  {
+                     console.error("u.upload() failed", e);
+                  }
                   dialog.hide();
                   actionResultsDialog.files = files;
                   actionResultsDialog.show();
@@ -7476,7 +7521,7 @@
                else
                {
                   actionResultsDialog.setTextContent(result["error"] + " " + p2j.pressAnyKey);
-                  actionResultsDialog.addTrigger("keydown", function(event)
+                  actionResultsDialog.addTrigger("keyup", function(event)
                   {
                      p2j.consumeEvent(event);
                      closeAction();
@@ -7495,7 +7540,6 @@
                }
                
                p2j.socket.sendFileChoose(uploadId, selectedFiles, uploadedFiles, direct, false);
-               
                closeAction();
                return;
             }
@@ -7503,21 +7547,23 @@
 
          dojo.connect(u, "onComplete", function(files)
          {
-            //console.debug("onComplete");
-            for (var i = 0; i < files.length; i++)
+//            console.debug("onComplete");
+            if (files)
             {
-               if (files[i].file)
-               {
-                  uploadedFiles.push(files[i].file);
-               }
-               if (files[i].name)
-               {
-                  selectedFiles.push(files[i].name);
-               }
+               for (var i = 0; i < files.length; i++)
+               {
+                  if (files[i].file)
+                  {
+                     uploadedFiles.push(files[i].file);
+                  }
+                  if (files[i].name)
+                  {
+                     selectedFiles.push(files[i].name);
+                  }
+               }
+               
+               p2j.socket.sendFileChoose(uploadId, selectedFiles, uploadedFiles, direct, false);
             }
-            
-            p2j.socket.sendFileChoose(uploadId, selectedFiles, uploadedFiles, direct, false);
-            
             if (!multiple)
             {
                closeAction();
@@ -7539,8 +7585,18 @@
                                                     "Error when uploading %1 files",
                                                     actionResultsDialog.files.length) });
             }
-            
+            resultDiv.className = "text";
             actionResultsDialog.setFooter({htmlElement : resultDiv});
+            
+            if (actionResultsDialog.isVisible())
+            {
+               actionResultsDialog.updateLayout();
+            }
+            else
+            {
+               actionResultsDialog.show();
+            }
+            
             closeTimeout = setTimeout(closeAction, delayForCloseAction);
          });
 
@@ -7554,16 +7610,29 @@
 
          dialog.addTrigger("onClose", finalHandler, false);
 
-         me.processMouse = direct;
+         me.processMouse = false;
          
          if (direct)
          {
+            //direct upload
+            var target;
+            var cancelListener = () => {
+//               console.debug('File selection cancelled by user.');
+               closeAction();
+               if (target)
+               {
+                  target.removeEventListener('cancel', cancelListener);
+                  target = null;
+               }
+            };
             var children = u.domNode.children;
             for (var i = 0; i < children.length; i++)
             {
                if (children[i].tagName.toLowerCase() === "input" && children[i].type === "file")
                {
-                  children[i].click();
+                  target = children[i];
+                  target.addEventListener('cancel', cancelListener);
+                  target.click();
                   break;
                }
             }

