hash_keys = function (obj){
    var keys = [];
    for(var i in obj)
	if(obj.hasOwnProperty(i))
	    keys.push(i);
    return keys;
}

function get_monthly_steel_data(all_data, m){
    return $.map(all_data, function(e,i){
	if(e[m+1][0]=='')
	    return null;
	return {
	    name: e[0],
	    score: parseInt(e[m+1][0]),
	    time: (parseInt(e[m+1][1]) || 0),
	    caliber: e[m+1][2]
	}
    });
}


function get_monthly_data(all_data, m){
    return $.map(all_data, function(e,i){
	if(e[m+1][0]=='')
	    return null;
	return {
	    name: e[0],
	    score: parseInt(e[m+1][0]),
	    xs: (parseInt(e[m+1][1]) || 0),
	    caliber: e[m+1][2]
	}
    });
}

function hashify(data){

    var r = 0;
    return $.map(data, function(e,i){
	r++;
	return {
	    rank : r,
	    name : e[0],
	    score : e[1][0],
	    tiebreaker: e[1][1]
	}})}



function add_rank_and_xify(data){

    unit = data[0].score
    for(var i in data){
	data[i].rank = parseInt(i)+1;
	data[i].promille = Math.round(1000*data[i].score/unit);
	data[i].percent = (data[i].promille/10).toFixed(1) + '%';
	data[i].bar = function(caliber, promille ){return function(elem){

	    color = {'308win': 'green' }[caliber.toLowerCase()] || 'grey';
	    var div = $('<div />', {style: 'border-top: 5px solid '+color+'; width: '+ 2*Math.round(promille/10) +'px' } );
	    elem.append(div)

	}}(data[i].caliber, data[i].promille);

	data[i].xs = data[i].xs + 'X';
    }
}

function add_rank_steel(data){

    unit = data[0].score
    for(var i in data){
	data[i].rank = parseInt(i)+1;
	data[i].promille = Math.round(1000*data[i].score/unit);
	data[i].percent = (data[i].promille/10).toFixed(1) + '%';
	data[i].bar = function(caliber, promille ){return function(elem){

	    color = {'308win': 'green' }[caliber.toLowerCase()] || 'grey';
	    var div = $('<div />', {style: 'border-top: 5px solid '+color+'; width: '+ 2*Math.round(promille/10) +'px' } );
	    elem.append(div)

	}}(data[i].caliber, data[i].promille);

	data[i].time = data[i].time + 's';
    }
}


function ranker(a,b){
    if(b.score == a.score)
	return b.xs - a.xs;
    return b.score - a.score ;
}

function ranker_steel(a,b){
    if(b.score == a.score)
	return a.time - b.time;
    return b.score - a.score ;
}



function show_away_stats_tabs(all_data){

    var div = $('#stats_away');
    div.hide();
    div.empty();
    var ul = $('<ul />').appendTo(div);

    years = hash_keys(all_data).sort().reverse();

    for(var i in years){
	var y = years[i];

	var tab = appendTab(div, ul, y);
	var year = all_data[y];
	for(var event in year){
	    data = year[event];
	    indies = [2,1];
	    appendTable(tab, y+' '+event, data, indies);
	}
    }
    div.tabs().show('slide');
}

function show_aggr_stats_tabs(aggrs){

    var div = $('#stats_aggr');
    div.hide();
    div.empty();
    var ul = $('<ul />').appendTo(div);

    for(var a in aggrs){
	var aggr = aggrs[a];
	var tab = appendTab(div,ul,aggr[0]);
	var data = hashify(aggr[1]);
	appendTable(tab, false, data, ['rank', 'name','score','tiebreaker']);
    }
    div.tabs().show('slide');
}

function show_steel_stats_tabs(all_data){
    var div = $('#stats_steel');
    div.hide();
    div.empty();

    var ul = $('<ul />').appendTo(div);

    months = ['December', 'February', 'April',
	      'June', 'August', 'October']
    curr_months = 6;

    for(var m=0;m<curr_months;m++){

	month = months[m];
	var tab = appendTab(div,ul,month);
	var data = get_monthly_steel_data(all_data,m).sort(ranker_steel);
	add_rank_steel(data);
	appendTable(
	    tab,
	    false,
	    data,
	    ['rank','name','score','time','percent','bar']);
    }
    div.tabs().show('slide');


}

function show_long_range_stats_tabs(all_data){

    var div = $('#stats_lr');
    div.hide();
    div.empty();

    var ul = $('<ul />').appendTo(div);

    months = ['January', 'February', 'March', 'April',
	      'May', 'June', 'July', 'August',
	      'September','October','November','December']
    curr_months = 12;

    for(var m=0;m<curr_months;m++){

	month = months[m];

	var tab = appendTab(div,ul,month);
	var data = get_monthly_data(all_data,m).sort(ranker);
	add_rank_and_xify(data);
	appendTable(
	    tab,
	    false,
	    data,
	    ['rank', 'name','score','xs','caliber', 'percent','bar']);
    }
    div.tabs().show('slide');
}
function appendBarGraph(elem, data, label_name, value_name){

    var num = data.length;

    var labels = $.map(data, function(d){
	return d[label_name];
    }).slice(0,num).reverse().join('|');

    var values = $.map(data, function(d){
	return parseInt(d[value_name])
    }).slice(0,num).join(',');

    var url = 'https://chart.googleapis.com/chart?';

    height = num * 15 + 20;
    var params = {
	cht: 'bhs',
	chbh: '12,3,0',
	chxt: 'x,y',
	chxr: '0,0,600',
	chds: '0,600',
	chs: '250x'+ height
    }

    for(var k in params){
	url += k+'='+params[k]+'&'
    }

    url += 'chd=t:'+values;
    url += '&chxl=1:|'+labels;

    var img = $('<img />', { src: url});

    elem.append(img);


}

function appendSelector(elem, name, data, is, selected){
    if(name)
	$('<h4 />').text(name).appendTo(elem);
    var list = $('<ol />').addClass('selector').appendTo(elem);
    var klass = 'odd'

    for(var i in data){

	var li = $('<li />').appendTo(list);
	var line = data[i];

	for(var j in is){
	    var span = $('<div />');

	    var content = line[is[j]];

	    if(typeof content == 'function'){
		content(span);
	    } else {
		span.text(content);
	    }
	    span.appendTo(li);
	}
	$('<br />').appendTo(li);
    }

    list.selectable({selected:selected})

}

function appendTable(elem, name, data, is, show_header){
    if(name)
	$('<h4 />').text(name).appendTo(elem);
    var table = $('<table />').appendTo(elem);
    var klass = 'odd'

    if(show_header){
	var tr = $('<tr />').appendTo(table);
	for(var i in is){
	    var th = $('<th />').text(is[i]).appendTo(tr);
	}
    }

    for(var i in data){

	var tr = $('<tr />').addClass(klass).appendTo(table);
	var line = data[i];

	for(var j in is){
	    var td = $('<td />');

	    var content = line[is[j]];

	    if(typeof content == 'function'){
		content(td);
	    } else {
		td.text(content);
	    }
	    td.appendTo(tr);
	}
	if(klass=='odd')
	    klass = 'even'
	else
	    klass = 'odd'
    }
}



function drawChart(elem, stat, labels) {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Month');
    data.addColumn('number', '% highest score');
    data.addRows(stat.length);

    for(var i=0;i<stat.length;i++){
	data.setValue(i, 0, labels[i]);
	data.setValue(i, 1, parseInt(stat[i][0]));
    }

    var chart = new google.visualization.ColumnChart(elem);
    chart.draw(data,
	       {width: 400,
		height: 240,
		legend: 'none',
		vAxis: {baseline: 0}
               });
}

function lr_chart(elem, stats, name){
    stat = stats[name]['lr'];
    var months = ['Jan','Feb','Mar',
	    'Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
    drawChart(elem, stat, months);
}

function steel_chart(elem, stats, name){
    stat = stats[name]['steel'];
    var months = ['Dec','Feb','Apr','Jun','Aug','Oct'];
    drawChart(elem, stat, months);
}




function show_individual_stats(scores){

    var elem = $('#stats_indivudal, .names');
    elem.empty();

    var card = $('#stats_indivudal, .card');
    card.hide();

    var ol = $('<ol />').appendTo(elem);
    ol.hide();

    var names = [];
    for(var name in scores)
	names.push(name);

    names = names.sort();

    for(var i in names){
	$('<li />').text(names[i]).appendTo(ol);
    }

    ol.selectable({
	selected : function(event, ui) {
	    name = ui.selected.innerText;
	    show_score_card(scores, name);
	}
    }).show('slide');
}

function show_score_card(scores, name){

    var card = $('#stats_indivudal, .card');
    card.fadeOut(150, function(){

	card.find('.name').text(name);
	var lr_scores = scores[name]['lr'];
	var steel_score = scores[name]['steel'];
	var lr = card.find('.lr_data');

	//appendTable(lr, 'Long Range Match', lr_scores, [1,2,3,0]);
	lr_chart(document.getElementById('lr_chart'),scores, name);
	steel_chart(document.getElementById('steel_chart'),scores, name);

	card.fadeIn();
    })
}


function appendTab(div, ul, title){

    var id = title.replace(/\s/g, '_')
    $('<li />').addClass(
	'stat_tab_header'
    ).append($('<a />',{href:'#'+id}
	      ).text(title)
	    ).appendTo(ul);

    return $('<div />',{id:id}).appendTo(div);
}

