
var partyOrder = [];
var partyData = {};
var polls = {};

var maxPolls = 9;

var defaultTypes = {
	"Old boys": "No",
	"Denomination": "?",
	"Protest": "No",
	"Block": "?"
}


var currentParl = {
	"seats":{"national":{
			"CDA": 41,
			"PvdA": 33,
			"VVD": 21,
			"D66": 3,
			"PVV": 9,
			"SP": 25,
			"GL": 7,
			"CU": 6,
			"SGP": 2,
			"PvdD": 2,
			"ToN": 1	
	}},
	"length": 5
}

var defaultBarWidth = 3;

var labels = {
	"datasrc": "Pollster",
	"parties": "Parties",
	"scale": "Scale (px per seat)",
	"compare": "Compare results "
}

var coalitions = {
	'Amsterdam': 'PvdA+VVD+GL',
	'Amsterdam-protestant': 'PvdA+VVD+GL+CU',
	'Amsterdam-red': 'PvdA+VVD+SP+GL',
	"Balkenende IV": "CDA+PvdA+CU",
	'Centre-left':'PvdA+CDA+D66',
	'Centre-left-green':'PvdA+CDA+D66+GL',
	'Centre-left-protestant':'PvdA+CDA+D66+CU',
	'Centre-left-red':'PvdA+CDA+D66+SP',
	'Centre-green I':'PvdA+CDA+GL',
	'Centre-green II':'VVD+CDA+GL',
	'Centre-green-red':'PvdA+CDA+GL+SP',
	'Centre-protestant':'CDA+VVD+CU',
	'Centre-red':'PvdA+CDA+SP',
	'Centre-right':'VVD+CDA+D66',
	'Centre-right-green':'VVD+CDA+D66+GL',
	'Centre-right-protestant':'VVD+CDA+D66+CU',
	'Centre-green-protestant':'VVD+CDA+GL+CU',
	'Centre-right-green-protestant':'VVD+CDA+D66+GL+CU',
	'Classic centre-left':'PvdA+CDA',
	'Classic centre-right':'VVD+CDA',
	'Forbidden': 'PvdA+CDA+VVD',
	'Left': 'PvdA+D66+GL+SP',
	'Left-double-christian I': 'PvdA+CDA+GL+CU',
	'Left-double-christian II': 'PvdA+CDA+D66+GL+CU',
	'Left-double-christian III': 'PvdA+CDA+GL+SP+CU',
	'Left-christian': 'PvdA+CDA+D66+GL+SP',
	'Opposites': 'PvdA+VVD+SP',
	'Double purple': 'PvdA+VVD+SP+D66',
	'Purple core': 'PvdA+VVD',
	'Purple': 'PvdA+VVD+D66',
	'Purple-green': 'PvdA+VVD+D66+GL',
	'Purple extreme': 'PvdA+VVD+D66+GL+SP',
	'Rainbow': 'PvdA+D66+GL+SP+CU+PvdD',
	'Red-double-christian': 'PvdA+CDA+SP+CU',
	'Right': 'CDA+VVD+PVV',
	'Right-protestant I': 'CDA+VVD+PVV+CU',
	'Right-protestant II': 'CDA+VVD+PVV+SGP',
	'Right-protestant III': 'CDA+VVD+PVV+CU+SGP'
}

var Senate = {
	"PvdA": 14,
	"VVD": 14,
	"CDA": 21,
	"SP": 12,
	"CU": 4,
	"GL": 4,
	"SGP": 2,
	"D66": 2,
	"PvdD": 1
}

var weight = {
	"Politieke Barometer": 6,
	"Peil.nl": 5,
	"TNS-NIPO": 4
}

var variables = {
	"datasrc": {
		"Politieke Barometer": "barometer",
		"Peil.nl": "peil",
		"TNS-NIPO": "tns"
	},
	"parties": {
		"Balkenende IV": "CDA+PvdA+CU",
		"3p - Left": "SP+GL+PvdA",
		"3p - Centre-left": "CDA+PvdA+D66",
		"3p - Purple": "D66+PvdA+VVD",
		"3p - Centre-right": "VVD+CDA+D66",
		"3p - Right": "CDA+VVD+PVV",
		"4p - Left": "SP+GL+PvdA+D66",
		"4p - Centre-left-green": "CDA+PvdA+D66+GL",
		"4p - Centre-left-protestant": "PvdA+CU+D66+CDA",
		"4p - Purple-green": "D66+PvdA+VVD+GL",
		"4p - Centre-right-green": "D66+CDA+VVD+GL",
		"4p - Centre-right-protestant": "CU+D66+CDA+VVD",
		"Incrowd": "Old boys:Yes",
		"Protest parties": "Protest:Yes",
		"Left block": "Block:Left",
		"Right block": "Block:Right",
		"Christian parties": "CU+CDA+SGP"
	},
	"scale": {
		"1": "1",
		"2": "2",
		"3": "3",
		"4": "4",
		"5": "5",
		"10": "10",
		"15": "15"
	},
	"compare": {
		"with previous poll": "",
		"with 2006 elections": "2006"
	}
}

/* Called as member of the create object */

function createForm(data) {
	var form = document.createElement('form');
	
	var selects = data.form.split(',');
	for (var i=0;i<selects.length;i+=1) {
		createSelect(selects[i]);
	}
	
	var submit = document.createElement('button');
	submit.innerHTML = 'Generate';
	submit.onclick = function () {
		var els = form.elements;
		for (var i=0;i<els.length-1;i+=1) {
			data[els[i].name] = els[i].value;
		}
		data.datasrc = window[data.datasrc];
		data.wrapper.removeChild(form);
		data.wrapper.texts = {};
		data.wrapper.innerHTML = '';
		data.wrapper.appendChild(form);
		create[data.type](data);
		return false;
	}
	form.appendChild(submit);

	data.wrapper.appendChild(form);
	submit.onclick();
	
	function createSelect(srcName) {
		var label = document.createElement('label');
		label.innerHTML = labels[srcName];
		var sel = document.createElement('select');
		sel.name = srcName;
		var selData = variables[srcName];
		for (var i in selData) {
			var opt = new Option(i,selData[i]);
			sel.options[sel.options.length] = opt;
			if (selData[i] == data[srcName]) {
				opt.selected = true;
			}
		}
		label.appendChild(sel);
		form.appendChild(label);
	}	
}

/*

	COALITION GAME

*/

var partyList = ['CDA','PvdA','VVD','D66','SP','PVV','GL','CU','PvdD','SGP','ToN'];

var partyLookup = {};

var defaultCoalitions = {
	"Left": "PvdA+GL+D66+SP",
	"Centre-left": "PvdA+CDA+D66",
	"Purple": "PvdA+VVD+D66",
	"Centre-right": "CDA+VVD+D66",
	"Right": "CDA+VVD+PVV"
}

var stabilityValues = {
	startPoint: 20,
	competitor: 1,
	competitorAbsent: 4,
	enemy: 3,
	protest: 2,
	moreParties: 2,
	economics: 3
}

var stabilityValuation = [
	{
		color: "red",
		name: "Unstable"
	},
	{
		color: "orange",
		name: "Fairly unstable"
	},
	{
		color: "#cccc00",
		name: "Fairly stable"
	},
	{
		color: "green",
		name: "Stable"
	}
]

var partyRelations = {
	exclusionLists: {
		'PvdA/D66':'PVV/ToN'
	},

	competitorLists: [
		'SP/GL/PvdA/PvdD',
		'GL/PvdA/D66/PvdD',
		'PvdA/CDA/D66',
		'CDA/VVD/D66',
		'CDA/CU/SGP',
		'VVD/PVV/ToN',
		'SP/PVV/ToN'
	],
	
	enemyLists: {
		'SP/GL/PvdA/D66/CU/PvdD':'PVV/ToN',
		'D66':'CU/SGP',
		'VVD':'SGP',
		'PvdA': 'CDA'
	}

}

function elections(votes) {
	var totalVotes = 0;
	for (var i in votes) {
		totalVotes += votes[i];
	}
	var divider = totalVotes/150;
	var seats = {},
		average = {},
		partySeats,
		maxAvg,
		restParty,
		restSeats = 150;
	for (var i in votes) {
		if (votes[i] < divider) {
			seats[i] = 0;
			continue;
		}
		partySeats = Math.floor(votes[i]/divider);
		seats[i] = partySeats;
//		average[i] = votes[i]/(partySeats+1);
		average[i] = votes[i] - (partySeats*divider);
		restSeats -= partySeats;
	}
	while (restSeats) {
		maxAvg = 0,
		 restParty = '';
		for (var i in average) {
			if (average[i] > maxAvg) {
				maxAvg = average[i];
				restParty = i;
			}
		}
		seats[restParty] += 1;
//		average[restParty] = votes[restParty]/(seats[restParty]+1);
		average[restParty] = 0;
		restSeats -= 1;
	}
	return seats;
}

var partiesTmp = [];

function calculateAllSeats() {
	var tmpObj,votes={},avgVotes={},avgVotesBack={},
	  shorttermCompare = 2,
	  longtermCompare = 7;
	$('shortCompare').innerHTML = shorttermCompare;
	$('startLongCompare').innerHTML = shorttermCompare+1;
	$('longCompare').innerHTML = longtermCompare;
	for (var i=0,party;party=partyList[i];i+=1) {
		var seats=0,counter=0,avgSeats=0,avgSeatsBack=0;
		for (var j in polls) {
			seats += polls[j].getPartySeats(party) * weight[j];
			avgSeats += polls[j].getTrendingAverage(party,1,shorttermCompare) * weight[j];
			avgSeatsBack += polls[j].getTrendingAverage(party,shorttermCompare+1,longtermCompare) * weight[j];
		}		
		votes[party] = seats;
		avgVotes[party] = avgSeats;
		avgVotesBack[party] = avgSeatsBack;
	}
	var seats = elections(votes);
	var avgSeats = elections(avgVotes);
	var avgSeatsBack = elections(avgVotesBack);
	for (var i=0,party;party=partyList[i];i+=1) {
		tmpObj = {};
		tmpObj.name = party;
		tmpObj.seats = seats[party];
		tmpObj.avgSeats = avgSeats[party];
		tmpObj.avgSeatsBack = avgSeatsBack[party];
		partiesTmp.push(tmpObj);
	}
	showWeighting();
	partiesTmp.sort(function (a,b) {
		return b.seats - a.seats;
	});
	
}

function showWeighting() {
	var wr = $('pollweight');
	for (var i in polls) {
		var x = document.createElement('li');
		x.innerHTML = i + ': ' + weight[i];
		wr.appendChild(x);
	}
}

function game() {
	
	// sort parties in order of seats in the polls

	for (var i=0;i<partiesTmp.length;i+=1) {
		variables.parties[partiesTmp[i].name] = partiesTmp[i].name;
	}
	
	// create checkbox and relations object for each party
	
	for (var i=0,party;party=partiesTmp[i];i+=1) {
		createBox(party);
		partyLookup[party.name] = {
			protest: false,
			exclusions: [],
			competitor: [],
			enemy: [],
			economics: []
		};
	}
	
	// Add economics Left vs. Right
	
	for (var i=0,party;party=partyList[i];i+=1) {
		var economics = partyData[party].type.Economics;
		partyLookup[party].protest = (partyData[party].type.Protest === 'Yes');
		if (economics === 'Centre') continue;
		var opposedEconomics = (economics === 'Left') ? 'Right' : 'Left';
		for (var j=i+1,party2;party2=partyList[j];j+=1) {
			if (partyData[party2].type.Economics === opposedEconomics) {
				partyLookup[party].economics.push(party2);
				partyLookup[party2].economics.push(party);
			}	
		}
	}
	
	// fill relations objects with exclusions, competitors and enemies
	
	var compObj = {};
	for (var i=0,compList;compList=partyRelations.competitorLists[i];i+=1) {
		compList = compList.split('/');
		for (var j=0,party1;party1=compList[j];j+=1) {
			if (!compObj[party1]) {
				compObj[party1]={};
			}
			for (var k=j+1,party2;party2=compList[k];k+=1) {
				if (!compObj[party2]) {
					compObj[party2]={};
				}
				compObj[party1][party2] = true;
				compObj[party2][party1] = true;
			}
		}
	}
	for (var i in compObj) {
		var tgt = partyLookup[i].competitor;
		for (var j in compObj[i]) {
			tgt.push(j);
		}
	}
	
	for (var i in partyRelations.exclusionLists) {
		var list1 = i.split('/');
		var list2 = partyRelations.exclusionLists[i].split('/');
		for (var j=0,party1;party1=list1[j];j+=1) {
			for (var k=0,party2;party2=list2[k];k+=1) {
				partyLookup[party1].exclusions.push(party2);
				partyLookup[party2].exclusions.push(party1);
			}
		}
	}
		
	for (var i in partyRelations.enemyLists) {
		var list1 = i.split('/');
		var list2 = partyRelations.enemyLists[i].split('/');
		for (var j=0,party1;party1=list1[j];j+=1) {
			for (var k=0,party2;party2=list2[k];k+=1) {
				partyLookup[party1].enemy.push(party2);
				partyLookup[party2].enemy.push(party1);
			}
		}
	}

	// when user clicks checkbox, update everything 

	var coalition = [];

	var boxes = $('parties').elements;
	$('parties').onclick = function () {
		coalition.length = 0;
		for (var i=0,box;box=boxes[i];i+=1) {
			box.reset();
			if (box.checked) {
				box.parentNode.className = 'coalition';
				coalition.push(boxes[i].name);
			}
		}
		for (var i in polls) {
			polls[i].setNewCoalition(coalition);
		}
		removeDetails();
		disableBoxes();
		setSeats();
		setPrimeMinister();
		setStability();
	}

	function disableBoxes() {
		for (var i=0,box;box=boxes[i];i+=1) {
			if (box.checked) {
				var exclusions = partyLookup[box.name].exclusions;
				for (var j=0,excluded;excluded=exclusions[j];j+=1) {
					boxes[excluded].disable();
				}
			}
		}
		if (boxes.CDA.checked && boxes.PvdA.checked) {
			boxes.VVD.disable();
		}
		if (boxes.CDA.checked && boxes.VVD.checked) {
			boxes.PvdA.disable();
		}
		if (boxes.PvdA.checked && boxes.VVD.checked) {
			boxes.CDA.disable();
		}
	}

	function setSeats() {
		var score=0,
		 counter=0;
		for (var i in polls) {
			score += polls[i].getTotalSeats();
			counter += 1;
		}
		var totalSeats = Math.floor(score/counter);
		$('totalseats').innerHTML = totalSeats;
		$('totalseats').parentNode.style.fontWeight = '';
		if (totalSeats > 75) {
			$('totalseats').parentNode.style.fontWeight = 'bold';
		}
	}

	function setPrimeMinister() {
		var writeroot = $('primeminister');
		writeroot.innerHTML = '';
		var candidates = {},score;
		for (var i in polls) {
			score = polls[i].getLargestParty();
			for (var j in score) {
				if (!candidates[j]) {
					candidates[j] = 0;
				}
				candidates[j] += score[j];
			}
		}
		var candidatesArray = [],obj;
		for (var i in candidates) {
			obj = {};
			obj.name = i;
			obj.score = candidates[i];
			candidatesArray.push(obj);
		}
		if (!candidatesArray.length) return;
		candidatesArray.sort(function (a,b) {
			return b.score - a.score;
		});
		var result = [],compare;
		result[0] = candidatesArray[0].name;
		compare = candidatesArray.shift().score;
		while (candidatesArray[0] && candidatesArray[0].score === compare) {
			result.push(candidatesArray.shift().name);
		}
		var span;
		for (var i=0,party;party=result[i];i+=1) {
			if (i > 0) {
				writeroot.innerHTML += ' / ';
			}
			span = document.createElement('span');
			span.style.color = partyData[party].color;
			span.innerHTML = party;
			writeroot.appendChild(span);
		}
	}

	var stabilityScore,
	 initialWidth = $('stability').offsetWidth;

	function setStability() {
		var instability = 0,value,text;
		var checkFor = ['enemy','economics','competitor'];
		var coalitionStability = (coalition.length > 1) ? stabilityValues.moreParties : 0;
		for (var i=0,box;box=boxes[i];i+=1) {
			var hasCompetitor = competitorsInGovernment(box.name);
			if (box.checked) {
				instability += partyLookup[box.name].protest * stabilityValues.protest;
				for (var j=0,group;group=partyLookup[box.name][checkFor[j]];j+=1) {
					value = stabilityValues[checkFor[j]];
					for (var k=0,competitor;competitor=group[k];k+=1) {
						var convertedValue = value;
						if (boxes[competitor].checked) {
							convertedValue /= 2;
							instability += convertedValue;
						} else {
							text = checkFor[j] + ' of ' + box.name + ': ' + -convertedValue;
							boxes[competitor].setStability(convertedValue);
							boxes[competitor].setText(text);
						}
							
					}
				}
				var competitors = partyLookup[box.name].competitor;
				if (!hasCompetitor) {
					for (var k=0,comp;comp=competitors[k];k+=1) {
						boxes[comp].setStability(-stabilityValues.competitorAbsent);
						var text = 'solves ' + box.name + ' competitor problem: +' + stabilityValues.competitorAbsent;
						boxes[comp].setText(text);
					}
//					box.setText('no competitor in government: -' + stabilityValues.competitorAbsent);
//					box.setStability(stabilityValues.competitorAbsent);										
					instability  += stabilityValues.competitorAbsent;
				}
			} else {
				var protestParty = partyLookup[box.name].protest * stabilityValues.protest;
				if (protestParty) {
					box.setStability(protestParty);
					box.setText('protest party: ' + -protestParty);
				}
				if (coalitionStability) {
					box.setText('number of parties: -' + stabilityValues.moreParties);
					box.setStability(coalitionStability);
				}
				if (!hasCompetitor) {
					box.setText('no competitor in government: -' + stabilityValues.competitorAbsent);
					box.setStability(stabilityValues.competitorAbsent);					
				}
			}
		}
		instability += getPartyStability(coalition.length);

		stabilityScore = stabilityValues.startPoint - instability;

		for (var i=0,box;box=boxes[i];i+=1) {
			box.checkStability();
		}			

		var stability = stabilityScore/stabilityValues.startPoint;
		var stabilityValue = Math.floor(stabilityValuation.length * stability);
		if (stabilityValue === stabilityValuation.length) {
			stabilityValue -= 1;
		}

		$('stability').style.backgroundColor = stabilityValuation[stabilityValue].color;
		$('stability').style.width = stability * initialWidth + 'px';
		$('stability').innerHTML = stabilityScore;

		function getPartyStability(length) {
			var instability = 0;
			if (length > 2) {
				instability = (length-2)*stabilityValues.moreParties;
			}
			return instability;
		}

		function competitorsInGovernment(party) {
			var competitorsInGovernment = false;
			for (var j=0,competitor;competitor=partyLookup[party].competitor[j];j+=1) {
				if (boxes[competitor].checked) {
					competitorsInGovernment = true;
					break;
				}
			}
			return competitorsInGovernment;
		}
	}
	
	var oldBox,link;
	
	function removeDetails() {
		if (oldBox) {
			oldBox.innerHTML = '';
			link.className = '';
		}
	}
	
	function createBox(partyObj) {
		var partyName = party.name;
		var partySeats = party.seats;
		var label = document.createElement('label');
		var box = document.createElement('input');
		box.name = partyName;
		box.type = 'checkbox';
		label.appendChild(box);
		var name = document.createElement('span');
		name.style.color = partyData[partyName].color;
		name.innerHTML = partyName + ' (' + partySeats + ')';
		label.appendChild(name);
		var stability = document.createElement('span');
		stability.className = 'stability';
		
		var texts = [];
		var details = document.createElement('a');
		details.href = '#';
		details.innerHTML = 'details';
		details.onclick = function (e) {
			removeDetails();
			for (var i=0;i<texts.length;i+=1) {
				detailBox.innerHTML += texts[i] + '<br>';
			}
			details.className = 'active';
			link = details;
			oldBox = detailBox;
			var evt = e || window.event;
			if (evt.stopPropagation) {
				evt.stopPropagation();
			}
			evt.cancelBubble = true;
			return false;		
		}
		var detailBox = document.createElement('div');
		detailBox.className = 'detailBox';
		detailBox.onclick = function () {
			return false;		
		}
		
		label.appendChild(detailBox);
		label.appendChild(details);
		label.appendChild(stability);
				
		var currentStability = 0;
		box.disable = function () {
			label.className += ' disabled';
			box.disabled = true;
		}
		box.reset = function () {
			label.className = label.className.replace(/disabled/g,'');
			box.disabled = false;
			stability.innerHTML = '';
			currentStability = 0;
			texts.length = 0;
			box.parentNode.className = '';
			box.competitors = false;
		}
		box.setStability = function (value) {
			if (!box.disabled) {
				currentStability += value;
				var output = -currentStability;
				if (output > 0) {
					output = '+' + output;
				}
				stability.innerHTML = output;
			}
		}
		box.checkStability = function () {
			if (currentStability >= stabilityScore) {
				this.disable();
			}		
		}
		box.setText = function (text) {
			texts.push(text);
		}
		$('parties').appendChild(label);	
	}	
}

/* POLL OVERVIEW TABLE */

function overview() {
	var writeroot = $('overview');
	var template,
	  blockScores = {},
	  currentSeats,
	  polledSeats,
	  test,
	  avgSeats,
	  avgSeatsBack,
	  pollSeats,
	  counter,
	  coalitionData = {},
	  safeMajority = 80;
	$('safeMajority').innerHTML = safeMajority;
	for (var i in coalitions) {
		coalitionData[i] = {seats:0,avgSeats:0,avgSeatsBack:0,currentSeats:0,names:[],senate:0,isCoalition: true};
	}
	
	for (var i=0,party;party=partiesTmp[i];i+=1) {
		currentSeats = currentParl.seats.national[party.name];
		gain = longTerm = counter = test = avgSeats = avgSeatsBack = 0;
		exactlySame = true;
		polledSeats = party.seats;
		avgSeats = party.avgSeats;
		avgSeatsBack = party.avgSeatsBack;
		senateSeats = Senate[party.name] || 0;

		for (var j in coalitionData) {
			if (partyData[party.name].type[j] === 'Yes') {
				coalitionData[j].seats += polledSeats;
				coalitionData[j].avgSeats += avgSeats;
				coalitionData[j].avgSeatsBack += avgSeatsBack;
				coalitionData[j].currentSeats += currentSeats;
				coalitionData[j].senate += senateSeats;
				coalitionData[j].names.push(party.name);
			}
		}

		var block = partyData[party.name].type.Block;
		if (!blockScores[block]) {
			blockScores[block] = {
				seats: 0,
				avgSeats: 0,
				avgSeatsBack: 0,
				currentSeats: 0,
				senate: 0,
				nameArray: []
			};
		}
		blockScores[block].seats += polledSeats;
		blockScores[block].senate += senateSeats;
		blockScores[block].avgSeats  += avgSeats;
		blockScores[block].avgSeatsBack  += avgSeatsBack;		
		blockScores[block].currentSeats += currentSeats;
		blockScores[block].nameArray.push (party.name);

		var tmp = {};
		tmp.name = '<span class="partyName">'+party.name+'</span>';
		tmp.currentSeats = currentSeats;
		tmp.seats = polledSeats;
		tmp.avgSeats = avgSeats;
		tmp.avgSeatsBack = avgSeatsBack;
		tmp.senate = senateSeats;
		var row = setRow(tmp);
		writeroot.appendChild(row);
	}

	var blocks = ['Right','Left'];
	if (blockScores.Left.seats > blockScores.Right.seats) {
		blocks.reverse();
	}
	blocks.push('Christian');

	writeroot = $('overviewBlocks');
	for (var j=0,block;block=blocks[j];j+=1) {
		blockScores[block].name = block;
		var row = setRow(blockScores[block]);
		writeroot.appendChild(row);
	}

//	writeroot = $('overviewcoalitionData');
	var coalitionNames = [];
	for (var j in coalitionData) {
		if (coalitionData[j].seats > 75) {
			coalitionNames.push(j);
		}
	}
	coalitionNames.sort(function (a,b) {
		var returnValue = coalitionData[b].seats - coalitionData[a].seats;
		if (returnValue === 0) {
			returnValue = coalitionData[b].senate - coalitionData[a].senate;
		}
		return returnValue;
	});
	for (var j=0,coalition;coalition=coalitionNames[j];j+=1) {
		coalitionData[coalition].nameArray = coalitionData[coalition].names;
		coalitionData[coalition].name = coalition;
		var row = setRow(coalitionData[coalition]);
		var wr = $('overviewCoalitions'+coalitionData[coalition].nameArray.length) || $('overviewCoalitions5');
		wr.appendChild(row);
	}
	
	var coalitionsByName = {};
	var coalitionsInOrder = $('coalitions').getElementsByTagName('tr');
	for (var j=0,coalition;coalition=coalitionsInOrder[j];j+=1) {
		if (coalition.getElementsByTagName('td').length < 1) continue;
		coalition.pointers = [];
		var coalitionName = coalition.firstChild.innerText || coalition.firstChild.textContent;
		for (var k in coalitionsByName) {
			if (coalitionName.indexOf(k) !== -1) {
				coalitionsByName[k].pointers.push(coalition);
			}
		}
		coalitionsByName[coalitionName] = coalition;
	}

	for (var j=0,coalition;coalition=coalitionsInOrder[j];j+=1) {
		if (coalition.getElementsByTagName('td').length < 1) continue;
		if (coalition.data.seats >= safeMajority) {
			for (var k=0;k<coalition.pointers.length;k+=1) {
				coalition.pointers[k].className = 'minority';
			}
		}

	}	
	
	setTimeout(function () {
		var tables = document.getElementsByTagName('table');
		for (var j=0;j<tables.length;j+=1) {
			if (tables[j].className === 'overviewTable') {
				var td = tables[j].getElementsByTagName('td')[0];
				if (td) {
					var width = tables[j].getElementsByTagName('td')[0].offsetWidth + 5;
					tables[j].style.marginLeft = -width + 'px';
				}
			}
		}
	},100);
	
	
	

	/* obj
	  - name;
	  - nameArray;
	  - currentSeats;
	  - seats
	  - avgSeats
	  - avgSeatsBack
	 */
	
	function initialiseRows() {
		setRow.tr = document.createElement('tr');
		for (var i=0;i<11;i+=1) {
			setRow.tr.appendChild(document.createElement('td'));
		}
		setRow.tr.childNodes[1].className = setRow.tr.childNodes[7].className = 'polls';
		setRow.tr.childNodes[6].className = 'separator';
		setRow.tr.childNodes[8].className = 'gainParliament';
		setRow.tr.childNodes[9].className = 'currentSeats';
		setRow.arrows = {};
		setRow.arrows.down = document.createElement('img');
		setRow.arrows.down.alt = 'down';
		setRow.arrows.down.src = '/politics/pix/trend_down.gif';
		setRow.arrows.up = document.createElement('img');
		setRow.arrows.up.src = '/politics/pix/trend_up.gif';
		setRow.arrows.up.alt = 'up';	
	}

	function setRow(obj) {
		if (!setRow.tr) {
			initialiseRows();
		}
		var row = setRow.tr.cloneNode(true);
		row.data = obj;
		if (obj.seats > 75) {
			row.className = 'majority';
		} else {
			row.className = 'minority';
		}
		if (obj.senate > 37) {
			row.childNodes[10].className = 'senateMajority';
		} else {
			row.childNodes[10].className = 'senateMinority';		
		}
		if (obj.name === 'Forbidden') {
			row.className += ' forbidden';
		}
		row.childNodes[6].innerHTML = obj.name;
		if (obj.nameArray) {
			if (obj.seats > 75 || !obj.isCoalition) {
				row.childNodes[0].innerHTML = '<span class="partyName">' 
					+ obj.nameArray.join('</span> <span class="partyName">') 
					+ '</span>';
			} else {
				row.childNodes[0].innerHTML = obj.nameArray.join(' ');
			}			
			row.childNodes[0].className = 'nameList';
		} else {
			row.childNodes[0].innerHTML = obj.name;
		}
		row.childNodes[9].innerHTML = obj.currentSeats;
		row.childNodes[10].innerHTML = obj.senate;
		row.childNodes[1].innerHTML = row.childNodes[7].innerHTML = obj.seats;
		row.childNodes[3].innerHTML = obj.avgSeats;
		row.childNodes[5].innerHTML = obj.avgSeatsBack;
		var tmp = {};
		tmp.gain = obj.seats - obj.avgSeats;
		tmp.cell = row.childNodes[2];
		tmp.extraArrow = 2;
		setGain(tmp);
		tmp.gain = obj.avgSeats - obj.avgSeatsBack;
		tmp.cell = row.childNodes[4];
		tmp.extraArrow = 2;
		setGain(tmp);
		tmp.gain = obj.seats - obj.currentSeats;
		tmp.cell = row.childNodes[8];
		tmp.extraArrow = 5;
		setGain(tmp);		
		return row;

		function setGain(obj) {
			var gain = obj.gain;
			if (gain > 0) {
				gain = '+' + gain;
				obj.cell.className += ' win';
				obj.cell.innerHTML = gain;
			} else if (gain < 0) {
				obj.cell.className += ' lose';
				obj.cell.innerHTML = gain;
			} 
			return;
			var numberOfArrows = Math.round(Math.abs(gain)/obj.extraArrow) || 1;
			var arrow;
			if (gain > 0) {
				arrow = 'up';
			} else {
				arrow = 'down';
			}
			for (var j=0;j<numberOfArrows;j+=1) {
				obj.cell.appendChild(setRow.arrows[arrow].cloneNode(true));
			}
		}
	}
	
}

var peil = {
	"17/1": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 16,
		"VVD": 23,
		"D66": 21,
		"PVV": 26,
		"SP": 15,
		"GL": 13,
		"CU": 6,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 2
	}}},
	"24/1": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 16,
		"VVD": 22,
		"D66": 22,
		"PVV": 26,
		"SP": 15,
		"GL": 13,
		"CU": 6,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"07/2": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 16,
		"VVD": 23,
		"D66": 21,
		"PVV": 26,
		"SP": 14,
		"GL": 13,
		"CU": 6,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 1
	}}},
	"14/2": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 15,
		"VVD": 22,
		"D66": 20,
		"PVV": 25,
		"SP": 13,
		"GL": 14,
		"CU": 7,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 2
	}}},
	"21/2": {"seats":{"national":{
		"CDA": 26,
		"PvdA": 19,
		"VVD": 23,
		"D66": 20,
		"PVV": 24,
		"SP": 11,
		"GL": 13,
		"CU": 7,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 2

	}}},
	"28/2": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 21,
		"VVD": 23,
		"D66": 18,
		"PVV": 26,
		"SP": 11,
		"GL": 14,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"06/3": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 24,
		"VVD": 19,
		"D66": 19,
		"PVV": 27,
		"SP": 12,
		"GL": 13,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"14/3": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 27,
		"VVD": 20,
		"D66": 18,
		"PVV": 26,
		"SP": 10,
		"GL": 12,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"19/3": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 32,
		"VVD": 21,
		"D66": 16,
		"PVV": 25,
		"SP": 9,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"26/3": {"seats":{"national":{
		"CDA": 23,
		"PvdA": 34,
		"VVD": 23,
		"D66": 15,
		"PVV": 24,
		"SP": 9,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"31/3": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 34,
		"VVD": 25,
		"D66": 14,
		"PVV": 22,
		"SP": 9,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"06/4": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 33,
		"VVD": 27,
		"D66": 12,
		"PVV": 21,
		"SP": 9,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"14/4": {"seats":{"national":{
		"CDA": 26,
		"PvdA": 33,
		"VVD": 28,
		"D66": 12,
		"PVV": 20,
		"SP": 10,
		"GL": 11,
		"CU": 6,
		"SGP": 2,
		"PvdD": 2

	}}},
	"21/4": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 30,
		"D66": 12,
		"PVV": 18,
		"SP": 10,
		"GL": 11,
		"CU": 6,
		"SGP": 2,
		"PvdD": 1

	}}},
	"26/4": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 32,
		"D66": 12,
		"PVV": 17,
		"SP": 10,
		"GL": 10,
		"CU": 6,
		"SGP": 2,
		"PvdD": 1

	}}},
	"06/5": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 33,
		"D66": 11,
		"PVV": 17,
		"SP": 10,
		"GL": 10,
		"CU": 6,
		"SGP": 2,
		"PvdD": 1

	}}},
	"12/5": {"seats":{"national":{
		"CDA": 26,
		"PvdA": 32,
		"VVD": 34,
		"D66": 10,
		"PVV": 16,
		"SP": 10,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2

	}}},
	"19/5": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 31,
		"VVD": 37,
		"D66": 9,
		"PVV": 16,
		"SP": 10,
		"GL": 11,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2

	}}},
	"26/5": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 29,
		"VVD": 36,
		"D66": 9,
		"PVV": 17,
		"SP": 11,
		"GL": 11,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2

	}}},
/*	"31/5": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 28,
		"VVD": 37,
		"D66": 10,
		"PVV": 17,
		"SP": 11,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2

	}}},
	"01/6": {"seats":{"national":{
		"CDA": 23,
		"PvdA": 28,
		"VVD": 37,
		"D66": 11,
		"PVV": 18,
		"SP": 12,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 1

	}}}, */
	"02/6": {"seats":{"national":{
		"CDA": 23,
		"PvdA": 28,
		"VVD": 37,
		"D66": 11,
		"PVV": 18,
		"SP": 12,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 1

	}}}, 
/*	"03/6": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 29,
		"VVD": 36,
		"D66": 11,
		"PVV": 18,
		"SP": 12,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 1

	}}},
	"04/6": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 29,
		"VVD": 36,
		"D66": 11,
		"PVV": 18,
		"SP": 12,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 1

	}}}
	"07/6": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 30,
		"VVD": 36,
		"D66": 10,
		"PVV": 18,
		"SP": 12,
		"GL": 10,
		"CU": 6,
		"SGP": 2,
		"PvdD": 1

	}}}*/ 
	"08/6": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 30,
		"VVD": 34,
		"D66": 11,
		"PVV": 18,
		"SP": 13,
		"GL": 11,
		"CU": 6,
		"SGP": 2,
		"PvdD": 1

	}}},
	"09/6": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 30,
		"VVD": 31,
		"D66": 10,
		"PVV": 24,
		"SP": 15,
		"GL": 10,
		"CU": 5,
		"SGP": 2,
		"PvdD": 2
	}}}
};

// EINDE PEIL

var tns = {
	"24/2": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 22,
		"VVD": 19,
		"D66": 22,
		"PVV": 32,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 3,
		"PvdD": 1,
		"ToN": 1
	}}},
	"5/2": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 22,
		"VVD": 19,
		"D66": 22,
		"PVV": 32,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 3,
		"PvdD": 1,
		"ToN": 1
	}}},
	"12/3": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 22,
		"VVD": 19,
		"D66": 22,
		"PVV": 32,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 3,
		"PvdD": 1,
		"ToN": 1
	}}},
	"19/3": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 22,
		"VVD": 19,
		"D66": 22,
		"PVV": 32,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 3,
		"PvdD": 1,
		"ToN": 1
	}}},
	"26/3": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 22,
		"VVD": 19,
		"D66": 22,
		"PVV": 32,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 3,
		"PvdD": 1,
		"ToN": 1
	}}},
	"02/4": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 35,
		"VVD": 25,
		"D66": 16,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"09/4": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 35,
		"VVD": 25,
		"D66": 16,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"16/4": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 35,
		"VVD": 25,
		"D66": 16,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"23/4": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 35,
		"VVD": 25,
		"D66": 16,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"30/4": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 35,
		"VVD": 25,
		"D66": 16,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1
	}}},
	"10/5": {"seats":{"national":{
		"CDA": 22,
		"PvdA": 29,
		"VVD": 30,
		"D66": 14,
		"PVV": 20,
		"SP": 9,
		"GL": 12,
		"CU": 10,
		"SGP": 2,
		"PvdD": 1,
		"ToN": 1
	}}},
	"19/5": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 31,
		"VVD": 33,
		"D66": 13,
		"PVV": 19,
		"SP": 9,
		"GL": 10,
		"CU": 10,
		"SGP": 2,
		"PvdD": 1,
		"ToN": 1
	}}},
	"25/5": {"seats":{"national":{
		"CDA": 20,
		"PvdA": 32,
		"VVD": 36,
		"D66": 12,
		"PVV": 19,
		"SP": 9,
		"GL": 9,
		"CU": 9,
		"SGP": 2,
		"PvdD": 1,
		"ToN": 1
	}}},
	"31/5": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 31,
		"VVD": 37,
		"D66": 10,
		"PVV": 17,
		"SP": 13,
		"GL": 8,
		"CU": 9,
		"SGP": 3,
		"PvdD": 1
	}}},
	"07/6": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 29,
		"VVD": 36,
		"D66": 11,
		"PVV": 18,
		"SP": 15,
		"GL": 10,
		"CU": 6,
		"SGP": 2,
		"ToN": 1,
		"PvdD": 1
	}}},
	"09/6": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 30,
		"VVD": 31,
		"D66": 10,
		"PVV": 24,
		"SP": 15,
		"GL": 10,
		"CU": 5,
		"SGP": 2,
		"PvdD": 2
	}}}
};

// EINDE TNS-NIPO


var barometer = {
	"15/1": {"seats":{"national":{
		"CDA": 33,
		"PvdA": 21,
		"VVD": 18,
		"D66": 18,
		"PVV": 25,
		"SP": 14,
		"GL": 8,
		"CU": 6,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 2
		
	}}},

	"29/1": {"seats":{"national":{
		"CDA": 33,
		"PvdA": 22,
		"VVD": 17,
		"D66": 17,
		"PVV": 27,
		"SP": 12,
		"GL": 9,
		"CU": 7,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 1
		
	}}},
	"04/2": {"seats":{"national":{
		"CDA": 33,
		"PvdA": 21,
		"VVD": 18,
		"D66": 17,
		"PVV": 26,
		"SP": 13,
		"GL": 10,
		"CU": 6,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 1
		
	}}},
	"11/2": {"seats":{"national":{
		"CDA": 34,
		"PvdA": 20,
		"VVD": 17,
		"D66": 17,
		"PVV": 24,
		"SP": 12,
		"GL": 11,
		"CU": 8,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 2
		
	}}},

	"18/2": {"seats":{"national":{
		"CDA": 32,
		"PvdA": 21,
		"VVD": 17,
		"D66": 18,
		"PVV": 24,
		"SP": 12,
		"GL": 11,
		"CU": 8,
		"SGP": 2,
		"PvdD": 3,
		"ToN": 2
	}}},
	"25/2": {"seats":{"national":{
		"CDA": 31,
		"PvdA": 27,
		"VVD": 15,
		"D66": 16,
		"PVV": 27,
		"SP": 12,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2

	}}},
/*	"02/3": {"seats":{"national":{
		"CDA": 29,
		"PvdA": 27,
		"VVD": 17,
		"D66": 16,
		"PVV": 26,
		"SP": 11,
		"GL": 13,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2

	}}},*/
	"03/3": {"seats":{"national":{
		"CDA": 29,
		"PvdA": 27,
		"VVD": 21,
		"D66": 15,
		"PVV": 24,
		"SP": 11,
		"GL": 12,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2

	}}}, 
	"10/3": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 26,
		"VVD": 22,
		"D66": 18,
		"PVV": 24,
		"SP": 9,
		"GL": 12,
		"CU": 7,
		"SGP": 2,
		"PvdD": 3

	}}},
	"18/3": {"seats":{"national":{
		"CDA": 28,
		"PvdA": 33,
		"VVD": 20,
		"D66": 15,
		"PVV": 23,
		"SP": 8,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"25/3": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 21,
		"D66": 15,
		"PVV": 22,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"02/4": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 21,
		"D66": 15,
		"PVV": 22,
		"SP": 9,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2,
		"ToN": 1

	}}},
	"09/4": {"seats":{"national":{
		"CDA": 29,
		"PvdA": 33,
		"VVD": 22,
		"D66": 12,
		"PVV": 23,
		"SP": 11,
		"GL": 8,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2
	}}},
	"16/4": {"seats":{"national":{
		"CDA": 30,
		"PvdA": 30,
		"VVD": 23,
		"D66": 12,
		"PVV": 21,
		"SP": 11,
		"GL": 10,
		"CU": 9,
		"SGP": 2,
		"PvdD": 2
	}}},
	"23/4": {"seats":{"national":{
		"CDA": 30,
		"PvdA": 30,
		"VVD": 27,
		"D66": 14,
		"PVV": 18,
		"SP": 10,
		"GL": 9,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2
	}}},
	"29/4": {"seats":{"national":{
		"CDA": 29,
		"PvdA": 32,
		"VVD": 30,
		"D66": 13,
		"PVV": 18,
		"SP": 8,
		"GL": 9,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2
	}}},
	"07/5": {"seats":{"national":{
		"CDA": 27,
		"PvdA": 33,
		"VVD": 31,
		"D66": 12,
		"PVV": 18,
		"SP": 9,
		"GL": 9,
		"CU": 8,
		"SGP": 2,
		"PvdD": 1
	}}},
	"14/5": {"seats":{"national":{
		"CDA": 26,
		"PvdA": 33,
		"VVD": 32,
		"D66": 11,
		"PVV": 17,
		"SP": 9,
		"GL": 9,
		"CU": 9,
		"SGP": 2,
		"PvdD": 2
	}}},
	"21/5": {"seats":{"national":{
		"CDA": 23,
		"PvdA": 33,
		"VVD": 36,
		"D66": 10,
		"PVV": 18,
		"SP": 8,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2
	}}},
	"25/5": {"seats":{"national":{
		"CDA": 26,
		"PvdA": 30,
		"VVD": 37,
		"D66": 9,
		"PVV": 18,
		"SP": 9,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2
	}}}, 
/*	"28/5": {"seats":{"national":{
		"CDA": 25,
		"PvdA": 29,
		"VVD": 38,
		"D66": 9,
		"PVV": 17,
		"SP": 10,
		"GL": 11,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2
	}}}, */
	"01/6": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 28,
		"VVD": 38,
		"D66": 10,
		"PVV": 16,
		"SP": 12,
		"GL": 10,
		"CU": 8,
		"SGP": 2,
		"PvdD": 2
	}}},
/*	"04/6": {"seats":{"national":{
		"CDA": 23,
		"PvdA": 30,
		"VVD": 36,
		"D66": 11,
		"PVV": 15,
		"SP": 14,
		"GL": 10,
		"CU": 7,
		"SGP": 2,
		"PvdD": 2
	}}}, */
	"08/6": {"seats":{"national":{
		"CDA": 24,
		"PvdA": 30,
		"VVD": 33,
		"D66": 10,
		"PVV": 17,
		"SP": 14,
		"GL": 11,
		"CU": 6,
		"SGP": 3,
		"PvdD": 2
	}}},
	"09/6": {"seats":{"national":{
		"CDA": 21,
		"PvdA": 30,
		"VVD": 31,
		"D66": 10,
		"PVV": 24,
		"SP": 15,
		"GL": 10,
		"CU": 5,
		"SGP": 2,
		"PvdD": 2
	}}}
};

// EINDE BAROMETER


var parties = [
	{
		name: "PvdD",
		color: "#660099",
		"type": {
			"Denomination": "Single Issue",
			"Block": "Left",
			"Integration": "Moderate",
			"Economics": "Left",
			"Europe": "Pro",
			"Ethics": "Liberal"
		},
		website: "http://www.partijvoordedieren.nl/",
		fullName: "Partij voor de Dieren",
		englishName: "Animal Party"
	},
	{
		name: "SP",
		"color": "#cc0000",
		"type": {
			"Block": "Left",
			"Denomination": "Socialist",
			"Protest": "Yes",
			"Economics": "Left",
			"Europe": "Con",
			"Integration": "Assimilation",
			"Ethics": "Liberal"
		},
		website: "http://www.sp.nl/",
		fullName: "Socialistische Partij",
		englishName: "Socialist Party"
	},
	{
		name: "GL",
		"color": "#00cc00",
		"type": {
			"Block": "Left",
			"Denomination": "Socialist",
			"Economics": "Left",
			"Integration": "Multiculti",
			"Europe": "Pro",
			"Ethics": "Liberal"
		},
		website: "http://groenlinks.nl/",
		fullName: "GroenLinks",
		englishName: "GreenLeft"

	},
	{
		name: "PvdA",
		"color": "#990000",
		"type": {
			"Block": "Left",
			"Denomination": "Socialist",
			"Economics": "Left",
			"Europe": "Pro",
			"Alliance": "PA",
			"Integration": "Moderate",
			"Old boys": "Yes",
			"Ethics": "Liberal"
		},
		website: "http://www.pvda.nl",
		fullName: "Partij van de Arbeid",
		englishName: "Labour Party",
		text: "The PvdA is the main social-democratic party and one of the three large parties " +
			"that form the core of the Dutch political system. " +
			"It used to get about one-third of the national vote, but in recent year " +
			"it has encountered serious competition from the left flank."
	},
	{
		name: "D66",
		"color": "#6699cc",
		"type": {
			"Block": "Left",
			"Denomination": "Liberal",
			"Old boys": "Yes",
			"Alliance": "PA",
			"Europe": "Pro",
			"Integration": "Moderate",
			"Economics": "Centre",
			"Ethics": "Liberal"
		},
		website: "http://www.d66.nl/",
		fullName: "Democraten '66",
		englishName: "Democrats '66"

	},
	{
		name: "CU",
		"color": "#660033",
		"type": {
			"Block": "Christian", // xChristian
			"Denomination": "Protestant",
			"Europe": "Con",
			"Integration": "Multiculti",
			"Economics": "Left",
			"Ethics": "Conservative"
		},
		website: "http://www.christenunie.nl/",
		fullName: "ChristenUnie",
		englishName: "Union of Christians"
	},
	{
		name: "CDA",
		"color": "#009900",
		"type": {
			"Block": "Right",
			"Old boys": "Yes",
			"Denomination": "Christian",
			"Integration": "Moderate",
			"Alliance": "CD",
			"Europe": "Pro",
			"Economics": "Centre",
			"Ethics": "Conservative"
		},
		website: "http://cda.nl/",
		fullName: "Christen-Democratisch App&egrave;l",
		englishName: "Christian Democratic Appeal",
		text: "The CDA is the main centrist party and is " +
			"one of the three large parties that form the core of the Dutch political system. " +
			"Because it is the centre that Dutch politics revolves around, " +
			"it, or its predecessor parties, has always taken part in all Dutch governments, " +
			"with the sole exception of the Purple governments (1994-2002). " +
			"During the Purple years it was down and out, but meanwhile it has made a come-back."
	},
	{
		name: "SGP",
		"color": "#cc6600",
		"type": {
			"Block": "Christian", // xChristian
			"Denomination": "Protestant",
			"Europe": "Con",
			"Integration": "Assimilation",
			"Economics": "Right",
			"Ethics": "Conservative"
		},
		website: "http://www.sgp.nl",
		fullName: "Staatkundig Gereformeerde Partij",
		englishName: "Political Reformed Party",
		text: "Founded by right-wing ARP members who could not stomach supporting a Catholic prime minister " +
			"the SGP remains the most conservative Protestant party to this day. It does not allow women into political " +
			"positions, and who takes the Sunday so seriously that its website is closed on " +
			"that day. It is currently the oldest Dutch political party, and its share of the vote is " +
			"very stable."

	},
	{
		name: "VVD",
		"color": "#000099",
		"type": {
			"Block": "Right",
			"Denomination": "Liberal",
			"Old boys": "Yes",
			"Europe": "Pro",
			"Integration": "Assimilation",
			"Economics": "Right",
			"Ethics": "Liberal"
		},
		website: "http://www.vvd.nl/",
		fullName: "Volkspartij voor Vrijheid en Democratie",
		englishName: "Popular Party for Freedom and Democracy"
	},
	{
		name: "PVV",
		"color": "#cccc00",
		"color": "#996600",
		"type": {
			"Split": "VVD",
			"Block": "Right",
			"Denomination": "Populist",
			"Protest": "Yes",
			"Integration": "Assimilation",
			"Europe": "Con",
			"Economics": "Right",
			"Ethics": "Liberal"
		},
		website: "http://www.pvv.nl/",
		fullName: "Partij van de Vrijheid",
		englishName: "Freedom Party"
	},
	{
		name: "ToN",
		type: {
			"Split": "VVD",
			"Block": "Right",
			"Integration": "Assimilation",
			"Denomination": "Populist",
			"Protest": "Yes",
			"Europe": "Con",
			"Economics": "Right",
			"Ethics": "Liberal"
		},
		fullName: "Trots op Nederland",
		englishName: "Proud of Holland",
		text: "Vehicle for former integration minister Rita Verdonk (VVD)."
	}
];

(function () {

	for (var i=0,party;party=parties[i];i+=1) {
		var name = party.name;
		partyOrder.push(name);
		partyData[name] = party;
	}
	
	for (var h in variables.datasrc) {
	
		parliament = window[variables.datasrc[h]];
	
		var order = [];
		for (var i in parliament) {
			order.push(reverseDate(i));
			if (!parliament[i].length) {
				parliament[i].length = defaultBarWidth;
			}
			parliament[i].number = {};
			parliament[i].totalSeats = 0;
			parliament[i].partyOrder = {};
			for (var j in parliament[i].seats) {
				parliament[i].number[j] = 0;
				var sorted = [];
				var data = parliament[i].seats[j]
				for (var k in data) {
					parliament[i].number[j] += 1;
					addToPartyList(k);
					sorted.push(k);
				}
				sorted.sort(function (a,b) {
					return data[b] - data[a]
				});
				parliament[i].partyOrder[j] = sorted;
			}
		}
		order = order.sort().reverse();
		if (order.length > maxPolls) {
			order.length = maxPolls;
		}
		order = order.reverse();
		
		for (var i=0;i<order.length;i+=1) {
			order[i] = reverseDate(order[i]);
		}
		
		parliament['2006'] = currentParl;
		order.unshift('2006');
		parliament.order = order;

		for (var i=0;i<parliament.order.length;i+=1) {
			var current = parliament[parliament.order[i]]
			var previous = parliament[parliament.order[i-1]];
			current.previous = previous || current;
			current.totalLists = {};
			current.totalGain = {};
			current.medians = {};
			current.smallestMaj = {};
			current.aboveMedian = {};
			for (var j in current.seats) {
				var currentElection = current.seats[j];
				var previousElection = current.previous.seats[j];

				var partiesInOrder = [];
				var partyListObj = {};

				for (var k in currentElection) {
					partyListObj[k] = true;
				}
				if (previousElection) {
					for (var k in previousElection) {
						partyListObj[k] = true;
					}
				}

				for (var k in partyListObj) {
					var partyObj = {};
					partyObj.Party = k;
					partyObj.Seats = currentElection[k] || 0;
					var oldResult = (previousElection && previousElection[k]) || 0;
					if (parliament.order[i] === '1956') {
						oldResult *= 1.5;
					}
					partyObj.Gain = partyObj.Seats - oldResult;
					if (partyData[k].type.Merged) {
						partyObj.merged = partyData[k].type.Merged;
					}
					partiesInOrder.push(partyObj);
				}
				partiesInOrder.sort(function (a,b) {
					var result = a.Seats - b.Seats;
					if (result === 0) {
						result = a.Gain - b.Gain;
					}
					return result;
				});
				current.totalLists[j] = partiesInOrder;

				var medianArray = [];
				var totalSeats = 0;
				for (var l=0;l<partiesInOrder.length;l+=1) {
					if (partiesInOrder[l].Seats !== 0) {
						medianArray.push(partiesInOrder[l]);
						totalSeats += partiesInOrder[l].Seats;
					}
				}

				current.totalSeats = totalSeats;


				var medianIndex = (medianArray.length-1)/2;
				if (medianIndex % 1 === 0.5) {
					current.medians[j] = (medianArray[medianIndex-.5].Seats + medianArray[medianIndex+.5].Seats)/2;
				} else {
					current.medians[j] = medianArray[medianIndex].Seats;
				}

				var majority = 0,
				  numberOfParties = 0,
				  medianCalc = 0;
				for (var k=medianArray.length-1;k>=0;k-=1) {
					if (!numberOfParties && majority > (totalSeats/2)) {
						numberOfParties = medianArray.length - 1 - k;
					} else {
						majority += medianArray[k].Seats;				
					}
					if (medianArray[k].Seats >= current.medians[j]) {
						medianCalc += medianArray[k].Seats;
					}
				}
				current.smallestMaj[j] = numberOfParties;
				current.aboveMedian[j] = medianCalc;

				var mergerParties = {};
				current.totalGain[j] = 0;
				for (var k=0;k<partiesInOrder.length;k+=1) {
					var party = partiesInOrder[k];
					if (party.merged && current.seats[j][party.merged]) {
						if (!mergerParties[party.merged]) {
							mergerParties[party.merged] = 0;
						}
						mergerParties[party.merged] += party.Gain;
					}
					else if (mergerParties[party.Party]) {
						mergerParties[party.Party] += party.Gain;
						if (mergerParties[party.Party] > 0) {
							current.totalGain[j] += mergerParties[party.Party];
						}
					}
					else if (party.Gain > 0) {
						current.totalGain[j] += party.Gain;
					}			
				}		
			}
		}
	}
	
	for (var i in partyData) {
		var merged = partyData[i].type.Merged;
		if (merged) {
			createRelation(i,'mergedto',merged);
			createRelation(merged,'mergedfrom',i);
			while (partyData[merged].type.Merged) {
				merged = partyData[merged].type.Merged;
			}
			partyData[i].type.Final = merged;
		} /* else {
			partyData[i].type.Final = 'final';
		} */
		var split = partyData[i].type.Split;
		if (split) {
			var splits = split.split(',');
			for (var j=0;j<splits.length;j+=1) {
				createRelation(i,'splitto',splits[j])
				createRelation(splits[j],'splitfrom',i);
			}
		}
		if (partyData[i].elections) {
			partyData[i].elections.sort();
			var firstElections = partyData[i].elections[0];
			var lastElections = partyData[i].elections[partyData[i].elections.length-1];
			var activeText = '';
			if (firstElections === lastElections) {
				activeText = firstElections;
			} else {
				if (lastElections === parliament.order[parliament.order.length-1]) {
					activeText = firstElections +  ' - present';
				} else {
					activeText = firstElections +  ' - ' + lastElections;
				}
			}
			partyData[i].active = activeText;
			partyData[i].firstElections = firstElections;
			partyData[i].lastElections = lastElections;
		}
	}

	if (window.index && index.length) {
		for (var i=0;i<index.length;i+=1) {
			index[i].fullLink = chapters[index[i].page*2-1] + '#' + index[i].link;
			if (!index[i].yearString) {
				index[i].yearString = index[i].year;
			}
			var affectedParties = index[i].parties.split(',');
			for (var j=0,party;party=partyData[affectedParties[j]];j+=1) {
				if (!party.links) {
					party.links = [];
				}
				party.links.push(index[i]);
			}
		}
	}
	for (var i=0;i<parties.length;i+=1) {
		if (parties[i].links) {
			parties[i].links.sort(function (a,b) {
				return a.year - b.year;
			});
		}
	}

	function createRelation(partyName,member,value) {
		var party = partyData[partyName];
		if (!party) {
//			alert(partyName. + ' unknown');
			return;
		}
		if (!party.relations) {
			party.relations = {};
		}
		if (!party.relations[member]) {
			party.relations[member] = [];
		}
		party.relations[member].push(value);
	}
	
	function addToPartyList(name) {
		var target = partyData[name];
		if (!target) {
			alert(name + ' lacking from party list');
			return;
		}
		if (!target.elections) {
			target.yearLookup = {};
			target.elections = [];
		}
		if (!target.yearLookup[i]) {
			target.yearLookup[i] = true;
			target.elections.push(i);
		}
	}
	
	function reverseDate(str) {
		var components = str.split('/');
		return components[1] + '/' + components[0];
	}

	// set coalitions 
	
	for (var i in coalitions) {
		var coalitionParties = coalitions[i].split('+');
		for (var j=0;j<coalitionParties.length;j+=1) {
			partyData[coalitionParties[j]].type[i] = 'Yes';
		}
		defaultTypes[i] = 'No';
	}

	for (var i=0,party;party=parties[i];i+=1) {
		for (var j in defaultTypes) {
			if (!party.type[j]) {
				party.type[j] = defaultTypes[j];
			}
		}
	}
	
	// set polls 

	var left=10;

	for (var i in variables.datasrc) {
		polls[i] = (function () {
			var datasrc = window[variables.datasrc[i]];
			var outerPoll = document.createElement('div');
			outerPoll.className = 'outerPoll';
			outerPoll.style.left = left + 'px';
			left += 80;
			var pollsterName = document.createElement('div');
			pollsterName.className = 'pollsterName';
			pollsterName.innerHTML = i;
			var total = document.createElement('div');
			total.className = 'total';
			var innerPoll = document.createElement('div');
			innerPoll.className = 'innerPoll';

			outerPoll.appendChild(total);
			outerPoll.appendChild(innerPoll);
			outerPoll.appendChild(pollsterName);
			$('scoreboard').appendChild(outerPoll);

			var poll = getPollData(),
			  gains = getPollGains(),
			  totalSeats,
			  coalition,
			  largestParty,
			  coalitionArray=[];

			return {
				setNewCoalition: function (coal) {
					coalition = coal;
					calculateCoalition();
					drawCoalition();
				},
				getLargestParty: function () {
					var parties = largestParty.split('/');
					var score = 1/parties.length;
					var obj = {};
					for (var i=0,party;party=parties[i];i+=1) {
						obj[party] = score;
					}
					return obj;
				},
				getTotalSeats: function () {
					return totalSeats;
				},
				getPartySeats: function(party) {
					return poll[party] || 0;
				},
				getTrendingAverage: function (party,start,end) {
					var tmp = datasrc.order,
					 total = 0,
					 latestValue = 0,
					 seats,
					 index;
					for (var j=start;j<end;j+=1) {
						index = tmp.length-j-1;
						if (datasrc[tmp[index]] && index > 0) {
							seats = datasrc[tmp[index]].seats.national[party] || 0;
							total += seats;
							latestValue = seats;
						} else {
							total += latestValue;
						}
					}
					return total;
				}
			}

			function calculateCoalition() {
				totalSeats = 0;
				largestParty = '';
				var seats,obj;
				coalitionArray.length = 0;
				for (var i=0,party;party=coalition[i];i+=1) {
					seats = poll[party] || 0;
					totalSeats += seats;
					obj = {};
					obj.name = party;
					obj.seats = seats;
					coalitionArray.push(obj);
				}
				if (coalitionArray.length) {
					coalitionArray.sort(function (a,b) {
						return b.seats - a.seats;
					});
					largestParty = coalitionArray[0].name;
					var counter = 1;
					while(coalitionArray[counter] && coalitionArray[counter].seats === coalitionArray[0].seats) {
						largestParty += '/' + coalitionArray[counter].name;
						counter +=1;
					}
				}
				total.innerHTML = totalSeats;
			}

			function drawCoalition() {
				innerPoll.innerHTML = '';
				var div;
				for (var i=coalitionArray.length-1,party;party=coalitionArray[i];i-=1) {
					div = document.createElement('div');
					div.style.backgroundColor = partyData[party.name].color;
					div.innerHTML = party.name + ' ' + party.seats;
					div.style.height = party.seats*3 + 'px';
					innerPoll.appendChild(div);
				}
			}

			function getPollData() {
				var datasrc = window[variables.datasrc[i]];
				var tmp = datasrc.order;
				return datasrc[tmp[tmp.length-1]].seats.national;
			}
			
			function getPollGains() {
				var datasrc = window[variables.datasrc[i]];
				var tmp = datasrc.order;
				var list = datasrc[tmp[tmp.length-1]].totalLists.national;
				var obj = {};
				for (var j=0,item;item =list[j];j+=1) {
					obj[item.Party] = item.Gain;
				}
				return obj;				
			}

		})();		
	}
	calculateAllSeats();
	game();
	overview();
})();