|  | // Copyright 2012 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | function initPlayground(transport) { | 
|  | 'use strict'; | 
|  |  | 
|  | function text(node) { | 
|  | var s = ''; | 
|  | for (var i = 0; i < node.childNodes.length; i++) { | 
|  | var n = node.childNodes[i]; | 
|  | if (n.nodeType === 1) { | 
|  | if (n.tagName === 'BUTTON') continue; | 
|  | if (n.tagName === 'SPAN' && n.className === 'number') continue; | 
|  | if (n.tagName === 'DIV' || n.tagName === 'BR' || n.tagName === 'PRE') { | 
|  | s += '\n'; | 
|  | } | 
|  | s += text(n); | 
|  | continue; | 
|  | } | 
|  | if (n.nodeType === 3) { | 
|  | s += n.nodeValue; | 
|  | } | 
|  | } | 
|  | return s.replace('\xA0', ' '); // replace non-breaking spaces | 
|  | } | 
|  |  | 
|  | // When presenter notes are enabled, the index passed | 
|  | // here will identify the playground to be synced | 
|  | function init(code, index) { | 
|  | var output = document.createElement('div'); | 
|  | var outpre = document.createElement('pre'); | 
|  | var running; | 
|  |  | 
|  | if ($ && $(output).resizable) { | 
|  | $(output).resizable({ | 
|  | handles: 'n,w,nw', | 
|  | minHeight: 27, | 
|  | minWidth: 135, | 
|  | maxHeight: 608, | 
|  | maxWidth: 990, | 
|  | }); | 
|  | } | 
|  |  | 
|  | function onKill() { | 
|  | if (running) running.Kill(); | 
|  | if (window.notesEnabled) updatePlayStorage('onKill', index); | 
|  | } | 
|  |  | 
|  | function onRun(e) { | 
|  | var sk = e.shiftKey || localStorage.getItem('play-shiftKey') === 'true'; | 
|  | if (running) running.Kill(); | 
|  | output.style.display = 'block'; | 
|  | outpre.textContent = ''; | 
|  | run1.style.display = 'none'; | 
|  | var options = { Race: sk }; | 
|  | running = transport.Run(text(code), PlaygroundOutput(outpre), options); | 
|  | if (window.notesEnabled) updatePlayStorage('onRun', index, e); | 
|  | } | 
|  |  | 
|  | function onClose() { | 
|  | if (running) running.Kill(); | 
|  | output.style.display = 'none'; | 
|  | run1.style.display = 'inline-block'; | 
|  | if (window.notesEnabled) updatePlayStorage('onClose', index); | 
|  | } | 
|  |  | 
|  | if (window.notesEnabled) { | 
|  | playgroundHandlers.onRun.push(onRun); | 
|  | playgroundHandlers.onClose.push(onClose); | 
|  | playgroundHandlers.onKill.push(onKill); | 
|  | } | 
|  |  | 
|  | var run1 = document.createElement('button'); | 
|  | run1.textContent = 'Run'; | 
|  | run1.className = 'run'; | 
|  | run1.addEventListener('click', onRun, false); | 
|  | var run2 = document.createElement('button'); | 
|  | run2.className = 'run'; | 
|  | run2.textContent = 'Run'; | 
|  | run2.addEventListener('click', onRun, false); | 
|  | var kill = document.createElement('button'); | 
|  | kill.className = 'kill'; | 
|  | kill.textContent = 'Kill'; | 
|  | kill.addEventListener('click', onKill, false); | 
|  | var close = document.createElement('button'); | 
|  | close.className = 'close'; | 
|  | close.textContent = 'Close'; | 
|  | close.addEventListener('click', onClose, false); | 
|  |  | 
|  | var button = document.createElement('div'); | 
|  | button.classList.add('buttons'); | 
|  | button.appendChild(run1); | 
|  | // Hack to simulate insertAfter | 
|  | code.parentNode.insertBefore(button, code.nextSibling); | 
|  |  | 
|  | var buttons = document.createElement('div'); | 
|  | buttons.classList.add('buttons'); | 
|  | buttons.appendChild(run2); | 
|  | buttons.appendChild(kill); | 
|  | buttons.appendChild(close); | 
|  |  | 
|  | output.classList.add('output'); | 
|  | output.appendChild(buttons); | 
|  | output.appendChild(outpre); | 
|  | output.style.display = 'none'; | 
|  | code.parentNode.insertBefore(output, button.nextSibling); | 
|  | } | 
|  |  | 
|  | var play = document.querySelectorAll('div.playground'); | 
|  | for (var i = 0; i < play.length; i++) { | 
|  | init(play[i], i); | 
|  | } | 
|  | } |