$(document).ready(init);

var baseURL = 'http://innovation.cqpolitics.com/upload_tool_output/table_json';
//var baseURL = 'table.json';
var tableObject;
var tryCounter = 0;

function init() {
	var urlVars = getUrlVars();
	$.get(baseURL + '?table=up_table198', parse, init);
	tryCounter++;
	if (tryCounter > 5) {
		$("#tableDesc").html("Sorry, there's been a problem retrieving the data for this table.");
	}
}

function parse(a) {
	tableObject = eval('(' + a + ')');
	setup();
	render();
}

function failure() {
	console.log('Game over, man! Game over!');
}

function getUrlVars() {
	var loc = window.location.href;
	if (loc.search(/cqpolitics/) != -1) {
		baseURL = 'http://innovation.cqpolitics.com/upload_tool_output/table_json';
	}
	var pageVars = new Object();
	var raw = loc.slice(loc.indexOf('?') + 1).split('&');
	for (var i = 0; i < raw.length; i++) {
		hash = raw[i].split('=');
		pageVars[hash[0]] = hash[1];
	}
	return pageVars;
}

function setup() {
	document.title = "CQ Interactive - " + tableObject.tableTitle;
	
	$("#tableH1").html(tableObject.tableTitle);
	$("#tableDesc").html(tableObject.description);
	$("#tableKey").html(tableObject.unitKey);
	$("#tableSource").html(tableObject.source);
	$("#tableFooter").html(tableObject.footnotes);
	$("#tableFooter").html(tableObject.footnotes);
	
	var table = $('#tableContents');
	var headerRow = table.append('<tr />').find('tr');
	for (var i = 0; i < tableObject.attributes.length; i++) {
		headerRow.append('<th>' + tableObject.attributes[i] + '<span></span></th>');
		if (tableObject.sortable) headerRow.find('th:last').click(headerClick);
	}
	
	if(tableObject.top_line != null){
		var topRow = table.append('<tr />').find('tr');
		for (var j = 0; j < tableObject.attributes.length; j++) {
		topRow.append('<td>' + tableObject.top_line[j] + '<span></span></td>');
		//topRow.find('th:last').click(headerClick);
		$("tableContent td").addClass('top_line')
		}
	}
	tableObject.sortCol = 0;
	tableObject.sortDir = 'down';
}

function headerClick(e) {
	var tindex;
	$('th').find('span').html('');
	var thtml = $(this).text();
	if (tableObject.sortCol != null) $('th:eq(' + tableObject.sortCol + ')').removeClass('sorthead');
	for (tindex = 0; tindex < tableObject.attributes.length; tindex++) {
		if (thtml == tableObject.attributes[tindex]) {
			break;
		}
	}
	if (tindex == tableObject.sortCol) {
		if (tableObject.sortDir == 'up') {
			tableObject.sortDir = 'down';
		} else {
			tableObject.sortDir = 'up';
		}
	} else {
		tableObject.sortCol = tindex;
		tableObject.sortDir = 'up';	
	}
	$('th:eq(' + tableObject.sortCol + ')').addClass('sorthead');
	tableObject.rows.sort(tableSorter);
	render();
	if (tableObject.sortDir == 'up') {
		$('th:eq(' + tableObject.sortCol + ')').find('span').html('&#x25B2;');
	} else {
		$('th:eq(' + tableObject.sortCol + ')').find('span').html('&#x25BC;');
	}
}

function tableSorter(one, two) {
	var m = one[tableObject.sortCol];
	var n = two[tableObject.sortCol];
	var a = normalize(stripTags(m));
	var b = normalize(stripTags(n));
	if (a == undefined || b == undefined) {
		if (a) {
			return -1;
		}
		return 1;
	}
	var mode;
	if (typeof(a) == 'number') mode = 'numerical'; else mode = 'text';
	if (mode == 'numerical') {
		if (tableObject.sortDir == 'up') {
			return (a - b);
		} else {
			return (b - a);
		}
	} else {
		if (tableObject.sortDir == 'up') {
			if (a > b) return 1; return -1;
		} else {
			if (a > b) return -1; return 1;
		}
	}
}

function normalize(x) {
	if (x) {
		var y = x.replace(/[,\$\%]/g, '');
		if (y.match(/[0-9\.\-]+/g) != null && Number(y.match(/[0-9\.\-]+/g)[0]) == Number(y)) return(Number(y));
	return(y);
	}
}

function stripTags(s) {
	return(s.replace(/<.+?>/gi, ''));
}

function render() {
	var table = $('#tableContents');
	table.find('tr:has(td)').remove();
	for (var i = 0; i < tableObject.rows.length; i++) {
		var currentRow = table.append('<tr />').find('tr:last');
		for (var j = 0; j < tableObject.rows[i].length; j++) {
			currentRow.append('<td>' + tableObject.rows[i][j] + '</td>');
		}
	}
	stripe(table);
	tableObject.typeFlags = [];
	for (var i = 0; i < tableObject.rows[0].length; i++) {
		var nonblank = "";
		for (var j = 0; j < tableObject.rows.length; j++) {
			if (tableObject.rows[j][i]) {
				nonblank = tableObject.rows[j][i];
				break;
			}
		}
		if (typeof(normalize(stripTags(nonblank))) == 'number') {
			$('tr:has(td)').find('td:eq('+ i + ')').addClass('numerical');
		}
	}
}

function stripe(target) {
	var rows = $(target).find("tr");
	for (var i = 0; i < rows.length; i++) {
		if (i % 2) $(rows[i]).children("td").addClass("odd");
	}
}