//base test functions

function forEach(iterable, fn, bind){
	for (var i = 0, j = iterable.length; i < j; i++) fn.call(bind, iterable[i], i, iterable);
};

//test start

window.onload = function(){
	
	var frameworks = {};
	
	forEach(document.getElementsByTagName('iframe'), function(iframe){
		frameworks[iframe.name] = {
			'test': window.frames[iframe.name].test,
			'attribute': window.frames[iframe.name].modifier || '',
			'selectors': []
		};
	});
	
	var tbody = document.getElementById('tbody');
	var tfoot = document.getElementById('tfoot');
	var lastrow = tfoot.getElementsByTagName('tr')[0];
	
	var controls = document.getElementById('controls');
	
	var links = controls.getElementsByTagName('a');
	
	var start = links[1];
	var stop = links[0];
	
	start.onclick = function(){
		testRunner();
		return false;
	};
	
	stop.onclick = function(){
		clearTimeout(timer);
		timer = null;
		return false;
	};
	
	var score = [];
	var scores = {};
	
	var frxi = 0;
	for (var name in frameworks){
		var framework = frameworks[name];
		forEach(window.selectors, function(selector){
			var frameworkSelector = selector.replace('%', frameworks[name].attribute);
			framework.selectors.push(frameworkSelector);
		});
		scores[name] = lastrow.getElementsByTagName('td')[frxi];
		score[name] = 0;
		frxi++;
	}
	
	var tests = [];

	forEach(window.selectors, function(selector, i){
		var frxi = 0;
		var row = tbody.getElementsByTagName('tr')[i];
		for (var name in frameworks){
			var framework = frameworks[name];
			var cell = row.getElementsByTagName('td')[frxi];
			tests.push({
				'execute': framework.test,
				'selector': framework.selectors[i],
				'name': name,
				'row': row,
				'cell' : cell
			});
			frxi++;
		}
	});
	
	var timer = null;
	
	var testRunner = function(){
		var test = tests.shift();
		if (!test) return;
		var results = test.execute(test.selector);
		test.cell.className = 'test';
		test.cell.innerHTML = results.time + ' ms | ' + results.found + ' found';
		test.cell.speed = results.time;
		if (results.found == 0){
			test.cell.innerHTML = results.time + ' ms | zero results';
			test.cell.className += ' zero';
			test.cell.found = 0;
			test.cell.error = true;
		} else if (results.error){
			test.cell.innerHTML = results.time + ' ms | <span class="exception" title="' + results.error + '">error returned</a>';
			test.cell.className += ' exception';
			test.cell.found = 0;
			test.cell.error = true;
		} else {
			test.cell.found = results.found;
			test.cell.error = false;
		}
		
		score[test.name] += test.cell.speed;
		scores[test.name].innerHTML =  '&nbsp;' + score[test.name] + '&nbsp;';
		
		if (test.cell == test.row.lastChild) colourRow(test.row);
		timer = setTimeout(testRunner, 0);
	};
	
	var colourRow = function(row){
		
		var cells = [];
		
		var tds = row.getElementsByTagName('td');
		forEach(tds, function(td){
			cells.push(td);
		});
		
		var speeds = [];
		
		forEach(cells, function(cell, i){
			if (!cell.error) speeds[i] = cell.speed;
			//error, so we exclude it from colouring
			else speeds[i] = 99999999999999999999999;
		});
		
		var min = Math.min.apply(this, speeds);
		var max = Math.max.apply(this, speeds);
		
		var found = [];
		var mismatch = false;
		forEach(cells, function(cell, i){
			found.push(cell.found);
			if (!mismatch){
				forEach(found, function(n){
					if (cell.found && n && cell.found != n){
						mismatch = true;
						return;
					}
				});
			}
			if (cell.speed == min) cell.className += ' good';
			else if (cell.speed == max) cell.className += ' bad';
			else cell.className += ' normal';
		});
		
		if (mismatch){
			forEach(cells, function(cell, i){
				if (cell.found) cell.className += ' mismatch';
			});
		}
		
	};
	

};