var server = "http://fayearthur.com/";
var tempStub = "";

function assertionChanged() {
  var assertion = document.getElementById("assertion-id").value;
	if(!/^\d+$/.test(assertion))
		return;
  var data = urlEncode({assertion: assertion});
  httpPostRequest("version_number.py", data, changeFilenames);
  httpPostRequest("get_assertion.py", data, changeAssertion);
  document.getElementById("success-container").className = "hidden";
}

function changeAssertion(req) {
  try {
      var json = JSON.parse(req.responseText);
    if(!json.assertion)
      return;
  } catch(e) {return;}
  var testcase = document.getElementById("testcase-text");
  testcase.value.replace(/\<meta\s*name="assert"\s*content=".*?"\>/, 
                '<meta name="assert" content="' + json.assertion + '"/>');
}

function changeFilenames(req) {
  var version = parseInt(req.responseText);
  var assertion = document.getElementById("assertion-id").value;
  var stub = stubName(assertion, version);

  var testname = document.getElementById("test-filename");
  if(testname.firstChild)
    testname.removeChild(testname.firstChild);
  var testFileName = testName(stub);
  testname.appendChild(document.createTextNode(testFileName));

  var xblname = document.getElementById("xbl-filename");
  if(xblname.firstChild)
    xblname.removeChild(xblname.firstChild);
  var xblFileName = fileName(stub);
  xblname.appendChild(document.createTextNode(xblFileName));

  var testcaseText = document.getElementById("testcase-text");
  testcaseText.value = replaceFileName(testcaseText.value, xblFileName);
}

function replaceFileName(testText, xblFileName) {
  return testText.replace(/url\(.*?#/g, 'url("' + xblFileName + '#');
}

function runTest() {
  var xbl = document.getElementById("xbl-text").value;
  var test = document.getElementById("testcase-text").value;
  var assertion = document.getElementById("assertion-id").value;
  if(!assertion)
    assertion = 0;
  // we have the save the files to the server to run the tests, so make temp files
  if(!tempStub)
    tempStub = tempName(); // one temp file name per session per testcase
  test = replaceFileName(test, fileName(tempStub))
  var data = urlEncode({assertion: assertion, xbl: xbl, test: test, temp: tempStub});
  httpPostRequest("save_file.py", data, showResults);
}

function showResults(req) {
  if(!/files/.test(req.responseText)) {
     alert('error processing testcase');
     return;
  }
	var resultsFrame = document.getElementById("testcase-results");
  resultsFrame.src = req.responseText;
  document.getElementById("submit-container").className = "";
}

function submitTest() {
  var assertion = document.getElementById("assertion-id").value;
  if(!/^\d+$/.test(assertion)) {
    alert("Assertion must be an integer");
    return;
  }
  var data = urlEncode({assertion: assertion});
  httpPostRequest("version_number.py", data, function(req) { changeFilenames(req); uploadTest();});
}

function uploadTest() {
  var xbl = document.getElementById("xbl-text").value;
  var test = document.getElementById("testcase-text").value;
  var email = document.getElementById("contact-email").value;
  var assertion = document.getElementById("assertion-id").value;
  
  if(!/^\d+$/.test(assertion)) {
    alert("Assertion id must be an integer");
    return;
  }

  var data = urlEncode({assertion: assertion, xbl: xbl, test: test, email: email});
  httpPostRequest("save_file.py", data, showPermalink);
  tempStub = "";
}

function showPermalink(req) {
  if(!/files/.test(req.responseText)) {
		alert('error processing testcase');
		return;
  }
  var url = server + req.responseText;
  var link = document.getElementById("test-link");
  link.href = url;
  link.textContent = url;
  document.getElementById("success-container").className = "";
}

function fileName(stub) {
  return "file_" + stub + ".xml";
}

function testName(stub) {
  return "test_" + stub + ".xhtml";
}

function stubName(assertion, version) {
  if(version == 1)
   return assertion;
  return assertion + "_" + version;
}

function tempName() {
  var rand = 4000 + Math.floor(Math.random() * 6000);
  return "temp" + rand;
}

function hideSubmit() {
  document.getElementById("submit-container").className = "hidden";
}

function urlEncode(params) {
  var url = [];
  for(var param in params)
    url.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
  return url.join("&");
}

function httpPostRequest(url, data, callback, errback) {
  var req = new XMLHttpRequest();
  req.open("POST", url, true);
  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  req.setRequestHeader("Content-length", data.length);
  req.setRequestHeader("Connection", "close");
  req.onreadystatechange = function (event) {
    if (req.readyState == 4) {
      if(req.status == 200)
        callback(req);
      else if(errback)
        errback(req);
    } 
  };
  req.send(data);
}
