Modul:Vorlage:Infobox Sendeanlage

Die Dokumentation für dieses Modul kann unter Modul:Vorlage:Infobox Sendeanlage/Doku erstellt werden

-- Allgemeine Variablen
local ModulStamm = "Modul:Vorlage:Infobox Sendeanlage" -- Stammverzeichnis des Moduls
local SN = mw.title.getCurrentTitle().text -- Seitenname des Artikels
local SR = mw.title.getCurrentTitle().rootText -- Basis-Seitenname des Artikels
local SU = mw.title.getCurrentTitle().subpageText -- Name der Unterseite des Artikels
-- local SI = mw.title.getCurrentTitle():getContent() -- Inhalt der Artikelseite
local NSP = mw.title.getCurrentTitle().namespace -- Namensraum des Artikels
local ZN = 0 -- allgemeiner Zaehler
local ZZ = "" -- allgemeines Zeichen
local ZF = {} -- allgemeines Feld
local Daten = { }
local Kategorien = { { } }
local DN = {}

-- Zuladen exportierter Datensaetze
local Label = require( ModulStamm .. "/Label" )
local Daten = Label.Label( SN )
local Geo = Label.Geo()
local Bezeichner = Label.Bezeichner()
local Tabelle = Label.Tabelle()
local OPK = Label.OPK()

-- Ermittung Typ des Bauwerkes
function TYP( Alle, DatenWL, frame )
	local WLD = mw.getCurrentFrame():getParent().args.CAT_TYP
	if (WLD == "" or WLD == nil) then WLD = frame.args.CAT_TYP end
	if (WLD == "" or WLD == nil) then WLD = DatenWL end
	if (WLD == "" or WLD == nil) then WLD = "Anlage" end
	return WLD
end

function CCN( SN, DatenWL, frame )
	local NCC = { }
	local ZZ = ""
	local YY = ""
	
	-- Ermittlung Stadt-Kategorie
	ZZ = mw.getCurrentFrame():getParent().args.CAT_STADT
	if (ZZ == "" or ZZ == nil) then ZZ = frame.args.CAT_STADT end
	if (ZZ == "" or ZZ == nil) then ZZ = DatenWL.CAT_STADT end
	if ZZ == nil then ZZ = "" end
	YY = mw.text.split( ZZ, "/")
	NCC.CSTADT = { }
	NCC.DSTADT = { }
	for DCk, DCv in pairs( YY ) do
		if string.sub( DCv, 0, 7 ) == "in der " then
			NCC.CSTADT[DCk] = string.sub( DCv, 8 )
			NCC.DSTADT[DCk] = DCv
		elseif (string.sub( DCv, 0, 3 ) == "in " or string.sub( DCv, 0, 3 ) == "im ") then
			NCC.CSTADT[DCk] = string.sub( DCv, 4 )
			NCC.DSTADT[DCk] = DCv
		else
			NCC.CSTADT[DCk] = DCv
			NCC.DSTADT[DCk] = "in " .. DCv
		end
	end
	if NCC.CSTADT[1] == "" then
		NCC.CSTADT[1] = nil
		NCC.DSTADT[1] = nil
	end
	
	-- weitere Ermittlungen zur Kategorisierung
	ZZ = mw.getCurrentFrame():getParent().args["NAME"]
	if (ZZ == "" or ZZ == nil) then ZZ = frame.args["NAME"] end
	if (ZZ == "" or ZZ == nil) then ZZ = DatenWL["NAME"] end
	if ZZ == "" then ZZ = nil end
	NCC.NNAME = ZZ or SN
	ZZ = mw.getCurrentFrame():getParent().args.CAT_NAME
	if (ZZ == "" or ZZ == nil) then ZZ = frame.args.CAT_NAME end
	if (ZZ == "" or ZZ == nil) then ZZ = DatenWL.CAT_NAME end
	if ZZ == "" then ZZ = nil end
	NCC.CNAME = ZZ or NCC.NNAME
	return NCC
end

-- Datensaetze aufbereiten
function DS_Aufbereitung( DSZusatz, DatenX, frame )
	-- Datenvariablen extrahieren
	local Daten = DatenX
	local DN = { }
	local Kategorien = { }
	
	-- Einzeldurchgang der Datensaetze
	for DSi, DS in pairs( Daten ) do
		
		-- Standard-Aufarbeitung aus Auslagerung aufrufen
		ZF = DSZusatz.Aufbereitung.AufarbStand( DS, DSZusatz, Kategorien, frame )
		DS = ZF.DS
		Kategorien = ZF.Kategorien
		
		-- DN erzeugen
		DN[DS.Name] = DS
	end
	if DSZusatz.Typ == "Mast" then table.insert( Kategorien, { "Sendemast", "Cat", Name = "TypMast" } ) end
	
	
	-- Datensaetze fuer Infobox bearbeiten
	local DSMA = {
		"NAME", --        Einheitlicher Parameter NAME
		"UE1", --         Ueberschrift der Infobox
		"IBBild", --      Anzeige Bild
		"Regionen", --    Anzeige der Regionen (Bundesland, Staat)
		"LAGEPUNKT", --   Hoehenlage
		"ZUGANG", --      Zugaenglichkeit
		"IBTBau", --      Zusammenfassung fuer Turmbau
		"IBTHoch", --     Zusammenfassung fuer Turm-Einzelhoehen
		"IBSHoch", --     Zusammenfassung fuer Sendeanlagen-Einzelheiten
		"KOORDINATEN", -- Gueltigkeitspruefung 'KOORDINATEN'
		"POSKARTE", --    Positionskarte 'POSKARTE'
		"KoordKarte" --   Anzeige Koordinaten 'KoordKarte'
	}
	local DSIB = {} --  nur uebergangsweise
	
		-- Anzeige Test
	DSIB.Test = function ( DN, DSZusatz, Kategorien, frame )
		
		local DSMB = { }
		
		return DN
	end
	
	for DSMAk, DSMAv in pairs( DSMA ) do
		DN = DSZusatz.Aufbereitung.DSIB[DSMAv]( DN, DSZusatz, Kategorien, frame )
		if DN.TMP_KAT then
			for DSMAx, DSMAy in pairs( DN.TMP_KAT ) do
				table.insert( Kategorien, DSMAy )
			end
			DN.TMP_KAT = nil
		end
	end
	
	DN = DSIB.Test( DN, DSZusatz, Kategorien, frame )
	
	
	-- Bau- und Abrissdekade
	if DN.BAU_DEKADE.WertZeile then table.insert( Kategorien, { "Erbaut in den " .. DN.BAU_DEKADE.WertZeile .. "0er Jahren" } ) end
	if DN.ABR_DEKADE.WertZeile then
		table.insert( Kategorien, { "Zerstört in den " .. DN.ABR_DEKADE.WertZeile .. "0er Jahren" } )
		table.insert( Kategorien, { "Abgegangenes Bauwerk", "GeoN"  } )
	end
	
	-- Ehemaliger Gastronomiebetrieb
	local EGB = { Restaurant = false, Abriss = false, Dekade = false }
	for EGB1k, KFS1v in pairs( DN.VERW.WertSplit ) do
		if (KFS1v == "Restaurant" or KFS1v == "Drehrestaurant") then EGB.Restaurant = true end
	end
	if DN.ABRISS.WertZeile then EGB.Abriss = true end
	if DN.ABR_DEKADE.WertZeile then EGB.Dekade = true end
	if (EGB.Restaurant == true and (EGB.Abriss == true or EGB.Dekade == true) )	then table.insert( Kategorien, { "Ehemaliger Gastronomiebetrieb", "GeoN"  } ) end
	
	-- Datenvariablen fuer Rueckgabe vorbereiten
	local DSRueck = {
		Daten = Daten,
		DN = DN,
		Kategorien = Kategorien
	}	
	return DSRueck
end

-- Wartung
function Wartung( DSZusatz, Daten, DN, Kategorien, frame )
	local WartungGesamt = require( ModulStamm .. "/Wartung" )
	local Wartung = {
		WartungGesamt.WartungLua( DSZusatz, Daten, DN, Kategorien, frame ),
		WartungGesamt.WartungWiki( DSZusatz, DN, frame ),
		Text = ""
	}
	Wartung.alle =  Wartung[1] .. Wartung[2]
	if DSZusatz.NSP == 0 then Wartung.Text = Wartung.alle end
	return Wartung.Text
end

-- Kategorien aufbereiten
function KatFinder( DSZusatz, Daten, DN, Kategorien, frame )
	local RegKAT = { } --  Regions-Kategorien
	--                 --  [1] = nach Region, [2] Regions-Kategorie-Name
	local GeoKAT = { } --  Geo-Kategorien: ["Name"] = Name der Kategorie [1] = Name mit Geo, [2] = Sortierung, [3] = Stand in der Abfolge
	local GeoKAT1 = 0 --   Geo-Kategorien-Zaehler
	local LaufTyp = { } -- Geo-Kategorien aus den Aufzaehlungern (z.B. Verwendung): [1] = Name der Kategorie, [2] = Sortierung
	local LaufGeo = { } -- Durchlauf der zu pruefenden Kategorien
	local LaufGeo1 = 1  -- Durchlauf-Zaehler der zu pruefenden Kategorien
	local DopplerT = "" -- Speicher der doppelten Kategorien nach Typ, z. B. SendeturmDeutschland
	local DopplerR = "" -- Speicher der doppelten Kategorien nach Region, z. B. Deutschland
	local KATmax = 0 --    maximale Tiefe der 'GeoKAT'
	local KATText = "" --  Tabelle zur erstellung Liste zur Fehlersuche
	local ZY = nil
	local ZZ = ""
	KATText = "\n=== Auswertung Kategorien zur Fehlersuche ==="
	
	-- Regions-Kategorien finden
	function RKAT( Art, REGION, CSTADT, DSAB )
		local RegKAT, Typ, RegTEMP = { }, 1, { Sub = "1" }
		RegTEMP.GL = {
			{ "Irland", "Bauwerk" },
			{ "Tschechien", "Bauwerk" }
		}
		if type( Art ) == "table" then Typ = Art[1] end
		if not REGION then REGION = { } end
		if REGION["2"] then
			for GLk, GLv in pairs( RegTEMP.GL ) do
				if (REGION["0"]["name"] == GLv[1] and Typ == GLv[2]) then RegTEMP.Sub = "2" end
			end
		end
		if REGION["0"] then RegKAT[1] = { DSZusatz.Aufbereitung.GeoVERW( Typ, "REG", "0", REGION ), REGION["0"]["name"], Art = "REGION" } end
		if REGION["1"] then RegKAT[2] = { DSZusatz.Aufbereitung.GeoVERW( Typ, "REG", RegTEMP.Sub, REGION ), REGION[RegTEMP.Sub]["name"], Art = "REGION" } end
		if REGION["2"] then RegKAT[3] = { DSZusatz.Aufbereitung.GeoVERW( Typ, "REG", "2", REGION ), REGION["2"]["name"], Art = "REGION" } end
		if not CSTADT then CSTADT = { } end
		for KFSk, KFSv in pairs( CSTADT ) do
			if (KFSv ~= nil and KFSv ~= "") then
				table.insert( RegKAT, { DSZusatz.Aufbereitung.GeoVERW( Typ, "CSTADT", KFSv, REGION, DSZusatz.DSTADT[KFSk] ), KFSv, Art = "CSTADT" } )
			end
		end
		table.insert( RegKAT, { "nichts", "nicht", Art = "nicht" } )

		return RegKAT
	end
	RegKAT = RKAT( { "Start" }, DSZusatz.REGION, DSZusatz.CSTADT, DSZusatz.Aufbereitung )
	
	-- Durchlaufwerte (LG0) bestimmen
		-- Laufwerte nach Bauwerkstyp
	KATText = KATText .. "\n=== Laufwerte nach Bauwerkstyp ==="
	local GeoSort, GeoDoppler = { }, { }
	if DSZusatz.Geo[DSZusatz.Typ] then
		GeoSort[1] = DSZusatz.Typ
		GeoDoppler[DSZusatz.Typ] = true
	end
	for GS1k, GS1v in pairs( Kategorien ) do
		if GS1v[3] then
			if (not GeoDoppler[GS1v[3]] and DSZusatz.Geo[GS1v[3]]) then
				table.insert( GeoSort, GS1v[3] )
				GeoDoppler[GS1v[3]] = true
			end
		end
	end
	if #GeoSort == 0 then
		GeoSort[1] = 1
		GeoDoppler = true
	end
	for GS9k, GS9v in pairs( GeoSort ) do
		KATText = KATText .. "\n# " .. tostring( GS9v )
	end
	
	for GS2k, GS2v in pairs( GeoSort ) do
		if type( DSZusatz.Geo[GS2v] ) == "table" then
			if type( DSZusatz.Geo[GS2v][1] ) == "table" then
				if type( DSZusatz.Geo[GS2v][1][1] ) == "table" then
					if type( DSZusatz.Geo[GS2v][1][1][1] ) == "string" then
						table.insert( LaufGeo, DSZusatz.Geo[GS2v] )
					end
				end
			end
		end
	end
	
		-- Geo-Kategorien finden
	for KFGk, KFGv in pairs( Kategorien ) do
		if ((KFGv[2] == "GeoN" or KFGv[2] == "GeoC") and not KFGv[3]) then
			table.insert( LaufGeo, { { { KFGv[1], KFGv[2] } } } )
		end
	end
	
	-- Durchlauf nach Geo-Kaskade nach Bauwerkstyp
	local RegWEGd = { }
	for LG0k, LG0v in pairs( LaufGeo ) do
		KATText = KATText .. "\n# „LG0v“ : " .. tostring( LG0v )
		for LG1k, LG1v in pairs( LG0v ) do
			KATText = KATText .. "\n## „LG1v“ : " .. tostring( LG1v )
			LaufGeo1 = 1
			for LG2k, LG2v in pairs( LG0v[LG1k] ) do
				KATText = KATText .. "\n### „LG2v[1]“ : " .. tostring( LG2v[1] )
				ZY = ""
				RegKAT = RKAT( LG2v, DSZusatz.REGION, DSZusatz.CSTADT, DSZusatz.Aufbereitung )
				for LG3k=LaufGeo1, table.maxn( RegKAT ), 1 do
					DopplerT = RegKAT[LG3k]["Art"] .. LG2v[1] .. RegKAT[LG3k][2]
					DopplerR = RegKAT[LG3k]["Art"] .. RegKAT[LG3k][2]
					if (ZY == nil and RegKAT[LG3k][2] == "nix") then DopplerT = "nix" end
					if (GeoKAT[DopplerT] == nil and GeoKAT[DopplerR] == nil) then
						ZZ = "0"
						if ZY then
							ZZ = mw.getCurrentFrame():callParserFunction( "#ifexist", { "Kategorie:" .. LG2v[1] .. " " .. RegKAT[LG3k][1], LG2v[1] .. " " .. RegKAT[LG3k][1], "0" } )
						end
						if (ZZ == "0" and ZY ~= nil) then
							if ((DopplerT ~= "nix" or DopplerR ~= "nix") and ZY ~= "") then
								GeoKAT1 = GeoKAT1 + 1
								GeoKAT[GeoKAT1] = { ZY, LG2v[2], LG3k - 1, Name = LG2v[1] }
								if KATmax < LG3k then KATmax = LG3k end
								KATText = KATText .. "\n#### GeoKAT[" .. tostring( GeoKAT1 ) .. "] = { [1]=„" .. tostring( GeoKAT[GeoKAT1][1] ) .. "“, [2]=„" .. tostring( GeoKAT[GeoKAT1][2] ) .. "“, [3]=„" .. tostring( GeoKAT[GeoKAT1][3] ) .. "“, Name=„" .. tostring( GeoKAT[GeoKAT1]["Name"] ) .. "“ }"
							end
							ZY = nil
						else
							if ZY then
								ZY = ZZ
								LaufGeo1 = LG3k + 1
								GeoKAT[DopplerT] = true
								GeoKAT[DopplerR] = true
							end
						end
					end
				end
			end
		end
		RegWEGd = {
			Daten = GeoKAT -- Datenablage
		}
		GeoKAT = { }
		for GeoKATk, GeoKATv in pairs( RegWEGd.Daten ) do
			if type( GeoKATk ) == "number" then GeoKAT[GeoKATk] = GeoKATv end
		end
	end
	RegWEGd = {
		Daten = GeoKAT, --    Datenablage
		Doppler = {}, --      Ablage der Doppler
		istschonda = false -- ist Eintrag schon vorhanden?
	}
	GeoKAT = { }
	for GeoKATk, GeoKATv in pairs( RegWEGd.Daten ) do
		for GeoKATDk, GeoKATDv in pairs( RegWEGd.Doppler ) do
			if GeoKATv[1] == GeoKATDv then
				RegWEGd.istschonda = true
			end
		end
		if RegWEGd.istschonda == false then
			table.insert( GeoKAT, GeoKATv )
			table.insert( RegWEGd.Doppler, GeoKATv[1] )
		end
		RegWEGd.istschonda = false
	end
	
	-- bei abgegangenem Bauwerk Doppler entfernen
	local ABE = { }     -- Speicher der Datensaetze
	--                           ['Nr'] = Satznummer
	--                           ['DS'] = Datensatz
	ABE[1] = { Nr = 0 } --    - 'Abgegangenes Bauwerk'
	ABE[2] = { Nr = 0 } --    - 'Bauwerk'
	
	for ABEk, ABEv in pairs( GeoKAT ) do
		if type( ABEk ) == "number" then
			if ABEv.Name == "Abgegangenes Bauwerk" then ABE[1] = { Nr = ABEk, DS = ABEv } end
			if ABEv.Name == "Bauwerk" then ABE[2] = { Nr = ABEk, DS = ABEv } end
		end
	end
	if (ABE[1]["Nr"] > 0 and ABE[2]["Nr"] > 0) then
		if ABE[1]["DS"][3] == ABE[2]["DS"][3] then GeoKAT[ABE[2]["Nr"]][3] = KATmax + 1 end
	end
	ABE = { { Nr = 0 }, { Nr = 0 } }
	for ABFk, ABFv in pairs( GeoKAT ) do
		if type( ABFk ) == "number" then
			if ABFv.Name == "Ehemaliger Gastronomiebetrieb" then ABE[1] = { Nr = ABFk, DS = ABFv } end
			if ABFv.Name == "Gastronomiebetrieb" then ABE[2] = { Nr = ABFk, DS = ABFv } end
		end
	end
	if (ABE[1]["Nr"] > 0 and ABE[2]["Nr"] > 0) then
		if ABE[1]["DS"][3] == ABE[2]["DS"][3] then GeoKAT[ABE[2]["Nr"]][3] = KATmax + 1 end
	end
	
	-- Rest-Kategorien finden
	local Rest = {
		Doppler = {}, --       Ablage der Nicht-Doppler
		istschonda = false, -- ist Eintrag schon vorhanden?
		istversteckt = 0 --    wenn versteckte kategorie, dann '-1'
	}
	
	KATText = KATText .. "\n# Rest-Kategorien"
	for KRSk, KRSv in pairs( Kategorien ) do
		Rest.istschonda = false
		Rest.istversteckt = 0
		if (KRSv[2] ~= "GeoN" and KRSv[2] ~= "GeoC") then
			for KRDk, KRDv in pairs( Rest.Doppler ) do
				if KRDv == KRSv[1] then Rest.istschonda = true end
			end
			if KRSv.Name == "istversteckt" then Rest.istversteckt = -1 end
			if Rest.istschonda == false then
				table.insert( GeoKAT, { KRSv[1], KRSv[2], Rest.istversteckt } )
				table.insert( Rest.Doppler, KRSv[1] )
				KATText = KATText .. "\n## { Rest.Doppler: „" .. tostring( KRSv[1] ) .. "“, KRSv[2]: „" .. tostring(  KRSv[2] ) .. "“, „" .. Rest.istversteckt .. "“ }"
			end
		end
	end
	
	-- Kategorien sortieren
	KATText = KATText .. "\n----\n;Kategorien sortiert\n:"
	local Kategorien = { } --                Kategorien zuruecksetzen
	--    KATmax                             Rxpansionstiege der Geo-Kategorien
	local ZL = { } --                        Maximalanzeiger
	ZL[1] = table.maxn( RegKAT ) --          maximal moegliche Geo-Expansionstiefe
	ZL[2] = table.maxn( DSZusatz.CSTADT ) -- Anzahl an Stadt-Kategorien
	
	KATText = KATText .. "KATmax: „" .. tostring( KATmax ) .. "“; ZL[1]: „" .. tostring( ZL[1] ) .. "“"
	if (KATmax < ZL[1] and DSZusatz.CSTADT[1] ~= "") then
		Kategorien[1] = { DSZusatz.CSTADT[ZL[2]], "GeoN" }
		KATText = KATText .. " / DSZusatz.CSTADT[ZL[2]] (DSZusatz.CSTADT[" .. ZL[2] .. "]): „" .. tostring( DSZusatz.CSTADT[ZL[2]] ) .. "“"
	end
	KATText = KATText .. " + "
	for KN = KATmax, -1, -1 do
		for KNk, KNv in pairs( GeoKAT ) do
			if type( KNk ) == "number" then
				if KNv[3] == KN then
					table.insert( Kategorien, KNv )
					KATText = KATText .. "\n* KNk (" .. KNk .. "): 1 = „" .. tostring( KNv[1] ) .. "“ + 2 = „" .. tostring( KNv[2] ) .. "“"
				end
			end
		end
	end
	KATText = KATText .. "\n----\n"
	
	return { Kategorien, KATText }
end

--	Kategorien['laufende Nummer']
--	[''][1]  = Name der Kategorie
--	[''][2]  = Sortierung der Kategorie = GeoN: nach 'NAME' der Infobox;
--	           GeoC + Cat: nach 'CAT_NAME' der Infobox;
--	           GeoN und GeoC werden nach Laender sortiert.
--	[''][3]  = Sofern Kategorisierungstyp Ablage
--	['Name'] = Name der Kategorie, z.B. 'VERWFernmelde'

-- Parameter-Uebersicht:
--	ModulStamm				= Stammverzeichnis des Moduls
--	SN						= Seitenname des Artikels
--	SR						= Basis-Seitenname des Artikels
--	SU						= Name der Unterseite des Artikels
--	SI						= Inhalt der Artikelseite
--	NNAME					= Ueberschrifts-Name der Infobox
--	CNAME					= Sortier-Name fuer Kategorien
--	DSZusatz.CSTADT         = Stadt-Name fuer Kategorien als Feld [1], [2], etc
--	Daten["WertZeile"]		= Werte aus Artikel in Daten einsortiert
--	Daten["WertSplit"]		= Daten splitten und als Tabelle abgelegt
--	Daten["WertSplitLink"]	= Verlinkte Daten
--	Daten["AnzSplit"]		= Anzahl der gesplitteten Datensaetze
--	Daten["BauTyp"]			= Typ des Bauwerkes (Liste, U3, etc.)
--	Daten["AnzLabel"]		= Daten-Bezeichner (Einzahl und Mehrzahl)
--	Typ						= Rueckgabewert ist der Name des Bauwerktyps (Auswahl mit TYP())
--	Geo						= Abfolgen der Kategoriebildung --> z.B. Sendeturm -- Turm -- Bauwerk
--	Bezeichner				= Zuordnung 'CAZ_TYP' zur Bezeichnung (z.B. Trum = Sendeturm)
--	Tabelle					= fuer die Infobox der Wiki-Code als Tabelle
--	OPK						= Zuordnungen der POSKARTE zu Obiger Karte
--	Kategorien				= Kategorien als Feldausdruck
--	DN[Typ]					= Datensatz um Daten nach Typ anzusprechen

-- Zusatz zur Datensatzbearbeitung
function Zusatz( frame, DatenWL )
	local NCC = CCN( SN, DatenWL, frame )
	local DSZusatz = {
		Geo = Geo,
		CSTADT = NCC.CSTADT,
		DSTADT = NCC.DSTADT,
		CNAME = NCC.CNAME,
		NNAME = NCC.NNAME,
		Bezeichner = Bezeichner,
		Tabelle = Tabelle,
		OPK = OPK,
		ModulStamm = ModulStamm,
		SN = SN,
		SR = SR,
		SU = SU,
		SI = SI,
		NSP = NSP,
		DatenWL = DatenWL
	}
	return DSZusatz
end

local p = {}
-- Anzeige Infobox
function p.Infobox( frame )
	local IB = ""
	
	-- Zuladen exportierter Datensaetze
	local Auflistung = require( ModulStamm .. "/Auflistung" )
	local Layout = require( ModulStamm .. "/Layout" )
	local Aufbereitung = require( ModulStamm .. "/Aufbereitung" )
	
	-- Vorbereiten der Datensaetze fuer 'Datensaetze aufbereiten'
	local REGION = Aufbereitung.DSFI( { }, frame )
	local DSZusatz = Zusatz( frame, { } )
	DSZusatz.Aufzaehlung = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle )
	DSZusatz.Aufzaehler = Auflistung.Aufzaehler( Daten, Geo, Bezeichner, Tabelle, Aufzaehlung )
	DSZusatz.Typ = TYP( Bezeichner, "", frame )
	DSZusatz.Aufbereitung = Aufbereitung
	DSZusatz.REGION = REGION
	
	-- Datensaetze aufbereiten
	local DSA = DS_Aufbereitung( DSZusatz, Daten, frame )
	Daten = DSA.Daten
	DN = DSA.DN
	Kategorien = DSA.Kategorien
	local K_Finder = KatFinder( DSZusatz, Daten, DN, Kategorien, frame )
	Kategorien = K_Finder[1]
	
	--Datensaetze anzeigen
	if (DSZusatz.SR ~= "Spielwiese" and DSZusatz.SU ~= "Spielwiese" and DSZusatz.SU ~= "Test" and DSZusatz.SU ~= "test") then DN.Test.BauTyp = "Ausblenden" end
	IB = IB .. Layout.InfoboxDarstellung( DSZusatz, Daten, DN, Kategorien, frame )
	IB = IB .. Wartung( DSZusatz, Daten, DN, Kategorien, frame )
	-- Test Spielwiese/KoordKarte
--	if (DSZusatz.SR == "Spielwiese" or DSZusatz.SU == "Spielwiese") then
--		local Spielwiese = require( DSZusatz.ModulStamm .. "/Test" )
--		IB = IB .. Spielwiese.KoordKarte( DSZusatz, Daten, DN, Kategorien, frame )
--	end
	IB = IB .. Layout.KategorieDarstellung( DSZusatz, Daten, DN, Kategorien, frame )
	
	return IB
end

-- Anzeige Fehlersuche
function p.Fehlersuche( frame )
	local IB = ""
	
	-- Zuladen exportierter Datensaetze
	local Auflistung = require( ModulStamm .. "/Auflistung" )
	local Layout = require( ModulStamm .. "/Layout" )
	local Aufbereitung = require( ModulStamm .. "/Aufbereitung" )
	
	-- Vorbereiten der Datensaetze fuer 'Datensaetze aufbereiten'
	local REGION = Aufbereitung.DSFI( { }, frame )
	local DSZusatz = Zusatz( frame, { } )
	DSZusatz.Aufzaehlung = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle )
	DSZusatz.Aufzaehler = Auflistung.Aufzaehler( Daten, Geo, Bezeichner, Tabelle, Aufzaehlung )
	DSZusatz.Typ = TYP( Bezeichner, "", frame )
	DSZusatz.Aufbereitung = Aufbereitung
	DSZusatz.REGION = REGION
	
	-- Datensaetze aufbereiten
	local DSA = DS_Aufbereitung( DSZusatz, Daten, frame )
	Daten = DSA.Daten
	DN = DSA.DN
	Kategorien = DSA.Kategorien
	local K_Finder = KatFinder( DSZusatz, Daten, DN, Kategorien, frame )
	Kategorien = K_Finder[1]
	
	--Datensaetze anzeigen
	IB = IB .. Layout.InfoboxDarstellung( DSZusatz, Daten, DN, Kategorien, frame )
	IB = IB .. Layout.KategorieDarstellung( DSZusatz, Daten, DN, Kategorien, frame )
	IB = IB .. K_Finder[2]
	
	return IB
end

-- Anzeige Infobox als Nebenbox
function p.Nebenbox( frame )
	local NB = ""
	
	-- Zuladen exportierter Datensaetze
	local Auflistung = require( ModulStamm .. "/Auflistung" )
	local Layout = require( ModulStamm .. "/Layout" )
	local Aufbereitung = require( ModulStamm .. "/Aufbereitung" )
	
	-- Vorbereiten der Datensaetze fuer 'Datensaetze aufbereiten'
	local REGION = Aufbereitung.DSFI( { }, frame )
	local DSZusatz = Zusatz( frame, { } )
	DSZusatz.Aufzaehlung = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle )
	DSZusatz.Aufzaehler = Auflistung.Aufzaehler( Daten, Geo, Bezeichner, Tabelle, Aufzaehlung )
	DSZusatz.Typ = TYP( Bezeichner, "", frame )
	DSZusatz.Aufbereitung = Aufbereitung
	DSZusatz.REGION = REGION
	
	-- Datensaetze aufbereiten
	local DSA = DS_Aufbereitung( DSZusatz, Daten, frame )
	Daten = DSA.Daten
	DN = DSA.DN
	Kategorien = DSA.Kategorien
	local K_Finder = KatFinder( DSZusatz, Daten, DN, Kategorien, frame )
	Kategorien = K_Finder[1]
	
	--Datensaetze anzeigen
	if (DSZusatz.SR ~= "Spielwiese" and DSZusatz.SU ~= "Spielwiese" and DSZusatz.SU ~= "Test" and DSZusatz.SU ~= "test") then DN.Test.BauTyp = "Ausblenden" end
	if not DN.BILD.WertSplit[1] then DN.IBBild.BauTyp = "Ausblenden" end
	DN.KoordKarte.BauTyp = "Zeile"
	DN.POSKARTE.BauTyp = "Ausblenden"
	NB = NB .. Layout.InfoboxDarstellung( DSZusatz, Daten, DN, Kategorien, frame )
	
	return NB
end

-- Anzeige Weiterleitung
function p.Weiterleitung( frame )
	local WL = ""
	
	-- Zuladen exportierter Datensaetze
	local Auflistung = require( ModulStamm .. "/Auflistung" )
	local Layout = require( ModulStamm .. "/Layout" )
	local Aufbereitung = require( ModulStamm .. "/Aufbereitung" )
	
	-- Vorbereiten der Datensaetze fuer 'Datensaetze aufbereiten'
	local DatenWL = Aufbereitung.DatenWeiterleitung( Daten, frame )
	if (DatenWL[1] == false and NSP == 0) then
		WL = WL .. "<div class=\"error\">[[Vorlage:Infobox Sendeanlage/Wartung/Weiterleitungslink defekt|Weiterleitungslink defekt]]</div>"
	end
	DatenWL[1] = nil
	local REGION = Aufbereitung.DSFI( DatenWL, frame )
	local DSZusatz = Zusatz( frame, DatenWL )
	DSZusatz.Aufzaehlung = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle )
	DSZusatz.Aufzaehler = Auflistung.Aufzaehler( Daten, Geo, Bezeichner, Tabelle, Aufzaehlung )
	DSZusatz.Typ = TYP( Bezeichner, DSZusatz.DatenWL.CAT_TYP, frame )
	DSZusatz.Aufbereitung = Aufbereitung
	DSZusatz.REGION = REGION
	
	-- Datensaetze aufbereiten
	local DSA = DS_Aufbereitung( DSZusatz, Daten, frame )
	Daten = DSA.Daten
	DN = DSA.DN
	Kategorien = DSA.Kategorien
	local K_Finder = KatFinder( DSZusatz, Daten, DN, Kategorien, frame )
	Kategorien = K_Finder[1]
	
	--Datensaetze anzeigen
	if DatenWL.ZIEL then WL = WL .. tostring( DN.KoordKarte.WertZeile ) end
	WL = WL .. Wartung( DSZusatz, Daten, DN, Kategorien, frame )
	if NSP == 0 then WL = WL .. Layout.KategorieDarstellung( DSZusatz, Daten, DN, Kategorien, frame ) end
	
	-- Test Spielwiese/DatenSeite
	if (DSZusatz.SR == "Spielwiese" or DSZusatz.SU == "Spielwiese") then
		local Spielwiese = require( DSZusatz.ModulStamm .. "/Test" )
		WL = Spielwiese.DatenSeite( DSZusatz, Daten, DN, Kategorien, frame )
	end
	
	return WL
end

-- Anzeige Dokumentation Infobox ueber DokuTemplate
function p.Dokumentation( frame )
	local Dokumentation = mw.getCurrentFrame():getParent().args[1] or frame.args[1] or "DokuVorlage"
	
	-- Zuladen exportierter Datensaetze
	local Auflistung = require( ModulStamm .. "/Auflistung" )
	local Layout = require( ModulStamm .. "/Layout" )
	
	-- Vorbereiten der Datensaetze fuer 'Datensaetze aufbereiten'
	local DSZusatz = Zusatz( frame, { } )
	DSZusatz.Aufzaehlung = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle )
	DSZusatz.Layout = Layout.Layout()
	
	-- Zusatz fuer diverse Funktionen
	if Dokumentation == "DokuDaten" then
		local Aufbereitung = require( ModulStamm .. "/Aufbereitung" )
		DSZusatz.Aufbereitung = Aufbereitung
		DSZusatz.Aufzaehler = Auflistung.Aufzaehlung( Daten, Geo, Bezeichner, Tabelle, DSZusatz.Aufzaehlung )
		DSZusatz.REGION = Aufbereitung.DSFI( { }, frame )
		Aufbereitung = DS_Aufbereitung( DSZusatz, Daten, frame )
		Daten = Aufbereitung["Daten"]
	end
	
	local VZ = require( ModulStamm .. "/VorlageDokumentation" )
	return VZ[Dokumentation]( DSZusatz, Daten, frame )
end

return p