source: tmcsimulator/trunk/webapps/cptms/js/cmsLayer.js @ 440

Revision 440, 9.3 KB checked in by jdalbey, 7 years ago (diff)

Move unified logger to python folder under src. Create a separate web app to display the log file in a formatted html page. Fix sanitize defect in cms and har layers.

Line 
1function initCMSbutton()
2{
3    var cmsBtnDiv = document.getElementById('cmsButton');
4    map.controls[google.maps.ControlPosition.LEFT_BOTTOM].push(cmsBtnDiv)
5    cmsBtnDiv.title = 'Click to toggle cms view';
6    // Setup the click event listeners to toggle icon display
7    cmsBtnDiv.addEventListener('click', function()
8    {
9        cms_showing = !cms_showing;
10        // Determine which button image to show
11        if (cms_showing)
12        {
13            pic = "images/btnDepressed_CMS.png"
14            // It's nice when icons become visible that the messages have been refreshed.
15            loadAllcmsMessages();
16        }
17        else
18        {
19            pic = "images/btnReady_CMS.png"
20        }
21        document.getElementById('cmsBtnImg').src = pic;
22        // reveal or hide all the icons
23        cmsLayer.forEach(function(feature)
24        {
25            cmsLayer.overrideStyle(feature,
26            {
27                visible: cms_showing
28            });
29        });
30    });
31}
32function loadCMSlayer()
33{
34    cmsLayer = new google.maps.Data();
35    cmsLayer.setMap(map);
36    cmsLayer.loadGeoJson(kCMSfile);
37    // Define the clickable area on a CMS icon (the default is too big)
38    var clickRegion = {coords: [0,0,18,15], type: "rect"}
39    cmsLayer.setStyle(function(feature)
40        {
41            // return the StyleOptions
42            return {
43                icon: iconCMSidle,
44                shape: clickRegion,
45                title: feature.getId()+ " " +feature.getProperty("location")+ " " 
46                        + feature.getProperty("street"),
47                visible: false
48            };
49        });
50   
51    cmsLayer.addListener('click', function(event)
52    {
53        var dialog = document.getElementById('cms-dialog');
54        // Note: If the dialog is already being displayed when someone else
55        // updates the message, it won't be reflected in the dialog, until
56        // you close and reopen it.
57        dialog.style.display = 'block';
58        cmsID = event.feature.getId();
59        // Assign to the hidden field
60        document.getElementById('cmsID').value = cmsID;
61        showMessage(cmsID); // note: this is async
62        document.getElementById('cms-info-label').innerHTML = "CMS ID: " +
63            cmsID + "   LOCATION: " + event.feature.getProperty("location")
64            + "  " + event.feature.getProperty("street");
65        // clear input fields
66        document.getElementById('msgcontent1').value = "";
67        document.getElementById('msgcontent2').value = "";
68        document.getElementById('msgcontent3').value = "";
69        document.getElementById('msgcontent4').value = "";
70        document.getElementById('msgcontent5').value = "";
71        document.getElementById('msgcontent6').value = "";
72        document.getElementById('msgcontent1').focus();
73        var span = document.getElementById("cms-close");
74            // When the user clicks on <span> (x), close the modal
75        span.onclick = function()
76        {
77            hideElementById('cms-dialog');
78        }
79    });
80}
81
82    // Center justify message text in a 16 column field
83    function justifyCMStext(message)
84    {
85        // don't bother justifying a blank message
86        if (message.length == 0) return message;   
87        // determine how much padding is needed
88        var kBlanks = "                ";
89        var padLen = (16 - message.length) / 2;
90        // apply the padding
91        var padding = kBlanks.substring(0, padLen);
92        return padding + message;
93    }
94    // Remove harmful characters from the message
95    // Fix defect #122.   
96    function sanitize(text)
97    {
98        return text.replace(/[;:,"]/gi, ""); 
99    }
100    function handleCMSsubmit()
101    {
102        // recover the user's response
103        var response1 = sanitize(document.getElementById('msgcontent1').value.trim());
104        var response2 = sanitize(document.getElementById('msgcontent2').value.trim());
105        var response3 = sanitize(document.getElementById('msgcontent3').value.trim());
106        var response4 = sanitize(document.getElementById('msgcontent4').value.trim());
107        var response5 = sanitize(document.getElementById('msgcontent5').value.trim());
108        var response6 = sanitize(document.getElementById('msgcontent6').value.trim());
109        var newMsg = response1 + response2 + response3 + response4 + response5 + response6;
110        if (newMsg.length == 0)
111        {
112            alert("Nothing to Send ... input fields are empty.");
113        }
114        else
115        {
116            document.getElementById('msgdisplay1').value = justifyCMStext(response1);
117            document.getElementById('msgdisplay2').value = justifyCMStext(response2);
118            document.getElementById('msgdisplay3').value = justifyCMStext(response3);
119            document.getElementById('msgdisplay4').value = justifyCMStext(response4);
120            document.getElementById('msgdisplay5').value = justifyCMStext(response5);
121            document.getElementById('msgdisplay6').value = justifyCMStext(response6);
122            saveCMSMessage(response1 + "|" + response2 + "|" + response3 + "|" +
123                        response4 + "|" + response5 + "|" + response6);
124        }
125    }
126
127    function handleCMSclear()
128    {
129        document.getElementById('msgdisplay1').value = "";
130        document.getElementById('msgdisplay2').value = "";
131        document.getElementById('msgdisplay3').value = "";
132        document.getElementById('msgdisplay4').value = "";
133        document.getElementById('msgdisplay5').value = "";
134        document.getElementById('msgdisplay6').value = "";
135        saveCMSMessage("|||||");
136    }
137
138    // Save an updated cms message to the file
139    function saveCMSMessage(outMessage)
140    {
141        // Fetch cmsID from hidden field where it was put when dialog opened.
142        var cmsID = document.getElementById('cmsID').value;
143        msgParts = outMessage.split("|");
144        CMSmessageDict[cmsID].cms.message.phase1.Line1 = msgParts[0];
145        CMSmessageDict[cmsID].cms.message.phase1.Line2 = msgParts[1];
146        CMSmessageDict[cmsID].cms.message.phase1.Line3 = msgParts[2];
147        CMSmessageDict[cmsID].cms.message.phase2.Line1 = msgParts[3];
148        CMSmessageDict[cmsID].cms.message.phase2.Line2 = msgParts[4];
149        CMSmessageDict[cmsID].cms.message.phase2.Line3 = msgParts[5];
150        // Check if there was any messages to save and
151        // Set icon to reflect message state
152        if (outMessage == "|||||")
153        {
154            currentIcon = {icon: iconCMSidle};
155        }
156        else
157        {
158            currentIcon = {icon: iconCMSactive};
159        }
160        cmsLayer.overrideStyle(cmsLayer.getFeatureById(cmsID), currentIcon);
161        // Examine each message in the dict and convert to json format
162        var lineOut = "";
163        for (var id in CMSmessageDict)
164        {
165            // convert and append to output string
166            lineOut += JSON.stringify(CMSmessageDict[id]) + ',\n';
167        }
168        // remove trailing comma
169        lineOut = lineOut.substring(0,lineOut.length-2);
170        outString = "{\"data\":[\n" + lineOut + "\n]}";
171
172        // Using POST to send the data
173        var xhr = new XMLHttpRequest();
174        xhr.open("POST", "../cgi-bin/saveCMSmessage.py", true);
175        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
176        // send the collected data as JSON
177        xhr.send("msg="+outString);
178    }
179
180    // retrieve the current cms message file
181    function showMessage(cmsID)
182    {
183        loadAllcmsMessages();  // because someone else may have made a recent update
184        // lookup the message for this cms ID
185        var message = CMSmessageDict[cmsID].cms.message;
186        // show the message in the display
187        document.getElementById('msgdisplay1').value = justifyCMStext(message.phase1.Line1);
188        document.getElementById('msgdisplay2').value = justifyCMStext(message.phase1.Line2);
189        document.getElementById('msgdisplay3').value = justifyCMStext(message.phase1.Line3);
190        document.getElementById('msgdisplay4').value = justifyCMStext(message.phase2.Line1);
191        document.getElementById('msgdisplay5').value = justifyCMStext(message.phase2.Line2);
192        document.getElementById('msgdisplay6').value = justifyCMStext(message.phase2.Line3);
193    }
194    function loadAllcmsMessages()
195    {
196        loadJSON("../dynamicdata/cms_messages.json", function(response)
197        {
198            // Parse JSON string into object
199            messagejson = JSON.parse(response);
200            // Add each message to a lookup dictionary
201            for (var i = 0; i < messagejson.data.length; i++)
202            {
203                var item = messagejson.data[i];
204                CMSmessageDict[item.cms.index] = item;
205                // Set the appropriate icon on the cms icon
206                // set a yellow flag if there's currently no message
207                if (item.cms.message.phase1.Line1 + 
208                    item.cms.message.phase1.Line2 +
209                    item.cms.message.phase1.Line3 +
210                    item.cms.message.phase2.Line1 + 
211                    item.cms.message.phase2.Line2 +
212                    item.cms.message.phase2.Line3 == "")
213                {
214                    cmsLayer.overrideStyle(cmsLayer.getFeatureById(item.cms.index), {icon: iconCMSidle})
215                }
216                else
217                {
218                    cmsLayer.overrideStyle(cmsLayer.getFeatureById(item.cms.index), {icon: iconCMSactive})
219                }
220            }
221        });
222    }
223
224
Note: See TracBrowser for help on using the repository browser.