Index: trunk/webapps/common/js/revision_number.dat
===================================================================
--- trunk/webapps/common/js/revision_number.dat	(revision 443)
+++ trunk/webapps/common/js/revision_number.dat	(revision 463)
@@ -1,3 +1,3 @@
 
-    var revisionNumber = "442";
+    var revisionNumber = "462";
     
Index: trunk/webapps/cmsmonitor/index.html
===================================================================
--- trunk/webapps/cmsmonitor/index.html	(revision 406)
+++ trunk/webapps/cmsmonitor/index.html	(revision 463)
@@ -43,4 +43,24 @@
   padding-right: 5%;
 }
+#har_info{
+  font-size: 20px;
+  font-family: Arial;
+  font-weight:lighter;
+  color: white;
+  padding-left: 5%;
+  padding-right: 5%;
+}
+
+.har_content{
+  font-size: 20px;
+  padding: 8px;
+  font-family: "Calibri";
+  color: white;
+  margin: 5px 10% 20px 10%;
+  background-color: rgb(29, 21, 21);
+  white-space:nowrap;
+  overflow:hidden;
+}
+
 .cms_content{
   font-size: 34px;
@@ -67,4 +87,9 @@
   clear: both;
 }
+
+#page {
+  margin-left: 46%;
+}
+
 </style>
 </head>
@@ -73,5 +98,13 @@
   <div class="column left" >
     <h2>Active CMS Messages</h2>
+    <h3 id="page">Pg 1 of 1</h3>
     <p id="msgs"></p>
+  </div>
+</div>
+<div class="row">
+    <div class="column left" >
+      <h2>Active HAR Messages</h2>
+      <p id="har"></p>
+    </div>
   </div>
 </div>
@@ -83,5 +116,12 @@
    <script>
     showRevision();
+	var msgsPerPage = 8; // constant: number of CMS msgs per display page
+    var loaded = false;
     var cmsLocations = {};
+    var harLocations = {};
+    var phase = {one: [], two: [], header:[]}; //Phase1 and Phase2 messages, and location info each stored in a different array 
+    var pageNumber = 0; //Current page index
+    var messages = {}; //Container to hold arrays for pagination
+
     // Load the CMS locations from the geojson file
     function loadCMSlocations()
@@ -99,4 +139,45 @@
         });
     }
+    // Load the HAR locations from the geojson file
+    function loadHARLocations()
+    {
+      loadJSON("../cptms/data_layers/har_locations_D12.gjson", function(response)
+        {
+            // Parse JSON string into object
+            var harjson = JSON.parse(response);
+            for (var i = 0; i < harjson.features.length; i++)
+            {
+                var item = harjson.features[i];
+                // Add each item to a lookup dictionary
+                harLocations[item.id] = item;
+            }
+        });
+    }
+    // Load the file of HAR messages
+    function loadAllHARMessages()
+    {
+      var cnt = 1;
+      var display = document.getElementById("har");
+      display.innerHTML = "";
+      loadJSON("../dynamicdata/har_messages.json", function(response)
+        {
+            // Parse JSON string into object
+            messagejson = JSON.parse(response);
+            // Consider each message 
+            for (var i = 0; i < messagejson.data.length; i++)
+            {
+              var item = messagejson.data[i];
+              var harLoc = harLocations[item.har.index];
+              var phase1 = item.har.message.phase1.Line1;
+              if (phase1 != "" && cnt <= 3) //limit to 3 messages
+              {
+                display.innerHTML += "<div id=\"har_info\">" + item.har.index + ": " + 
+                        harLoc.properties.location + " " + harLoc.properties.street + "</div>";
+                display.innerHTML += "<div class=\"har_content\">" + phase1 + "</div>" ;
+                cnt++;
+              }
+            }
+        });
+    }
     // Load the file of CMS messages
     function loadAllcmsMessages()
@@ -105,5 +186,5 @@
         var cnt = 0;
         var display = document.getElementById("msgs");
-        display.innerHTML = ""
+        display.innerHTML = "";
         loadJSON("../dynamicdata/cms_messages.json", function(response)
         {
@@ -124,33 +205,130 @@
                 var phase2 = item.cms.message.phase2.Line1.toUpperCase() +  "<br>" +
                     item.cms.message.phase2.Line2.toUpperCase() + "<br>" +
-                    item.cms.message.phase2.Line3.toUpperCase();
-      
+                    item.cms.message.phase2.Line3.toUpperCase() + "<br>";
                 // If the message isn't blank, append it to the list
                 // adding a seperate dotted line between phase1 and phase2
-                if (phase1 != "<br><br><br>" || phase2 != "<br><br>")
+                if (phase1 != "<br><br><br>" || phase2 != "<br><br><br>")
                 {
+                    // store phase 1 and phase 2 messages in arrays
+                    phase.one[cnt] = phase1;
+                    phase.two[cnt] = phase2;
                     // Keep track of the number of non-empty cms message 
                     cnt++;
                     // Determine odd or even cms message in order to alternate the background color
-                    if (cnt%2==0) {
+                    if (cnt%2==0) 
+					{
                       bg = "even";
-                    } else {
+                    } else 
+					{
                       bg = "odd";
                     }
-                    display.innerHTML += "<div id=\"cms_info\" class=\"" + bg + "\">" + item.cms.index + ": " + 
+                    // Store location info in array
+                    phase.header[cnt-1] = "<div id=\"cms_info\" class=\"" + bg + "\">" + item.cms.index + ": " + 
                         cmsLoc.properties.location + " " + cmsLoc.properties.street + "</div>";
-                    display.innerHTML += "<div class=\"cms_content " + bg + "\">" + phase1 + "</div>" +
-                      "<div class=\"divider " + bg + "\"> -----------------------------------------------</div>" +
-                      "<div class=\"cms_content " + bg + "\">" + phase2 + "</div>";
+
+                    // Only come here initially where page is loaded 
+                   /* if (i <= messagejson.data.length - 1 && loaded === false) {
+                      display.innerHTML += phase.header[cnt-1];
+                      display.innerHTML += "<div class=\"cms_content " + bg + "\">" + phase1 + "</div>" ;
+                      if (i == messagejson.data.length - 1)
+                        loaded = true;
+                   }*/
                 }
-            }
+            }            
         });
-    }
-
+        // After all relevant info is stored in arrays, we can begin pagination 
+        //console.log(phase.one, phase.one.length);
+        switchPages();
+    }
+
+// Returns an array of elements to be displayed given a page_number
+function paginate (array, page_size, page_number) {
+  --page_number; // because pages logically start with 1, but technically with 0
+  return array.slice(page_number * page_size, (page_number + 1) * page_size);
+}
+
+function switchPages()
+{
+    var display = document.getElementById("msgs");
+    var finalPage = Math.ceil(phase.one.length / msgsPerPage);
+    display.innerHTML = "";
+    pageNumber++;
+    // Check if last page is reached, then cycle back to 1
+    if (pageNumber > finalPage)
+    {
+        pageNumber = 1;
+    }
+    // Change Page Number
+    var pageIndex = document.getElementById("page");
+    pageIndex.innerHTML = "Pg " + pageNumber + " of " + finalPage;
+    // Paginate all arrays
+    var phase1msgs = paginate(phase.one, msgsPerPage, pageNumber); //phase 1 messages after pagination
+    var phase2msgs = paginate(phase.two, msgsPerPage, pageNumber); //phase 2 messages after pagination
+    var header = paginate(phase.header, msgsPerPage, pageNumber); //location info after pagination
+    // Output the CMS messages and location info from the paginated arrays
+    for (var cnt = 0; cnt < phase1msgs.length; cnt++)
+    {
+        // Determine odd or even cms message in order to alternate the background color
+        if (cnt % 2 == 0)
+        {
+            bg = "odd";
+        }
+        else
+        {
+            bg = "even";
+        }
+        display.innerHTML += header[cnt];
+        display.innerHTML += "<div class=\"cms_content " + bg + "\">" + phase1msgs[cnt] + "</div>";
+    }
+    // Hold the paginated arrays in container 'messages'
+    messages.phase1msgs = phase1msgs;
+    messages.phase2msgs = phase2msgs;
+}
+
+function switchPhase()
+{
+    var cnt = 0;
+    // Do a swap between the arrays in 'messages' storing each phase 
+    var temp = messages.phase1msgs;
+    messages.phase1msgs = messages.phase2msgs;
+    messages.phase2msgs = temp;
+    if (messages.phase1msgs.length == 0)
+    {
+        messages.phase1msgs = phase.two;
+    }
+    // Get all CMS messages currently displayed
+    odd = document.getElementsByClassName('cms_content odd');
+    even = document.getElementsByClassName('cms_content even');
+    // Change each message to display messages from the swapped array instead
+    [].slice.call(odd).forEach(function(o)
+    {
+        if (messages.phase1msgs[cnt] != "<br><br><br>")
+        {
+            o.innerHTML = messages.phase1msgs[cnt] + "</div>";
+        }
+        cnt += 2;
+    });
+    cnt = 1;
+    [].slice.call(even).forEach(function(e)
+    {
+        if (messages.phase1msgs[cnt] != "<br><br><br>")
+        {
+            e.innerHTML = messages.phase1msgs[cnt] + "</div>";
+        }
+        cnt += 2;
+    });
+}
 // Start
 loadCMSlocations();
+loadHARLocations();
 loadAllcmsMessages();
+loadAllHARMessages();
+
+// start an interval timer to switch phases every 5 seconds
+var phaseTimer = setInterval(switchPhase, 2000);
 // start an interval timer to refresh the cms icons every 10 seconds
 var cmsTimer = setInterval(loadAllcmsMessages, 10000);
+// start an interval timer to refresh the har messages every 10 seconds
+var harTimer = setInterval(loadAllHARMessages, 10000);
 
    </script>
Index: trunk/webapps/dynamicdata/cms_messages.json
===================================================================
--- trunk/webapps/dynamicdata/cms_messages.json	(revision 442)
+++ trunk/webapps/dynamicdata/cms_messages.json	(revision 463)
@@ -8,5 +8,5 @@
 {"cms":{"index":"16","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"17","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
-{"cms":{"index":"18","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
+{"cms":{"index":"18","message":{"displayTime":"","phase1":{"Line1":"BBBBB","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"19","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"20","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
@@ -34,5 +34,5 @@
 {"cms":{"index":"69","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"70","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
-{"cms":{"index":"71","message":{"displayTime":"","phase1":{"Line1":"SLOW FOR THE","Line2":"","Line3":"CONE ZONE"},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
+{"cms":{"index":"71","message":{"displayTime":"","phase1":{"Line1":"SLOW FOR THE","Line2":"","Line3":"CONE ZONE"},"phase2":{"Line1":"ROAD WORK","Line2":"AHEAD","Line3":""}}}},
 {"cms":{"index":"72","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"73","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
@@ -49,5 +49,5 @@
 {"cms":{"index":"84","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"85","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
-{"cms":{"index":"86","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
+{"cms":{"index":"86","message":{"displayTime":"","phase1":{"Line1":"AAAAAA","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"87","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
 {"cms":{"index":"88","message":{"displayTime":"","phase1":{"Line1":"","Line2":"","Line3":""},"phase2":{"Line1":"","Line2":"","Line3":""}}}},
Index: trunk/webapps/dynamicdata/har_messages.json
===================================================================
--- trunk/webapps/dynamicdata/har_messages.json	(revision 438)
+++ trunk/webapps/dynamicdata/har_messages.json	(revision 463)
@@ -1,4 +1,4 @@
 {"data":[
-{"har":{"index":"WPMW407 1620 AM","message":{"displayTime":"","phase1":{"Line1":"GOOD MORNING, AMERICA"}}}},
+{"har":{"index":"WPMW407 1620 AM","message":{"displayTime":"","phase1":{"Line1":"GOOD NIGHT"}}}},
 {"har":{"index":"KNNN868 1620 AM","message":{"displayTime":"","phase1":{"Line1":"HELLO WORLD"}}}}
 ]}
Index: trunk/webapps/dynamicdata/IncidentActivity.log
===================================================================
--- trunk/webapps/dynamicdata/IncidentActivity.log	(revision 463)
+++ trunk/webapps/dynamicdata/IncidentActivity.log	(revision 463)
@@ -0,0 +1,7 @@
+{"data":
+[
+["20190207-001","02\/07","13:22.49","Ha, Khanh Duy","","Per 32-1, NB rte 405 blocked"],
+["20190207-001","02\/07","13:23.07","Gross, Angelo","","HCC NOTIFIED"],
+["20190207-001","02\/07","13:23.59","Gross, Angelo","","32-1 Vehicle Disabled S 55@ 405 1308 hours"],["20190207-021","02\/07","16:05.11","","10-98 Assignment Completed","75-1"]
+]
+}
Index: trunk/webapps/dynamicdata/unifiedlog.csv
===================================================================
--- trunk/webapps/dynamicdata/unifiedlog.csv	(revision 443)
+++ trunk/webapps/dynamicdata/unifiedlog.csv	(revision 463)
@@ -1,1 +1,5 @@
-0:00:49, CMS Activated.,N I-405 15.18 MAGNOLIA ST, 'SLOW FOR THE::CONE ZONE:::'
+0:00:30, CMS Activated.,N I-405 15.18 MAGNOLIA ST, 'SLOW FOR THE::CONE ZONE:::'
+0:00:30, Activity Log: Ha, Khanh DuyPer 32-1, NB rte 405 blocked
+0:00:30, Activity Log: Gross, AngeloHCC NOTIFIED
+0:00:30, Activity Log: Gross, Angelo32-1 Vehicle Disabled S 55@ 405 1308 hours
+0:00:30, Activity Log: 10-98 Assignment Completed75-1
