# HG changeset patch
# Parent 58ed3d69156d921bb7008c2eb823c53f5a31b3b5
Fixes 16267 : Strip // from start of relative urls and handle case when context is / in classic popup javascript

diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-action-button.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-action-button.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-action-button.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-action-button.js
@@ -64,7 +64,7 @@
     if (this.modal){
       allProperties.Command = this.command;
       callbackFunction = function(){
-        OB.Layout.ClassicOBCompatibility.Popup.open('process', 900, 600, OB.Application.contextUrl + me.obManualURL, '', null, false, false, true, allProperties);
+        OB.Layout.ClassicOBCompatibility.Popup.open('process', 900, 600, OB.Utilities.applicationUrl(me.obManualURL), '', null, false, false, true, allProperties);
       };
     } else {
       var popupParams = {
@@ -98,7 +98,9 @@
     OB.ActionButton.executingProcess = null;
     
     if (newWindow) {
-      var contextURL = location.href.substr(0, location.href.indexOf(OB.Application.contextUrl) + OB.Application.contextUrl.length);
+      var contextURL = location.protocol +"//"
+                        + location.host
+                        + location.pathname.substr(0, location.pathname.indexOf(OB.Application.contextUrl) + OB.Application.contextUrl.length);
       
       if (newWindow.indexOf(contextURL) !== -1){
         newWindow = newWindow.substr(contextURL.length);
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-compatibility.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-compatibility.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-compatibility.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-compatibility.js
@@ -42,7 +42,7 @@
   }
   
   ClassicOBCompatibility.prototype = {
-  
+
     // ** {{{ openLinkedItem(tabId, recordId) }}} **
     //
     // Opens a window from the linked item view.
@@ -187,7 +187,7 @@
         // formObject.action.toString();
         // hardcode to prevent this issue with chrome:
         // https://issues.openbravo.com/view.php?id=13837
-        var actionURL = OB.Application.contextUrl + 'utility/ReferencedLink.html';
+        var actionURL = OB.Utilities.applicationUrl('utility/ReferencedLink.html');
         
         var rpcMgr = ISC.RPCManager;
         var reqObj = {
@@ -334,6 +334,10 @@
         if (showCloseControl !== false) {
           showCloseControl = true;
         }
+        if (url.indexOf("//") === 0) {
+          // Double slash at start of relative URL only keeps scheme, not server
+          url = url.substring(1);
+        }
         var cPopup = isc.OBClassicPopup.create({
           ID: name + '_' + cobcomp.Popup.secString,
           width: width,
@@ -347,8 +351,9 @@
           isLoaded: false,
           htmlCode: '<html><head></head><frameset cols="*, 0%" rows="*" frameborder="no" border="0" framespacing="0">'+
             '<frame id="MDIPopupContainer" name="MDIPopupContainer"></frame>'+
-            '<frame name="frameMenu" scrolling="no" src="' + OB.Application.contextUrl +
-            'utility/VerticalMenu.html?Command=HIDE" id="paramFrameMenuLoading"></frame>'+
+            '<frame name="frameMenu" scrolling="no" src="' +
+              OB.Utilities.applicationUrl('utility/VerticalMenu.html?Command=HIDE') +
+              '" id="paramFrameMenuLoading"></frame>'+
             '</frameset><body></body></html>',
           popupURL: url
         });
@@ -482,21 +487,21 @@
       //
       // Opens directly the "Instance Purpose" window inside a popup
       openInstancePurpose: function(){
-        cobcomp.Popup.open('InstancePurpose', 600, 500, OB.Application.contextUrl + 'ad_forms/InstancePurpose.html', '', window, false, false, true);
+        cobcomp.Popup.open('InstancePurpose', 600, 500, OB.Utilities.applicationUrl('ad_forms/InstancePurpose.html'), '', window, false, false, true);
       },
       
       // ** {{{ Popup.openHeartbeat() }}} **
       //
       // Opens directly the "Heartbeat" window inside a popup
       openHeartbeat: function(){
-        cobcomp.Popup.open('Heartbeat', 600, 500, OB.Application.contextUrl + 'ad_forms/Heartbeat.html', '', window, false, false, true);
+        cobcomp.Popup.open('Heartbeat', 600, 500, OB.Utilities.applicationUrl('ad_forms/Heartbeat.html'), '', window, false, false, true);
       },
       
       // ** {{{ Popup.openRegistration() }}} **
       //
       // Opens directly the "Registration" window inside a popup
       openRegistration: function(){
-        cobcomp.Popup.open('Registration', 600, 500, OB.Application.contextUrl + 'ad_forms/Registration.html', '', window, false, false, true);
+        cobcomp.Popup.open('Registration', 600, 500, OB.Utilities.applicationUrl('ad_forms/Registration.html'), '', window, false, false, true);
       }
     }
   };
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-popup.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-popup.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-popup.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-popup.js
@@ -42,8 +42,8 @@
         urlCharacter = '&';
     }
     if(this.obManualURL !== '') {
-      contentsURL = OB.Application.contextUrl + this.obManualURL + '?Command=' + this.command;
-//      contentsURL = this.appURL + urlCharacter + 'url=' + this.obManualURL + '&noprefs=true&Command=' + this.command + '&hideMenu=true';
+      contentsURL = OB.Utilities.applicationUrl(this.obManualURL) + '?Command=' + this.command;
+    //      contentsURL = this.appURL + urlCharacter + 'url=' + this.obManualURL + '&noprefs=true&Command=' + this.command + '&hideMenu=true';
     } else {
       contentsURL = this.appURL + urlCharacter + 'Command=' + this.command + '&noprefs=true&tabId=' + this.tabId + '&hideMenu=true';
     }
@@ -59,7 +59,7 @@
 isc.defineClass('OBClassicPopupModal', isc.Class).addProperties({
   showsItself: true,
   show: function() {
-    OB.Layout.ClassicOBCompatibility.Popup.open(this.id, 625, 450,  OB.Application.contextUrl + this.obManualURL+'?Command='+this.command, '', null, false, false, true);
+    OB.Layout.ClassicOBCompatibility.Popup.open(this.id, 625, 450,  OB.Utilities.applicationUrl(this.obManualURL)+'?Command='+this.command, '', null, false, false, true);
   }
   
 });
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-window.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-window.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-window.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-classic-window.js
@@ -321,7 +321,7 @@
       evalResult: false,
       httpMethod: 'POST',
       useSimpleHttp: true,
-      actionURL: OB.Application.contextUrl + postData.mappingName
+      actionURL: OB.Utilities.applicationUrl(postData.mappingName)
     };
     isc.RPCManager.sendRequest(reqObj);
   },
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-formitem-widgets.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-formitem-widgets.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-formitem-widgets.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-formitem-widgets.js
@@ -256,7 +256,7 @@
       complementsNS4 = 'alwaysRaised=1, dependent=1, directories=0, hotkeys=0, menubar=0, ';
     }
     var complements = complementsNS4 + 'height=' + height + ', width=' + width + ', left=' + left + ', top=' + top + ', screenX=' + left + ', screenY=' + top + ', location=0, resizable=1, scrollbars=1, status=0, toolbar=0, titlebar=0, modal=\'yes\'';
-    isc.OBSearchItem.openedWindow = window.open(OB.Application.contextUrl + url + ((auxField === '') ? '' : '?' + auxField), 'SELECTOR', complements);
+    isc.OBSearchItem.openedWindow = window.open(OB.Utilities.applicationUrl(url) + ((auxField === '') ? '' : '?' + auxField), 'SELECTOR', complements);
     if (isc.OBSearchItem.openedWindow) {
       isc.OBSearchItem.openedWindow.focus();
       this.setUnloadEventHandling();
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-help-about-widget.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-help-about-widget.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-help-about-widget.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-help-about-widget.js
@@ -53,7 +53,7 @@
       handleClick: function(){
         isc.OBQuickRun.hide();
         
-        OB.Layout.ClassicOBCompatibility.Popup.open('About', 620, 500, OB.Application.contextUrl + '/ad_forms/about.html', '', window);
+        OB.Layout.ClassicOBCompatibility.Popup.open('About', 620, 500, OB.Utilities.applicationUrl('/ad_forms/about.html'), '', window);
       }
     };
     
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-toolbar.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-toolbar.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-toolbar.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-toolbar.js
@@ -1126,7 +1126,7 @@
   popupParams += '&inphiddenvalue=' + selectedIds;
   
   view.setContextInfo(sessionProperties, function(){
-    OB.Layout.ClassicOBCompatibility.Popup.open('print', 0, 0, OB.Application.contextUrl + '/businessUtility/PrinterReports.html?' + popupParams, '', window, false, false, true);
+    OB.Layout.ClassicOBCompatibility.Popup.open('print', 0, 0, OB.Utilities.applicationUrl('/businessUtility/PrinterReports.html?') + popupParams, '', window, false, false, true);
   });
 };
 
@@ -1151,7 +1151,7 @@
     popupParams += '&inpRecordId=' + view.viewGrid.getSelectedRecord().id;
   }
   
-  OB.Layout.ClassicOBCompatibility.Popup.open('audit', 900, 600, OB.Application.contextUrl + '/businessUtility/AuditTrail.html?' + popupParams, '', window, false, false, true);
+  OB.Layout.ClassicOBCompatibility.Popup.open('audit', 900, 600, OB.Utilities.applicationUrl('/businessUtility/AuditTrail.html?') + popupParams, '', window, false, false, true);
 };
 
 OB.ToolbarUtils.showTree = function(view){
@@ -1161,7 +1161,7 @@
     popupParams += '&Command=DEFAULT';
     popupParams += '&inpTabId=' + tabId;
     popupParams += '&hideMenu=true&noprefs=true';
-    OB.Layout.ClassicOBCompatibility.Popup.open('tree', 750, 625, OB.Application.contextUrl + '/security/Menu.html?' + popupParams, '', window, false, false, true);
+    OB.Layout.ClassicOBCompatibility.Popup.open('tree', 750, 625, OB.Utilities.applicationUrl('/security/Menu.html?') + popupParams, '', window, false, false, true);
   }
   var tabId = view.tabId;
   
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-utilities.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-utilities.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-utilities.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/ob-utilities.js
@@ -764,3 +764,22 @@
   }
   return (/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i).test(url);
 };
+
+// ** {{{ applicationUrl(path) }}} **
+//
+// Get the full URL to the supplied path under the application context
+//
+// Parameters:
+//  * {{{path}}} path portion of URL
+//
+OB.Utilities.applicationUrl = function(path) {
+  var appUrl = OB.Application.contextUrl + path;
+  if(appUrl.indexOf("//") === 0 ) {
+    // Double slash at start of relative URL only keeps scheme, not server
+    appUrl = appUrl.substring(1);
+  }
+  return appUrl;
+};
+
+
+
