var timeplot1;

function invert(data, params) {
    var values = data.values;
    var F = values.length;
    var g = new Array(F);
    for (var t = 0; t < F; t++) {
        g[t] = values[t] * -1;
    }
    return g;
}

Timeplot.ColumnAddSource = function(eventSource, column1, column2, column3) {
    Timeplot.ColumnSource.apply(this, arguments);
    this._column2 = column2 - 1;
    this._column3 = column3 - 1;
};

Object.extend(Timeplot.ColumnAddSource.prototype,Timeplot.ColumnSource.prototype);

Timeplot.ColumnAddSource.prototype._getValue = function(event) {
    var a = parseFloat(event.getValues()[this._column]);
    var b = parseFloat(event.getValues()[this._column2]);
    var c = parseFloat(event.getValues()[this._column3]);
    return a + b + c;
}

function onLoad() {
	var blue = new Timeplot.Color("#222266");
	var lightBlue = new Timeplot.Color("#555599");
	var yellow = new Timeplot.Color("#FFCC33");
	var orange = new Timeplot.Color("#FF9900");
	var dullBg = new Timeplot.Color("#444444");
	dullBg.transparency(0.15);
	var dullLine = new Timeplot.Color("#444444");
	var eventShade = new Timeplot.Color("#111122");

	var gridColor = new Timeplot.Color("#666666");

	var timeGeometry = new Timeplot.DefaultTimeGeometry({
		timeZone: -5,
		gridColor: gridColor,
		axisLabelsPlacement: "top"
	});

	var geometry1 = new Timeplot.DefaultValueGeometry({});
	var geometry2 = new Timeplot.DefaultValueGeometry({
		min: 0
	});

	var eventSource1 = new Timeplot.DefaultEventSource();
	var dataSource1 = new Timeplot.ColumnSource(eventSource1,1);
	var avgAssassin = new Timeplot.Processor(dataSource1, Timeplot.Operator.average, { size: 7 });
	var summedDataSource1 = new Timeplot.Processor(dataSource1, Timeplot.Operator.sum);
	var dataSource2 = new Timeplot.ColumnSource(eventSource1,2);
	var avgThunderbird = new Timeplot.Processor(dataSource2, Timeplot.Operator.average, { size: 7 });
	var tbSummed = new Timeplot.Processor(dataSource2, Timeplot.Operator.sum);
	var dataSource3 = new Timeplot.ColumnSource(eventSource1,3);
	var avgManual = new Timeplot.Processor(dataSource3, Timeplot.Operator.average, { size: 7 });
	var dataSource4 = new Timeplot.ColumnSource(eventSource1,4);
	var negDataSource4 = new Timeplot.Processor(dataSource4, invert);
	var avgFalse = new Timeplot.Processor(negDataSource4, Timeplot.Operator.average, { size: 7 });
	var eventSource5 = new Timeplot.DefaultEventSource();

	var interimSource1 = new Timeplot.ColumnAddSource(eventSource1,1,2,3);
	var summed = new Timeplot.Processor(interimSource1, Timeplot.Operator.sum);
	var avgInterim = new Timeplot.Processor(interimSource1, Timeplot.Operator.average, { size: 7 });

	var plotInfo1 = [
		Timeplot.createPlotInfo({
			id: "Cumulative Total",
			dataSource: summed,
			timeGeometry: timeGeometry,
			lineColor: dullBg,
			fillColor: dullBg,
			fillGradient: false,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "Total",
			dataSource: interimSource1,
			timeGeometry: timeGeometry,
			valueGeometry: geometry1,
			lineColor: dullLine
		}),
		Timeplot.createPlotInfo({
			id: "Events",
			eventSource: eventSource5,
			timeGeometry: timeGeometry,
			lineColor: eventShade
		}),
		Timeplot.createPlotInfo({
			id: "SpamAssassin",
			dataSource: dataSource1,
			timeGeometry: timeGeometry,
			valueGeometry: geometry1,
			lineColor: blue,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "Thunderbird",
			dataSource: dataSource2,
			timeGeometry: timeGeometry,
			valueGeometry: geometry1,
			lineColor: lightBlue,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "Manual",
			dataSource: dataSource3,
			timeGeometry: timeGeometry,
			valueGeometry: geometry1,
			lineColor: yellow,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "SA False Positive",
			dataSource: negDataSource4,
			timeGeometry: timeGeometry,
			valueGeometry: geometry1,
			lineColor: orange,
			showValues: true
		})
	];

	timeplot1 = Timeplot.create(document.getElementById("timeplot1"), plotInfo1);
	timeplot1.loadText("all.txt", " ", eventSource1);
	timeplot1.loadXML("events.xml", eventSource5);

	var plotInfo2 = [
		Timeplot.createPlotInfo({
			id: "Cumulative Total",
			dataSource: summed,
			timeGeometry: timeGeometry,
			lineColor: dullBg,
			fillColor: dullBg,
			fillGradient: false,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "Average Total",
			dataSource: avgInterim,
			timeGeometry: timeGeometry,
			valueGeometry: geometry2,
			lineColor: dullLine,
			showValues: true
		}),
		Timeplot.createPlotInfo({
			id: "Events",
			eventSource: eventSource5,
			timeGeometry: timeGeometry,
			lineColor: eventShade
		}),
		Timeplot.createPlotInfo({
			id: "Average SpamAssassin",
			dataSource: avgAssassin,
			timeGeometry: timeGeometry,
			valueGeometry: geometry2,
			lineColor: blue
		}),
		Timeplot.createPlotInfo({
			id: "Average Thunderbird",
			dataSource: avgThunderbird,
			timeGeometry: timeGeometry,
			valueGeometry: geometry2,
			lineColor: lightBlue
		}),
		Timeplot.createPlotInfo({
			id: "Average Manual",
			dataSource: avgManual,
			timeGeometry: timeGeometry,
			valueGeometry: geometry2,
			lineColor: yellow
		}),
		Timeplot.createPlotInfo({
			id: "Average False Positives",
			dataSource: avgFalse,
			timeGeometry: timeGeometry,
			valueGeometry: geometry2,
			lineColor: orange
		})
	];

	timeplot2 = Timeplot.create(document.getElementById("timeplot2"), plotInfo2);
};

var resizeTimerID = null;
function onResize() {
    if (resizeTimerID == null) {
        resizeTimerID = window.setTimeout(function() {
            resizeTimerID = null;
            if (timeplot1) timeplot1.repaint();
            if (timeplot2) timeplot2.repaint();
        }, 0);
    }
}

/* addEvent function - by Scott Andrew 
 * http://www.scottandrew.com/weblog/articles/cbs-events
 */
function addEvent(obj, evType, fn){ 
	if (obj.addEventListener){ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} else if (obj.attachEvent){ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	} else { 
		return false; 
	} 
}

addEvent(window, "load", onLoad);
addEvent(window, "resize", onResize);
