/*******************************************************
*	Notenrechner Version 0.5
*	27.01.2006
*	Carsten Rammoser - carsten@rammoser.com
*
******************************************************/


// Definition der Kurse incl. Container.
// Parameter 1: Container-Nummer
// Parameter 2: Gewichtung
// Parameter 3: Array mit Kurs-Objekten
var diplom = new Array(
	new Container(0, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0))),
	new Container(1, 1, new Array(new Kurs(0, 1, 0))),
	new Container(2, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0))),
	new Container(3, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0), new Kurs(2, 1, 0))),
	new Container(4, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0), new Kurs(2, 1, 0))),
	new Container(5, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0), new Kurs(2, 1, 0))),
	new Container(6, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0))),
	new Container(7, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0))),
	new Container(8, 2, new Array(new Kurs(0, 1, 0))),
	new Container(9, 1, new Array(new Kurs(0, 1, 0))),
	new Container(10, 1, new Array(new Kurs(0, 1, 0), new Kurs(1, 1, 0), new Kurs(2, 1, 0))),
	new Container(11, 3, new Array(new Kurs(0, 1, 0)))
);

// gewichtete Gesamtnote
var diplomNote = 0;
var alleNotenGesetzt = true;

function doCalc() {
	diplomNote = 0;
	alleNotenGesetzt = true;
	for (var i = 0; i < diplom.length; i++) {	
		diplom[i].resetValues();
		diplom[i].updateGrades();
		diplom[i].calcContainerGrade();
		if (diplom[i].note >= 1) {	
			document.getElementById("ausg" + i).innerHTML = diplom[i].note;
		} else {
			document.getElementById("ausg" + i).innerHTML = "";
		}
	}
	calcTotalGrade();
	if (alleNotenGesetzt == true) {
		document.getElementById("gesnote").className = "alleNoten";
	} else {
		document.getElementById("gesnote").className = "nichtAlleNoten";
	}
	document.getElementById("gesnote").innerHTML = diplomNote.toFixed(2);
}

// Kurs-Klasse:
function Kurs(id, gewichtung, note) {
	this.id = id;
	this.gewichtung = gewichtung;
	this.note = note;
}

// Container-Klasse:
function Container(id, gewichtung, kurse) {
	this.id = id;
	this.gewichtung = gewichtung;
	this.kurse = kurse;
	this.note = 0;
}

// berechnet die Durchschnittsnote de Containers
function calcContainerGrade() {
	var kurse = this.kurse;
	var notenSumme = 0;
	var kursAnzahl = 0;
	for (var i = 0; i < kurse.length; i++) {
		if (kurse[i].note != 0) {
			notenSumme += kurse[i].note * kurse[i].gewichtung;
			kursAnzahl += kurse[i].gewichtung;
		}
	}
	var schnitt = notenSumme / kursAnzahl;
	if (schnitt > 0) {
		// Rundet. Wegen JS-Rechenfehler Addition von 0.01 nötig
		this.note = (Math.floor(schnitt *10 + 0.01)) / 10;
	}
}

// berechnet die gewichtete Gesamtnote
function calcTotalGrade() {
	var d = diplom;
	var notenSumme = 0;
	var notenAnzahl = 0;
	var t;
	for (var i = 0; i < d.length; i++) {
		t = d[i].note;
		if (t != 0 && t != "" && t != "undefined") {
			notenSumme += t * d[i].gewichtung;
			notenAnzahl += d[i].gewichtung;
		}		
	}
	if (notenAnzahl > 0) {
		diplomNote = (Math.floor((notenSumme / notenAnzahl) * 100) / 100);
	}
}

// fügt dem Container neue Kurse hinzu
function addCourse(kurs) {
	this.kurse.push(kurs);
}

// schreibt die Noten aus den Formulareldern in die Objekte
function updateGrades() {
	var k = this.kurse;
	var n;
	for (var i = 0; i < k.length; i++) {
		n = document.getElementById("f" + this.id + "_" + i).value;
		n = n.replace(/,/, ".");
		n = parseFloat(n);
		
		if (n >= 1 && n <= 5 && n != "" && n != "undefined" && n != "NaN") {
			k[i].note = n;
		} else {
			k[i].note = 0;
			alleNotenGesetzt = false;
		}
	}
}

// setzt noten usw. zurück
function resetValues() {
	this.note = 0;
	var k = this.kurse;
	for (var i = 0; i < k.length; i++) {
		k[i].note = 0;
	}
}

// Methoden von Container
Container.prototype.calcContainerGrade = calcContainerGrade;
Container.prototype.addCourse = addCourse;
Container.prototype.updateGrades = updateGrades;
Container.prototype.resetValues = resetValues;