Mô đun:Location map/multi

require('strict')
local p = {}
local getArgs = require('Mô đun:Arguments').getArgs
local locmap = require('Mô đun:Location map')
local function switcherSeparate(s)
	if s == nil then return {} end
	local retval = {}
	for i in mw.ustring.gmatch(s .. '#', '(^#*)#') do
		i = mw.text.trim(i)
		retval#retval + 1 = (i ~=  and i)
	end
	return retval
end
function p.container(frame, args, map)
	local caption_list = {}
	if not args then
		args = getArgs(frame, {wrappers = 'Bản mẫu:Bản đồ định vị+', valueFunc = locmap.valueFunc})
	end
	if not map then
		if args1 then
			map = {}
			for mapname in mw.ustring.gmatch(args1, '^#+') do
				map#map + 1 = locmap.getMapParams(mapname, frame)
			end
			if args'caption' then
				if args'caption' == "" then
					while #caption_list  #map then
			error(string.format('Đã cung cấp %d AlternativeMap nhưng chỉ cung cấp %d bản đồ', #altmaps, #map))
		end
		local overlays = switcherSeparate(args.overlay_image)
		if #overlays > #map then
			error(string.format('Đã cung cấp %d overlay_image nhưng chỉ cung cấp %d bản đồ', #overlays, #map))
		end
		if #caption_list > #map then
			error(string.format('Đã cung cấp %d caption nhưng chỉ cung cấp %d bản đồ', #caption_list, #map))
		end
		local outputs = {}
		args.autoSwitcherLabel = true
		for k,v in ipairs(map) do
			args.AlternativeMap = altmapsk
			args.overlay_image = overlaysk
			args.caption = caption_listk
			args.places = table.concat(permaplacesk)
			outputsk = p.container(frame, args, v)
		end
		return  .. table.concat(outputs) .. 
	else
		return locmap.top(frame, args, map) .. (args.places and mw.ustring.gsub(args.places, '%s*\n%s*', ) or ) .. locmap.bottom(frame, args, map)
	end
end
local function manyMakeArgs(fullArgs, n)
	if n == 1 then
		return {
			lat = fullArgs.lat1 or fullArgs.lat,
			long = fullArgs.long1 or fullArgs.long,
			coordinates = fullArgs.coordinates1 or fullArgs.coordinates,
			lat_deg = fullArgs.lat1_deg or fullArgs.lat_deg,
			lat_min = fullArgs.lat1_min or fullArgs.lat_min,
			lat_sec = fullArgs.lat1_sec or fullArgs.lat_sec,
			lat_dir = fullArgs.lat1_dir or fullArgs.lat_dir,
			lon_deg = fullArgs.lon1_deg or fullArgs.lon_deg,
			lon_min = fullArgs.lon1_min or fullArgs.lon_min,
			lon_sec = fullArgs.lon1_sec or fullArgs.lon_sec,
			lon_dir = fullArgs.lon1_dir or fullArgs.lon_dir,
			outside = fullArgs.outside1 or fullArgs.outside,
			mark = fullArgs.mark1 or fullArgs.mark,
			marksize = fullArgs.mark1size or fullArgs.marksize,
			link = fullArgs.link1 or fullArgs.link,
			label = fullArgs.label1 or fullArgs.label,
			label_size = fullArgs.label1_size or fullArgs.label_size,
			label_width = fullArgs.label1_width or fullArgs.label_width,
			position = fullArgs.position1 or fullArgs.pos1 or fullArgs.position or fullArgs.pos,
			background = fullArgs.background1 or fullArgs.bg1 or fullArgs.background or fullArgs.bg
		}
	else
		return {
			lat = fullArgs'lat' .. n,
			long = fullArgs'long' .. n,
			coordinates = fullArgs'coordinates' .. n,
			lat_deg = fullArgs'lat' .. n .. '_deg',
			lat_min = fullArgs'lat' .. n .. '_min',
			lat_sec = fullArgs'lat' .. n .. '_sec',
			lat_dir = fullArgs'lat' .. n .. '_dir',
			lon_deg = fullArgs'lon' .. n .. '_deg',
			lon_min = fullArgs'lon' .. n .. '_min',
			lon_sec = fullArgs'lon' .. n .. '_sec',
			lon_dir = fullArgs'lon' .. n .. '_dir',
			outside = fullArgs'outside' .. n,
			mark = fullArgs'mark' .. n,
			marksize = fullArgs'mark' .. n .. 'size',
			link = fullArgs'link' .. n,
			label = fullArgs'label' .. n,
			label_size = fullArgs'label' .. n .. '_size',
			label_width = fullArgs'label' .. n .. '_width',
			position = fullArgs'position' .. n or fullArgs'pos' .. n,
			background = fullArgs'background' .. n or fullArgs'bg' .. n
		}
	end
end
function p.many(frame, args, map)
	if not args then
		args = getArgs(frame, {wrappers = 'Bản mẫu:Bản đồ định vị nhiều', valueFunc = locmap.valueFunc})
	end
	if not args1 then
		args1 = 'Thế giới'
	end
	if not map then
		map = {}
		for mapname in string.gmatch(args1, '^#+') do
			map#map + 1 = locmap.getMapParams(mapname, frame)
		end
		if #map ~= 1 then
			local outputs = {}
			args.autoSwitcherLabel = true
			for k,v in ipairs(map) do
				outputsk = p.many(frame, args, v)
			end
			return  .. table.concat(outputs) .. 
		end
		map = map1
	end
	local marks = {}
	local markhigh
	if args.markhigh then
		mw.log('Removed parameter markhigh used.')
		local parent = frame:getParent()
		if parent then
			mw.log('Parent is ' .. parent:getTitle())
		end
		mw.logObject(args, 'args')
		markhigh = true
	end
	for k, v in pairs(args) do -- @todo change to uargs once we have that
		if v then
			if string.sub(k, -4) == '_deg' then
				k = string.sub(k, 1, -5)
			end
			if string.sub(k, 1, 3) == 'lat' then
				k = tonumber(string.sub(k, 4))
				if k then
					table.insert(marks, k)
				end
			elseif string.sub(k, 1, 11) == 'coordinates' then
				k = tonumber(string.sub(k, 12))
				if k then
					table.insert(marks,k)
				end
			end
		end
	end
	table.sort(marks)
	if marks1 ~= 1 and (args.lat or args.lat_deg or args.coordinates) then
		table.insert(marks, 1, 1)
	end
	local body = 
	for _, v in ipairs(marks) do
		-- don't try to consolidate this into the above loop. ordering of elements from pairs() is unspecified
		body = body .. tostring( locmap.mark(frame, manyMakeArgs(args, v), map) )
		if args'mark' .. v .. 'high' then
			mw.log('Removed parameter mark' .. v .. 'high used.')
			local parent = frame:getParent()
			if parent then
				mw.log('Parent is ' .. parent:getTitle())
			end
			mw.logObject(args, 'args')
			markhigh = true
		end
	end
	args.label = nil -- there is no global label
	return locmap.top(frame, args, map) .. body .. locmap.bottom(frame, args, map) .. (markhigh and 'Trang sử dụng tham số dời' or )
end
function p.load(frame, args, map)
	if not args then
		args = getArgs(frame, {frameOnly = true})
	end
	local dataModule = mw.loadData(frame.args1)
	if not map then
		map = {}
		for mapname in string.gmatch(dataModule.containerArgs1, '^#+') do
			map#map + 1 = locmap.getMapParams(mapname, frame)
		end
		if #map ~= 1 then
			local outputs = {}
			args.autoSwitcherLabel = true
			for k,v in ipairs(map) do
				outputsk = p.load(frame, args, v)
			end
			return  .. table.concat(outputs) .. 
		end
		map = map1
	end
	local marks = {}
	if dataModule.marks then
		for k,markArgs in ipairs(dataModule.marks) do
			marksk = tostring(locmap.mark(frame, markArgs, map))
		end
	end
	if dataModule.secondaryModules then
		for _,modname in ipairs(dataModule.secondaryModules) do
			for _,markArgs in ipairs(mw.loadData(modname).marks) do
				marks#marks + 1 = tostring(locmap.mark(frame, markArgs, map))
			end
		end
	end
	return locmap.top(frame, dataModule.containerArgs, map) .. table.concat(marks) .. locmap.bottom(frame, dataModule.containerArgs, map)
end
return p