Index: trunk/webapps/common/js/revision_number.dat
===================================================================
--- trunk/webapps/common/js/revision_number.dat	(revision 547)
+++ trunk/webapps/common/js/revision_number.dat	(revision 551)
@@ -1,3 +1,3 @@
 
-    var revisionNumber = "540";
+    var revisionNumber = "549";
     
Index: trunk/webapps/common/js/displayutils.js
===================================================================
--- trunk/webapps/common/js/displayutils.js	(revision 386)
+++ trunk/webapps/common/js/displayutils.js	(revision 551)
@@ -14,2 +14,58 @@
 }
 
+// Load a CSV file and convert to a string of formatted HTML
+// @param filename the file containing the CSV input
+// @param targetDiv the div element in which the HTML should be placed.
+function loadLog(filename, targetDiv)
+{
+    // Asynchronous file read of unified log data
+    loadJSON("dynamicdata/" + filename, function(response)
+    {
+        // Format the csv data into an HTML table
+        var allRows = response.split(/\r?\n|\r/);
+        var table = '<table>';
+        // Put the last log entry at the TOP of the table
+        for (var singleRow = allRows.length-1; singleRow >= 0; singleRow--)
+        {
+            var rowCells = allRows[singleRow].split(',');
+            var msg_type = ""; // color white is default
+
+            // trimming white space in the type field 
+            // ingore the empty line 
+            if (rowCells.length > 1) 
+            {
+                rowCells[1] = rowCells[1].trim();
+            }
+            var label = String(rowCells[1]);
+            var info = String(rowCells[3]).trim();
+            // Implement ticket #190 
+            // Checking for the type of logging information 
+            if (label.startsWith("CAD")) {
+                msg_type = "class=\"CAD\"";
+                if (info.startsWith("Detail")) {
+                    msg_type = "class=\"CADdetail\"";
+                }
+            } else if (label.startsWith("Activity")) {
+                msg_type = "class=\"Activity\"";
+            //} else if (rowCells[1] == "CMS Activated.") {
+            } else if (label.startsWith("CMS")) {
+                msg_type = "class=\"CMS\"";
+            } else if (label.startsWith("Eval")) {
+                msg_type = "class=\"Evaluation\"";
+            } 
+
+            // add the message type class to that row 
+            table += '<tr ' + msg_type + '>';
+            for (var rowCell = 0; rowCell < rowCells.length; rowCell++)
+            {
+                table += '<td>';
+                table += rowCells[rowCell];
+                table += '</td>';
+            }
+            table += '</tr>';
+        }
+        table += '</table>';
+        targetDiv.innerHTML = table;
+    }
+    );
+}
Index: trunk/webapps/common/js/fileutils.js
===================================================================
--- trunk/webapps/common/js/fileutils.js	(revision 442)
+++ trunk/webapps/common/js/fileutils.js	(revision 551)
@@ -1,27 +1,48 @@
-    // Load the dynamic json file for highways, etc.
-    // Ref: https://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript
-    function loadJSON(inFile, callback)
+// Load the dynamic json file for highways, etc.
+// Ref: https://codepen.io/KryptoniteDove/post/load-json-file-locally-using-pure-javascript
+function loadJSON(inFile, callback)
+{
+    var xobj = new XMLHttpRequest();
+    // Assume XML unless filename ends with .json
+    if (inFile.endsWith(".json"))
     {
-        var xobj = new XMLHttpRequest();
-        // Assume XML unless filename ends with .json
-        if (inFile.endsWith(".json"))
+        xobj.overrideMimeType("application/json");
+    }
+    if (inFile.endsWith(".csv"))
+    {
+        xobj.overrideMimeType("text/csv");
+    }
+    xobj.open('GET', inFile, true);
+    xobj.onreadystatechange = function()
+    {
+        if (xobj.readyState == 4 && xobj.status == "200")
         {
-            xobj.overrideMimeType("application/json");
+            callback(xobj.responseText);
         }
-        if (inFile.endsWith(".csv"))
-        {
-            xobj.overrideMimeType("text/csv");
-        }
-        xobj.open('GET', inFile, true);
-        xobj.onreadystatechange = function()
-        {
-            if (xobj.readyState == 4 && xobj.status == "200")
-            {
-                callback(xobj.responseText);
-            }
-        };
-        // We want ajax to ignore any cached responses
-        xobj.setRequestHeader('If-Modified-Since', 'Sat, 01 Jan 2000 01:01:01 GMT')
-        xobj.send(null);
+    };
+    // We want ajax to ignore any cached responses
+    xobj.setRequestHeader('If-Modified-Since', 'Sat, 01 Jan 2000 01:01:01 GMT')
+    xobj.send(null);
+}
+
+/* Retrieve URL parameters passed to a web page
+   @return a dictionary of key/value pairs
+*/
+function getQueryParms()
+{
+    var items = {};
+    var query = window.location.search.substring(1);
+    var parms = query.split("&");
+    // Examine each parameter
+    for (var i = 0, max = parms.length; i < max; i++)
+    {
+        // check for trailing & with no param
+        if (parms[i] === "") 
+            continue; // skip it
+
+        var param = parms[i].split("=");
+        // If it's valid add it to dictionary
+        items[decodeURIComponent(param[0])] = decodeURIComponent(param[1] || "");
     }
-
+    return items
+}
