/*
 * Copyright (C) 2004  Ralf Wiebicke
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/*
 * Interface:
 * - The table with the data must have an id "fuel_table".
 * - To start the computation execute computeFuel().
 * - The buttons to be disabled after computing must have a title "fuel_button".
 * - Table Data Cells (TD) for generated section lines for quarters/years/total
 *   get a CSS class "fuel_quarter" / "fuel_year" / "fuel_total".
 * - Table Data Cells (TD) for generated section headers for
 *   quarters/years/total get a CSS class
 *   "fuel_quarter_head" / "fuel_year_head" / "fuel_total_head".
 */


var prepared = false;
function prepareFuel()
{
	if(prepared)
		return;
	prepared = true;

	var buttons = document.body.getElementsByTagName("input");
	for(j=0; j<buttons.length; j++)
	{
		if(buttons[j].title=="fuel_prepare_button")
			buttons[j].disabled = true;
	}

	var table = document.getElementById("fuel_table");
	var rows=table.rows;
	for(rowCount=0; rowCount<rows.length; rowCount++)
	{
		var row=rows[rowCount].cells;
		if(row[0].tagName=="TH")
			continue;

		// Verbrauch
		rows[rowCount].insertCell(4);
		// Preis pro Liter
		rows[rowCount].insertCell(4);
		// Einzelstrecke
		rows[rowCount].insertCell(2);
		// Laufleistung jaehrlich
		rows[rowCount].insertCell(3);
	}
}


function parse(text, rowCount, description)
{
	var result = parseFloat(text);
	//alert("row "+rowCount+": "+description+" >"+text+"< "+" parsed "+result);
	if(isNaN(result))
		alert("Zeile "+rowCount+": "+description+" ist keine Zahl: >"+text+"<");
	return result;
}

function parseDate(text)
{
	var dayDot = text.indexOf(".");
	var dayString = text.substring(0, dayDot);
	var day = parse(dayString);
	var monthDot = text.indexOf(".", dayDot+1);
	var monthString = text.substring(dayDot+1, monthDot);
	var month = parse(monthString);
	var yearString = text.substring(monthDot+1);
	var year = parse(yearString);
	var result = new Date(year, month-1, day, 12, 0, 0);
	return result;
}

function format(number)
{
	if(isNaN(number))
		return "<b>Fehler&nbsp;!!!</b>";
	else
		return number;
}

function format100(number)
{
	if(isNaN(number))
		return "<b>Fehler&nbsp;!!!</b>";
	else
	{
		var num = Math.round(100 * number) + "";
		var len = num.length;
		var result;
		if(len==1)
			result = "0,0" + num;
		else if(len==2)
			result = "0," + num;
		else
			result = num.substring(0, len-2) + "," + num.substring(len-2, len);

		//result += "<br><small>" + number + "</small>"
		return result ;
	}
}

function format1000(number)
{
	if(isNaN(number))
		return "<b>Fehler&nbsp;!!!</b>";
	else
	{
		var num = Math.round(1000 * number) + "";
		var len = num.length;
		var result;
		if(len==1)
			result = "0,00" + num;
		else if(len==2)
			result = "0,0" + num;
		else if(len==3)
			result = "0," + num;
		else
			result = num.substring(0, len-3) + "," + num.substring(len-3, len);

		//result += "<br><small>" + number + "</small>"
		return result ;
	}
}

function formatSingleRoute(startkilometers, endKilometers)
{
	if(startkilometers!=0)
		return format(endKilometers-startkilometers);
	else
		return "-";
}

function formatYearlyRoute(startDate, endDate, startkilometers, endKilometers)
{
	if(startDate!=null)
	{
		var intervall = (startDate.getTime() - endDate.getTime()) / (1000*60*60*24);
		return Math.round(365 * (startkilometers-endKilometers) / intervall );
	}
	else
		return "-";
}

function formatLiterPrice(price, liters)
{
	return format1000(price/liters);
}

function formatConsumption(liters, startkilometers, endKilometers)
{
	if(startkilometers!=0)
		return format100(100*liters/(endKilometers-startkilometers));
	else
		return "-";
}

function Section(description, classname)
{
	this.description = description;
	this.classname     = "fuel_" + classname;
	this.classnamehead = "fuel_" + classname + "_head";
	this.startDate = null;
	this.startKilometers = 0;
	this.endDate = null;
	this.endKilometers = 0;
	this.liters = 0;
	this.price = 0;
}

function sectionIterate(section, date, kilometers, liters, price)
{
	if(section.startDate==null)
	{
		section.startDate = date;
		section.startKilometers = kilometers;
		section.liters = 0;
		section.price  = 0;
	}
	else
	{
		section.liters += liters;
		section.price  += price;
	}
	section.endDate = date;
	section.endKilometers = kilometers;
}

function sectionWrite(sectionRow, section)
{
	sectionRow.insertCell(0);
	
	if("fuel_quarter"==section.classname & section.endDate!=null)
	{
		sectionRow.cells[0].innerHTML = "Q" + Math.ceil((section.endDate.getMonth() + 1)/3) + "/" + (section.endDate.getYear() + 1900);
	}
	else if("fuel_year"==section.classname & section.endDate!=null)
	{
		sectionRow.cells[0].innerHTML = section.endDate.getYear() + 1900;
	}
	else
		sectionRow.cells[0].innerHTML = section.description;

	sectionRow.cells[0].className = section.classnamehead;

	sectionRow.insertCell(1);
	sectionRow.cells[1].className = section.classname;

	sectionRow.insertCell(2);
	sectionRow.cells[2].innerHTML = formatSingleRoute(section.startKilometers, section.endKilometers);
	sectionRow.cells[2].className = section.classname;

	// Laufleistung jaehrlich
	sectionRow.insertCell(3);
	sectionRow.cells[3].innerHTML = formatYearlyRoute(section.startDate, section.endDate, section.startKilometers, section.endKilometers);
	sectionRow.cells[3].className = section.classname;

	// Menge
	sectionRow.insertCell(4);
	sectionRow.cells[4].innerHTML = format100(section.liters);
	sectionRow.cells[4].className = section.classname;

	// Preis
	sectionRow.insertCell(5);
	sectionRow.cells[5].innerHTML = format100(section.price);
	sectionRow.cells[5].className = section.classname;

	// Preis pro Liter
	sectionRow.insertCell(6);
	sectionRow.cells[6].innerHTML = formatLiterPrice(section.price, section.liters);
	sectionRow.cells[6].className = section.classname;

	// Verbrauch
	sectionRow.insertCell(7);
	sectionRow.cells[7].innerHTML = formatConsumption(section.liters, section.startKilometers, section.endKilometers);
	sectionRow.cells[7].className = section.classname;

	sectionReset(section);
}

function sectionReset(section)
{
	section.startDate = section.endDate;
	section.startKilometers = section.endKilometers;
	section.liters = 0;
	section.price  = 0;
}

var computed = false;
function computeFuel()
{
	prepareFuel();
	if(computed)
		return;
	computed = true;

	var buttons = document.body.getElementsByTagName("input");
	for(j=0; j<buttons.length; j++)
	{
		if(buttons[j].title=="fuel_button")
			buttons[j].disabled = true;
	}

	var lastKilometers = 0;
	var previousDate = null;

	var fullSection = new Section("", "full");
	var quarterSection = new Section("Quartal", "quarter");
	var yearSection = new Section("Jahr", "year");
	var totalSection = new Section("Total", "total");

	var table = document.getElementById("fuel_table");
	var rows=table.rows;
	var last_not_full = false;
	var last_date = null;
	for(rowCount=0; rowCount<rows.length; rowCount++)
	{
		var row=rows[rowCount].cells;
		if(row[0].tagName=="TH")
			continue;

		var date = parseDate(row[0].innerHTML);
		var kilometers = parse(row[1].innerHTML, rowCount, "Die Laufleistung");
		var liters = parse(row[4].innerHTML.replace(/,/,"."), rowCount, "Die Menge");
		var price = parse(row[5].innerHTML.replace(/,/,"."), rowCount, "Der Preis");
		var not_full = row[4].className=="not_full";
		//alert(">"+date+"<>"+kilometers+"<>"+liters+"<>"+price+"<");
		
		if(last_date!=null && last_date.getTime()>date.getTime())
			row[0].innerHTML = row[0].innerHTML + " nicht nach Datum der Vorzeile";
		last_date = date;

		if(previousDate!=null && !not_full)
		{
			if(Math.floor(previousDate.getMonth()/3)!=Math.floor(date.getMonth()/3))
			{
				sectionWrite(table.insertRow(rowCount++), quarterSection);
				if(previousDate.getYear()!=date.getYear())
				{
					sectionWrite(table.insertRow(rowCount++), yearSection);
				}
			}
		}

		sectionIterate(fullSection,    date, kilometers, liters, price);
		sectionIterate(quarterSection, date, kilometers, liters, price);
		sectionIterate(yearSection,    date, kilometers, liters, price);
		sectionIterate(totalSection,   date, kilometers, liters, price);

		if(!not_full)
		{
			if(last_not_full)
				sectionWrite(table.insertRow((rowCount++)+1), fullSection);
			else
				sectionReset(fullSection);
		}

		// Einzelstrecke
		row[2].innerHTML = formatSingleRoute(lastKilometers, kilometers);
		// Laufleistung jaehrlich
		row[3].innerHTML = formatYearlyRoute(previousDate, date, lastKilometers, kilometers);
		// Preis pro Liter
		row[6].innerHTML = formatLiterPrice(price, liters);
		// Verbrauch
		if(not_full||last_not_full)
			row[7].className = "empty";
		else
			row[7].innerHTML = formatConsumption(liters, lastKilometers, kilometers);

		lastKilometers = kilometers;
		previousDate = date;
		last_not_full = not_full;
	}
	sectionWrite(table.insertRow(rows.length), quarterSection);
	sectionWrite(table.insertRow(rows.length), yearSection);
	sectionWrite(table.insertRow(rows.length), totalSection);
}


