/*
Copyright (C) 2008 Harald Herberth
tabellen von ISS3 laden (über handball-sr-mittelfranken.de)
und diese Tabellen in einem eigenen Format darstellen.
Format kann über CSS angepasst werden

Beispiele
<!-- Einbinden der CSS und JS Dateien -->
<link rel="stylesheet" type="text/css" href="http://handball-sr-mittelfranken.de/tabellen/tabellen.css">
<script src="http://handball-sr-mittelfranken.de/tabellen/jquery.js" type="text/javascript"></script>
<script src="http://handball-sr-mittelfranken.de/tabellen/tabellen.js" type="text/javascript"></script>

<!-- Erzeugt einen Eintrag mit Links auf alle Tabellen, die in die Seite eingebaut wurden -->
<div class="srsLinks"></div>

<!-- Tabelle mit voller Anzeige -->
<div class="srsTab" srsKlasse="BOLWJA" srsVerein="Zirndorf"></div>
<div class="srsTab" srsKlasse="BOLMJA" srsVerein="Altenberg"></div>
<div class="srsTab" srsKlasse="BKM2" srsVerein="Altenberg"></div>

<!-- Erzeugt obige Einträge automatisch für alle Tabellen eines Vereins -->
<div class="srsTabVerein" srsTitle="lang" srsVerein="Zirndorf" srsAuchSpiele=1></div>

<!-- Spielplan für einen Verein -->
<div class="srsPlan" srsKlasse="BOLWJA" srsVerein="Zirndorf" srsAlle=1></div>

*/
jQuery(document).ready(function($){
	$.ajaxSettings.cache = false;
	var links = $("div.srsLinks").empty();
	var anchors = [];
	// Eine einzelne Tabelle aus den Daten erstellen
	var create_table = function(header, fields, data) {
		var h = '<table><tr>';
		$.each(header.split(/;/), function(i,val) {
			h += "<th>" + val + "</th>";
		});
		h += '</tr>';
		$.each(data.constructor == Array ? data : [data], function(i, val) {
			h += "<tr>";
			$.each(fields.split(/;/), function(j, f) {
				var fv, ff, fe, fev;
				// wird eine Zelle aus mehreren Werten zusamengebaut? (expr+expr+expr...)
				fv = "";
				fe = f.split(/\+/);
				for (var i = 0; i < fe.length; i++) {
					// ein Ausdruck
					ff = fe[i].split(/\/|§/);
					// feld started mit %, also Konstante
					if (ff[0].match(/^%/))
						fev = ff[0].substr(1);
					else
						fev = (val[ff[0]] && val[ff[0]].$ ? val[ff[0]].$ : '');
					// is there a pattern match and replace in the field expression (field/pat/replace)
					ff = fe[i].split(/\//);
					if (ff.length == 3) {
						eval("fev = fev.replace(/"+ff[1]+"/,'"+ff[2]+"')"); 
					}
					// is there a substring expression (field§start§len)
					ff = fe[i].split(/§/);
					if (ff.length == 3) {
						eval("fev = fev.substr("+ff[1]+","+ff[2]+")"); 
					}
					fv = fv + fev;
				}
				h += "<td>" + (fv == '' ? '&nbsp;' : fv) + "</td>";
			});
			h += "</tr>";
		});
		h += '</table>';
		return h;
	};
	// eine tabelle in ein div mit formatieren
	var show_table = function(div, data, p) {
		$(div).empty();
		if (!data) return;
		if (!p.classtable) p.classtable = "srsTable";
		var h = create_table(p.header, p.fields, data);
		$(div).html(h);
		// class für tabelle und felder setzen
		$(div).find("table").addClass(p.classtable);
		var t = $(div).find("tr");
		$.each(p.classCol.split(/;/), function (i, val) {
			t.find("td:eq("+i+")").addClass(val).end()
			 .find("th:eq("+i+")").addClass(val).end();
		});
		// eigenen Verein einfärben
		t.filter(":contains('"+p.verein+"')").addClass("srsHome");
	};
	// alle tabellen (spiele und tabelle) fuer eine klasse
	var show_tables = function(div, data, p) {
		if (data.error && data.error.$) {$(div).append(data.error.$); return;}
		$(div).find(".srsLaden").remove();
		if (p.minitab) p.auchspiele = "";
		var d; // temporary div to hold one table
		// show vorherige_Spiele
		if (p.auchspiele > 0 && data.Aktueller_Spielplan && data.Aktueller_Spielplan.vorherige_Spiele) {
			p.header = "Datum;Zeit;Heim;Gast;Tore";
			p.fields = "SpieldatumTag/^..(..).(..).(..)$/$3.$2.$1;Spieldatum§11§5;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast";
			p.classCol = "l;l;l;l;c;c";
			d = $(document.createElement("div"));
			show_table(d[0], data.Aktueller_Spielplan.vorherige_Spiele, p);
			$(div).append(d);
		}
		// show Tabelle
		if (data.Tabelle || data.Aktueller_Spielplan && data.Aktueller_Spielplan.Tabelle) {
			d = $(document.createElement("div"));
			p.header = p.tabellenkopf || "Platz;Mannschaft;Spiele;g;u;v;Tore;Diff;Punkte";
			p.fields = p.tabellenspalten || "Platz;Team_Kurzname;Spiele;SpieleGewonnen;SpieleUnentschieden;SpieleVerloren;PlusTore+%:+MinusTore;DiffTore;PlusPunkte+%:+MinusPunkte";
			p.classCol = p.tabellenformat || "r;l;c;c;c;c;c;c;c;c";
			if (p.minitab) {
				p.header = "Platz;Mannschaft;Punkte";
				p.fields = "Platz;Team_Kurzname;PlusPunkte";
				p.classCol = "r;l;c";
			}
			show_table(d[0], (data.Tabelle || data.Aktueller_Spielplan).Tabelle, p);
			// delete unwanted rows
			// welche Spalte hat denn den Platz, nicht das wir zuviel löschen
			var sp = $.inArray("Platz", p.fields.split(/;/));
			if (+p.keineak > 0) {
				$(d).find("tr").find("td:eq("+sp+"):contains('254')").parent().remove();
			}
			if (+p.keineex > 0) {
				$(d).find("tr").find("td:eq("+sp+"):contains('255')").parent().remove();
			}
			// sort, since ISS3 does not always return the table sorted
			var st = $(d).find("tr:gt(0)").get(); // first row contains header, do not sort
			$.each(st, function(i, val) {
				val.tabellen_rang = parseInt($(val).find("td:eq("+sp+")").text());
			});
			st.sort(function(a, b) {
				if (a.tabellen_rang < b.tabellen_rang) return -1;
				if (a.tabellen_rang > b.tabellen_rang) return 1;
				return 0;
			});
			$.each(st, function(i, val) {
				val.tabellen_rang = null;
				$(d).find("table").append(val);
			});
			$(div).append(d);
		} else {
			$(div).html("Tabelle nicht gefunden");
		}
		// show kommende_Spiele
		if (p.auchspiele > 0 && data.Aktueller_Spielplan && data.Aktueller_Spielplan.kommende_Spiele) {
			p.header = "Datum;Zeit;Heim;Gast;Tore";
			p.fields = "SpieldatumTag/^..(..).(..).(..)$/$3.$2.$1;Spieldatum§11§5;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast";
			p.classCol = "l;l;l;l;c;c";
			d = $(document.createElement("div"));
			show_table(d[0], data.Aktueller_Spielplan.kommende_Spiele, p);
			$(div).append(d);
		}
	};
	// alle ligen suchen, und anzeigen
	var lookup_tables = function() {
		var divs = $("div.srsTab");
		divs.each(function(i) {
			var o = $(this);
			var div = this;
			var p = {};
			var m;
			// get all attributes srs*
			$.each(["srsTitle","srsVerein","srsKlasse","srsMinitab","srsAuchSpiele","srsKeineAK", "srsKeineEx", 
				"srsLigaNummer", "srsSeason",
				"srsURL", "srsTabellenSpalten", "srsTabellenKopf", 
				"srsTabellenFormat"], function(i, val) {
				var m = val.match(/^srs(.*)/);
				if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
			});
			if (p.title) m = "<p>"+p.title+"</p>"; else m = "";
			if (divs.length > 1 && links.length > 0) {
				m = "<a name=\"srs_a_"+i+"\"></a>" + m;
				anchors.push('<a href="#srs_a_'+i+'">'+(p.title?p.title:p.klasse?p.klasse:"Tab "+i)+'</a>');
			}
			o.html(m+"<p class=\"srsLaden\">" + (window.srsTabMsg || "Tabelle für " + (p.klasse || p.liganummer)+ " wird geladen") + "</p>");
			$.ajax({
			    type: "GET",
			    url: "http://handball-sr-mittelfranken.de/tabellen/fetch_table.php",
			    data : p, 
			    dataType: "jsonp",
			    success: function(data, textstatus) {
				show_tables(div, data, p);
			    },
			    error: function(XMLHttpRequest, textStatus, errorThrown) {
				o.html("Error: " + textStatus);
			    }
			});
		});
		// Links setzen, wenn alle Ligen (ohne daten) im DOM sind
		if (anchors.length > 0) links.append(anchors.join(" | "));
	};
	// haben wir tabellen für alle mannschaften eines Vereins?
	var v = $("div.srsTabVerein");
	if (v.length) {
		// wenn ja, ersetzen durch alle einzelnen Tabellen für diesen Verein
		v.each(function() {
			var o = $(this);
			var p = {};
			// get all attributes srs*
			$.each(["srsVerein", "srsTitle", "srsMinitab","srsAuchSpiele","srsKeineAK", "srsKeineEx", 
				"srsTabellenSpalten", "srsTabellenKopf", "srsTabellenFormat"], function(i, val) {
				var m = val.match(/^srs(.*)/);
				if (m && o.attr(val)) {p["srs"+m[1].toLowerCase()] = o.attr(val); }
			});
			$.ajax({
			    type: "GET",
			    url: "http://handball-sr-mittelfranken.de/tabellen/tabsproverein.php",
			    data : p, 
			    dataType: "jsonp",
			    success: function(data, textstatus) {
				if (!data) data = "<div>";
				o.replaceWith($(data));
				// wenn alle Vereinstabellen aufgelöst, die einzelnen Tabellen suchen und darstellen
				if ($("div.srsTabVerein").length == 0) lookup_tables();
			    },
			    error: function(XMLHttpRequest, textStatus, errorThrown) {
				o.html("Error: " + textStatus);
			    }
			});
		});
	} else {
		// wenn nein, einzelne Tabellen suchen und darstellen
		lookup_tables();
	}
	// haben wir Spielpläne für eine bestimmte Klasse und Verein
	// diese ausgeben als datum, zeit, heim, gast, halle
	$("div.srsPlan").each(function() {
		var o = $(this);
		var p = {};
		var m;
		// get all attributes srs*
		$.each(["srsTitle","srsVerein","srsKlasse", "srsAlle",
			"srsLigaNummer", "srsSeason",
			"srsURL", "srsTabellenSpalten", "srsTabellenKopf", 
			"srsTabellenFormat"], function(i, val) {
			var m = val.match(/^srs(.*)/);
			if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
		});
		if (!p.verein && !p.alle) {
			o.html("Keinen Verein angegeben");
			return;
		}
		if (p.title) m = "<p>"+p.title+"</p>"; else m = "";
		o.html(m+"<p class=\"srsLaden\">" + (window.srsPlanMsg || "Spielplan für " + (p.klasse || p.liganummer) + " wird geladen") + "</p>");
		p.spielplan = 1;
		$.ajax({
		    type: "GET",
		    url: "http://handball-sr-mittelfranken.de/tabellen/fetch_table.php",
		    data : p, 
		    dataType: "jsonp",
		    success: function(data, textstatus) {
			show_plan(o.get(), data, p);
		    },
		    error: function(XMLHttpRequest, textStatus, errorThrown) {
			o.html("Error: " + textStatus);
		    }
		});
	});
	// einen Plan als table ausgeben
	var show_plan = function(div, data, p) {
		var o = $(div);
		var d;
		o.find(".srsLaden").remove();
		if (data && data.Spielplan && data.Spielplan.Spielplan) {
			p.header = p.tabellenkopf || "Datum;Zeit;Heim;Gast;Halle;Ergebnis";
			p.fields = p.tabellenspalten || "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;HeimTeam_Name_kurz;GastTeam_Name_kurz;Halle_Kuerzel;Heim+%:+Gast";
			p.classCol = p.tabellenformat || "l;c;l;l;l;c";
			var h = create_table(p.header, p.fields, data.Spielplan.Spielplan);
			d = $(document.createElement("div"));
			d.html(h);
			if (!p.classtable) p.classtable = "srsTable";
			d.find("table").addClass(p.classtable);
			var t = d.find("tr");
			$.each(p.classCol.split(/;/), function (i, val) {
				t.find("td:eq("+i+")").addClass(val).end()
				 .find("th:eq("+i+")").addClass(val).end();
			});
			// eigenen Verein einfärben
			t = d.find("tr:gt(0)");
			t.filter(":contains('"+p.verein+"')").addClass("srsHome");
			// rest löschen
			if (!+p.alle) {
				d.find("tr:gt(0):not(.srsHome)").remove();
				d.find("tr.srsHome").removeClass("srsHome");
			}
			// heim und ausw (Spalte über format bestimmen)
			var sh = $.inArray("HeimTeam_Name_kurz", p.fields.split(/;/));
			var sa = $.inArray("GastTeam_Name_kurz", p.fields.split(/;/));
			t.find("td:eq("+sh+"):contains('"+p.verein+"')").parent().addClass("srsHeim");
			t.find("td:eq("+sa+"):contains('"+p.verein+"')").parent().addClass("srsAusw");
			t.find("td:contains('"+p.verein+"')").addClass("srsTabHome");
			o.append(d);
		} else {
			o.append("<p>Spieplan konnnte nicht geladen werden</p>");
		}

	}
	
});

