(function () {
    function Graph(elem, ltdata, error) {
	var chart = c3.generate({
		bindto: elem,
		size: {
		    width: 1200,
		    height: error ? 400 : 600,
		},
		data: {
			columns: ltdata['data'],
			regions: {
				'ideal': error ? [] : [{'start': 0, 'style': 'dashed'}]
			},
			colors: {
				'ideal': '#bbbbbb',
				'txrate': '#bbbbbb',
			},
			axes: {
			    'txrate': 'y2'
			}
		},
		point: {
			show: false
		},
		axis: {
			x: {
				tick: {
					values: ltdata['ticks'],
				},
				label: {
					text: 'seconds',
					position: 'outer-center'
				}
			},
			y: {
				min: 0,
				max: error ? 1 : ltdata['max'],
				padding: { top: 0, bottom: 0 },
				type: (error ? 'log' : 'linear'),
				tick: {
				    format: d3.format('.3f'),
				},
				label: {
				    text: (error ? 'err fraction of txrate (log)' : ltdata['yprefix'] + 'pps'),
				    position: 'outer-middle'
				}
			},
			y2: {
				show: true,
				min: 0,
				max: error ? ltdata['max'] : 1,
				type: (error ? 'linear' : 'linear'),
				tick: {
				    format: d3.format(error ? '.3f' : '.1f'),
				},
				padding: { top: 0, bottom: 0 },
				label: {
					text: error ? 'txrate ' + ltdata['yprefix'] + 'pps' : 'fraction of linerate',
					position: 'outer-middle'
				}
			}
		},
		grid: {
			y: {
			    lines: error ? [{value: ltdata['ft'], text: 'fail threshold', class: 'ft', position: 'start'}] : [{value: ltdata['max']}]
			}
		}
	});
    }

    function LoadtestGraph(elem, ltdata) {
	return Graph(elem, ltdata, false);
    }

    function ErrorGraph(elem, ltdata) {
	return Graph(elem, ltdata, true);
    }

    $(window).on("load", function() {
		$('div.loadtest-graph').each(function(index, el) {
			if (el.dataset.ltdata) {
				LoadtestGraph(el, JSON.parse(el.dataset.ltdata));
			} else if (el.dataset.errdata) {
				ErrorGraph(el, JSON.parse(el.dataset.errdata));
			}
		});
    });

})();