
function Results(evaluationElementId) {
	this.evaluationElementId = evaluationElementId;
}

function getSelectedText(selectName) {
	var select = document.getElementById(selectName);
	var txt = select.options[select.selectedIndex].text;
	return txt.split("(")[0].replace(" ", "");
}

function getSelectedValue(selectName) {
	var select = document.getElementById(selectName);
	if (select.selectedIndex < 0)
		return -1;
	return select.options[select.selectedIndex].value;
}

function prepareSelectLists(evaluationElementId, evals, dataSetElementId) {
	prepareEvaluationSelect(evaluationElementId, evals);
	prepareDataSetSelect(evaluationElementId, dataSetElementId);
}

function prepareEvaluationSelect(evaluationElementId, evals) {
	var evLabel = $('#' + evaluationElementId + '_label');
	if(evals.length == 1)
		evLabel.html('Evaluation procedure (1):');
	else
		evLabel.html('Evaluation procedures (' + evals.length + '):');
	var evSelect = $('#' + evaluationElementId);
	evSelect.empty();
	var options = "";
	$.each(evals, function(i, el){
		var count = data[i].getNumberOfRows();
		options += '<option value="' + i + '">' + el + ' (' + count + ')</option>';
	});
	evSelect.append(options);
	$('#gotoEval').attr('href', "repo/" + getSelectedText(evaluationElementId));
}

function printTables() {
	var width = '100%';
    var cssClassNames = {
    	    'headerRow': 'gTableHeader',
    	    'tableRow': 'gTableRow',
    	    'oddTableRow': 'gTableOddRow',
    	    'hoverTableRow': 'gHoverTableRow',
    	    'headerCell': 'gTableHeaderCell',
    	    'tableCell': 'gTableCell'};
    for (var i in data) {
    	var table = new google.visualization.Table(document.getElementById('table_div_'+i));
    	var view = new google.visualization.DataView(data[i]);
		view.hideColumns([evaluationColumn, dataSetColumn, algorithmPackageColumn, algorithmColumn]);
    	table.draw(view, {
        	'height': Math.min(tableDivHeight, view.getNumberOfRows()*20 + 70),
        	'width': width,
        	'sortColumn': 0,
        	'allowHtml': true,
        	'cssClassNames': cssClassNames
        	});
    }
}

function prepareDataSetSelect(evaluationElementId, dataSetElementId) {
	var dsLabel = $('#' + dataSetElementId + '_label');
	var evaluationSelectedIndex = getSelectedValue(evaluationElementId);
	if (evaluationSelectedIndex < 0)
		return;
	var dataSets = data[evaluationSelectedIndex].getDistinctValues(dataSetColumn);
	if(dataSets.length == 1)
		dsLabel.html("Dataset (1):");
	else
		dsLabel.html("Datasets (" + dataSets.length + "):");
	var evaluationSelectedText = getSelectedText(evaluationElementId);
	var options = "";
	for (var i in dataSets) {
		var rows = data[evaluationSelectedIndex].getFilteredRows([{column: dataSetColumn, value: dataSets[i]}]);
		options += '<option value="' + i + '">' + dataSets[i] + ' (' + rows.length + ')</option>';
	}
	$('#' + dataSetElementId).empty().html(options);
	var link = document.getElementById("gotoData");
	link.href = "repo/" + getSelectedText(dataSetElementId);
}

function onSelectedEvaluation(evaluationElementId, dataSetElementId) {
	var link = document.getElementById("gotoEval");
	link.href = "repo/" + getSelectedText(dataSetElementId);
	prepareDataSetSelect(evaluationElementId, dataSetElementId);
	drawChart(evaluationElementId, dataSetElementId);
	startShowingAlgs();
}

function onSelectedDataSet(evaluationElementId, dataSetElementId) {
	var link = document.getElementById("gotoData");
	link.href = "repo/" + getSelectedText(dataSetElementId);
	drawChart(evaluationElementId, dataSetElementId);
	startShowingAlgs();
}

function prepareAlg(dataTable, rowNum){
	links.push(dataTable.getValue(rowNum, algorithmColumn));
	return dataTable.getValue(rowNum, algorithmPackageColumn) + "     ";
}

function prepareChartDataViews(evaluationElementId, dataSetElementId) {
	chartDataView = null;
	chartDataViewTooltip = null;
	
	var evaluationSelectedIndex = getSelectedValue(evaluationElementId);
	if (evaluationSelectedIndex < 0)
		return;
	var evaluationSelectedText = getSelectedText(evaluationElementId);
	var dataSetSelectedText = getSelectedText(dataSetElementId);
	var filter = [{column: evaluationColumn, value: evaluationSelectedText},
         		  {column: dataSetColumn, value: dataSetSelectedText}];
	chartDataView = new google.visualization.DataView(data[evaluationSelectedIndex]);
	chartDataView.setRows(chartDataView.getFilteredRows(filter));
	chartDataView.setColumns([{calc:prepareAlg, type:'string'}, meanColumn]);
	chartDataViewTooltip = new google.visualization.DataView(data[evaluationSelectedIndex]);
	chartDataViewTooltip.setRows(chartDataViewTooltip.getFilteredRows(filter));
	chartDataViewTooltip.hideColumns([dataSetColumnLink, algorithmPackageColumn, algorithmColumnLink]);
}

function prepareAndShowTooltip(e) {
	prepareTooltip(e);
	showTooltip();
}

function prepareTooltip(e) {
	var row = e['row'];
	var info = '<table>';
	var noOfColumns = chartDataViewTooltip.getNumberOfColumns();
	for (var i=0; i<noOfColumns; i++) {
		info += '<tr>';
    	info += '<td>';
        info += chartDataViewTooltip.getColumnLabel(i) + ': ';
        info += '</td>';
    	info += '<td style="padding-left: 20px;">';
    	info += chartDataViewTooltip.getFormattedValue(row, i);
        info += '</td>';
		info += '</tr>';
	}
	info += '</table>';
	var element = document.getElementById('tooltip');
	element.innerHTML = info;
}

function showTooltip() {
	document.getElementById('tooltip').style.display = 'block';
}

function hideTooltip() {
	document.getElementById('tooltip').style.display = 'none';
}

function drawChart(evaluationElementId, dataSetElementId) {
	prepareChartDataViews(evaluationElementId, dataSetElementId);
	if (chartDataView == null)
		return;
	var chartDivHeight = chartDataView.getNumberOfRows() * 20 + 40;
	if (!chart)
    	chart = new google.visualization.BarChart(document.getElementById('chart_div'));
	links = new Array(0);
	google.visualization.events.addListener(chart, 'ready', setTimeout("showAlgLinks()", 2000));
    chart.draw(chartDataView, {
    		width: chartDivWidth,
        	height: chartDivHeight,
            is3D: false,
            title: 'Mean Results of Algorithms',
    		titleFontSize: 14,
            axisFontSize: 12,
            titleColor: '#333333',
            legend: 'none',
            colors: [ '#3090BF' ],   // FFA300 00A7C6
            //\\backgroundColor: {stroke:'null', fill:'beige', strokeSize: 0},
            focusBorderColor: {stroke:'#333333', strokeSize: 1},
            enableTooltip: false});
    google.visualization.events.addListener(chart, 'onmouseover', prepareAndShowTooltip);
}

function addColumnsWithLinks(data, siteUrl) {
	for (var i in data) {
		data[i].insertColumn(dataSetColumnLink, 'string', data[i].getColumnLabel(dataSetColumn));
		data[i].insertColumn(algorithmColumnLink, 'string', data[i].getColumnLabel(algorithmColumn));
    	var noOfRows = data[i].getNumberOfRows();
    	for (var j=0; j<noOfRows; j++) {
			data[i].setCell(j, dataSetColumnLink, data[i].getValue(j, dataSetColumn));
			data[i].setCell(j, algorithmColumnLink, data[i].getValue(j, algorithmColumn));
		}
    	var formatter = new google.visualization.PatternFormat('<a href="' + siteUrl + 'repo/{0}">{0}</a>');
    	formatter.format(data[i], [dataSetColumn], dataSetColumnLink);
    	formatter.format(data[i], [algorithmColumn], algorithmColumnLink);
	}
}

function fillFilters(eval, data, alg)
{
	document.getElementsByName('e')[0].value = eval;
	document.getElementsByName('d')[0].value = data;
	document.getElementsByName('a')[0].value = alg;
	document.getElementById('exact').checked = "checked";
	return false;
}

function startShowingAlgs()
{
	$('.algLink').remove();
//	showAlgLinks();
}

function showAlgLinks()
{
	$('.algLink').remove();
	var frame = $('#chart_div > iframe');
	var doc = frame[0].contentDocument;
	var texts = $('#chart text', doc);
	$('#chart_div').css("position", "relative");
	$.each(texts, function(ind, elem){
		var qElem = $(elem);
		if(qElem.attr("text-anchor") == "end"){
			var frame = $('#chart_div > iframe');
			var rect = $('#chart > g > rect:eq(1)', frame[0].contentDocument);
			$('#chart_div').append('<a href="repo/' + links[links.length - ind] + '" id="anch' + ind + '" class="algLink">' + qElem.text() + '</a>');
			if(qElem.offset().top > 0)
				$('#anch' + ind).css("top", qElem.offset().top);
			else if(qElem.attr("offsetTop") > 0)
				$('#anch' + ind).css("top", qElem.attr("offsetTop") - 12);
			else if(elem.attributes[2].value > 0)
				$('#anch' + ind).css("top", (elem.attributes[2].value - 12) + "px");
			else
				$('.algLink').remove();
			$('#anch' + ind).css("width", (rect.attr("x").baseVal.value - 4) + "px");
		}
	});
}

