function init() {
	calculatePoints();
//	initHiding();
	document.getElementById('comparison').parentNode.tHead.style.display = 'none';
}

var points = {
	"yes": 6,
	"almost": 5,
	"alternative": 4,
	"incomplete": 3,
	"incorrect": 2,
	"minimal": 1,
	"buggy": -1,
	"crash": -3
}

var totalPoints = {total:0};
var browserData = {};
function calculatePoints() {
	var root = document.getElementById('webkit');
	var dH = root.getElementsByTagName('tr');
	var dataHolder = [];
	for (var i=0;i<dH.length;i+=1) {
		dataHolder[i] = dH[i];
	}
	var header = dataHolder[0];
	var browserNames = header.getElementsByTagName('th');
	var browsers = [];
	var tests = [];
	document.getElementById('count').innerHTML = browserNames.length-1;
	for (var i=1;i<browserNames.length;i+=1) {
		var name = browsers[i-1] = browserNames[i].textContent;
		browserData[name] = {};
		browserData[name].points = 0;
		browserData[name].tests = {};
		browserData[name].types = {};
	}
	var counter = 0;
	for (var i=0;i<dataHolder.length;i+=1) {
		var dataSnippets = dataHolder[i].getElementsByTagName('td');
		var weight = dataHolder[i].getAttribute('weight') || 1;
		var type = dataHolder[i].getAttribute('type');
		if (dataSnippets.length > 1) {
			var testName = dataSnippets[0].getElementsByTagName('div')[0];
			testName = testName.innerText || testName.textContent;
			var localScore = 0;
			var browserCounter = 0;
			totalPoints.total += points.yes*weight;
			if (type) {
				if (!totalPoints[type]) {
					totalPoints[type] = points.yes*weight;
				} else {
					totalPoints[type] += points.yes*weight;
				}
			}
			var untestables = [];
			for (var j=1;j<dataSnippets.length;j+=1) {
				var untestable = false;
				var key = dataSnippets[j].className.replace(/comp /,'');
				if (key === 'test' || key === 'untestable') {
					untestable = true;
				}
				var pointsScored = points[key] || 0;
				pointsScored *= weight;
				for (var k=0;k<dataSnippets[j].colSpan;k+=1) {
					var dataPointer = browserData[browsers[k+browserCounter]];
					dataPointer.tests[testName] = {};
					dataPointer.tests[testName].className = dataSnippets[j].className;
					dataPointer.tests[testName].text = dataSnippets[j].innerHTML;
					dataPointer.tests[testName].score = pointsScored/weight;
					if (untestable) {
						untestables.push(browsers[k+browserCounter]);
						continue;
					}
					setData(dataPointer,pointsScored,type);
					localScore += pointsScored/weight;
				}
				browserCounter += dataSnippets[j].colSpan;
			}
			if (untestables.length) {
				var avgScore = parseInt(localScore/(browserCounter - untestables.length)) || 0;
				for (var j=0;j<untestables.length;j+=1) {
					setData(browserData[untestables[j]],avgScore*weight,type)
				}
			}

			var bar = dataSnippets[0].appendChild(document.createElement('div'));
			bar.className = 'bar';
			bar.innerHTML = localScore + ' points';
			if (weight > 1) {
				dataSnippets[0].innerHTML += '<p><strong>weight ' + weight + '</strong></p>';
			}
			var localObj = {};
			localObj.row = i;
			localObj.score = localScore;
			tests.push(localObj);
			counter +=1;
			
		}
		root.removeChild(dataHolder[i]);
	}

	function setData(dataPointer,pointsScored,type) {
		dataPointer.points += pointsScored;
		if (type) {
			if (!dataPointer.types[type]) {
				dataPointer.types[type] = pointsScored;
			} else {
				dataPointer.types[type] += pointsScored;
			}
			if (type === 'year' || type === 'version') {
				var text = dataSnippets[j+1].innerHTML*1 || '';
				dataPointer.types[type] = text;
			}
		}
	}

	totalPoints.year = 0;
	totalPoints.version = 0;

	tests.sort(function (a,b) {
		return b.score - a.score;
	});

	root.appendChild(header.cloneNode(true));
	var flag = 0;

	for (var i=0;i<tests.length;i+=1) {
		flag  -= 1;
		root.appendChild(dataHolder[tests[i].row]);
		root.appendChild(dataHolder[tests[i].row + 1]);
		if (i && (i+1)/4 == parseInt((i+1)/4)) {
			root.appendChild(header.cloneNode(true));
			flag = 2;
		}
	}
	if (flag <= 0) {
		root.appendChild(header.cloneNode(true));
	}

	var browsersInOrder = [];
	for (var i in browserData) {
		browsersInOrder.push(i);
	}
	browsersInOrder.sort(function (a,b) {
		return browserData[b].points - browserData[a].points;
	});

	var template = document.createElement('tr');
	var checkBoxHolder = template.appendChild(document.createElement('td'));
	template.appendChild(document.createElement('td'));
	var divHolder = template.appendChild(document.createElement('td'));
	divHolder.appendChild(document.createElement('div'));
	var writeroot = document.getElementById('score');
	var types = [];
	for (var i in totalPoints) {
		if (i !== 'total') {
			types.push(i);
		}
	}
	types.sort();
	var headerWrapper = document.createElement('thead');
	var header = document.createElement('tr');
	header.className = 'clickable';
	header.appendChild(document.createElement('th'));
	header.appendChild(document.createElement('th')).appendChild(document.createTextNode('Browser'));
	for (var i=0;i<types.length;i+=1) {
		header.appendChild(document.createElement('th')).appendChild(document.createTextNode(types[i]));	
	}
	header.appendChild(document.createElement('th')).appendChild(document.createTextNode('Total'));
	headerWrapper.appendChild(header);
	writeroot.parentNode.appendChild(headerWrapper);
	var totals = document.createElement('tr');
	totals.appendChild(document.createElement('th'));
	totals.appendChild(document.createElement('th'));
	for (var i=0;i<types.length;i+=1) {
		totals.appendChild(document.createElement('th')).appendChild(document.createTextNode(totalPoints[types[i]]));	
	}
	totals.appendChild(document.createElement('th')).appendChild(document.createTextNode(totalPoints.total));
	headerWrapper.appendChild(totals);
	for (var i=0;i<browsersInOrder.length;i+=1) {
		var row = document.createElement('tr');
		var box = row.appendChild(document.createElement('td')).appendChild(document.createElement('input'));
		box.type = 'checkbox';
		box.name = browsersInOrder[i];
		var name = row.appendChild(document.createElement('td'));
		name.appendChild(document.createTextNode(browsersInOrder[i]));
		name.className = 'name';
		var data = browserData[browsersInOrder[i]];
		for (var j=0;j<types.length;j+=1) {
			var td = row.appendChild(document.createElement('td'));
			td.appendChild(document.createTextNode(data.types[types[j]]));
			td.className = types[j];
		}
		var total = row.appendChild(document.createElement('td'));
		total.appendChild(document.createTextNode(data.points));
		total.className = 'total';
		row.box = box;
		writeroot.appendChild(row);
	}
	writeroot.onclick = startComparison;
	writeroot.className = 'total';
	header.onclick = sortTable;

	var scoringRoot = document.getElementById('scoring');
	var scoringTemplate = document.createElement('li');
	for (var i in points) {
		var scoringMsg = scoringTemplate.cloneNode(true);
		scoringMsg.innerHTML = i + ': ' + points[i];
		scoringRoot.appendChild(scoringMsg);
	}
	allCheckboxes = writeroot.getElementsByTagName('input');
}

var allCheckboxes = [];
function startComparison(e) {
	var writeroot = document.getElementById('comparison');
	if (e !== false) {
		var evt = e || window.event;
		var tgt = evt.target || evt.srcElement;
		if (tgt.nodeName !== 'INPUT') {
			while (tgt.nodeName !== 'TABLE') {
				if (tgt.nodeName === 'TR') {
					tgt.box.checked = !tgt.box.checked && !writeroot.disabled;
					break;
				}
				tgt = tgt.parentNode;
			}
		}
	}
	var counter = 0;
	for (var i=0;i<allCheckboxes.length;i+=1) {
		if (allCheckboxes[i].checked) {
			counter +=1;
		}
	}
	var status = (counter > 1);
	writeroot.disabled = status;
	var browsersCompared = [];
	for (var i=0;i<allCheckboxes.length;i+=1) {
		if (!allCheckboxes[i].checked) {
			allCheckboxes[i].disabled = status;
		} else {
			browsersCompared[browsersCompared.length] = allCheckboxes[i].name;
		}
	}
	while (writeroot.childNodes.length) {
		writeroot.removeChild(writeroot.childNodes[0]);
	}
	writeroot.parentNode.tHead.style.display = 'none';
	writeroot.parentNode.caption.innerHTML = '';
	if (counter === 1) {
		writeroot.parentNode.tHead.style.display = '';
		var name1 = browsersCompared[0];
		writeroot.parentNode.caption.innerHTML = name1 + ' compared to';
		var diffCount = [];
		for (var i=0;i<allCheckboxes.length;i+=1) {
			var name2 = allCheckboxes[i].name;
			if (name1 !== name2) {
				var diffs = getDifferences([name1,name2]);
				var better = 0;
				var worse = 0;
				for (var j=0;j<diffs.length;j+=1) {
					var score1 = browserData[name1].tests[diffs[j]].score;
					var score2 = browserData[name2].tests[diffs[j]].score;
					if (score1 > score2) {
						better +=1;
					} else if (score1 < score2) {
						worse += 1;
					}
				}
				var holdObj = {};
				holdObj.name = name2;
				holdObj.better = better;
				holdObj.worse = worse;
				holdObj.count = diffs.length;
				diffCount.push(holdObj);
			}
		}

		diffCount.sort(function (a,b) {
			return a.count - b.count;
		});

		var smallestDifference = diffCount[0].count;
		var maxDifference = 15; // Math.max(smallestDifference+5,10);

		for (var i=0;i<diffCount.length;i+=1) {
			if (diffCount[i].count > maxDifference) {
				break;
			}
			var tr = document.createElement('tr');
			var name = tr.appendChild(document.createElement('td'));
			var better = tr.appendChild(document.createElement('td'));
			var worse = tr.appendChild(document.createElement('td'));
			var count = tr.appendChild(document.createElement('td'));
			name.relatedItem = document.forms['scoreForm'][diffCount[i].name];
			name.onclick = function () {
				this.relatedItem.checked = true;
				startComparison(false);
			}
			name.innerHTML = diffCount[i].name;
			count.innerHTML = diffCount[i].count;
			better.innerHTML = diffCount[i].better;
			worse.innerHTML = diffCount[i].worse;
			writeroot.appendChild(tr);
			if (diffCount[i].count === smallestDifference) {
				tr.className = 'bold';
			}
		}

	} else if (counter === 2) {
		var template = document.createElement('tr');
		var name = template.appendChild(document.createElement('td'));
		name.className = 'declaration';
		var header = document.createElement('tr');
		header.className = 'compheader';
		header.appendChild(document.createElement('th'));
		header.appendChild(document.createElement('th')).appendChild(document.createTextNode(browsersCompared[0]));
		header.appendChild(document.createElement('th')).appendChild(document.createTextNode(browsersCompared[1]));
		writeroot.appendChild(header);

		var differences = getDifferences(browsersCompared);

		for (var i=0;i<differences.length;i+=1) {
			var data1 = browserData[browsersCompared[0]].tests[differences[i]];
			var data2 = browserData[browsersCompared[1]].tests[differences[i]];
			var row = template.cloneNode(true);
			row.firstChild.innerHTML = differences[i];
			var td1 = row.appendChild(document.createElement('td'));
			td1.className = data1.className;
			td1.innerHTML = data1.text;
			var td2 = row.appendChild(document.createElement('td'));
			td2.className = data2.className;
			td2.innerHTML = data2.text;
			writeroot.appendChild(row);
		}
	}
}

function sortTable(e) {
	var evt = e || window.event;
	var tgt = evt.target || evt.srcElement;
	var index = tgt.cellIndex;
	var sorted = [];
	var writeroot = document.getElementById('score');
	writeroot.className = tgt.innerHTML.toLowerCase();
	var trs = writeroot.getElementsByTagName('tr');
	for (var i=0;i<trs.length;i+=1) {
		var holdObj = {};
		holdObj.tr = trs[i];
		holdObj.score = trs[i].cells[index].innerHTML*1;
		holdObj.total = trs[i].lastChild.innerHTML;
		sorted.push(holdObj);
	}
	sorted.sort(function (a,b) {
		var returnValue = b.score - a.score;
		if (returnValue === 0) {
			returnValue = b.total - a.total;
		}
		return returnValue;
	});
	for (var i=0;i<sorted.length;i+=1) {
		writeroot.appendChild(sorted[i].tr);
	}
}

var diff = {};
function getDifferences(browsers) {
	var name1 = browsers[0];
	var name2 = browsers[1];
	if (!diff[name1]) {
		diff[name1] = {};
	}
	if (!diff[name1][name2]) {
		diff[name1][name2] = [];
	}
	if (!diff[name2]) {
		diff[name2] = {};
	}
	if (!diff[name2][name1]) {
		diff[name2][name1] = [];
	}

	if (!diff[name1][name2].length) {
		if (diff[name2][name1].length) {
				diff[name1][name2] = diff[name2][name1];
		} else {
			var browser1 = browserData[name1].tests;
			var browser2 = browserData[name2].tests;
			for (var i in browser1) {
				if (i !== 'points') {
					if (browser1[i].className !== browser2[i].className) {
						diff[name1][name2].push(i);
					}
				}
			}
		}
	}
	return diff[name1][name2];
}

function initHiding() {
	var wr = document.getElementById('hide');
	var data = document.getElementsByTagName('col');
	for (var i=0,col;col=data[i];i+=1) {
		if (col.id) {
			setBox(col);
		}
	}
	
	function setBox(col) {
		var box = document.createElement('input');
		box.type = 'checkbox';
		box.checked = true;
		box.name = col.id;
		wr.appendChild(box);
		wr.appendChild(document.createTextNode(col.id));
		box.onclick = function () {
			if (!box.checked) {
				col.style.visibility = 'collapse';
//				col.style.display = 'none';
			} else {
				col.style.visibility = '';			
			}
		}
	}
}


if (!window.onload) {
	window.onload = init;
}

