// 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 && n.tagName === "SPAN" && n.className != "number") {
				var innerText = n.innerText === undefined ? "textContent" : "innerText";
				s += n[innerText] + "\n";
				continue;
			}
			if (n.nodeType === 1 && n.tagName !== "BUTTON") {
				s += text(n);
			}
		}
		return s;
	}

	function init(code) {
		var output = document.createElement('div');
		var outpre = document.createElement('pre');
		var running;

		// TODO(adg): check that jquery etc is loaded.
		$(output).resizable({
			handles: "n,w,nw",
			minHeight:	27,
			minWidth:	135,
			maxHeight: 608,
			maxWidth:	990
		});

		function onKill() {
			if (running) running.Kill();
		}

		function onRun(e) {
			onKill();
			output.style.display = "block";
			outpre.innerHTML = "";
			run1.style.display = "none";
			var options = {Race: e.shiftKey};
			running = transport.Run(text(code), PlaygroundOutput(outpre), options);
		}

		function onClose() {
			onKill();
			output.style.display = "none";
			run1.style.display = "inline-block";
		}

		var run1 = document.createElement('button');
		run1.innerHTML = 'Run';
		run1.className = 'run';
		run1.addEventListener("click", onRun, false);
		var run2 = document.createElement('button');
		run2.className = 'run';
		run2.innerHTML = 'Run';
		run2.addEventListener("click", onRun, false);
		var kill = document.createElement('button');
		kill.className = 'kill';
		kill.innerHTML = 'Kill';
		kill.addEventListener("click", onKill, false);
		var close = document.createElement('button');
		close.className = 'close';
		close.innerHTML = '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]);
	}
}

