/*
	Klapptabelle (c) 2007 J. StrÃ¼big
	http://javascript.jstruebig.de/js/klapptabelle.html
	
	Letzte Ã"nderungen:
	
	07.01.2008
	* Preload der Bilder in die ini-Funktion verschoben
	* RegulÃ¤rer Ausdruck
	
*/
function KlappTabelle(t) {
	var obj = t;
	var rows = [];
	var self = this;

	self.doCloseAll = true;
	self.onopen = self.onclose = function() {};
	
	self.hideAll = function() {
		for(var i = 0; i < rows.length;i++) rows[i].hide();
	};
	self.showAll = function() {
		var tmp = self.doCloseAll;
		for(var i = 0; i < rows.length;i++) {
			rows[i].show();
			self.doCloseAll = false;
		}
		self.doCloseAll = tmp;
	};
	
	function init() {
		var r = obj.getElementsByTagName('tr');
		var akt = null;
		for(var i = 0; i < r.length; i++) {
			if( (r[i].className || '') == KlappTabelle.className) { 
				if(akt && !akt.rows()) akt.disable();
				// Eine neue Hauptreihe initialisieren
				akt = new Part(r[i], self);
				rows.push( akt );
			} else if(akt) akt.addRow( r[i] );
		}
		self.hideAll()
	}
	
	if(obj) init();
	
	////////////////////////////////////////////
	/*
	privates Objekt: Part(row, parent)
	
	Parameter:
	row: 		Die Reihe unter der ausgeblendet werden soll
	parent: 	Das Objekt/Tabelle das die Reihe erzeugt
	
	Funktionen:
	addRow()
	rows()
	show()
	hide()
	disable()
	*/
	////////////////////////////////////////////
	function Part(row, parent) {
		var self = this;	// Zeiger auf das Objekt
		var open = true;	// Flag
		var rows = [];		// Die Reihen die "ein- und ausgeklappt" werden
		
		// anklickbare Grafik zum klappen erzeugen und in die erste Spalte einfÃ¼gen
		var m = document.createElement('img'); 

		m.src = KlappTabelle.marker;
		row.cells[0].insertBefore(m, row.cells[0].firstChild);
		m.style.cursor = 'pointer';
		m.onmouseover = function() {
			var i = this.src.lastIndexOf('.');
			this.src = this.src.substring(0, i) +
			'-invers' + this.src.substring(i);
		};
		m.onmouseout = function() {
			this.src = this.src.replace(/-invers/, '');
		};
		m.onclick = function() {
			if(open) self.hide(); else self.show();
		};

		row.style.cursor = 'pointer';
		row.onmouseover = function() {
			var i = m.src.lastIndexOf('.');
			m.src = m.src.substring(0, i) +
			'-invers' + m.src.substring(i);
		};
		row.onmouseout = function() {
			m.src = m.src.replace(/-invers/, '');
		};
		row.onclick = function() {
			if(open) self.hide(); else self.show();
		};

		// Funktionen
		this.addRow = function(r) { rows[rows.length] = r;};
		this.rows = function() {return rows.length;};
		this.show = function() {
			if(parent.doCloseAll) parent.hideAll();
			if(parent.onopen(parent, row) == false) return false;
			for(var i = 0; i < rows.length; i++) rows[i].style.display = '';
			m.src = m.src.replace(/-auf/, '-zu');
			open = true;
			return true;
		};
		
		this.hide = function() {
			if(!parent.onclose(parent, row) == false) return false;
			for(var i = 0; i < rows.length; i++) rows[i].style.display = 'none';
			m.src = m.src.replace(/-zu/, '-auf');
			open = false;
			return true;
		};
		
		this.disable = function() {
			m.onmouseover = m.onmouseout = 
			m.onclick = function() {};
			var tmp = m.src.replace(/-zu/, '-grey')
			m.src = tmp;
			m.style.cursor = '';
		};
	}
}
KlappTabelle.init = function(callback) {
	// prÃ¼fen ob die Bilder vorhanden sind.
	var img = new Image();
	img.onerror = function() {
		alert('Die Bilder fehlen!\n\nEntweder sind sie an der falschen Stelle oder sie wurden vergessen.\n\nEs wurde versucht:' + this.src + ' zu laden.');
	}
	img.onload = function() {
		// Bilder vorladen?
		if(KlappTabelle.preload) {
			var tmp_1 = new Image();
			var i = this.src.lastIndexOf('.');
			tmp_1.src = this.src.substring(0, i) + '-invers' + this.src.substring(i);
			var tmp_2 = new Image();
			tmp_2.src = this.src.replace(/-zu/, '-auf');
			var tmp_3 = new Image();
			tmp_3.src = this.src.replace(/-zu/, '-grey');
		}
	}
	img.src = KlappTabelle.marker;
	
	
	// Alle Tabellen des Dokuments
	var t = document.getElementsByTagName('table');
	var r = /\bklapptabelle\b/i;
	for(var i = 0; i < t.length; i++) if(t[i].className && r.test(t[i].className)) {
		var tmp = new KlappTabelle(t[i]);
		if(callback) callback(tmp);
	}
};

KlappTabelle.className = 'klapptabelle';
KlappTabelle.preload = true;
KlappTabelle.marker = 'img/pfeil-zu.gif'; 