Index: /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/common.js
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/common.js	(revision 84619)
+++ /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/common.js	(revision 84620)
@@ -31,4 +31,7 @@
 /** Same as WuiDispatcherBase.ksParamRedirectTo. */
 var g_ksParamRedirectTo = 'RedirectTo';
+
+/** Days of the week in Date() style with Sunday first. */
+var g_kasDaysOfTheWeek = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ];
 
 
@@ -1237,5 +1240,4 @@
     if (oResp)
     {
-        var asDaysOfTheWeek = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ];
         sHtml = '<div class="tmvcstimeline tmvcstimelinetooltip">\n';
 
@@ -1254,5 +1256,5 @@
                     sHtml += ' </dl>\n';
                 iCurDay = iCommitDay;
-                sHtml += ' <h2>' + tsCreated.toISOString().split('T')[0] + ' ' + asDaysOfTheWeek[tsCreated.getDay()] + '</h2>\n';
+                sHtml += ' <h2>' + tsCreated.toISOString().split('T')[0] + ' ' + g_kasDaysOfTheWeek[tsCreated.getDay()] + '</h2>\n';
                 sHtml += ' <dl>\n';
             }
Index: /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/vcsrevisions.js
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/vcsrevisions.js	(revision 84619)
+++ /trunk/src/VBox/ValidationKit/testmanager/htdocs/js/vcsrevisions.js	(revision 84620)
@@ -25,5 +25,40 @@
  */
 
-/** Called when we've got the revision data.   */
+
+/**
+ * @internal.
+ */
+function vcsRevisionFormatDate(tsDate)
+{
+    /*return tsDate.toLocaleDateString();*/
+    return tsDate.toISOString().split('T')[0];
+}
+
+/**
+ * @internal.
+ */
+function vcsRevisionFormatTime(tsDate)
+{
+    var sRet = tsDate.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit'} );
+    return sRet.replace(' ', '\u00a0');
+}
+
+/**
+ * Called 'onclick' for the link/button used to show the detailed VCS
+ * revisions.
+ * @internal.
+ */
+function vcsRevisionShowDetails(oElmSource)
+{
+    document.getElementById('vcsrevisions-detailed').style.display = 'block';
+    document.getElementById('vcsrevisions-brief').style.display = 'none';
+    oElmSource.style.display = 'none';
+    return false;
+}
+
+/**
+ * Called when we've got the revision data.
+ * @internal
+ */
 function vcsRevisionsRender(sTestMgr, oElmDst, sBugTracker, oRestReq, sUrl)
 {
@@ -76,9 +111,14 @@
         else
         {
-            sHtml = '<p>';
-
             var aoCommits = oResp.aoCommits;
             var cCommits  = oResp.aoCommits.length;
             var i;
+
+            sHtml = '';
+            /*sHtml = '<a href="#" onclick="return vcsRevisionShowDetails(this);" class="vcsrevisions-show-details">Show full VCS details...</a>\n';*/
+            /*sHtml = '<button onclick="vcsRevisionShowDetails(this);" class="vcsrevisions-show-details">Show full VCS details...</button>\n';*/
+
+            /* Brief view (the default): */
+            sHtml += '<p id="vcsrevisions-brief">';
             for (i = 0; i < cCommits; i++)
             {
@@ -88,7 +128,83 @@
                 sHtml += ' <a href="' + escapeElem(sUrl) + '" title="' + escapeElem(sTitle) + '">r' + oCommit.iRevision + '</a> \n';
             }
-
             sHtml += '</p>';
-
+            sHtml += '<a href="#" onclick="return vcsRevisionShowDetails(this);" class="vcsrevisions-show-details-bottom">Show full VCS details...</a>\n';
+
+            /* Details view: */
+            sHtml += '<div id="vcsrevisions-detailed" style="display:none;">\n';
+            var iCurDay = null;
+            if (0)
+            {
+                /* Changelog variant: */
+                for (i = 0; i < cCommits; i++)
+                {
+                    var oCommit    = aoCommits[i];
+                    var tsCreated  = parseIsoTimestamp(oCommit.tsCreated);
+                    var sUrl       = oResp.sTracChangesetUrlFmt.replace('%(sRepository)s', oCommit.sRepository).replace('%(iRevision)s', oCommit.iRevision.toString());
+                    var iCommitDay = Math.floor((tsCreated.getTime() + tsCreated.getTimezoneOffset()) / (24 * 60 * 60 * 1000));
+                    if (iCurDay === null || iCurDay != iCommitDay)
+                    {
+                        if (iCurDay !== null)
+                            sHtml += ' </dl>\n';
+                        iCurDay = iCommitDay;
+                        sHtml += ' <h3>' + vcsRevisionFormatDate(tsCreated) + ' ' + g_kasDaysOfTheWeek[tsCreated.getDay()] + '</h3>\n';
+                        sHtml += ' <dl>\n';
+                    }
+
+                    sHtml += '  <dt id="r' + oCommit.iRevision + '">';
+                    sHtml += '<a href="' + oResp.sTracChangesetUrlFmt.replace('%(iRevision)s', oCommit.iRevision.toString()) + '">';
+                    /*sHtml += '<span class="vcsrevisions-time">' + escapeElem(vcsRevisionFormatTime(tsCreated)) + '</span>'
+                    sHtml += ' Changeset <span class="vcsrevisions-rev">r' + oCommit.iRevision + '</span>';
+                    sHtml += ' by <span class="vcsrevisions-author">' + escapeElem(oCommit.sAuthor) + '</span>'; */
+                    sHtml += '<span class="vcsrevisions-time">' + escapeElem(vcsRevisionFormatTime(tsCreated)) + '</span>';
+                    sHtml += ' - <span class="vcsrevisions-rev">r' + oCommit.iRevision + '</span>';
+                    sHtml += ' - <span class="vcsrevisions-author">' + escapeElem(oCommit.sAuthor) + '</span>';
+                    sHtml += '</a></dt>\n';
+                    sHtml += '  <dd>' + escapeElem(oCommit.sMessage) + '</dd>\n';
+                }
+
+                if (iCurDay !== null)
+                    sHtml += ' </dl>\n';
+            }
+            else
+            {   /* TABLE variant: */
+                sHtml += '<table class="vcsrevisions-table">';
+                var iAlt = 0;
+                for (i = 0; i < cCommits; i++)
+                {
+                    var oCommit    = aoCommits[i];
+                    var tsCreated  = parseIsoTimestamp(oCommit.tsCreated);
+                    var sUrl       = oResp.sTracChangesetUrlFmt.replace('%(sRepository)s', oCommit.sRepository).replace('%(iRevision)s', oCommit.iRevision.toString());
+                    var iCommitDay = Math.floor((tsCreated.getTime() + tsCreated.getTimezoneOffset()) / (24 * 60 * 60 * 1000));
+                    if (iCurDay === null || iCurDay != iCommitDay)
+                    {
+                        iCurDay = iCommitDay;
+                        sHtml += '<tr id="r' + oCommit.iRevision + '"><td colspan="4" class="vcsrevisions-tab-date">';
+                        sHtml += vcsRevisionFormatDate(tsCreated) + ' ' + g_kasDaysOfTheWeek[tsCreated.getDay()];
+                        sHtml += '</td></tr>\n';
+                        sHtml += '<tr>';
+                        iAlt = 0;
+                    }
+                    else
+                        sHtml += '<tr id="r' + oCommit.iRevision + '">';
+                    var sAltCls = '';
+                    var sAltClsStmt = '';
+                    iAlt += 1;
+                    if (iAlt & 1)
+                    {
+                        sAltCls     = ' alt';
+                        sAltClsStmt = ' class="alt"';
+                    }
+                    sHtml += '<td class="vcsrevisions-tab-time'+sAltCls+'"><a href="' + sUrl + '">'
+                           + escapeElem(vcsRevisionFormatTime(tsCreated)) + '</a></td>';
+                    sHtml += '<td'+sAltClsStmt+'><a href="' + sUrl + '" class="vcsrevisions-rev' + sAltCls + '">r'
+                           + oCommit.iRevision + '</a></td>';
+                    sHtml += '<td'+sAltClsStmt+'><a href="' + sUrl + '" class="vcsrevisions-author' + sAltCls + '">'
+                           + escapeElem(oCommit.sAuthor) + '<a></td>';
+                    sHtml += '<td'+sAltClsStmt+'>' + escapeElem(oCommit.sMessage) + '</td></tr>\n';
+                }
+                sHtml += '</table>\n';
+            }
+            sHtml += '</div>\n';
         }
     }
@@ -107,5 +223,5 @@
     oRestReq.open('GET', sUrl);
     oRestReq.withCredentials = true;
-    //oRestReq.setRequestHeader('Content-type', 'application/json');
+    /*oRestReq.setRequestHeader('Content-type', 'application/json'); - Causes CORS trouble. */
     oRestReq.send();
 }
