// 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);
  }
}
