Vorlagenprogrammierung Diskussionen Lua Test Unterseiten
Modul Deutsch

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


-- Auslesen der Deteils zu Regionen ueber Wiki-Vorlage
function REG( Level, Info, DatenWL, frame )
	--[[ Rueckgabewert erzeugt 'Info ISO-3166-2' fuer den Parser. Muster:
		 - REG2: '{{Info ISO-3166-2|code={{{REGION-ISO|}}}|name}}'
		 - REG1: '{{Info ISO-3166-2|code={{Info ISO-3166-2|code={{{REGION-ISO|}}}|upper}}|name}}'
		 - REG0: '{{Info ISO-3166-2|code={{Info ISO-3166-2|code={{{REGION-ISO|}}}|top}}|name}}'
	]]
	
	local VR = {
		REGION_ISO = { I = mw.getCurrentFrame():getParent().args["REGION-ISO"] },
		title = "Info ISO-3166-2"
	}
	if (VR.REGION_ISO.I == "" or VR.REGION_ISO.I == nil) then VR.REGION_ISO.I = frame.args["REGION-ISO"] end
	if (VR.REGION_ISO.I == "" or VR.REGION_ISO.I == nil) then VR.REGION_ISO.I = DatenWL["REGION-ISO"] end
	if VR.REGION_ISO.I == "" then VR.REGION_ISO.I = nil end
	VR.code = { II = VR.REGION_ISO.I }
	VR.code.Y = { O = "top", I = "upper" }
	VR.code.X = VR.code.Y[Level] or ""
	VR.code.I = frame:expandTemplate{ title = "Info ISO-3166-2", args = { VR.code.X, code = VR.code.II } }
	VR.code.O = VR.code.I
	VR.args = {
		Info,
		code = VR.code[Level]
	}
	return frame:expandTemplate{ title = VR.title, args = VR.args }
end

-- Zaehlung, wie viele Parameter vorhanden sind
function ZDS( ZG, Zmax )
	local Aussage = false
	local max = 0
	for ZGk, ZGv in pairs( ZG ) do
		if ZGv[2] then max = max + 1 end
	end
	if max > Zmax then Aussage = true end
	return Aussage
end

local p = {}

--	Ausgabe einer Fehlermeldung
p.Fehler = function ( Meldung )
	local Text = tostring( Meldung ) or "\'\'Fehlertext fehlt!\'\'"
	local Anzeige = mw.html.create( "div" )
		:attr( "class", "error rahmenfarbe3 hintergrundfarbe8" ) 
		:css( "font-size", "120%" )
		:css( "font-weight", "bold" )
		:css( "text-align", "center" )
		:css( "border-style", "solid" )
		:css( "border-width", "2px" )
		:css( "padding", ".5em" )
		:css( "margin", ".25em" )
		:wikitext( Text )
	return tostring( Anzeige )
end

--	Anzeige Rahmen
p.Rahmen = function ( TXT, Ue )
	local LA = { { " rahmenfarbe2", " border-width:1px; border-style:solid;", "" }, { "", "", "\n! colspan=\"2\" class=\"hintergrundfarbe9\" style=\"text-align:center;\" | " .. tostring( Ue ) } }
	local Text = { { "Anzuzeigende Eigenschaft", "Anzuzeigender Text" } }
	local Einheit = ""
	local Un = 1
	if Ue then Un = 2 end
	if type( TXT ) == "table" then Text = TXT end
	local Inhalt = "\n{| class=\"toptextcells" .. LA[Un][1] .. "\" style=\"font-size:90%; text-align:left; width:90%; margin:0em auto;" .. LA[Un][2] .. "\"" .. LA[Un][3]
	for TXTi, TXTv in pairs(Text) do
		if (type( TXTv ) == "table" ) then
			if (TXTv[2] and TXTv[2] ~= "") then
				Einheit = TXTv[3] or ""
				Inhalt = Inhalt .. "\n|-\n| " .. tostring( TXTv[1] ) .. ":\n| " .. tostring( TXTv[2] .. Einheit )
			end
		end
	end
	Inhalt = Inhalt .. "\n|}\n"
	return Inhalt
end

--	Werte aus Artikel in Daten einsortieren und splitten
p.AufarbStand = function ( Datensatz, DSZusatz, Kategorie, frame )
	local DS = Datensatz --         zu bearbeitender Datensatz
	local Kategorien = Kategorie -- Speicher fuer Kategorien
	DS.TMP = { } --                 temporaerer Speicher
	DS.WertZeile = mw.getCurrentFrame():getParent().args[DS.Name]
	if (DS.WertZeile == "" or DS.WertZeile == nil) then DS.WertZeile = frame.args[DS.Name] end
	if (DS.WertZeile == "" or DS.WertZeile == nil) then DS.WertZeile = DSZusatz.DatenWL[DS.Name] end
	if DS.Standard then
		if (DS.WertZeile == "" or DS.WertZeile == nil) then DS.WertZeile = DS.Standard[DSZusatz.Typ] end
		if (DS.WertZeile == "" or DS.WertZeile == nil) then DS.WertZeile = DS.Standard[1] end
	end
	if DS.WertZeile == nil then DS.WertZeile = "" end
	DS.WertSplit = mw.text.split( DS.WertZeile, "/" )
	if DS.WertZeile == "" then DS.WertZeile = nil end
	if DS.WertSplit[1] == "" then DS.WertSplit[1] = nil end
	DS.AnzSplit = table.maxn( DS.WertSplit )
	
	--	Auswahl der Bezeichnung 'Typ' zu 'BauTyp'
	DS.TMP.Z = DS.Typ or { "Zeile" }
	DS.BauTyp = DS.TMP.Z[DSZusatz.Typ] or DS.TMP.Z[1]
	
	--	Textverlinkung und Einheitsanbindung
	DS.TMP.EHT = { "", "" } -- Formatierung der Einheiten zur Wiedergabe
	DS.TMP.LIZ = ""         -- resultierende Einheiten(-verlinkung)
	DS.TMP.LTR = DSZusatz.Aufzaehler[DS.BauTyp] or "/" -- Trennzeichen bei Aufsplittung
	DS.TMP.AFZ = DSZusatz.Aufzaehlung[DS.Name] or { } --  Aufzaehlung
	DS.TMP.Liste = "" --       Auflistung der Werte
	DS.TMP.AZ = { } --         Aufzaehler als Tabelle aller, z.B. 'VERW'
	DS.TMP.WSL = { } --        WertSplitLink als Tabelle
	
		--	Einheiten-Auswaehler
	if DS.Einheit then
		if (type( DS.Einheit[1] ) == "string" and DS.Einheit[1] ~= "") then
			DS.TMP.EHT[1] = " " .. DS.Einheit[1]
			DS.TMP.EHT[2] = DS.TMP.EHT[1]
			if (type( DS.Einheit[2] ) == "string" and DS.Einheit[2] ~= "") then
				DS.TMP.EHT[2] = " [[" .. DS.Einheit[2] .. "|" .. DS.Einheit[1] .. "]]"
			end
		end
	end
	
		--	Durchlauf Zaehlinstanz
	for j, ZS in pairs(DS.WertSplit) do
			-- Standardsetzung entsprechend Bauwerktyp
		DS.TMP.tf = true
		if DS.TMP.AFZ[ZS] then
			DS.TMP.AFZ[ZS][1] = DS.TMP.AFZ[ZS][1] or { }
			DS.TMP.AFZ[ZS][2] = DS.TMP.AFZ[ZS][2] or { }
			DS.TMP.AFZ[ZS][3] = DS.TMP.AFZ[ZS][3] or { }
			DS.TMP.AFZ[ZS][4] = DS.TMP.AFZ[ZS]["CatTyp"] or { }
			if DS.TMP.AFZ[ZS][1][DSZusatz.Typ] == false then DS.TMP.tf = false end
		end
		if DS.TMP.tf == false then DS.TMP.AFZ[ZS] = nil end
		
			-- Durchzaehler fuer Werte in VERW + T_HOCH etc.
		if DS.TMP.AFZ[ZS] then
			DS.TMP.STAZ = { "\'\Wert unbekannt\'\'", "\'\Wert unbekannt\'\'" }
			for k=1, 4, 1 do -- Ermittlung Standardwerte
				DS.TMP.STAZ[k] = DS.TMP.AFZ[ZS][k][DSZusatz.Typ] or DS.TMP.AFZ[ZS][k][1]
			end
			if (type( DS.TMP.STAZ[3] ) == "string" and DS.TMP.STAZ[3] ~= "" ) then
				table.insert( Kategorien, { DS.TMP.STAZ[3], DS.TMP.AFZ[ZS]["Geo"], DS.TMP.STAZ[4], Name = DS.Name .. DS.TMP.STAZ[1] } )
			end
			DS.TMP.AZ[j] = DS.TMP.STAZ
		else
			DS.TMP.AZ[j] = { ZS, ZS, nil }
		end
		if j < 2 then
			DS.TMP.LIZ = DS.TMP.EHT[2]
		else
			DS.TMP.Liste = DS.TMP.Liste .. DS.TMP.LTR
			DS.TMP.LIZ = DS.TMP.EHT[1]
		end
		if DS.WertZeile then DS.TMP.Liste = DS.TMP.Liste .. DS.TMP.AZ[j][2] .. DS.TMP.LIZ end
		DS.TMP.WSL[j] = DS.TMP.AZ[j][2]
	end
	DS.WertSplitLink = DS.TMP.WSL
	if DSZusatz.Aufzaehler[DS.BauTyp] then DS.WertZeile = DS.TMP.Liste end
	if DS.WertZeile == "" then DS.WertZeile = nil end
	
	--	Eigenschaften beschriften (Einzahl / Mehrzahl / Typ)
	DS.TMP.EW = DS.Label -- Eigenschaften-Werte
	if DS.TMP.EW then
		DS.TMP.EW = DS.Label[DSZusatz.Typ]
		if not DS.TMP.EW then DS.TMP.EW = DS.Label[1] end
		if not DS.TMP.EW then DS.TMP.EW = { "" } end
		DS.TMP.EW[2] = DS.TMP.EW[2] or DS.TMP.EW[1]
		if DS.AnzSplit > 1 then
			DS.AnzLabel = DS.TMP.EW[2]
		else
			DS.AnzLabel = DS.TMP.EW[1]
		end
	else
		DS.AnzLabel = ""
	end
	
	DS.TMP = nil
	return { DS = DS, Kategorien = Kategorien }
end

p.DSIB = {}
	-- NAME Festlegen
p.DSIB.NAME = function ( DN, DSZusatz, Kategorien, frame )
	DN.NAME.WertZeile = DSZusatz.NNAME
	return DN
end

	-- Ueberschrift der Infobox
p.DSIB.UE1 = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = {}
	DSMB.Bezeichner = mw.html.create( "div" )
		:css( "width", "100%" )
		:wikitext( DN.NAME.WertZeile )
	DSMB[1] = tostring( DSMB.Bezeichner )
	
	DSMB.Bezeichner = mw.html.create( "div" )
		:css( "font-size", "90%" )
		:css( "width", "100%" )
		:wikitext( tostring( DN.OFZ_NAME.WertZeile ) )
	DSMB[2] = tostring( DSMB.Bezeichner )
	
	DSMB.Bezeichner = mw.html.create( "div" )
		:css( "font-size", "70%" )
		:css( "font-style", "italic" )
		:css( "width", "100%" )
		:wikitext( tostring( DN.FUNK_NAME.WertZeile ) )
	DSMB[3] = tostring( DSMB.Bezeichner )
	
	if not DN.OFZ_NAME.WertZeile then DSMB[2] = nil end
	if not DN.FUNK_NAME.WertZeile then DSMB[3] = nil end
	if not DSMB[2] then
		DSMB[2] = DSMB[3]
		DSMB[3] = nil
	end
	
	DN.UE1.WertSplit = { DSMB[1], DSMB[2], DSMB[3] }
	DN.UE1.AnzSplit = table.maxn( DN.UE1.WertSplit )
	DN.UE1.WertZeile = ""
	for DSMBk, DSMBv in pairs( DN.UE1.WertSplit ) do
		DN.UE1.WertZeile = DN.UE1.WertZeile .. DSMBv
	end
	
	return DN
end

	-- Anzeige Bild
p.DSIB.IBBild = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { BILD = { }, TMP = { } }
	DSMB.BILD = {
		Bmax = 360,
		Hmax = 500,
		Amax = 48000,
		Titel = ""
	}
	DSMB.BILD.Datei = DN.BILD.WertZeile or "kein Bild"
	DSMB.BILD.Datei = DSMB.BILD.Datei:gsub("[%[%]]", "")
	DSMB.BILD.Beschreibung = DN.BILD_BES.WertZeile or ""
	if mw.title.new( DSMB.BILD.Datei, 6 ) then 
		DSMB.BILD.B = mw.title.new( DSMB.BILD.Datei, 6 ).file.width
		DSMB.BILD.H = mw.title.new( DSMB.BILD.Datei, 6 ).file.height
	end
	DN.TMP_KAT = { } -- Zwischenspeicher fuer Kategorien
	
	--	Bilderwunsch aus Wiki-Vorlage generieren
	DSMB.BW = {
		title = "Bilderwunsch/encode",
		args = {
			Ort = DN.ORT.WertZeile,
			Name = DSZusatz.NNAME,
			KoordLat = "",
			KoordLon = ""
		}
	}
	if (type(DN.NS.WertZeile) == "string" and type(DN.NS.WertSplit[1]) == "number") then DSMB.BW.args.KoordLat = tostring( DN.NS.WertSplit[1] ) end
	if (type(DN.EW.WertZeile) == "string" and type(DN.EW.WertSplit[1]) == "number") then DSMB.BW.args.KoordLon = tostring( DN.EW.WertSplit[1] ) end
	DSMB.BILDERWUNSCH = frame:expandTemplate{ title = DSMB.BW.title, args = DSMB.BW.args } or ""
	
	--	'WertZeile' bereitstellen
	if (DN.BILD.WertZeile == "kein" or DN.BILD.WertZeile == "keine" or DN.BILD.WertZeile == "nein" or DN.BILD.WertZeile == "no" or DN.BILD.WertZeile == "none" or DN.BILD.WertZeile == "aus" or DN.BILD.WertZeile == "ohne") then
		table.insert( DN.TMP_KAT, { "Wikipedia:Bilderwunsch unterdrückt", Name = "istversteckt" } )
	elseif (not DN.BILD.WertZeile and not DN.ABR_DEKADE.WertZeile ) then
		DN.IBBild.WertZeile = "[[Datei:Photo-request.svg|64px|link=Wikipedia:Bilderwünsche/Anleitung]]<br />[[Wikipedia:Bilderwünsche/Anleitung|Bild&nbsp;gesucht]]"
		if DSZusatz.NSP == 0 then DN.IBBild.WertZeile = DN.IBBild.WertZeile .. "\n" .. DSMB.BILDERWUNSCH end
	elseif not (DSMB.BILD.B and DSMB.BILD.H) then
		if not DN.ABR_DEKADE.WertZeile then DN.IBBild.WertZeile = DSZusatz.Aufbereitung.Fehler( "Angegebene Bilddatei „" .. DSMB.BILD.Datei .. "“ ist nicht verfügbar." ) end
	elseif DN.BILD.WertZeile then
		DSMB.BILD.A = DSMB.BILD.B * DSMB.BILD.H  --                    Flaeche
		DSMB.BILD.SV = DSMB.BILD.B / DSMB.BILD.H --                    Seitenverhaeltnis
		DSMB.BILD.Borg = math.sqrt( DSMB.BILD.Amax * DSMB.BILD.SV ) -- Breite gem. SV
		DSMB.BILD.Horg = DSMB.BILD.Borg / DSMB.BILD.SV --              Hoehe gem. SV
		if DSMB.BILD.Borg > DSMB.BILD.Bmax then
			DSMB.BILD.BBild = DSMB.BILD.Bmax
			DSMB.BILD.HBild = DSMB.BILD.BBild / DSMB.BILD.SV
		elseif DSMB.BILD.Horg > DSMB.BILD.Hmax then
			DSMB.BILD.HBild = DSMB.BILD.Hmax
			DSMB.BILD.BBild = DSMB.BILD.HBild * DSMB.BILD.SV
		else
			DSMB.BILD.BBild = DSMB.BILD.Borg
			DSMB.BILD.HBild = DSMB.BILD.Horg
		end
		DSMB.BILD.BBild = math.floor( DSMB.BILD.BBild )
		DSMB.BILD.HBild = math.floor( DSMB.BILD.HBild )
		
		-- Anpassung Titel
		DSMB.TMP.html = {
			{ "<br />", " " },
			{ "<small>", "" },
			{ "</small>", "" }
		}
		DSMB.BILD.Titel = DSMB.BILD.Beschreibung
		if DSMB.BILD.Titel == "" then DSMB.BILD.Titel = "Datei:" .. DSMB.BILD.Datei end
		for HTMLk, HTMLv in pairs( DSMB.TMP.html ) do
			DSMB.TMP.Text = ""
			DSMB.TMP.Split = mw.text.split( DSMB.BILD.Titel, HTMLv[1] )
			for BITk, BITv in pairs( DSMB.TMP.Split ) do
				if BITk > 1 then DSMB.TMP.Text = DSMB.TMP.Text .. HTMLv[2] end
				DSMB.TMP.Text = DSMB.TMP.Text .. BITv
			end
			DSMB.BILD.Titel = DSMB.TMP.Text
		end
		
		-- Anzeige des Bildes
		DSMB.Anzeige = mw.html.create( "div" )
			:css( "font-size", "85%" )
			:wikitext( "[[Datei:" .. DSMB.BILD.Datei .. "|" .. DSMB.BILD.BBild .. "x" .. DSMB.BILD.HBild ..  "px|center|" .. DSMB.BILD.Titel .. "|alt=Bild des Objektes]]" .. DSMB.BILD.Beschreibung )
		DN.IBBild.WertZeile = tostring( DSMB.Anzeige )
	end
	
	return DN
end

	-- Regionen
p.DSIB.Regionen = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = ""
	if DSZusatz.REGION["0"] then
		DN.REGION_0.WertZeile = "[[" .. DSZusatz.REGION["0"]["lemma"] .. "|" .. DSZusatz.REGION["0"]["name"] .. "]]"
	else
		DN.REGION_0.BauTyp = "Feld"
		DN.REGION_0.AnzLabel = ""
		if DN["REGION-ISO"]["WertZeile"] then
			DSMB = "Es ist ein falscher"
		else
			DSMB = "Es ist kein"
		end
		DN.REGION_0.WertZeile = DSZusatz.Aufbereitung.Fehler( DSMB .. " Wert für den Parameter „REGION-ISO“ eingetragen!<br />→&nbsp;[[ISO-3166-1-Kodierliste|siehe Kodierliste]]" )
	end
	if DSZusatz.REGION["1"] then
		DN.REGION_1.AnzLabel = DSZusatz.REGION["1"]["admtype"]
		DN.REGION_1.WertZeile = "[[" .. DSZusatz.REGION["1"]["lemma"] .. "|" .. DSZusatz.REGION["1"]["name"] .. "]]"
	end
	if DSZusatz.REGION["2"] then
		DN.REGION_2.AnzLabel = DSZusatz.REGION["2"]["admtype"]
		DN.REGION_2.WertZeile = "[[" .. DSZusatz.REGION["2"]["lemma"] .. "|" .. DSZusatz.REGION["2"]["name"] .. "]]"
	end
	
	return DN
end
	-- Hoehenlage
p.DSIB.LAGEPUNKT = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = DN.LAGEPUNKT.WertZeile or ""
	DN.LAGEPUNKT.WertSplit[1] = tonumber( DN.LAGEPUNKT.WertSplit[1] ) or DN.LAGEPUNKT.WertSplit[1]
	if not DN.LAGEPUNKT.WertSplit[2] then
		if DSZusatz.REGION["0"] then
			DN.LAGEPUNKT.WertSplit[2] = DSZusatz.REGION["0"]["acronym"]
		else
			DN.LAGEPUNKT.WertSplit[2] = ""
		end
	end
	if DN.LAGEPUNKT.WertSplit[2] == "CH" then DN.LAGEPUNKT.WertSplit[2] = "CH-m" end
	if DN.LAGEPUNKT.WertSplit[2] == "LI" then DN.LAGEPUNKT.WertSplit[2] = "LI-m" end
	DN.LAGEPUNKT.WertZeile = frame:expandTemplate{ title = "Höhe", args = { tostring( DN.LAGEPUNKT.WertSplit[1] ), DN.LAGEPUNKT.WertSplit[2] } }
	if DSMB == "" then DN.LAGEPUNKT.WertZeile = nil end
	if DN.LAGEPUNKT.WertSplit[2] == "" then DN.LAGEPUNKT.WertSplit[2] = nil end
	
	return DN
end

	-- Zugaenglichkeit
p.DSIB.ZUGANG = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = DSZusatz.Bezeichner[DSZusatz.Typ] or DSZusatz.Bezeichner[DSZusatz.Bezeichner[1]]
	if DN.ZUGANG.WertZeile == "ja" then
		DN.ZUGANG.WertZeile = DSMB .. " öffentlich zugänglich"
	elseif DN.ZUGANG.WertZeile == "jein" then
		DN.ZUGANG.WertZeile = DSMB .. " nach Voranmeldung zugänglich"
	elseif DN.ZUGANG.WertZeile == "nein" then
		DN.ZUGANG.WertZeile = DSMB .. " öffentlich nicht zugänglich"
	end
	if ( DN.ABR_DEKADE.WertZeile and DSZusatz.Typ ~= "Anlage") then DN.ZUGANG.BauTyp = "Ausblenden" end
	
	return DN
end

	-- Zusammenfassung fuer Turmbau
p.DSIB.IBTBau = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { }
	DSMB.Tabelle = {
		{ DN.T_BAU_KOST.AnzLabel, DN.T_BAU_KOST.WertZeile },
		{ DN.T_BAU_HERR.AnzLabel, DN.T_BAU_HERR.WertZeile },
		{ DN.T_BAU_ARCH.AnzLabel, DN.T_BAU_ARCH.WertZeile },
		{ DN.T_BAU_ST.AnzLabel, DN.T_BAU_ST.WertZeile }
	}
	if DN.T_BAU_ZEIT.WertZeile then
		DN.IBTBau.ausklappen = "Weitere Baudaten"
	else
		DN.IBTBau.AnzLabel = "Baudaten:"
	end
	DSMB.Anzeige = ZDS( DSMB.Tabelle, 1 )
	if DSMB.Anzeige == true then
		DN.IBTBau.WertZeile = DSZusatz.Aufbereitung.Rahmen( DSMB.Tabelle )
		DN.T_BAU_KOST.BauTyp = "Ausblenden"
		DN.T_BAU_HERR.BauTyp = "Ausblenden"
		DN.T_BAU_ARCH.BauTyp = "Ausblenden"
		DN.T_BAU_ST.BauTyp = "Ausblenden"
	else
		DN.IBTBau.BauTyp = "Ausblenden"
	end
	
	return DN
end

	-- Zusammenfassung fuer Turm-Einzelhoehen
p.DSIB.IBTHoch = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { }
	DSMB.Tabelle = {
		{ DN.T_HOCH_AUS.AnzLabel, DN.T_HOCH_AUS.WertZeile },
		{ DN.T_HOCH_RES.AnzLabel, DN.T_HOCH_RES.WertZeile },
		{ DN.T_HOCH_BET.AnzLabel, DN.T_HOCH_BET.WertZeile }
	}
	if DN.T_HOCH_GES.WertZeile then
		DN.IBTHoch.ausklappen = "Weitere Höhenwerte"
	else
		DN.IBTHoch.AnzLabel = "Höhenwerte im Detail:"
	end
	DSMB.Anzeige = ZDS( DSMB.Tabelle, 1 )
	if DSMB.Anzeige == true then
		DN.IBTHoch.WertZeile = DSZusatz.Aufbereitung.Rahmen( DSMB.Tabelle )
		DN.T_HOCH_AUS.BauTyp = "Ausblenden"
		DN.T_HOCH_RES.BauTyp = "Ausblenden"
		DN.T_HOCH_BET.BauTyp = "Ausblenden"
	else
		DN.IBTHoch.BauTyp = "Ausblenden"
	end
	
	return DN
end

	-- Zusammenfassung fuer Sendeanlagen-Einzelheiten
p.DSIB.IBSHoch = function ( DN, DSZusatz, Kategorien, frame )
	DN.IBSHoch.ausklappen = "Daten zu den einzelnen Sendetürmen/Sendemasten"
	local DSMB = { }
	DSMB.Tabelle = {
		{ "Höhe", DN.S_HOCH_GES.WertZeile, DN.S_HOCH_GES.WertSplit, DN.S_HOCH_GES.AnzSplit, Name = "S_HOCH_GES", Einheit = "&nbsp;m" },
		{ "Bauzeit", DN.S_BAU_ZEIT.WertZeile, DN.S_BAU_ZEIT.WertSplit, DN.S_BAU_ZEIT.AnzSplit, Name = "S_BAU_ZEIT" },
		{ "Betriebszeit", DN.S_BET_ZEIT.WertZeile, DN.S_BET_ZEIT.WertSplit, DN.S_BET_ZEIT.AnzSplit, Name = "S_BET_ZEIT" },
		{ "Umbau Antenne", DN.S_ANT_BAU.WertZeile, DN.S_ANT_BAU.WertSplit, DN.S_ANT_BAU.AnzSplit, Name = "S_ANT_BAU" },
		{ "Umbau Sender", DN.S_UMBAU.WertZeile, DN.S_UMBAU.WertSplit, DN.S_UMBAU.AnzSplit, Name = "S_UMBAU" },
		{ "Stilllegung Sender", DN.S_STILL.WertZeile, DN.S_STILL.WertSplit, DN.S_STILL.AnzSplit, Name = "S_STILL" }
	}
	
	--	Maximale Datensatz-Anzahl:
	DSMB.max = 0 --     Ermittlung maximale Turmanzahl, Einzel
	DSMB.SatzMax = 0 -- Ermittlung maximale Turmanzahl, Gesamt
	for maxK, maxV in pairs( DSMB.Tabelle ) do
		if maxV[2] == "" then DSMB.max = 0 else DSMB.max = maxV[4] end 
		DSMB.SatzMax = math.max( DSMB.SatzMax, DSMB.max )
	end
	
	--	Sortierung nach Turm/Mast:
	local Einheit = ""
	DSMB.Komplett = { } -- Komplett-Zusammenstellung nach Turm/Mast
	DSMB.leer = "style=\"text-align:center;\" | –"
	for ZZ=1, DSMB.SatzMax, 1 do
		DSMB.Komplett[ZZ] = { }
		for ZZk, ZZv in pairs( DSMB.Tabelle ) do
			Einheit = ZZv.Einheit or ""
			DSMB.Komplett[ZZ][ZZk] = { ZZv[1], DSMB.leer, Einheit }
			if ZZv[3] == nil then ZZv[3] = { } end
			if (ZZv[3][ZZ] and ZZv[3][ZZ] ~= "") then DSMB.Komplett[ZZ][ZZk][2] = ZZv[3][ZZ] end
		end
	end
	
	--	Leere erkennen
	DSMB.Grundsatz = { }
	DSMB.Box = false
	DSMB.DSHoch = 1
	for dslMk, dslMv in pairs( DSMB.Tabelle ) do
		if dslMv["Name"] == "S_HOCH_GES" then DSMB.DSHoch = dslMk end
		if (DN[dslMv["Name"]]["WertZeile"] and DN[dslMv["Name"]]["BauTyp"] == "Liste" and (DSMB.Tabelle[dslMk][4] > 1 or dslMv["Name"] == "S_HOCH_GES")) then
			DSMB.Grundsatz[dslMk] = true
			if dslMv["Name"] ~= "S_HOCH_GES" then
				DN[dslMv["Name"]]["BauTyp"] = "Ausblenden"
				DSMB.Box = true
			end
		else
			DSMB.Grundsatz[dslMk] = false
		end
	end
	if (DSMB.Box == false or DN[DSMB.Tabelle[DSMB.DSHoch]["Name"]]["BauTyp"] ~= "Liste") then
		DSMB.Grundsatz[DSMB.DSHoch] = false
	else
		DN[DSMB.Tabelle[DSMB.DSHoch]["Name"]]["BauTyp"] = "Ausblenden"
	end
	for ZX=1, DSMB.SatzMax, 1 do -- leere aussortieren
		for ZXk, ZXv in pairs( DSMB.Komplett[ZX] ) do
			if DSMB.Grundsatz[ZXk] == false then ZXv[2] = nil end
		end
	end
	
	--	Liste anzeigen:
	if DSMB.Box == true then
		DN.S_ANZAHL_T.BauTyp = "Ausblenden"
		for XX=1, DSMB.SatzMax, 1 do
				if XX == 1 then
					DN.IBSHoch.WertZeile = ""
				else
					DN.IBSHoch.WertZeile = DN.IBSHoch.WertZeile .. "\n"
				end
				DN.IBSHoch.WertZeile = DN.IBSHoch.WertZeile .. DSZusatz.Aufbereitung.Rahmen( DSMB.Komplett[XX], "Turm/Mast " .. tostring( XX ) )
		end
	else
		DN.IBSHoch.BauTyp = "Ausblenden"
	end
	if DN.IBSHoch.WertZeile == "" then DN.IBSHoch.WertZeile = nil end
	
	return DN
end
	-- Gueltigkeitspruefung 'KOORDINATEN'
p.DSIB.KOORDINATEN = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { }
	DSMB.KO = { { "NS", P = "N", N = "S" } , { "EW", P = "E", N = "W" } }
	DSMB.ZeilenSpeicher = { }
	DSMB.ist = { NS = true, EW = true }
	
	for KONk, KONv in pairs( DSMB.KO ) do
		DSMB.ZeilenSpeicher.Komma = 0
		for WKk, WKv in pairs( DN[KONv[1]]["WertSplit"] ) do
			if (tonumber( WKv ) and WKk < 4 ) then
				DSMB.ZeilenSpeicher.Komma = DSMB.ZeilenSpeicher.Komma + tonumber( WKv ) / (60 ^ ( WKk - 1 ))
			elseif ( WKv == KONv.P and WKk > 1 and WKk < 5 ) then
				DSMB.ZeilenSpeicher.Komma = DSMB.ZeilenSpeicher.Komma * 1
			elseif ( WKv == KONv.N and WKk > 1 and WKk < 5 ) then
				DSMB.ZeilenSpeicher.Komma = DSMB.ZeilenSpeicher.Komma * -1
			else
				DSMB.ist[KONv[1]] = false
			end
		end
		if not DN[KONv[1]]["WertSplit"][1] then DSMB.ist[KONv[1]] = false end
		if DSMB.ist[KONv[1]] == true then
			if ( (DSMB.ZeilenSpeicher.Komma * 10^8 - math.floor( DSMB.ZeilenSpeicher.Komma * 10^8 )) * 10 ) < 5 then
				DSMB.ZeilenSpeicher.Komma = math.floor( DSMB.ZeilenSpeicher.Komma * 10^8 ) / ( 10^8 )
			else
				DSMB.ZeilenSpeicher.Komma = math.floor( DSMB.ZeilenSpeicher.Komma * 10^8 + 1 ) / ( 10^8 )
			end
			if (( DSMB.ZeilenSpeicher.Komma > 90 * KONk) or ( DSMB.ZeilenSpeicher.Komma < -90 * KONk) ) then DSMB.ist[KONv[1]] = false end
			DN[KONv[1]]["WertSplit"][1] = DSMB.ZeilenSpeicher.Komma
			DN[KONv[1]]["AnzSplit"] = 1
			if DSMB.ist[KONv[1]] == true then
				DN[KONv[1]]["WertZeile"] = tostring( DSMB.ZeilenSpeicher.Komma )
			else
				DN[KONv[1]]["WertZeile"] = nil
			end
		else
			DN[KONv[1]]["WertSplit"][1] = DN[KONv[1]]["WertZeile"]
			DN[KONv[1]]["WertZeile"] = nil
			DN[KONv[1]]["AnzSplit"] = 1
		end
		if not DN[KONv[1]]["WertSplit"][1] then DN[KONv[1]]["AnzSplit"] = 0 end
	end
	
	return DN
end

	-- Positionskarte 'POSKARTE'
p.DSIB.POSKARTE = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { Karte = { }, TMP = { } }
	if (DN.POSKARTE.WertZeile == "kein" or DN.POSKARTE.WertZeile == "keine" or DN.POSKARTE.WertZeile == "nein" or DN.POSKARTE.WertZeile == "no" or DN.POSKARTE.WertZeile == "aus" or DN.POSKARTE.WertZeile == "ohne") then
		DSMB.anzeigen = false
	else
		DSMB.anzeigen = true
	end
	
	-- Anzeige Positionskarte
	if (DSZusatz.REGION["0"] and DN.NS.WertZeile and DN.EW.WertZeile and DSMB.anzeigen == true) then
		DSMB.PK = {
			title = "Positionskarte",
			args = {
				"Welt",
				border = "none",
				float = "inline",
				width = "360",
				maptype = "relief",
				label = DSZusatz.NNAME,
				label_size = "75%",
				background = "#fff4d5",
				lat = tostring( DN.NS.WertSplit[1] ),
				long = tostring( DN.EW.WertSplit[1] ),
				type = "building",
				name = DSZusatz.NNAME,
				region = DN["REGION-ISO"]["WertZeile"],
				Breite = nil
			}
		}
		DSMB.TMP.DL = 1
		DSMB.Karte[1] = {
			G = "Welt",
			Bmax = 360,
			Hmax = 1000,
			Amax = 48000
		}
		if DSZusatz.REGION["0"] then DSMB.Karte[1]["G"] = DSZusatz.REGION["0"]["map"] or DSMB.Karte[1]["G"] end
		if DSZusatz.REGION["1"] then DSMB.Karte[1]["G"] = DSZusatz.REGION["1"]["map"] or DSMB.Karte[1]["G"] end
		if DSZusatz.REGION["2"] then DSMB.Karte[1]["G"] = DSZusatz.REGION["2"]["map"] or DSMB.Karte[1]["G"] end
		if DN.POSKARTE.WertSplit[1] then
			if mw.getCurrentFrame():callParserFunction( "#ifexist", { "Vorlage:Positionskarte " .. DN.POSKARTE.WertSplit[1], "1", "0" } ) == "1" then
				DSMB.Karte[1]["G"] = DN.POSKARTE.WertSplit[1]
			end
		end
		DSMB.Karte.obige = frame:expandTemplate{ title = "Obige Karte", args = { DSMB.Karte[1]["G"] } }
		--	Sonderfestlegung
		if DSMB.Karte.obige == "USA" then DSMB.Karte.obige = "USA 48" end
		if DSZusatz.REGION["1"] then
			if DSZusatz.REGION["0"]["acronym"] == "RU" then
				if (DSZusatz.REGION["1"]["continent"] == "Europa" or DSZusatz.REGION["1"]["continent"] == "Eurasien") then DSMB.Karte.obige = "Russland Europäischer Teil" end
			end
		end
		--	Anpassung 'obige Karte'
		for OPKk, OPKv in pairs( DSZusatz.OPK ) do
			if OPKv[1] == DSMB.Karte[1]["G"] then DSMB.Karte.obige = OPKv[2] end
			DSMB.Karte.obige = DSMB.Karte.obige or "Welt"
		end
		
		if (DSMB.Karte.obige ~= "Welt" and DSMB.Karte.obige ~= "") then
			DSMB.Karte[2] = {
				G = DSMB.Karte.obige
			}
			DSMB.Karte[1]["Amax"] = DSMB.Karte[1]["Amax"] * 1.25
			DSMB.TMP.DL = 2
		end
		for DL = 1, DSMB.TMP.DL, 1 do
			DSMB.Karte[DL]["img"] = frame:expandTemplate{ title = "Positionskarte " .. DSMB.Karte[DL]["G"], args = { "image", "relief" } }
			DSMB.Karte[DL]["Borg"] = mw.title.new( DSMB.Karte[DL]["img"], 6 ).file.width
			DSMB.Karte[DL]["Horg"] = mw.title.new( DSMB.Karte[DL]["img"], 6 ).file.height
			DSMB.Karte[DL]["Aorg"] = DSMB.Karte[DL]["Borg"] * DSMB.Karte[DL]["Horg"]
			DSMB.Karte[DL]["SV"] = DSMB.Karte[DL]["Borg"] / DSMB.Karte[DL]["Horg"]
			DSMB.Karte[DL]["Bgr"] = math.sqrt( DSMB.Karte[DL]["Amax"] * DSMB.Karte[DL]["SV"] )
			DSMB.Karte[DL]["Hgr"] = DSMB.Karte[DL]["Bgr"] / DSMB.Karte[DL]["SV"]
			if DSMB.Karte[DL]["Bgr"] > DSMB.Karte[DL]["Bmax"] then
				DSMB.Karte[DL]["B"] = DSMB.Karte[DL]["Bmax"]
				DSMB.Karte[DL]["H"] = DSMB.Karte[DL]["B"] / DSMB.Karte[DL]["SV"]
			elseif DSMB.Karte[DL]["Hgr"] > DSMB.Karte[DL]["Hmax"] then
				DSMB.Karte[DL]["H"] = DSMB.Karte[DL]["Hmax"]
				DSMB.Karte[DL]["B"] = DSMB.Karte[DL]["H"] * DSMB.Karte[DL]["SV"]
			else
				DSMB.Karte[DL]["B"] = DSMB.Karte[DL]["Bgr"]
				DSMB.Karte[DL]["H"] = DSMB.Karte[DL]["Hgr"]
			end
			DSMB.Karte[DL]["A"] = DSMB.Karte[DL]["B"] * DSMB.Karte[DL]["H"]
			if (DL == 1 and DSMB.TMP.DL == 2) then
				DSMB.Karte[2]["Bmax"] = DSMB.Karte[1]["B"]
				DSMB.Karte[2]["Hmax"] = DSMB.Karte[1]["H"]
				DSMB.Karte[2]["Amax"] = DSMB.Karte[1]["A"] / 5
			end
			if DL == 2 then
				DSMB.PK.args["Karte in einer Ecke"] = DSMB.Karte[2]["G"]
				DSMB.PK.args.Breite = tostring( math.floor( DSMB.Karte[2]["B"] ) )
			end
		end
		DSMB.PK.args[1] = DSMB.Karte[1]["G"]
		DSMB.PK.args.width = tostring( math.floor( DSMB.Karte[1]["B"] ) )
		DSMB.VKarte = frame:expandTemplate{ title = DSMB.PK.title, args = DSMB.PK.args } or ""
		DN.POSKARTE.WertZeile = DSMB.VKarte
	else
		DN.POSKARTE.WertZeile = ""
	end
	
	if DN.POSKARTE.WertZeile == "" then DN.POSKARTE.WertZeile = nil end
	return DN
end

	-- Anzeige Koordinaten 'KoordKarte'
p.DSIB.KoordKarte = function ( DN, DSZusatz, Kategorien, frame )
	local DSMB = { }
	
	--	Variable für die Wiki-Vorlage
	DSMB.Artikel = false -- sollen Koordinaten im Artikel oben angezeigt werden
	DSMB.Anzeige = true --  sollen Koordinaten in der Infobox angezeigt werden
	DSMB.Rahmen = true --   soll die Anzeige mit einem Rahmen versehen werden
	DSMB.brF = false --     Absatz vor DSMB.Fehler
	DSMB.Fehler = { --      Speicher fuer Fehlermeldung
		GZNS = "Gradzahl-Fehler:<br />\'\'[[Vorlage:Coordinate#NS und EW|NS]]\'\': keine Zahl",
		GZEW = "Gradzahl-Fehler:<br />\'\'[[Vorlage:Coordinate#NS und EW|EW]]\'\': keine Zahl",
		GBNS = "Gültigkeitsbereich Breitengrad: „" .. tostring( DN.NS.WertSplit[1] ) .. "“",
		GBEW = "Gültigkeitsbereich Längengrad: „" .. tostring( DN.EW.WertSplit[1] ) .. "“"
	}
	DSMB.NS = DN.NS.WertSplit[1] or ""
	DSMB.EW = DN.EW.WertSplit[1] or ""
	DSMB.KOA = {
		title = "Coordinate",
		args = {
			NS = tostring( DSMB.NS ),
			EW = tostring( DSMB.EW ),
			type = "building",
			region = DN["REGION-ISO"]["WertZeile"],
			name = DSZusatz.NNAME,
			dim = "250"
		}
	}
	
	--	Zuweisung fuer Rahmen
	if ((DN.NS.WertZeile and DN.EW.WertZeile) or (DN.NS.AnzSplit == 0 and DN.EW.AnzSplit == 0)) then DSMB.Rahmen = false end
	if not DSZusatz.REGION["0"] then
		DSMB.KOA.args["type"] = "building"
		if (DN.NS.WertSplit[1] and DN.EW.WertSplit[1]) then
			DSMB.Rahmen = true
			DSMB.brF = true
		end
	end
	if ((DN.NS.WertZeile and type( DN.NS.WertSplit[1] ) == "number" and DN.EW.WertSplit[1] == nil) or (DN.EW.WertZeile and type( DN.EW.WertSplit[1] ) == "number" and DN.NS.WertSplit[1] == nil)) then
		DSMB.Rahmen = nil
	end
	
	--	Zuweisung zur Anzeige
	if DN.SONDER.WertZeile == "Nebenbox" then
		DSMB.Artikel = false
	elseif DN.SONDER.WertZeile == "Weiterleitung" then
		DSMB.Artikel = true
	elseif DSZusatz.NSP == 0 then
		DSMB.Artikel = true
	end
	
	--	Zuweisung zur Wiki-Vorlage
	if DSMB.Artikel == true then
		DSMB.KOA.args.article = "/"
		if ((DN.NS.WertZeile and DN.EW.WertZeile) or (DN.NS.AnzSplit == 0 and DN.EW.AnzSplit == 0) or (DN.NS.WertZeile and DN.EW.AnzSplit == 0) or (DN.NS.AnzSplit == 0 and DN.EW.WertZeile)) then
			DSMB.Anzeige = false
		end
		if (DSZusatz.REGION["0"] == nil and DN.NS.WertZeile and DN.EW.WertZeile) then DSMB.Anzeige = true end
	else
		DSMB.KOA.args.text = "/"
	end
	if DSMB.Anzeige == false then
		DN.KoordKarte.BauTyp = "Feld"
		DN.KoordKarte.AnzLabel = ""
	end
	
	--	Generierung Vorlage:Coordinate und Fehlertexte
	DN.KoordKarte.WertZeile = frame:expandTemplate{ title = DSMB.KOA.title, args = DSMB.KOA.args }
	if (type( DN.NS.WertSplit[1] ) ~= "number" or type( DN.NS.WertZeile ) == "string") then DSMB.Fehler.GBNS = nil end
	if (type( DN.EW.WertSplit[1] ) ~= "number" or type( DN.EW.WertZeile ) == "string") then DSMB.Fehler.GBEW = nil end
	if DN.NS.AnzSplit > 0 then DSMB.Fehler.GZEW = nil end
	if DN.EW.AnzSplit > 0 then DSMB.Fehler.GZNS = nil end
	if type( DN.NS.WertSplit[1] ) ~= "string" then DSMB.Fehler.GZNS = nil end
	if type( DN.EW.WertSplit[1] ) ~= "string" then DSMB.Fehler.GZEW = nil end
	if (DSMB.Fehler.GZNS and DSMB.Fehler.GZEW) then
		DSMB.Fehler.GZNS = nil
		DSMB.Fehler.GZEW = nil
		DSMB.brF = true
	end
	for Gk, Gv in pairs( DSMB.Fehler ) do
		if DSMB.brF == true then
			DN.KoordKarte.WertZeile = DN.KoordKarte.WertZeile .. "<br />"
		else
			DSMB.brF = true
		end
		if type( Gv ) == "string" then 	DN.KoordKarte.WertZeile = DN.KoordKarte.WertZeile .. Gv end
	end
	if DSMB.Rahmen == true then DN.KoordKarte.WertZeile = DSZusatz.Aufbereitung.Fehler( DN.KoordKarte.WertZeile ) end
	
	return DN
end

--	Region-ISO in Feld
p.DSFI = function ( DatenWL, frame )
	local DSFz = ""
	local DSFD = { }
	DSFD["0"] = { }
	DSFD["0"]["level"] = 0
	DSFD["0"]["continent"] = REG( "O", "continent", DatenWL, frame )
	DSFD["0"]["acronym"] = REG( "O", "acronym", DatenWL, frame )
	DSFD["0"]["admtype"] = REG( "O", "admtype", DatenWL, frame )
	DSFD["0"]["admname"] = REG( "O", "admname", DatenWL, frame )
	DSFD["0"]["name"] = REG( "O", "name", DatenWL, frame )
	DSFD["0"]["lemma"] = REG( "O", "lemma", DatenWL, frame )
	DSFD["0"]["map"] = REG( "O", "map", DatenWL, frame )
	DSFD["0"]["flag"] = REG( "O", "flag", DatenWL, frame )
	DSFD["0"]["Lin"] = "in " .. tostring( DSFD["0"]["name"] )
	DSFz = REG( "O", "in", DatenWL, frame )
	if DSFz ~= "" then DSFD["0"]["Lin"] = DSFz end
	DSFD["1"] = { }
	DSFD["1"]["level"] = 1
	DSFD["1"]["continent"] = REG( "I", "continent", DatenWL, frame )
	DSFD["1"]["acronym"] = REG( "I", "acronym", DatenWL, frame )
	DSFD["1"]["admtype"] = REG( "I", "admtype", DatenWL, frame )
	DSFD["1"]["admname"] = REG( "I", "admname", DatenWL, frame )
	DSFD["1"]["name"] = REG( "I", "name", DatenWL, frame )
	DSFD["1"]["lemma"] = REG( "I", "lemma", DatenWL, frame )
	DSFD["1"]["map"] = REG( "I", "map", DatenWL, frame )
	DSFD["1"]["flag"] = REG( "I", "flag", DatenWL, frame )
	DSFD["1"]["Lin"] = "in " .. tostring( DSFD["1"]["name"] )
	DSFz = REG( "I", "in", DatenWL, frame )
	if DSFz ~= "" then DSFD["1"]["Lin"] = DSFz end
	DSFD["2"] = { }
	DSFD["2"]["continent"] = REG( "II", "continent", DatenWL, frame )
	DSFD["2"]["level"] = REG( "II", "level", DatenWL, frame )
	DSFD["2"]["acronym"] = REG( "II", "acronym", DatenWL, frame )
	DSFD["2"]["admtype"] = REG( "II", "admtype", DatenWL, frame )
	DSFD["2"]["admname"] = REG( "II", "admname", DatenWL, frame )
	DSFD["2"]["name"] = REG( "II", "name", DatenWL, frame )
	DSFD["2"]["lemma"] = REG( "II", "lemma", DatenWL, frame )
	DSFD["2"]["map"] = REG( "II", "map", DatenWL, frame )
	DSFD["2"]["flag"] = REG( "II", "flag", DatenWL, frame )
	DSFD["2"]["Lin"] = "in " .. tostring( DSFD["2"]["name"] )
	DSFz = REG( "II", "in", DatenWL, frame )
	if DSFz ~= "" then DSFD["2"]["Lin"] = DSFz end
	if DSFD["0"]["acronym"] == "NL" then
		if (DSFD["2"]["acronym"] == "AW" or DSFD["2"]["acronym"] == "CW" or DSFD["2"]["acronym"] == "SX") then
			DSFD["0"]["Lin"] = "im Königreich der Niederlande"
		else
			DSFD["0"]["Lin"] = "in den Niederlanden"
		end
	end
	if DSFD["2"]["level"] == "2" then
		if DSFD["0"]["acronym"] == DSFD["1"]["acronym"] then
			DSFD["1"] = DSFD["2"]
			DSFD["1"]["level"] = 2
			DSFD["2"] = nil
		else
			DSFD["2"]["level"] = 2
		end
	elseif DSFD["2"]["level"] == "1" then
		DSFD["1"] = DSFD["2"]
		DSFD["1"]["level"] = 1
		DSFD["2"] = nil
	elseif DSFD["2"]["level"] == "0" then
		DSFD["0"] = DSFD["2"]
		DSFD["0"]["level"] = 0
		DSFD["1"] = nil
		DSFD["2"] = nil
	else
		DSFD["0"] = nil
		DSFD["1"] = nil
		DSFD["2"] = nil
	end
	return DSFD
end

--	Regionen fuer Geo-Regionen auswaehlen
p.GeoVERW = function ( Art, Ort, KFSv, REGION, DCSTADT )
	local REGIO = REGION or { }
	local DSTADT = DCSTADT or ""
	local KFS = KFSv or "Stuttgart"
	if REGIO[KFS] == nil then REGIO[KFS] = { } end
	local VXW = {
		CSTADT = {
			tostring( DSTADT ),
			"nicht " .. tostring( DSTADT ),
			Gastronomiebetrieb = "(" .. tostring( KFS ) .. ")"
		},
		REG = {
			tostring( REGIO[KFS]["Lin"] ),
			"nicht " .. tostring( REGIO[KFS]["Lin"] ),
			Gastronomiebetrieb = "(" .. tostring( REGIO[KFS]["name"] ) .. ")"
		}
	}
	local LOC = VXW["CSTADT"][1]
	if (Ort ~= nil and Ort ~= "") then
		LOC = VXW[Ort][1]
		if (Art ~= nil and Art ~= "") then
			if (VXW[Ort][Art] ~= nil and VXW[Ort][Art] ~= "") then
				LOC = VXW[Ort][Art]
			end
		end
	end
	return LOC
end

-- 	Datenermittlung bei Weiterleitung
p.DatenWeiterleitung = function ( Daten, frame )

	-- 	Ziel definieren
	local Ziel = {
		Name = mw.getCurrentFrame():getParent().args.ZIEL or frame.args.ZIEL
	}
	Ziel.Splitten1 = { }
	Ziel.Splitten2 = { }
	Ziel.NSP = 0
	if Ziel.Name then Ziel.Splitten1 = mw.text.split( Ziel.Name, "#" ) end
	if Ziel.Splitten1[1] then Ziel.Splitten2 = mw.text.split( Ziel.Splitten1[1], ":" ) end
	if Ziel.Splitten2[2] then Ziel.NSP = Ziel.Splitten2[1] end
	Ziel.Seite = Ziel.Splitten2[2] or Ziel.Splitten2[1]
	Ziel.Abschnitt = Ziel.Splitten1[2]
	if Ziel.Seite == "" then Ziel.Seite = nil end
	if Ziel.Abschnitt == "" then Ziel.Abschnitt = nil end
	if Ziel.Seite then Ziel.Inhalt = mw.title.new( Ziel.Seite, Ziel.NSP ):getContent() end
	Ziel.Splitten1 = nil
	Ziel.Splitten2 = nil
	
	-- 	Infobox extrahieren
	if Ziel.Inhalt then
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "Infobox Sendeanlage", "XXXTA" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, " SONDER", " XXXTE" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|SONDER", "| XXXTE" )
		Ziel.Splitten = mw.text.split( Ziel.Inhalt, "XXXTA" )
		Ziel.Inhalt = Ziel.Splitten[2]
	end
	if Ziel.Inhalt then
		Ziel.Splitten = mw.text.split( Ziel.Inhalt, "XXXTE" )
		if Ziel.Splitten[2] then
			Ziel.Inhalt = Ziel.Splitten[1]
		else
			Ziel.Inhalt = nil
		end
	end
	
	-- 	Parameter bestimmen
	if Ziel.Inhalt then
		for PEk, PEv in pairs( Daten ) do
			Ziel.Inhalt = string.gsub( Ziel.Inhalt, " " .. PEv.Name, " XXXPEA" .. PEv.Name )
			Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|" .. PEv.Name, "| XXXPEA" .. PEv.Name )
		end
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, " REGION", " XXXPEAREGION" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|REGION", "| XXXPEAREGION" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, " CAT_TYP", " XXXPEACAT_TYP" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|CAT_TYP", "| XXXPEACAT_TYP" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, " CAT_NAME", " XXXPEACAT_NAME" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|CAT_NAME", "| XXXPEACAT_NAME" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, " CAT_STADT", " XXXPEACAT_STADT" )
		Ziel.Inhalt = string.gsub( Ziel.Inhalt, "|CAT_STADT", "| XXXPEACAT_STADT" )
		Ziel.Splitten = nil
		Ziel.Splitten = string.find( Ziel.Inhalt, "XXXPEA" )
		if not Ziel.Splitten then Ziel.Inhalt = nil end
	end
	
	-- 	Datensaetze extrahieren
	if Ziel.Inhalt then
		Ziel.Splitten =  mw.text.split( Ziel.Inhalt, "XXXPEA" )
		Ziel.vorTabelle = { }
		for DSEk, DSEv in pairs( Ziel.Splitten ) do
			if DSEk > 1 then
				Ziel.ZTL = string.len( DSEv )
				Ziel.ZTZ1 = string.sub( DSEv, Ziel.ZTL )
				Ziel.ZTZ2 = string.sub( DSEv, Ziel.ZTL - 1 )
				if Ziel.ZTZ2 == "| " then
					table.insert( Ziel.vorTabelle, string.sub( DSEv, 0, Ziel.ZTL - 3 ) )
				elseif Ziel.ZTZ1 == "|" then
					table.insert( Ziel.vorTabelle, string.sub( DSEv, 0, Ziel.ZTL - 2 ) )
				end
			end
		end
	end
	
	-- 	Datensaetze aufteilen
	if Ziel.vorTabelle then
		Ziel.ZwischenTabelle, Ziel.Splitten = { }, { }
		for DSF1k, DSF1v in pairs( Ziel.vorTabelle ) do
			Ziel.ZwischenTabelle[DSF1k] = { }
			Ziel.Splitten = mw.text.split( DSF1v, "=" )
			for DSF2k, DSF2v in pairs( Ziel.Splitten ) do
				if DSF2k < 3 then
					Ziel.ZwischenTabelle[DSF1k][DSF2k] = DSF2v
				elseif DSF2k == 2 then
					Ziel.ZwischenTabelle[DSF1k][2] = Ziel.ZwischenTabelle[DSF1k][2] .. DSF2v
				end
			end
			Ziel.ZwischenTabelle[DSF1k][1] = mw.text.trim( Ziel.ZwischenTabelle[DSF1k][1] )
			Ziel.ZwischenTabelle[DSF1k][2] = mw.text.trim( Ziel.ZwischenTabelle[DSF1k][2] )
			if Ziel.ZwischenTabelle[DSF1k][1] == "" then Ziel.ZwischenTabelle[DSF1k][1] = "blind" end
			if Ziel.ZwischenTabelle[DSF1k][2] == "" then Ziel.ZwischenTabelle[DSF1k][2] = nil end
		end
	end
	-- 	Tabelle erzeugen
	Ziel.Tabelle = { false }
	if Ziel.ZwischenTabelle then
		Ziel.Tabelle[1] = true
		for TABk, TABv in pairs( Ziel.ZwischenTabelle ) do
			Ziel.Tabelle[TABv[1]] = TABv[2]
		end
		Ziel.Tabelle.ZIEL = Ziel.Name
		Ziel.Tabelle.ZIELNSP = Ziel.NSP
		Ziel.Tabelle.ZIELSeite = Ziel.Seite
		Ziel.Tabelle.ZIELAbschnitt = Ziel.Abschnitt
	end
	
	return Ziel.Tabelle
end

return p