PageSourceSearch

https://tsv-ottobeuren-handball.de/nutab/tabellen.js

js tsv-ottobeuren-handball.de collected 2026-10-02 22:27:18 UTC 20,020 bytes, 494 lines download raw bytes

1/*
2Copyright (C) 2008 Harald Herberth
3Licence BSD
4Darf frei verwendet werden, solange damit keine Werbung in die erzeugten Tabellen eingefügt wird
5
6Dokumentation siehe im help.html file
7
8BITTE BEACHTEN DASS var server ANGEPASST WERDEN MUSS (weiter unten)
9wird er so gelassen, dann werden die Daten von selben server geladen von dem die Seite geladen wird (dies wird dann die Vereinsseite sein)
10
11Beispiele
12<!-- Einbinden der CSS und JS Dateien -->
13<link rel="stylesheet" type="text/css" href="//SERVER/pfad/tabellen.css">
14<script src="//SERVER/pfad/jquery.js" type="text/javascript"></script>
15<script src="//SERVER/pfad/tabellen.js" type="text/javascript"></script>
16
17<!-- Erzeugt einen Eintrag mit Links auf alle Tabellen, die in die Seite eingebaut wurden -->
18<div class="srsLinks"></div>
19
20<!-- Tabelle mit voller Anzeige -->
21<div class="srsTab" srsurl="..." srsVerein="Zirndorf"></div>
22
23<!-- Spielplan für eineKlasse -->
24<div class="srsPlan" srsurl="..." srsVerein="Zirndorf" srsAlle=1></div>
25
26<!-- Gesamt-Spielplan für einen Verein -->
27<div class="srsPlanVerein" srsclub="..." srsAlle=1></div>
28
29*/
30jQuery(document).ready(function($){
31	if (window.srsLoaded) return;
32	window.srsLoaded = true;
33	$.ajaxSettings.cache = false;
34	// basis ist die URL von der später dann fetch_table.php aufzurufen ist. 
35	// kann auch leer oder unverändert gelassen werden, dann wir der Server genommen von dem aus die Seite geladen wurde
36	// http oder https wird automatisch aus location.protocol bestimmt
37	// SERVER kann ersetzt werden durch den echten Server auf dem fetch_table.php installiert oder genutzt werden soll
38	// immer mit // beginnen und mit / beenden!! Auf das Verzeichnis im Server wo fetch_table installiert ist
39	// und immer mit oder ohne www. davor, abhaengig davon, ob ihr eure Seite mit oder ohne aufruft. Also nur das http(s):: davor weglassen
40	//var server = "//SERVER/pfad/"; // OHNE http: vorne, also nicht http://EuerServer... sondern nur //EuerServer...
41	var server = "//tsv-ottobeuren-handball.de/nutab/"; // OHNE http: vorne, also nicht http://EuerServer... sondern nur //EuerServer...
42	var options = setOptions(server);
43	server = options.server;
44	// da so viele Probleme mit der Server Konfiguration haben, testen wir das gleich
45	if (server && server.indexOf("//") !== 0 || server === "//") {
46		alert("Bitte var server='..' richtig konfigurieren. Ist derzeit: " + server);
47		return;
48	}
49	var basis = !server || window.location.href.match(/localhost/) || server.match(/SERVER/) ? "" : window.location.protocol + server;
50	var links = $("div.srsLinks").empty();
51	var anchors = [];
52	// Eine einzelne Tabelle aus den Daten erstellen
53	var create_table = function(header, fields, data) {
54		var h = '<table class="srs">';
55		if (header !== '-') {
56			h += '<tr class="srs">';
57			$.each(header.split(/;/), function(i,val) {
58				h += '<th class="srs">' + val + '</th>';
59			});
60			h += '</tr>';
61		}
62		$.each(data.constructor == Array ? data : [data], function(i, val) {
63			h += '<tr class="srs">';
64			$.each(fields.split(/;/), function(j, f) {
65				var i, fv, ff, fe, fev, pat, allnull, href;
66				// wird eine Zelle aus mehreren Werten zusamengebaut? (expr+expr+expr...)
67				fv = ""; allnull = true;
68				href = null;
69				if (f.match(/@/)) {
70					// haben wir ein @
71					href = f.split(/@/);
72					f = href[0];
73					href = href[1];
74					href = (val[href] ? val[href] : '');
75					if (href) href = atob(href);
76				}
77				fe = f.split(/\+/);
78				for (i = 0; i < fe.length; i++) {
79					// ein Ausdruck
80					// feld started mit %, also Konstante
81					if (fe[i].match(/^%/))
82						fev = fe[i].substr(1);
83					else {
84						ff = fe[i].split(/\/|!|\xa7/); // xa7 = §
85						fev = (val[ff[0]] ? val[ff[0]] : '');
86						if (fev.length > 0) allnull = false;
87						// is there a pattern match and replace in the field expression (field/pat/replace)
88						ff = fe[i].split(/\//);
89						if (ff.length == 3) {
90							pat = new RegExp(ff[1]);
91							fev = fev.replace(pat,ff[2]); 
92						}
93						// is there a substring expression (field§start§len or sep by !)
94						ff = fe[i].split(/\xa7/);
95						if (ff.length == 3) {
96							fev = fev.substr(ff[1],ff[2]); 
97						}
98						ff = fe[i].split(/!/);
99						if (ff.length == 3) {
100							fev = fev.substr(ff[1],ff[2]); 
101						}
102					}
103					fv = fv + fev;
104				}
105				if (allnull) fv = "";
106				if (href && fv) {
107					fv = '<a target="_blank" href="' + href + '">' + fv + '</a>';
108				}
109				h += '<td class="srs">' + (fv == '' ? '&nbsp;' : fv) + '</td>';
110			});
111			h += '</tr>';
112		});
113		h += '</table>';
114		return h;
115	};
116	// eine tabelle in ein div mit formatieren
117	var show_table = function(div, data, p) {
118		$(div).empty();
119		if (!data) return;
120		if (!p.class) p.class = "srsTable";
121		var h = create_table(p.header, p.fields, data);
122		$(div).html(h);
123		// class für tabelle und felder setzen
124		$(div).find("table.srs").addClass(p.class);
125		var t = $(div).find("tr.srs");
126		$.each(p.classCol.split(/;/), function (i, val) {
127			t.find("td.srs:eq("+i+")").addClass(val).end()
128			 .find("th.srs:eq("+i+")").addClass(val).end();
129		});
130		// eigenen Verein einfärben
131		if (p.verein) t.filter(":contains('"+p.verein+"')").addClass("srsHome");
132	};
133	// alle tabellen (spiele und tabelle) fuer eine klasse
134	var show_tables = function(div, data, p) {
135		$(div).find(".srsLaden").remove();
136		if (!data) return;
137		if (data.error) {$(div).append(data.error); return;}
138		if (+p.minitab) p.auchspiele = "";
139		var d; // temporary div to hold one table
140		var aa;
141		var tennis;
142		tennis = +(data.Aktueller_Spielplan.Tennis ? data.Aktueller_Spielplan.Tennis : 0);
143		// show vorherige_Spiele
144		if (p.auchspiele > 0 && data.Aktueller_Spielplan && data.Aktueller_Spielplan.vorherige_Spiele) {
145			p.header = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].header;
146			p.fields = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].fields;
147			p.classCol = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].classCol;
148			d = $(document.createElement("div"));
149			aa = data.Aktueller_Spielplan.vorherige_Spiele;
150			show_table(d[0], aa, p);
151			$(div).append(d);
152		}
153		// show Tabelle
154		if (data.Aktueller_Spielplan && data.Aktueller_Spielplan.Tabelle) {
155			d = $(document.createElement("div"));
156			if (tennis == 1) {
157				p.header = p.tabellenkopf || "Platz;Mannschaft;Beg.;S;U;N;Punkte;MatchP;S\xe4tze;Spiele";
158				p.fields = p.tabellenspalten || "Platz;Team_Kurzname;Spiele;SpieleGewonnen;SpieleUnentschieden;SpieleVerloren;PlusPunkte+%:+MinusPunkte;PlusMatchPunkte+%:+MinusMatchPunkte;PlusSaetze+%:+MinusSaetze;PlusSpiele+%:+MinusSpiele";
159				p.classCol = p.tabellenformat || "r;l;c;c;c;c;c;c;c;c";
160			} else if (tennis == 2) {
161				p.header = p.tabellenkopf || "Rang;LK;Name, Vorname;Einzel;Doppel;gesamt";
162				p.fields = p.tabellenspalten || "Platz;LK;Team_Kurzname;PlusEinzel+%:+MinusEinzel;PlusDoppel+%:+MinusDoppel;PlusGesamt+%:+MinusGesamt";
163				p.classCol = p.tabellenformat || "r;l;l;c;c;c";
164			} else {
165				p.header = p.tabellenkopf || "Platz;Mannschaft;Spiele;S;U;N;Tore;Diff;Punkte";
166				p.fields = p.tabellenspalten || "Platz;Team_Kurzname;Spiele;SpieleGewonnen;SpieleUnentschieden;SpieleVerloren;PlusTore+%:+MinusTore;DiffTore;PlusPunkte+%:+MinusPunkte";
167				p.classCol = p.tabellenformat || "r;l;c;c;c;c;c;c;c";
168			}
169			if (+p.minitab) {
170				p.header = "Platz;Mannschaft;Punkte";
171				p.fields = "Platz;Team_Kurzname;PlusPunkte";
172				p.classCol = "r;l;c";
173			}
174			show_table(d[0], data.Aktueller_Spielplan.Tabelle, p);
175			// delete unwanted rows
176			// welche Spalte hat denn den Platz, nicht das wir zuviel löschen
177			var sp = $.inArray("Platz", p.fields.split(/;/));
178			if (+p.keineak > 0) {
179				$(d).find("tr.srs").find("td.srs:eq("+sp+"):contains('254')").parents("tr.srs").remove();
180			}
181			if (+p.keineex > 0) {
182				$(d).find("tr.srs").find("td.srs:eq("+sp+"):contains('255')").parents("tr.srs").remove();
183			}
184			$(div).append(d);
185		} else if (data.Teams) {
186			p.header = "Team";
187			p.fields = "sShortName";
188			p.classCol = "l";
189			d = $(document.createElement("div"));
190			show_table(d[0], data.Teams.Teams, p);
191			$(div).append(d);
192		} else {
193			$(div).html("Tabelle nicht gefunden");
194		}
195		// show kommende_Spiele
196		if (p.auchspiele > 0 && data.Aktueller_Spielplan && data.Aktueller_Spielplan.kommende_Spiele) {
197			p.header = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].header;
198			p.fields = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].fields;
199			p.classCol = plan_format[tennis == 1 ? 4 : tennis == 2 ? 6 : 0].classCol;
200			d = $(document.createElement("div"));
201			show_table(d[0], data.Aktueller_Spielplan.kommende_Spiele, p);
202			$(div).append(d);
203		}
204	};
205	// alle Tabellen suchen, und anzeigen
206	var lookup_tables = function() {
207		var divs = $("div.srsTab");
208		divs.each(function(i) {
209			var o = $(this);
210			var div = this;
211			var p = {};
212			var m;
213			// get all attributes srs*
214			$.each([
215				"srsURL", 
216				"srsTitle","srsVerein","srsMinitab","srsAuchSpiele","srsKeineAK", "srsAuchAK", "srsKeine
216Ex", 
217				"srsTabellenSpalten", "srsTabellenKopf", "srsTabellenFormat", "srsClass"
218				], function(i, val) {
219				var m = val.match(/^srs(.*)/);
220				if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
221				val = "data-" + val;
222				if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
223			});
224			if (+p.auchak > 0 && p.keineak !== undefined) p.keineak = 0;
225			if (p.title) m = "<p>"+p.title+"</p>"; else m = "";
226			if (divs.length > 1 && links.length > 0) {
227				m = "<a name=\"srs_a_"+i+"\"></a>" + m;
228				anchors.push('<a href="#srs_a_'+i+'">'+(p.title?p.title:p.klasse?p.klasse:"Tab "+i)+'</a>');
229			}
230			o.html(m+"<p class=\"srsLaden\">" + (window.srsTabMsg || "Tabelle " + (p.klasse || p.liganummer || "")+ " wird geladen") + "</p>");
231			$.ajax({
232			    type: "GET",
233			    url: basis + "fetch_table.php",
234			    data : p, 
235			    dataType: options.ajaxDataType,
236			    success: function(data, textstatus) {
237				show_tables(div, data, p);
238			    },
239			    error: function(XMLHttpRequest, textStatus, errorThrown) {
240				o.html("Error in GET srsTab: " + textStatus);
241			    }
242			});
243		});
244		// Links setzen, wenn alle Ligen (ohne daten) im DOM sind
245		if (anchors.length > 0) links.append(anchors.join(" | "));
246	};
247	// Tabellen suchen und darstellen
248	lookup_tables();
249	// haben wir Spielpläne für eine bestimmte Klasse und Verein
250	// diese ausgeben als datum, zeit, halle, heim, gast
251	$("div.srsPlan").each(function() {
252		var o = $(this);
253		var p = {};
254		var m;
255		// get all attributes srs*
256		$.each([
257			"srsURL", 
258			"srsTitle","srsVerein","srsAlle","srsHeimGast",
259			"srsVon", "srsBis","srsAktuell","srsNeueVorne",
260			"srsNurHalle", "srsOhneHalle", "srsMaxZeilen", "srsClass",
261			"srsTabellenSpalten", "srsTabellenKopf", "srsTabellenFormat"
262			], function(i, val) {
263			var m = val.match(/^srs(.*)/);
264			if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
265			val = "data-" + val;
266			if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
267		});
268		if (!p.verein && !+p.alle && !+p.aktuell) {
269			p.alle = "1";
270			//o.html("Keinen Verein angegeben");
271			//return;
272		}
273		if (p.title) m = "<p>"+p.title+"</p>"; else m = "";
274		o.html(m+"<p class=\"srsLaden\">" + (window.srsPlanMsg || "Spielplan " + (p.klasse || p.liganummer || "") + " wird geladen") + "</p>");
275		p.spielplan = 1;
276		$.ajax({
277		    type: "GET",
278		    url: basis + "fetch_table.php",
279		    data : p, 
280		    dataType: options.ajaxDataType,
281		    success: function(data, textstatus) {
282			show_plan(o.get(), data, p);
283		    },
284		    error: function(XMLHttpRequest, textStatus, errorThrown) {
285			o.html("Error in GET srsPlan: " + textStatus);
286		    }
287		});
288	});
289	// Ausgabeformat fuer den Plan
290	var plan_format = [
291		{ // alles fuer plan
292		"header": "Datum;Zeit;Halle;Heim;Gast;Ergebnis",
293		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;Halle_Kuerzel;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb",
294		"classCol": "l;c;l;l;l;c"
295		},
296		{ // alles fuer planverein
297		"header": "Datum;Zeit;Liga;Halle;Heim;Gast;Ergebnis",
298		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;Liga_Name_kurz;Halle_Kuerzel;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb",
299		"classCol": "l;c;l;l;l;l;c"
300		},
301		{ // ohne halle fuer plan
302		"header": "Datum;Zeit;Heim;Gast;Ergebnis",
303		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb",
304		"classCol": "l;c;l;l;c"
305		},
306		{ // ohne halle fuer planverein
307		"header": "Datum;Zeit;Liga;Heim;Gast;Ergebnis",
308		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;Liga_Name_kurz;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb",
309		"classCol": "l;c;l;l;l;c"
310		},
311		{ // alles fuer plan Tennis
312		"header": "Datum;Zeit;Heim;Gast;MatchPunkte;S\xe4tze;Spiele",
313		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb;Saetze_Heim+%:+Saetze_Gast;Spiele_Heim+%:+Spiele_Gast",
314		"classCol": "l;c;l;l;c;c;c"
315		},
316		{ // alles fuer planverein Tennis
317		"header": "Datum;Zeit;Liga;Heim;Gast;MatchPunkte;S\xe4tze;Spiele",
318		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;Liga_Name_kurz;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb;Saetze_Heim+%:+Saetze_Gast;Spiele_Heim+%:+Spiele_Gast",
319		"classCol": "l;c;l;l;c;c;c"
320		},
321		{ // alles fuer plan Tennis Team
322		"header": "Datum;Zeit;Heim;Gast;MatchPunkte",
323		"fields": "Spieldatum/^..(..).(..).(..).*/$3.$2.$1;Spieldatum/.*T(..:..).*/$1;HeimTeam_Name_kurz;GastTeam_Name_kurz;Heim+%:+Gast@sbb",
324		"classCol": "l;c;l;l;c"
325		},
326		];
327	// einen Plan als table ausgeben
328	var show_plan = function(div, data, p) {
329		var o = $(div);
330		var d, dd, tennis;
331		o.find(".srsLaden").remove();
332		if (data && data.error) {$(div).append(data.error); return;}
333		if (data && data.Spielplan && data.Spielplan.Spielplan) {
334			tennis = +(data.Spielplan.Tennis ? data.Spielplan.Tennis : 0);
335			d = 0; 
336			if (tennis == 1) d = 4;
337			if (p.spielplanverein) d += 1;
338			if (+p.ohnehalle && !tennis) d += 2;
339			if (tennis == 2) d = 6;
340			p.header = p.tabellenkopf || plan_format[d].header;
341			p.fields = p.tabellenspalten || plan_format[d].fields;
342			p.classCol = p.tabellenformat || plan_format[d].classCol;
343			// filtern nach von und bis
344			if (data.Spielplan.von && data.Spielplan.bis && data.Spielplan.von > '' && data.Spielplan.bis > '') {
345				dd = [];
346				$.each(data.Spielplan.Spielplan, function(i, val) {
347					if (val.SpieldatumTag >= data.Spielplan.von 
348						&& val.SpieldatumTag <= data.Spielplan.bis) 
349						dd.push(val);
350				});
351				data.Spielplan.Spielplan = dd;
352			}
353			// filtern nach nach Halle
354			if (p.nurhalle && p.nurhalle > '') {
355				dd = [];
356				var re = new RegExp(p.nurhalle.replace(",", "|"));
357				$.each(data.Spielplan.Spielplan, function(i, val) {
358					if (val.Halle_Kuerzel && val.Halle_Kuerzel.match(re)) 
359						dd.push(val);
360				});
361				data.Spielplan.Spielplan = dd;
362			}
363			var h = create_table(p.header, p.fields, data.Spielplan.Spielplan);
364			d = $(document.createElement("div"));
365			d.html(h);
366			if (!p.class) p.class = "srsTable";
367			d.find("table.srs").addClass(p.class);
368			var t = d.find("tr.srs");
369			$.each(p.classCol.split(/;/), function (i, val) {
370				t.find("td.srs:eq("+i+")").addClass(val).end()
371				 .find("th.srs:eq("+i+")").addClass(val).end();
372			});
373			// eigenen Verein einfärben
374			if (p.verein) {
375				t = d.find("tr.srs:gt(0)");
376				t.filter(":contains('"+p.verein+"')").addClass("srsHome");
377				// rest löschen
378				if (!+p.alle || +p.heimgast) {
379					d.find("tr.srs:gt(0):not(.srsHome)").remove();
380					d.find("tr.srsHome").removeClass("srsHome");
381				}
382				// heim und ausw (Spalte über format bestimmen)
383				var sh = $.inArray("HeimTeam_Name_kurz", p.fields.split(/;/));
384				var sa = $.inArray("GastTeam_Name_kurz", p.fields.split(/;/));
385				t = d.find("tr.srs:gt(0)");
386				t.find("td.srs:eq("+sh+"):contains('"+p.verein+"')").parents("tr.srs").addClass("srsHeim");
387				t.find("td.srs:eq("+sa+"):contains('"+p.verein+"')").parents("tr.srs").addClass("srsAusw");
388				t.find("td.srs:contains('"+p.verein+"')").addClass("srsTabHome");
389				// nur heim oder gast stehen lassen
390				if (+p.heimgast === 1) {
391					d.find("tr.srs:gt(0):not(.srsHeim)").remove();
392				}
393				if (+p.heimgast === 2) {
394					d.find("tr.srs:gt(0):not(.srsAusw)").remove();
395				}
396			}
397			// überzählige löschen 
398			if (+p.maxzeilen > 0) d.find("tr.srs:gt(" + (+p.maxzeilen) + ")").remove();
399			// gestrichene Spiele markieren, Die Zeit ist bei solchen Spielen "00:0."
400			d.find("tr.srs td.srs:contains('00:0')").parents("tr.srs").addClass("srsSpielGestrichen");
401			o.append(d);
402		} else {
403			o.append("<p>Keine Spiele gefunden, die den Suchbedingungen entsprechen</p>");
404		}
405
406	}
407	// Gesamtspielplan für einen Verein
408	$("div.srsPlanVerein").each(function() {
409		var o = $(this);
410		var p = {};
411		var m;
412		// get all attributes srs*
413		$.each([
414			"srsClub", "srsVerband", "srsSportart", 
415			"srsTitle","srsVerein","srsAlle", "srsHeimGast", 
416			"srsVon", "srsBis", "srsNeueVorne", 
417			"srsNurHalle", "srsOhneHalle", "srsMaxZeilen", "srsClass",
418			"srsTabellenSpalten", "srsTabellenKopf", "srsTabellenFormat" 
419			], function(i, val) {
420			var m = val.match(/^srs(.*)/);
421			if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
422			val = "data-" + val;
423			if (m && o.attr(val)) {p[m[1].toLowerCase()] = o.attr(val); }
424		});
425		if (!p.verein && !p.club) {
426			o.html("Keinen Verein angegeben");
427			return;
428		}
429		// sind mehrere clubs zu mischen
430		p.club = p.club || "";
431		var clubs = p.club.split(",");
432		var dataAll = [];
433		p.club = clubs.shift();
434		if (p.title) m = "<p>"+p.title+"</p>"; else m = "";
435		o.html(m+"<p class=\"srsLaden\">" + (window.srsPlanMsg || "Gesamt-Spielplan " + "" + " wird geladen") + "</p>");
436		p.spielplanverein = 1;
437		var processPart = function() {
438			var ligen = p.club.split("/");
439			p.club = ligen.shift();
440			if (ligen.length) ligen = ligen.join("/").toLowerCase().split(";");
441			$.ajax({
442			    type: "GET",
443			    url: basis + "fetch_table.php",
444			    data : p, 
445			    dataType: options.ajaxDataType,
446			    success: function(data, textstatus) {
447				    if (data && data.error) {show_plan(o.get(), data, p); return;}
448				    if (data && data.Spielplan && data.Spielplan.Spielplan) {
449					    dataAll = dataAll.concat(data.Spielplan.Spielplan.filter(function(x) {
450						    if (!x.Liga_Name_kurz) return true;
451						    return ligen.length == 0 || ligen.indexOf(x.Liga_Name_kurz.toLowerCase()) >= 0;
452						}));
453				    }
454				    if (clubs.length > 0) {
455					    p.club = clubs.shift();
456					    processPart();
457					    return;
458				    }
459				    if (dataAll.length) {
460					    dataAll.sort(function(a,b) {
461						    if (a.Spieldatum < b.Spieldatum) return (p.neuevorne > 0 ? 1 : -1);
462						    if (a.Spieldatum > b.Spieldatum) return (p.neuevorne > 0 ? -1 : 1);
463						    return 0;
464					    });
465				    }
466				    data.Spielplan.Spielplan = dataAll;
467				    p.alle = 0;
468				    show_plan(o.get(), data, p);
469			    },
470			    error: function(XMLHttpRequest, textStatus, errorThrown) {
471				    o.html("Error in GET srsPlanVerein: " + textStatus);
472			    }
473			});
474		}
475		processPart();
476	});
477	function setOptions(server) {
478		var o = {
479			server: server,
480			ajaxDataType: "json",
481		};
482		$("div.srsConf").each(function() {
483			var c = $(this);
484			for (var x in o) {
485				var aname = "srs" + x;
486				if (c.attr(aname)) o[x] = c.attr(aname);
487				aname = "data-" + aname;
488				if (c.attr(aname)) o[x] = c.attr(aname);
489			}
490		});
491		return o;
492	}
493});
494

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.