OLD | NEW |
1 /** | 1 /** |
2 * Common JS that talks XHR back to the server and runs the code and receives | 2 * Common JS that talks XHR back to the server and runs the code and receives |
3 * the results. | 3 * the results. |
4 */ | 4 */ |
5 | 5 |
6 | 6 |
7 /** | 7 /** |
8 * All the functionality is wrapped up in this anonymous closure, but we need | 8 * All the functionality is wrapped up in this anonymous closure, but we need |
9 * to be told if we are on the workspace page or a normal try page, so the | 9 * to be told if we are on the workspace page or a normal try page, so the |
10 * workspaceName is passed into the closure, it must be set in the global | 10 * workspaceName is passed into the closure, it must be set in the global |
(...skipping 27 matching lines...) Expand all Loading... |
38 var chooseList = document.getElementById('chooseList'); | 38 var chooseList = document.getElementById('chooseList'); |
39 | 39 |
40 // Id of the source image to use, 0 if no source image is used. | 40 // Id of the source image to use, 0 if no source image is used. |
41 var sourceId = 0; | 41 var sourceId = 0; |
42 | 42 |
43 sourceId = parseInt(enableSource.getAttribute('data-id')); | 43 sourceId = parseInt(enableSource.getAttribute('data-id')); |
44 if (sourceId) { | 44 if (sourceId) { |
45 sourceSelectByID(sourceId); | 45 sourceSelectByID(sourceId); |
46 } | 46 } |
47 | 47 |
| 48 function setIFrameURL() { |
| 49 var url = document.URL; |
| 50 url = url.replace('/c/', '/iframe/'); |
| 51 embed.value = '<iframe src="' + url + '" width="740" height="550" style=
"border: solid #00a 5px; border-radius: 5px;"/>' |
| 52 } |
48 | 53 |
49 function beginWait() { | 54 function beginWait() { |
50 document.body.classList.add('waiting'); | 55 document.body.classList.add('waiting'); |
51 run.disabled = true; | 56 run.disabled = true; |
52 } | 57 } |
53 | 58 |
54 | 59 |
55 function endWait() { | 60 function endWait() { |
56 document.body.classList.remove('waiting'); | 61 document.body.classList.remove('waiting'); |
57 run.disabled = false; | 62 run.disabled = false; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 if (enableSource.checked) { | 131 if (enableSource.checked) { |
127 beginWait(); | 132 beginWait(); |
128 var req = new XMLHttpRequest(); | 133 var req = new XMLHttpRequest(); |
129 req.addEventListener('load', sourcesComplete); | 134 req.addEventListener('load', sourcesComplete); |
130 req.addEventListener('error', xhrError); | 135 req.addEventListener('error', xhrError); |
131 req.overrideMimeType('application/json'); | 136 req.overrideMimeType('application/json'); |
132 req.open('GET', '/sources/', true); | 137 req.open('GET', '/sources/', true); |
133 req.send(); | 138 req.send(); |
134 } else { | 139 } else { |
135 sourceId = 0; | 140 sourceId = 0; |
| 141 chooseSource.classList.remove('show'); |
136 } | 142 } |
137 } | 143 } |
138 | 144 |
139 enableSource.addEventListener('click', sourceClick, true); | 145 enableSource.addEventListener('click', sourceClick, true); |
140 selectedSource.addEventListener('click', sourceClick, true); | 146 selectedSource.addEventListener('click', sourceClick, true); |
141 | 147 |
142 | 148 |
143 var editor = CodeMirror.fromTextArea(code, { | 149 var editor = CodeMirror.fromTextArea(code, { |
144 theme: "default", | 150 theme: "default", |
145 lineNumbers: true, | 151 lineNumbers: true, |
(...skipping 13 matching lines...) Expand all Loading... |
159 * Callback when there's an XHR error. | 165 * Callback when there's an XHR error. |
160 * @param e The callback event. | 166 * @param e The callback event. |
161 */ | 167 */ |
162 function xhrError(e) { | 168 function xhrError(e) { |
163 endWait(); | 169 endWait(); |
164 alert('Something bad happened: ' + e); | 170 alert('Something bad happened: ' + e); |
165 } | 171 } |
166 | 172 |
167 function clearOutput() { | 173 function clearOutput() { |
168 output.textContent = ""; | 174 output.textContent = ""; |
| 175 output.style.display='none'; |
169 if (stdout) { | 176 if (stdout) { |
170 stdout.textContent = ""; | 177 stdout.textContent = ""; |
| 178 stdout.style.display='none'; |
171 } | 179 } |
172 embed.style.display='none'; | 180 if (embed) { |
| 181 embed.style.display='none'; |
| 182 } |
173 } | 183 } |
174 | 184 |
175 /** | 185 /** |
176 * Called when an image in the workspace history is clicked. | 186 * Called when an image in the workspace history is clicked. |
177 */ | 187 */ |
178 function historyClick() { | 188 function historyClick() { |
179 beginWait(); | 189 beginWait(); |
180 clearOutput(); | 190 clearOutput(); |
181 var req = new XMLHttpRequest(); | 191 var req = new XMLHttpRequest(); |
182 req.addEventListener('load', historyComplete); | 192 req.addEventListener('load', historyComplete); |
(...skipping 14 matching lines...) Expand all Loading... |
197 // "code": "source code for try" | 207 // "code": "source code for try" |
198 // } | 208 // } |
199 endWait(); | 209 endWait(); |
200 body = JSON.parse(e.target.response); | 210 body = JSON.parse(e.target.response); |
201 code.value = body.code; | 211 code.value = body.code; |
202 editor.setValue(body.code); | 212 editor.setValue(body.code); |
203 img.src = '/i/'+body.hash+'.png'; | 213 img.src = '/i/'+body.hash+'.png'; |
204 sourceSelectByID(body.source); | 214 sourceSelectByID(body.source); |
205 if (permalink) { | 215 if (permalink) { |
206 permalink.href = '/c/' + body.hash; | 216 permalink.href = '/c/' + body.hash; |
| 217 permalink.style.display='inline-block'; |
207 } | 218 } |
208 } | 219 } |
209 | 220 |
210 | 221 |
211 /** | 222 /** |
212 * Add the given try image to the history of a workspace. | 223 * Add the given try image to the history of a workspace. |
213 */ | 224 */ |
214 function addToHistory(hash, imgUrl) { | 225 function addToHistory(hash, imgUrl) { |
215 var clone = tryTemplate.content.cloneNode(true); | 226 var clone = tryTemplate.content.cloneNode(true); |
216 clone.querySelector('img').src = imgUrl; | 227 clone.querySelector('img').src = imgUrl; |
(...skipping 13 matching lines...) Expand all Loading... |
230 // "message": "you had an error...", | 241 // "message": "you had an error...", |
231 // "img": "<base64 encoded image but only on success>" | 242 // "img": "<base64 encoded image but only on success>" |
232 // } | 243 // } |
233 // | 244 // |
234 // The img is optional and only appears if there is a valid | 245 // The img is optional and only appears if there is a valid |
235 // image to display. | 246 // image to display. |
236 endWait(); | 247 endWait(); |
237 console.log(e.target.response); | 248 console.log(e.target.response); |
238 body = JSON.parse(e.target.response); | 249 body = JSON.parse(e.target.response); |
239 output.textContent = body.message; | 250 output.textContent = body.message; |
| 251 if (body.message) { |
| 252 output.style.display = 'block'; |
| 253 } |
240 if (stdout) { | 254 if (stdout) { |
241 stdout.textContent = body.stdout; | 255 stdout.textContent = body.stdout; |
| 256 if (body.stdout) { |
| 257 stdout.style.display = 'block'; |
| 258 } |
242 } | 259 } |
243 if (body.hasOwnProperty('img')) { | 260 if (body.hasOwnProperty('img')) { |
244 img.src = 'data:image/png;base64,' + body.img; | 261 img.src = 'data:image/png;base64,' + body.img; |
245 } else { | 262 } else { |
246 img.src = ''; | 263 img.src = ''; |
247 } | 264 } |
248 // Add the image to the history if we are on a workspace page. | 265 // Add the image to the history if we are on a workspace page. |
249 if (tryHistory) { | 266 if (tryHistory) { |
250 addToHistory(body.hash, 'data:image/png;base64,' + body.img); | 267 addToHistory(body.hash, 'data:image/png;base64,' + body.img); |
251 } else { | 268 } else { |
252 window.history.pushState(null, null, '/c/' + body.hash); | 269 window.history.pushState(null, null, '/c/' + body.hash); |
253 } | 270 } |
254 if (permalink) { | 271 if (permalink) { |
255 permalink.href = '/c/' + body.hash; | 272 permalink.href = '/c/' + body.hash; |
| 273 permalink.style.display = 'inline-block'; |
256 } | 274 } |
257 if (embed) { | 275 if (embed) { |
258 var url = document.URL; | 276 setIFrameURL(); |
259 url = url.replace('/c/', '/iframe/'); | |
260 embed.value = '<iframe src="' + url + '" width="740" height="550" styl
e="border: solid #00a 5px; border-radius: 5px;"/>' | |
261 } | 277 } |
262 if (embedButton && embedButton.hasAttribute('disabled')) { | 278 if (embedButton) { |
263 embedButton.removeAttribute('disabled'); | 279 embedButton.style.display = 'inline-block'; |
264 } | 280 } |
265 } | 281 } |
266 | 282 |
267 | 283 |
268 function onSubmitCode() { | 284 function onSubmitCode() { |
269 beginWait(); | 285 beginWait(); |
270 clearOutput(); | 286 clearOutput(); |
271 var req = new XMLHttpRequest(); | 287 var req = new XMLHttpRequest(); |
272 req.addEventListener('load', codeComplete); | 288 req.addEventListener('load', codeComplete); |
273 req.addEventListener('error', xhrError); | 289 req.addEventListener('error', xhrError); |
274 req.overrideMimeType('application/json'); | 290 req.overrideMimeType('application/json'); |
275 req.open('POST', '/', true); | 291 req.open('POST', '/', true); |
276 req.setRequestHeader('content-type', 'application/json'); | 292 req.setRequestHeader('content-type', 'application/json'); |
277 req.send(JSON.stringify({'code': editor.getValue(), 'name': workspaceNam
e, 'source': sourceId})); | 293 req.send(JSON.stringify({'code': editor.getValue(), 'name': workspaceNam
e, 'source': sourceId})); |
278 } | 294 } |
279 run.addEventListener('click', onSubmitCode); | 295 run.addEventListener('click', onSubmitCode); |
280 | 296 |
281 | 297 |
282 function onEmbedClick() { | 298 function onEmbedClick() { |
283 embed.style.display='inline'; | 299 embed.style.display='inline'; |
284 } | 300 } |
285 | 301 |
286 if (embedButton) { | 302 if (embedButton) { |
287 embedButton.addEventListener('click', onEmbedClick); | 303 embedButton.addEventListener('click', onEmbedClick); |
288 } | 304 } |
289 | 305 |
| 306 setIFrameURL(); |
| 307 |
290 // Add the images to the history if we are on a workspace page. | 308 // Add the images to the history if we are on a workspace page. |
291 if (tryHistory && history_) { | 309 if (tryHistory && history_) { |
292 for (var i=0; i<history_.length; i++) { | 310 for (var i=0; i<history_.length; i++) { |
293 addToHistory(history_[i].hash, '/i/'+history_[i].hash+'.png'); | 311 addToHistory(history_[i].hash, '/i/'+history_[i].hash+'.png'); |
294 } | 312 } |
295 } | 313 } |
296 } | 314 } |
297 | 315 |
298 // If loaded via HTML Imports then DOMContentLoaded will be long done. | 316 // If loaded via HTML Imports then DOMContentLoaded will be long done. |
299 if (document.readyState != "loading") { | 317 if (document.readyState != "loading") { |
300 onLoad(); | 318 onLoad(); |
301 } else { | 319 } else { |
302 this.addEventListener('load', onLoad); | 320 this.addEventListener('load', onLoad); |
303 } | 321 } |
304 | 322 |
305 })(); | 323 })(); |
OLD | NEW |