// ==UserScript==
// @name           Selenium RC HTML driver via GreaseMonkey
// @namespace      dtakamori.com
// @include        http://localhost/selenium/*.html
// ==/UserScript==

//var selenium_server = "http://localhost:4444";
var selenium_server = "http://192.168.1.5:4444";
var browser = "*iexplore";
var base_url = document.getElementsByTagName("link")[0].getAttribute("href");

function execute(args) {
	var url = selenium_server + "/selenium-server/driver/?cmd=" + args.cmd + 
		"&1=" + encodeURIComponent(args.arg1) + 
		"&2=" + encodeURIComponent(args.arg2);
	if (args.sessionId) {
		url += "&sessionId=" + args.sessionId;
	}
	GM_xmlhttpRequest({
		method: "GET",
		url: url,
		onload: function(responseDetails) {
			var response = responseDetails.responseText;
			if (response.substring(0, 2) == "OK") {
				var result;
				if (response.length > 2) {
					result = response.substring(3);
				}
				if (args.onComplete) args.onComplete(result);
			} else {
				if (args.onError) args.onError(response);
			}
		},
		onerror: function(responseDetails) {
			if (args.onError) {
				args.onError("Received error HTTP " + 
					responseDetails.status +
					" " + responseDetails.statusText);
			}
		}
	});
}

function executeSteps(args) {
	if (args.steps.length == 0) {
		if (args.onComplete) args.onComplete();
		return;
	}
	var stepsCopy = args.steps.concat();
	var step = stepsCopy.shift();
	var onComplete = function(result) {
		if (args.onStepComplete) args.onStepComplete(step, result);
		executeSteps({
			steps: stepsCopy, 
			sessionId: args.sessionId, 
			onStep: args.onStep,
			onStepComplete: args.onStepComplete,
			onStepError: args.onStepError,
			onComplete: args.onComplete, 
			onError: args.onError
		});
	};
	var onError = function(error) {
		if (args.onStepError) args.onStepError(step, error);
		if (args.onError) args.onError(error);
	}
	if (args.onStep) {
		args.onStep(step);
	}
	execute({
		cmd: step.cmd, 
		arg1: step.arg1, 
		arg2: step.arg2, 
		sessionId: args.sessionId, 
		onComplete: onComplete, 
		onError: onError
	});
}

function runTest(browser, base_url, onComplete, onError) {
	var body = document.getElementsByTagName("body")[0];

	var resultContainer = document.createElement("div");
	resultContainer.innerHTML = "Result: ";
	body.insertBefore(resultContainer, body.firstChild);
	var result = document.createElement("span");
	result.setAttribute("id", "result");
	resultContainer.appendChild(result);

	var executionLogContainer = document.createElement("div");
	executionLogContainer.innerHTML = "Execution Log:";
	body.appendChild(executionLogContainer);
	var executionLog = document.createElement("div");
	executionLog.setAttribute("id", "log");
	executionLog.setAttribute("style", "white-space: pre;");
	executionLogContainer.appendChild(executionLog);

	var headerRow = document.getElementsByTagName("thead")[0].getElementsByTagName("tr")[0];
	headerRow.insertCell(1).innerHTML="State";
	headerRow.insertCell(2).innerHTML="Result";
	var stepRows = document.getElementsByTagName("tbody")[0].getElementsByTagName("tr");
	var steps = new Array();
	for (var i = 0; i < stepRows.length; i++) {
		var stepFields = stepRows[i].getElementsByTagName("td");
		steps.push({
			elt: stepRows[i],
			cmd: stepFields[0].innerHTML,
			arg1: stepFields[1].innerHTML,
			arg2: stepFields[2].innerHTML
		});
	}

	execute({
		cmd:"getNewBrowserSession", 
		arg1: browser, 
		arg2: base_url, 
		onComplete: function(sessionId) {
			executeSteps({
				steps: steps, 
				sessionId: sessionId, 
				onStep: function(step) {
					var cell = step.elt.insertCell(3);
					cell.innerHTML = "Running";
				},
				onStepComplete: function(step, result) {
					step.elt.cells[3].innerHTML = "OK";
					if (result) {
						var cell = step.elt.insertCell(4);
						cell.innerHTML = result;
					}
				},
				onStepError: function(step, error) {
					step.elt.cells[3].innerHTML = "ERROR";
					if (result) {
						var cell = step.elt.insertCell(4);
						cell.innerHTML = error;
					}
				},
				onComplete: function() {
					execute({ cmd: "testComplete", sessionId: sessionId });
					document.getElementById("result").innerHTML = "PASSED";
					executionLog.innerHTML += "Test Complete\n";
					if (onComplete) onComplete();
				}, 
				onError: function(error) {
					execute({ cmd: "testComplete", sessionId: sessionId });
					document.getElementById("result").innerHTML = "FAILED";
					executionLog.innerHTML += error +"\n";
					if (onError) onError(error);
				}
			});
		}, 
		onError: function(error) {
			document.getElementById("result").innerHTML = "ERROR";
			executionLog.innerHTML += "Failed to initialize session\n";
			executionLog.innerHTML += error + "\n";
			if (onError) onError("Error on Initialization: " + error);
		}
	});
}

runTest(browser, base_url);

