/* VIDEO TEST HARNESS */
/* Tests should define:
 *  function init(h, w) { } // optional
 *  function showLoading() { } // optional
 *  function hideLoading() { } // optional
 *  function setPixel(x, y, color) { } // required
 *  function report(wallClockTime, workTime, fps) { } // optional
 */

var start = 0;
var frame = 0;
var frameDelay = 40;
var outputNode;

if (window.showLoading) {
  showLoading()
} else {
  output('Loading, please stand by... (this may take some time)');
}

window.onload = function () {
  if (window.init)
    init(frames[0][0].length, frames[0].length);
  if (window.hideLoading)
    hideLoading();
  output('Testing...');
  document.documentElement.offsetWidth; // cause layout
  start = new Date();
  setTimeout(tick, frameDelay);
}

function tick() {
  if (paintFrame(frame)) {
    frame += 1;
    setTimeout(tick, frameDelay);
  } else {
    var end = new Date();
    var elapsed = end - start;
    var fps = (elapsed > 0) ? frame / (elapsed/1000) : '0';
    var workTime = elapsed - (frame + 1) * frameDelay;
    if (window.parent.reportResults) {
      window.parent.reportResults(elapsed, workTime, fps);
    } else if (window.report) {
      report(elapsed, workTime, fps);
    } else {
      output ('Elapsed wall-clock time: ' + elapsed + 'ms (ideal: ' + ((frame + 1) * frameDelay) + 'ms).\n' +
              'Elapsed non-idle time: ' + workTime + 'ms (ideal: 0ms).\n' +
              'Speed: ' + fps.toFixed(2) + 'fps (ideal: '+ (1000 / frameDelay).toFixed(2) +'fps).');
    }
  }
}

function output(s) {
  if (!outputNode) {
    var r = document.getElementById('result');
    if (r && r.textContent) {
      outputNode = r;
    } else if (r && r.firstChild && r.firstChild.data) {
      outputNode = r.firstChild;
    } else {
      outputNode = document.createTextNode('');
      if (!r)
        r = document.documentElement;
      r.appendChild(outputNode);
    }
  }
  if (outputNode.textContent) {
    outputNode.textContent = s;
  } else if (outputNode.data) {
    outputNode.data = s;
  } else {
    var old = outputNode;
    outputNode = document.createTextNode(s);
    old.parentNode.insertBefore(outputNode, old);
    old.parentNode.removeChild(old);
  }
}

function paintFrame(i) {
  if (i >= frames.length)
    return false;
  for (var y = 0; y < frames[i].length; y += 1) {
    for (var x = 0; x < frames[i][y].length; x += 1) {
      setPixel(x, y, frames[i][y][x]);
    }
  }
  return true;
}
