r2.acts = {

	newLocation = "new location",
	enlargingFactor = 2,
	islands = {},
	ecoSystemName = "r2_desert",
	islandButtonColors = 
	{
		["r2_desert"] = "157 110 74 255", 
		["r2_jungle"] = "47 110 54 255",
		["r2_forest"] = "74 52 0 255",
		["r2_lakes"] = "95 93 67 255", 
		["r2_roots"] = "66 52 41 255",
	},

	islandSelectedButtonColors = 
	{
		["r2_desert"] = "152 60 39", 
		["r2_jungle"] = "18 156 51",   
		["r2_forest"] = "133 36 13", 
		["r2_lakes"] = "109 149 106", 
		["r2_roots"] = "73 148 122",
	},

	islandOverButtonColors = 
	{
		["r2_desert"] = "127 48 33",
		["r2_jungle"] =  "0 51 20", 
		["r2_forest"] = "90 28 0", 
		["r2_lakes"] = "55 53 37",
		["r2_roots"] = "36 22 11", 
	},

	ecosystemNames = 
	{
		["r2_desert"] =	i18n.get("uiR2EDEcosystemDesert"):toUtf8(),
		["r2_jungle"] =	i18n.get("uiR2EDEcosystemJungle"):toUtf8(), 
		["r2_forest"] =	i18n.get("uiR2EDEcosystemForest"):toUtf8(), 
		["r2_lakes"]  =	i18n.get("uiR2EDEcosystemLacustre"):toUtf8(),
		["r2_roots"]  =	i18n.get("uiR2EDEcosystemPrimeRoots"):toUtf8(), 
	},

	selectedIslandButtonId = nil,
	selectedIslandName = nil,

	createNewScenario = true,
	deleteOldScenario = false,
	createNewLocation = true,

	currentScenario = 
	{
		name="",
		level = 0,
		rules = "strict",
		notes = ""
	},

	currentAct = 
	{
		name="",
		weather = 0,
		manualWeather = true,
		notes = "",
	},

	currentLocation = 
	{
		name="",
		islandName = "",
		instanceId = "",
		season = "spring",
		manualSeason = true,
		notes = "",
		entryPoint = "",
	},
}

-------------------------- to sort islands in function of their translated name -----------
function r2.acts:getIslandNb(islandName)

	local islandTrans = i18n.get(islandName):toUtf8()
	local islandNb = string.sub(islandTrans, -5)
	local endLen = 6
	if string.sub(islandNb, 1, 1) ~= " " then
		islandNb = string.sub(islandNb, 3)
		endLen = endLen-1
	else
		islandNb = string.sub(islandNb, 2)
	end

	-- outland test
	local outland = string.sub(islandTrans, 1, -endLen)
	outland = string.sub(outland, -7)
	if outland=="Outland" then return nil end

	islandNb = string.sub(islandNb, 1, -2)
	return tonumber(islandNb)
end

--------------------------------------------------------------------------------------
--------------------------- init location editor -------------------------------------
function r2.acts:initActsEditor()

	-- create scenario/act window
	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	self.islands = {}
	local islands = getCompleteIslands()

	for islandName, islandAtts in pairs(islands) do
		local ecoSystemName = islandAtts.continent
		if self.islands[ecoSystemName] == nil then
			self.islands[ecoSystemName] = {}
		end

		local islandNb = self:getIslandNb(islandName)
		if islandNb then
			self.islands[ecoSystemName][islandNb] = {["name"] =islandName, ["table"] = islandAtts}
		end
	end

	local ecoList = actsUI:find("ecosystem_list_2")
	assert(ecoList)
	ecoList:clear()

	local ecoButtonsGr = actsUI:find("choose_ecosystem")
	assert(ecoButtonsGr)

	local buttonDim = 78
	local maxWLine = actsUI:find("choose_island_2"):find("back_gr").w_real - 1 
	local nbButtonsInLine = math.floor(maxWLine/(buttonDim+2))
	local addW = math.floor((maxWLine - buttonDim*nbButtonsInLine)/nbButtonsInLine)

	-- for each ecosystem group, create all islands buttons
	for ecoSysName, ecoSysTable in pairs(self.islands) do

		local ecoGr = createGroupInstance("template_lines", ecoList.id, {id=ecoSysName})
		assert(ecoGr)
		ecoList:addChild(ecoGr)
		ecoGr.active = false

		local maxPackage = 0
		local islandsNb = 0
		for k, v in pairs(ecoSysTable) do 
			local package = r2.getIslandRingAccess(v.name)
			if r2.RingAccess.testAccess(package) then
				local package = tonumber(string.sub(package, 2, 2))
				if package>maxPackage then maxPackage = package end
				islandsNb=islandsNb+1 
			end
		end
		local nbLines = math.ceil(islandsNb/nbButtonsInLine)

		local ecoButton = ecoButtonsGr:find(ecoSysName):find("eco_button")
		assert(ecoButton)

		local uc_package = ucstring()
		uc_package:fromUtf8(i18n.get("uiR2EDEcosystemPackage"):toUtf8().." : "..maxPackage)
		ecoButton.tooltip = uc_package

		for i=0, nbLines-1 do
			local lineGr = createGroupInstance("template_line", ecoGr.id, {id="line"..i, h=buttonDim})
			assert(lineGr)
			ecoGr:addChild(lineGr)
		end	

		if ecoGr.childrenNb >0 then
			local currentLine = ecoGr:getChild(0)
			assert(currentLine)

			local currentEltInLine = 0
			local currentLineNb = 0

			for islandNb, islandAttrs in pairs(ecoSysTable) do

				local islandName = islandAttrs.name
				local islandTable = islandAttrs.table

				local textureName = islandName.."_sp_little.tga"
				local ringAccess = r2.RingAccess.testAccess( r2.getIslandRingAccess(islandName) )
				if fileExists(textureName) and ringAccess then

					local tooltip = islandName 

					local islandW = islandTable.xmax - islandTable.xmin
					local islandH = islandTable.ymax - islandTable.ymin
					local maxDim = math.max(islandW, islandH)
					local ratio = 64/maxDim
					local width = math.floor(islandW*ratio)
					local height = math.floor(islandH*ratio)

					local maxDim = buttonDim - 20                      -- buttonDim - 2*(8+2)				
					local w_button_texture 
					local h_button_texture 
					local x_button_texture 
					local y_button_texture 
					local scale = "false"
					
					scale, w_button_texture, h_button_texture, width, height = 
						self:textureRedimension(textureName, maxDim, maxDim, width, height)

					scale = tostring(scale)

					-- center button island
					x_button_texture =((maxDim-width)/2 + 10)			--   (8 + (maxDim-width)/2 + 2)
					y_button_texture =-((maxDim-height)/2 + 10)			--   (-((maxDim-height)/2 + 8 + 2))

					local tmplParams = 
					{
						id=islandName,
						posparent="parent",
						posref="TL TL",
						sizeref= "",
						h = buttonDim+2,
						w = buttonDim+addW, 

						x_button="0", 
						y_button="0",	
						w_button = -addW, 
						h_button = "-2",

						icon = textureName,
						tooltip = tooltip,
						w_button_texture = w_button_texture,
						h_button_texture = h_button_texture,
						x_button_texture = x_button_texture,
						y_button_texture = y_button_texture,
						scale = scale,
						color= self.islandButtonColors[ecoSysName],
						back_color= self.islandButtonColors[ecoSysName],
						selected_color = self.islandSelectedButtonColors[ecoSysName].." 255",
						col_over = self.islandOverButtonColors[ecoSysName].." 80",
						group_params_l="r2.acts:openIslandCardFromButton('"..ecoSysName.."', '" ..islandName.."')",
						params_l="r2.acts:openIslandCardFromButton('"..ecoSysName.."', '" ..islandName.."')",
					}
					local buttonIsland = createGroupInstance("act_button_template", currentLine.id, tmplParams)
					
					if buttonIsland then
						currentLine:addChild(buttonIsland)	
						buttonIsland.Env.Name = islandName
					end

					currentEltInLine = currentEltInLine+1
					if currentEltInLine==nbButtonsInLine then
						currentLineNb = currentLineNb+1
						if currentLineNb < ecoGr.childrenNb then
							currentLine = ecoGr:getChild(currentLineNb)
						end
						currentEltInLine = 0
					end
				end
			end
		end
	end

	local newLocationMode = actsUI:find("new_location_mode_2")
	assert(newLocationMode)
	newLocationMode.Env.Name = self.newLocation

	local ringLevel = actsUI:find("ring_level")
	ringLevel.hardtext = "Ring level :    " .. r2.getCharacterRingAccess()
end

--------------------------------------------------------------------------------------
--------------------------- open scenario editor -------------------------------------
function r2.acts:openScenarioActEditor(newScenario, noCancelOption, rebuildFirstAct)
	
	setKeyboardContext("r2ed_scenario_creation")

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local locationEditor = actsUI:find("location")
	assert(locationEditor)

	local prevLocationEditor = actsUI:find("previous_location")
	assert(prevLocationEditor)

	actsUI.active = true
	setTopWindow(actsUI)

	self.createNewScenario = newScenario
	locationEditor.active = (newScenario==true or rebuildFirstAct==true)
	prevLocationEditor.active = not locationEditor.active
	self.createNewLocation = true

	local islandCancel = actsUI:find("island_cancel")
	assert(islandCancel)
	islandCancel.active = (noCancelOption~=true)

	local islandPrecedent = actsUI:find("island_precedent")
	assert(islandPrecedent)
	islandPrecedent.active = (self.createNewScenario~=true and rebuildFirstAct~=true)
	
	-----------------------------------------
	-- init scenario/act/location properties
	self.currentScenario.level = 0
	self.currentScenario.rules = "strict"

	self.currentAct.weather = math.random(0,1022) 
	self.currentAct.manualWeather = true
	self.currentLocation.manualSeason = true

	local seasonNb = math.random(1,4) 
	local seasons = {[1]="Spring", [2]="Summer", [3]="Autumn", [4]="Winter"}
	self.currentLocation.season = seasons[seasonNb]

	-- location season
	local seasonGr = actsUI:find("island_season")
	assert(seasonGr)
	local seasonButton = seasonGr:find(self.currentLocation.season)
	assert(seasonButton)
	self:selectButtonTemplate(seasonButton)

	local seasonManual = seasonGr:find("manual_season_2")
	assert(seasonManual)
	seasonManual:find("toggle_butt").pushed = not self.currentLocation.manualSeason

	-- act and scenario names
	if self.createNewScenario or rebuildFirstAct then
		self.currentAct.name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. " 1"
	else
		local actNb = r2.Scenario.Acts.Size 
		self.currentAct.name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. " " .. actNb 
	end
	
	if self.createNewScenario == true then
		self.currentScenario.name = i18n.get("uiR2EDNewScenario"):toUtf8()
	else
		r2.ScenarioWindow:setActNotes()

		-- select "new island" mode
		local newLocationMode = actsUI:find("new_location_mode_2")
		assert(newLocationMode)
		newLocationMode:find("button").active = false
		newLocationMode:find("selected_button").active = true
		self.currentLocation.islandName = ""
		self.currentLocation.instanceId = ""
			
		-- clean list of old previous locations
		local locationList = actsUI:find("location_list")
		assert(locationList)
		locationList:clear()

		self:openPreviousIslandsActs()

		local scrollPreviousLoc = actsUI:find("scroll_previous_islands")
		assert(scrollPreviousLoc)
		scrollPreviousLoc.trackPos = scrollPreviousLoc.h_real
	end

		self:openEcosystemIslands("r2_desert")		
end

function r2.acts:backPreviousLocations()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local newLocationMode = actsUI:find("new_location_mode_2")
	assert(newLocationMode)

	self:locationIsland(newLocationMode:find("button"))

	local locationEditor = actsUI:find("location")
	assert(locationEditor)

	local prevLocationEditor = actsUI:find("previous_location")
	assert(prevLocationEditor)

	locationEditor.active = false
	prevLocationEditor.active = true
end

-------------------------------------------------------------------------------------------------------
function r2.acts:openPreviousIslandsActs()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local locationList = actsUI:find("location_list")
	assert(locationList)

	local enlargingFactor = self.enlargingFactor 

	local locationActs = {}
	for key, act in specPairs(r2.Scenario.Acts) do
		local locationId = act.LocationId
		if locationActs[locationId]==nil then locationActs[locationId]={} end
		table.insert(locationActs[locationId], act.InstanceId)
	end

	for key, location in specPairs(r2.Scenario.Locations) do
		
		local islandName = location.IslandName

		local textureName = islandName .. "_sp.tga"

		local actsUI = getUI("ui:interface:r2ed_acts")
		assert(actsUI)

		local islandTable
		local ecoSysName = nil
		for ecoSystem, ecoSysTable in pairs(self.islands) do
			local islandNb = self:getIslandNb(islandName)
			if ecoSysTable[islandNb] and ecoSysTable[islandNb].name == islandName then
				ecoSysName = ecoSystem
				islandTable = ecoSysTable[islandNb].table
				break
			end
		end

		if ecoSysName then

			local backTexture = ecoSysName .. "_back.tga"

			local islandW, islandH = (islandTable.xmax - islandTable.xmin)*enlargingFactor, (islandTable.ymax - islandTable.ymin)*enlargingFactor

			-- resize island button to see all island whitout deformation
			local totalDim = 200
			local maxDim = totalDim-2*8
			local w_button_texture 
			local h_button_texture 
			local x_button_texture 
			local y_button_texture 
			local scale = "false"
			
			local initW, initH = islandW, islandH

			scale, w_button_texture, h_button_texture, islandW, islandH = 
				self:textureRedimension(textureName, maxDim, maxDim, islandW, islandH)

			scale = tostring(scale)

			-- center button island
			x_button_texture = (maxDim-islandW)/2 + 8				--   8 + (maxDim-width)/2 + 2 
			y_button_texture = -((maxDim-islandH)/2 + 8)			--   -((maxDim-height)/2 + 8 + 2)

			local h, h_button, y_button, h_text, y_text
			local marge=15
			if locationList.childrenNb == 0 then
				h=totalDim
				h_button="0"
				y_button="0"
				h_text="0"
				y_text="0"
			else
				h=totalDim+marge
				h_button=-marge
				y_button=-marge
				h_text=-marge
				y_text=-marge
			end

			local tmplParams = 
			{
				id=islandName,
				posparent="parent",
				posref="BR TR",
				sizeref="w",
				w="0",
				h=h,
				x="0",
				y="0",

				sizeref_act="h",
				w_act = totalDim,
				h_act="0",
				x_act="0",
				y_act="0",
				y_button=y_button, 	
				h_button=h_button,

				icon = textureName,
				w_button_texture = w_button_texture,
				h_button_texture = h_button_texture,
				x_button_texture = x_button_texture,
				y_button_texture = y_button_texture,
				scale = scale,
				color= self.islandButtonColors[ecoSysName],
				back_color= "255 255 255 255",
				selected_color = self.islandSelectedButtonColors[ecoSysName].." 255",
				col_over = self.islandSelectedButtonColors[ecoSysName].." 80",
				group_params_l="r2.acts:locationIsland(getUICaller())",
				params_l="r2.acts:locationIsland()",
				back_texture=backTexture,

				x_text=marge, 
				w_text= -(totalDim + marge + 15), 
				h_text=h_text,
				y_text=y_text,
			}
			local buttonIsland = createGroupInstance("previous_loc_template", locationList.id, tmplParams)
			
			if buttonIsland then
				locationList:addChild(buttonIsland)	
				buttonIsland.Env.InstanceId = location.InstanceId

				local uc_island = ucstring()
				uc_island:fromUtf8(location.Name)
				buttonIsland:find("button"):find("center_button").tooltip = uc_island
				buttonIsland:find("selected_button"):find("center_button").tooltip = uc_island

				-- init text
				local textList = buttonIsland:find("text_list")
				assert(textList)

				local prevText = textList:find("previous_text")
				assert(prevText)

				local text = "'" .. location.Name .. "' Location used in acts :\n"
				prevText:addColoredTextChild(text, 200, 0, 0, 255)

				local acts = locationActs[location.InstanceId]
				for k, actId in pairs(acts) do
					local act = r2:getInstanceFromId(actId)
					local act_text = act.Name 
					if act.ShortDescription~="" then 
						act_text = act_text .. " : "
					end

					prevText:addColoredTextChild(act_text, 200, 120, 0, 255)

					if act.ShortDescription~="" then
						act_text = act.ShortDescription
						local uc_act = ucstring()
						uc_act:fromUtf8(act_text)
						prevText:addTextChild(uc_act)
					end
				end

				-- init scroll target
				local scroll = textList:find("scroll_previous")
				assert(scroll)
				local list = textList:find("list")
				assert(list)
				scroll:setTarget(list.id)
			end

		end
	end
end

--------------------------------------------------------------------------------------
--------------------------- texture button redimension -------------------------------
function r2.acts:textureRedimension(textureName, maxW, maxH, islandW, islandH)

	local scale = false
	local w, h

	if maxW<islandW or maxH<islandH then
		local ratioW = islandW/maxW
		local ratioH = islandH/maxH
		local maxRatio = math.max(ratioW, ratioH)
		
		local textureW, textureH = getTextureSize(textureName)
		local newW = math.floor(textureW/maxRatio)
		local newH = math.floor(textureH/maxRatio)

		scale = true
		w = newW 
		h = newH 

		islandW = math.floor(islandW/maxRatio)
		islandH = math.floor(islandH/maxRatio)
	else
		w = islandW 
		h = islandH 	
	end

	return scale, w, h, islandW, islandH
end

--------------------------------------------------------------------------------------
--------------------------- open islands list of an ecosystem ------------------------
function r2.acts:openEcosystemIslands(ecoSystemName)

	self.ecoSystemName = ecoSystemName

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	-- ecosystem buttons
	local ecoSystemList = actsUI:find("ecosystem_list")
	assert(ecoSystemList)

	local selectedEcoSystemGr = ecoSystemList:find(ecoSystemName)
	assert(selectedEcoSystemGr)

	local selectedIslandsLists = selectedEcoSystemGr:find("two_lists")
	assert(selectedIslandsLists)

	-- ecosystem islands lists
	local ecoSystemList2 = actsUI:find("ecosystem_list_2")
	assert(ecoSystemList2)

	local selectedEcoSystemGr2 = ecoSystemList2:find(ecoSystemName)
	assert(selectedEcoSystemGr2)

	if selectedEcoSystemGr2.active then 
		local ecoButton = selectedEcoSystemGr:find("eco_button")
		assert(ecoButton)
		ecoButton.pushed = true
		--return 
	end

	local index = ecoSystemList2:getElementIndex(selectedEcoSystemGr2)
	for i=0, index do
		ecoSystemList2:upChild(selectedEcoSystemGr2)
	end

	-- all islands list inactive instead of selected ecosystem (inverse)
	for i=0, ecoSystemList2.childrenNb-1 do
		local ecosystemGr2 = ecoSystemList2:getChild(i)
		assert(ecosystemGr2)
		ecosystemGr2.active = (ecosystemGr2.id == selectedEcoSystemGr2.id)
	end

	for i=0, ecoSystemList.childrenNb-1 do

		local ecosystemGr = ecoSystemList:getChild(i)
		assert(ecosystemGr)

		local islandsList = ecosystemGr:find("two_lists")
		assert(islandsList)

		local ecoButton = ecosystemGr:find("eco_button")
		assert(ecoButton)

		ecoButton.pushed = (islandsList.id == selectedIslandsLists.id)

		ecosystemGr.child_resize_h = false
		ecosystemGr.h = 32 
		if islandsList.id == selectedIslandsLists.id then  
			ecosystemGr.h = 38
		end
	end

	-- open first island image
	local selectedIslandsList = selectedEcoSystemGr2:find("line0")
	
	local islandCard = actsUI:find("island_current_image")
	assert(islandCard)

	local islandOk = actsUI:find("island_ok")
	assert(islandOk)

	if selectedIslandsList and (selectedIslandsList.childrenNb > 0) then
		
		-- color
		local ecoColor = self.islandSelectedButtonColors[self.ecoSystemName].." 255"
		local ecoColorBack = self.islandSelectedButtonColors[self.ecoSystemName].." 100"

		islandCard.active = true

		islandCard:find("bl").color = ecoColor
		islandCard:find("tl").color = ecoColor
		islandCard:find("tr").color = ecoColor
		islandCard:find("br").color = ecoColor
		islandCard:find("bottom").color = ecoColor
		islandCard:find("top").color = ecoColor
		islandCard:find("left").color = ecoColor
		islandCard:find("right").color = ecoColor
		islandCard:find("bg").color = ecoColorBack

		islandOk.active = true

		local firstIsland = selectedIslandsList:getChild(0)
		assert(firstIsland)
		self:openIslandCardFromButton(self.ecoSystemName, firstIsland.Env.Name)
	else
		local islandBitmap = actsUI:find("island_bitmap")
		assert(islandBitmap)

		islandBitmap.texture = ""

		islandCard.active = false

		islandOk.active = false
	end

	local scrollIslands = actsUI:find("scroll_islands_2")
	assert(scrollIslands)
	scrollIslands.trackPos = scrollIslands.h_real

	-- "choose island" title
	local title = actsUI:find("choose_island"):find("choose_island_title")
	assert(title)
	-- doesn't work in all language local titleText = " " .. i18n.get("uiR2EDChooseIsland"):toUtf8() .." " .. self.ecosystemNames[self.ecoSystemName] .. " " .. i18n.get("uiR2EDEcosystem"):toUtf8() .. " "
	local titleText = " " .. i18n.get("uiR2EDChooseIsland"):toUtf8() .. self.ecosystemNames[self.ecoSystemName] .. " "
	local uc_title = ucstring()
	uc_title:fromUtf8(titleText)
	title.uc_hardtext = uc_title
end

--------------------------------------------------------------------------------------
--------------------------- open island card and images ------------------------------
function r2.acts:openIslandCardFromButton(ecosystem, islandName)

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local ecosystemList = actsUI:find("ecosystem_list_2")
	assert(ecosystemList)

	local ecosystemGr = ecosystemList:find(ecosystem)
	assert(ecosystemGr)

	local islandButton = ecosystemGr:find(islandName)
	assert(islandButton)

	-- unselect last selection
	if self.selectedIslandButtonId~=nil then
		local lastSelectedIsland = getUI(self.selectedIslandButtonId)
		if lastSelectedIsland ~= nil then
			lastSelectedIsland:find("button").active = true
			lastSelectedIsland:find("selected_button").active = false
		end
	end

	-- select button
	islandButton:find("button").active = false
	islandButton:find("selected_button").active = true

	self.selectedIslandButtonId = islandButton.id

	self.selectedIslandName = islandButton.Env.Name

	self.currentLocation.islandName = self.selectedIslandName

	self:openIslandCard(self.selectedIslandName)
end

--------------------------------------------------------------------------------------
--------------------------- open island card -----------------------------------------
function r2.acts:openIslandCard(islandName)

	local enlargingFactor = self.enlargingFactor

	local textureName = islandName .. "_sp.tga"

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local islandBitmap = actsUI:find("island_bitmap")
	assert(islandBitmap)

	-- load texture
	islandBitmap.texture = textureName

	-- card title
	local title = actsUI:find("island_images"):find("card_title")
	assert(title)
	-- doesn't work in all language local titleText = " " .. i18n.get("uiR2EDZoomOn"):toUtf8() .." '" .. i18n.get(islandName):toUtf8() .. "' " .. i18n.get("uiR2EDIsland"):toUtf8() .. " "
	local titleText = " " .. i18n.get("uiR2EDZoomOn"):toUtf8() .. i18n.get(islandName):toUtf8() .. " "
	local uc_title = ucstring()
	uc_title:fromUtf8(titleText)
	title.uc_hardtext = uc_title

	local islandTable = self.islands[self.ecoSystemName][self:getIslandNb(islandName)].table
	local islandW, islandH = (islandTable.xmax - islandTable.xmin)*enlargingFactor, (islandTable.ymax - islandTable.ymin)*enlargingFactor
	local islandCard = actsUI:find("island_current_image")
	assert(islandCard)

	-- resize island button to see all island whitout deformation
	local maxW, maxH = islandCard.w_real-12, islandCard.h_real-12
	
	local initW, initH = islandW, islandH
	islandBitmap.scale, islandBitmap.w, islandBitmap.h, islandW, islandH = 
		self:textureRedimension(textureName, maxW, maxH, islandW, islandH)

	local cardButton = islandCard:find("selected_button")
	assert(cardButton)

	cardButton.w = - (maxW - islandW)
	cardButton.h = - (maxH - islandH)
	cardButton.x = (maxW - islandW)/2
	cardButton.y = - (maxH - islandH)/2

	-- center button island
	islandBitmap.x = 6
	islandBitmap.y = -6

	-- entry points
	local entryNb = 0
	for location, entry in pairs(islandTable.entrypoints) do

		local entryPoinButton = actsUI:find("entrypoint"..entryNb):find("flag")
		entryPoinButton.active = true
		entryPoinButton.x = (enlargingFactor*(entry.x - islandTable.xmin)/initW)*islandW
		entryPoinButton.y = (enlargingFactor*(entry.y  - islandTable.ymax)/initH)*islandH

		entryPoinButton.tooltip = i18n.get(location)
		entryPoinButton.parent.Env.Name = location
		if entryNb == 0 then
			entryPoinButton.texture = "r2ed_entry_point_pushed.tga"
			self.currentLocation.entryPoint = location
		else
			entryPoinButton.texture = "r2ed_entry_point.tga"
		end

		entryNb = entryNb+1
		if entryNb==9 then break end
	end

	if entryNb < 9 then
		for i=entryNb, 9 do
			local entryPointGr = actsUI:find("entrypoint"..i)
			assert(entryPointGr)
			local entryPoinButton = entryPointGr:find("flag")
			entryPoinButton.active = false
		end
	end

	-- enlarge selected ecosystem button 
	local ecoButton = actsUI:find(self.ecoSystemName)
	assert(ecoButton)

	local ecoList = ecoButton.parent
	assert(ecoList)
	
	for i=0, ecoList.childrenNb-1 do
		local button = ecoList:getChild(i)
		if button == ecoButton then 
			button:find("eco_button").wmin = 164 
		else 
			button:find("eco_button").wmin = 160 
		end
	end

	actsUI:invalidateCoords()
	actsUI:updateCoords()
end

--------------------------------------------------------------------------------------
--------------------------- select an entry point ---------------------------------------
function r2.acts:selectEntryPoint()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	for i=0, 9 do
		local entryPoinButton = actsUI:find("entrypoint"..i):find("flag")
		assert(entryPoinButton)

		if entryPoinButton == getUICaller() then
			getUICaller().texture = "r2ed_entry_point_pushed.tga"
			self.currentLocation.entryPoint = getUICaller().parent.Env.Name
		else
			entryPoinButton.texture = "r2ed_entry_point.tga"
		end
	end 
end

--------------------------------------------------------------------------------------
--------------------------- choose a name for location -------------------------------
function r2.acts:chooseLocationName()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local chooseNamePopup = getUI("ui:interface:r2ed_choose_location_name")
	assert(chooseNamePopup)

	local editText = chooseNamePopup:find("edit_box_group")
	assert(editText)

	local name = editText.uc_input_string:toUtf8()

	-- check location name duplication
	if not self.createNewScenario then
		for i=0, r2.Scenario.Locations.Size-1 do
			local location = r2.Scenario.Locations[i]
			if location.Name == name then
				messageBox(i18n.get("uiR2EDLocationNameDuplicated"))
				return
			end
		end
	end
	
	if name~="" then

		self.currentLocation.name = name

		chooseNamePopup.active = false
		actsUI.active = false

		disableModalWindow()
		setKeyboardContext("r2ed")

		if self.createNewScenario==true then
			self:createScenario()
		else
			self:createAct()
		end
	else
		editText:setFocusOnText()
	end
end

--------------------------------------------------------------------------------------
--------------------------- choose a name for scenario/act ---------------------------
function r2.acts:chooseScenarioActName()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local chooseNamePopup = getUI("ui:interface:r2ed_choose_scenario_act_name")
	assert(chooseNamePopup)

	-- act name
	local actGr = chooseNamePopup:find("act_name")
	assert(actGr)
	local actEditText = actGr:find("edit_box_group")
	assert(actEditText)
	local actName = actEditText.uc_input_string:toUtf8()
	local scenarioName = ""

	local scenarioEditText
	if self.createNewScenario == true then
		-- scenario name
		local scenarioGr = chooseNamePopup:find("scenario_name")
		assert(scenarioGr)

		scenarioEditText = scenarioGr:find("edit_box_group")
		assert(scenarioEditText)
		
		scenarioName = scenarioEditText.uc_input_string:toUtf8()
	end

	if (self.createNewScenario and scenarioName~="" and actName~="") or (not self.createNewScenario and actName~="") then
		chooseNamePopup.active = false
		disableModalWindow()

		self.currentScenario.name = scenarioName
		self.currentAct.name = actName

		if self.createNewLocation == true then
			local locationGr = actsUI:find("location")
			assert(locationGr)

			local scenarioActGr = actsUI:find("scenario_act")
			assert(scenarioActGr)

			scenarioActGr.active = false
			locationGr.active = true

			self:openEcosystemIslands("r2_desert")	
		else
			actsUI.active = false
			if self.createNewScenario==true then
				self:createScenario()
			else
				self:createAct()
			end
			setKeyboardContext("r2ed")
		end

	elseif self.createNewScenario and scenarioName==""then 
		scenarioEditText:setFocusOnText()

	elseif actName=="" then
		actEditText:setFocusOnText()	   
	end
end

--------------------------------------------------------------------------------------
--------------------------------- createScenario -------------------------------------
function r2.acts:createScenario()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	-- scenario/act/location notes
	local scenarioNotes, actNotes
	scenarioNotes = ""
	actNotes = ""
	
	r2.resetNameGiver()
	-- create scenario component
	local scenario= r2.newComponent("Scenario")
	scenario.Ghost_Name = self.currentScenario.name
	scenario.Description.ShortDescription = scenarioNotes
	if r2.Scenario and r2.Scenario.Language then
		scenario.Language = r2.Scenario.Language
	end
	scenario.AccessRules = self.currentScenario.rules
	scenario.Description.LevelId = self.currentScenario.level
	scenario.Description.CreationDate = os.date()
	scenario.Description.Creator = r2:getUserEntityName()
	scenario.Description.CreatorMD5 = r2.getCharIdMd5()


	
	-- create permanent act component
	local act =r2.newComponent("Act")
	local features = act.Features
	local tmpDefault = r2.newComponent("DefaultFeature")
	act.Name =  i18n.get("uiR2EDBaseAct"):toUtf8() 
	table.insert(features, tmpDefault)
	table.insert(scenario.Acts, act)

	-- create act 1 component
	act = r2.newComponent("Act")
	local features = act.Features
	local tmpDefault = r2.newComponent("DefaultFeature")
	r2.ActUIDisplayer.LastSelfCreatedActInstanceId = act.InstanceId
	--act.Name =  i18n.get("uiR2EDAct1"):toUtf8() .. ":" .. r2.currentAct.name
	act.Name =  self.currentAct.name
	act.WeatherValue = self.currentAct.weather
	local manualWeather = 0
	if self.currentAct.manualWeather == true then manualWeather = 1 end
	act.ManualWeather = manualWeather 
	act.ShortDescription = actNotes
	table.insert(features, tmpDefault)
	table.insert(scenario.Acts, act)

	-- create location
	local location = r2.newComponent("Location")
	location.Season = self.currentLocation.season
	location.IslandName = self.currentLocation.islandName  
	location.Name = self.currentLocation.name
	location.EntryPoint = self.currentLocation.entryPoint
	local manualSeason = 0
	if self.currentLocation.manualSeason == true then manualSeason = 1 end
	location.ManualSeason = manualSeason 
	table.insert(scenario.Locations, location)
	act.LocationId = location.InstanceId
	
	r2.requestCreateScenario(scenario)	
	r2:waitScenarioScreen()	

	self.deleteOldScenario = true
end

function r2.acts:createAct()

	r2.requestNewAction(i18n.get("uiR2EDNewActAction"))

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	-- act/location notes
	local actNotes = ""

	-- create act component
	local act =r2.newComponent("Act")
	local features = act.Features
	local tmpDefault = r2.newComponent("DefaultFeature")
	if (tmpDefault == nil) then
		debugWarning("Failed to create default feature");
		return
	end	
	r2.ActUIDisplayer.LastSelfCreatedActInstanceId = act.InstanceId
	local actNb = r2.Scenario.Acts.Size 
	--act.Name = i18n.get("uiR2EDDefaultActTitle"):toUtf8() .. actNb .. ":" .. r2.currentAct.name 
	act.Name = self.currentAct.name 
	act.WeatherValue = self.currentAct.weather
	local manualWeather = 0
	if self.currentAct.manualWeather == true then manualWeather = 1 end
	act.ManualWeather = manualWeather 
	act.ShortDescription = actNotes
	table.insert(features, tmpDefault)
	if (act == nil) then
		debugWarning("Failed to create additionnal 'Act'");
		return
	end	

	-- create location
	local location
	if self.createNewLocation then

		location = r2.newComponent("Location")
		location.Season = self.currentLocation.season
		location.IslandName = self.currentLocation.islandName  
		location.Name = self.currentLocation.name
		location.EntryPoint = self.currentLocation.entryPoint
		local manualSeason = 0
		if self.currentLocation.manualSeason == true then manualSeason = 1 end
		location.ManualSeason = manualSeason 
		act.LocationId = location.InstanceId

		r2.requestInsertNode(r2.Scenario.InstanceId, "Locations", -1, "", location)
	else
		act.LocationId = self.currentLocation.instanceId
	end

	r2.requestInsertNode(r2.Scenario.InstanceId, "Acts", -1, "", act)
end

--------------------------------------------------------------------------------------
--------------------------- choose location name popup -------------------------------
function r2.acts:openLocationName()

	local chooseNamePopup = getUI("ui:interface:r2ed_choose_location_name")
	assert(chooseNamePopup)

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	if not actsUI.active then return end

	local okButton = actsUI:find("island_ok")
	assert(okButton)

	enableModalWindow(okButton, chooseNamePopup.id)

	local editText = chooseNamePopup:find("edit_box_group")
	assert(editText)
	editText.uc_input_string = i18n.get(self.currentLocation.islandName)
	editText:setFocusOnText()
end

------------------------ SELECT BUTTON IN LIST --------------------------------
-- only one button can be selected --------------------------------------------
function r2.acts:selectButtonTemplate(buttonTemplate)

	local list = buttonTemplate.parent
	assert(list)

	for i=0,list.childrenNb-1 do
		local child = list:getChild(i)
		assert(child)
		child:find("button").active = true
		child:find("selected_button").active = false
	end

	buttonTemplate:find("button").active = false
	buttonTemplate:find("selected_button").active = true
end

function r2.acts:selectButton(button)

	local list = button.parent
	assert(list)

	for i=0,list.childrenNb-1 do
		local child = list:getChild(i)
		assert(child)
		child:find("button").pushed = false
	end

	button:find("button").pushed = true
end

--------------------------- CHOOSE LOCATION SEASON ---------------------------------------
function r2.acts:locationSeason(caller)

	local buttonTemplate
	if caller == nil then
		caller = getUICaller()
		buttonTemplate = caller.parent.parent
	else
		buttonTemplate = caller.parent	
	end

	self:selectButtonTemplate(buttonTemplate)

	local list = buttonTemplate.parent
	local seasons = {[0]="Spring", [1]="Summer", [2]="Autumn", [3]="Winter"}
	local seasonNb = list:getElementIndex(buttonTemplate)
	self.currentLocation.season = seasons[seasonNb]
end

----- MANUAL SEASON ACTIVATION -------------------------------------------------------
function r2.acts:manualSeason()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local manualButton = actsUI:find("manual_season_2"):find("toggle_butt")
	assert(manualButton)

	self.currentLocation.manualSeason = (manualButton.pushed==false)

	local seasonList = actsUI:find("season_list_2")
	assert(seasonList)

	seasonList.active = self.currentLocation.manualSeason
end

--- OPEN POPUP NAME FOR ACT/SCENARIO OR LOCATION -----------------------------------------
function r2.acts:openPopupName()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local createLocationGr = actsUI:find("location")
	assert(createLocationGr)
	local prevLocationGr = actsUI:find("previous_location")	
	assert(prevLocationGr)

	if prevLocationGr.active then
		self:createLocationOrCreateAct()
	else
		self:openLocationName()
	end
end


--- CANCEL ACT/SCENARIO CREATION --------------------------------------------------------
function r2.acts:cancelActCreation()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	actsUI.active =false

	setKeyboardContext("r2ed")
end


--------------------- update palette UI when change act ------------------------------
function r2.acts:updatePaletteFromEcosystem()

	local ecosystemTrees = 
				{
					["r2_desert"]	= "fytrees",
					["r2_forest"]	= "fotrees",
					["r2_jungle"]	= "jutrees",
					["r2_lakes"]	= "trtrees",
					["r2_roots"]	= "prtrees",
				}

	local currentAct = r2:getCurrentAct()
	assert(currentAct)

	local botObjectsPalette = {}
	if not r2.Palette.BotEntries then
		return  -- special case for the 'light' palette
	end

	botObjectsPalette = r2.Palette.BotEntries

	if not currentAct:isBaseAct() then
		local currentLocation = r2:getInstanceFromId(currentAct.LocationId)
		if currentLocation==nil then return end

		-- search for ecosystem of current location
		local islandEcosystem
		for ecoName, v in pairs(self.islands) do
			if self.islands[ecoName][self:getIslandNb(currentLocation.IslandName)].name==currentLocation.IslandName then
				islandEcosystem = ecoName
				break
			end
		end

		-- flag to display only vegetation of current ecosystem
		if islandEcosystem and ecosystemTrees[islandEcosystem] then
			for ecoName, v in pairs(ecosystemTrees) do
				botObjectsPalette[ecosystemTrees[ecoName]].Display = (ecoName==islandEcosystem)
			end
		end
	else
		for ecoName, v in pairs(ecosystemTrees) do
			botObjectsPalette[ecosystemTrees[ecoName]].Display = false
		end
	end

	r2:buildPaletteUI()	
end

----------------------------------------------------------------------------------------------
function r2.acts:locationIsland(caller)

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	local buttonTemplate
	if caller == nil then
		caller = getUICaller()
		buttonTemplate = caller.parent.parent
	else
		buttonTemplate = caller.parent	
	end

	if buttonTemplate.Env.Name == self.newLocation then

		-- select "create new location" mode
		buttonTemplate:find("button").active = false
		buttonTemplate:find("selected_button").active = true
		self.createNewLocation = true

		-- deselect all previous locations
		local prevLocationList = actsUI:find("location_list")
		assert(prevLocationList)
		for i=0,prevLocationList.childrenNb-1 do
			local child = prevLocationList:getChild(i)
			assert(child)
			child:find("button").active = true
			child:find("selected_button").active = false
		end
		self.currentLocation.islandName = ""
		self.currentLocation.intanceId = ""
	else
		-- select this previous location
		self:selectButtonTemplate(buttonTemplate.parent)
		self.currentLocation.instanceId = buttonTemplate.parent.Env.InstanceId

		-- deselect "create new location" mode
		local newLocationMode = actsUI:find("new_location_mode_2")
		assert(newLocationMode)
		newLocationMode:find("button").active = true
		newLocationMode:find("selected_button").active = false
		self.createNewLocation = false
	end
end

--------------------------------------------------------------------------------------
--------------------------- choose a name for scenario/act ---------------------------
function r2.acts:createLocationOrCreateAct()

	local actsUI = getUI("ui:interface:r2ed_acts")
	assert(actsUI)

	if self.createNewLocation then
		
		local createLocationGr = actsUI:find("location")
		assert(createLocationGr)
		local prevLocationGr = actsUI:find("previous_location")	
		assert(prevLocationGr)

		createLocationGr.active = true
		prevLocationGr.active = false

		self:openEcosystemIslands("r2_desert")
	else
		actsUI.active = false

		disableModalWindow()
		setKeyboardContext("r2ed")

		self:createAct()
	end
end