class 'ExtraScreenBase' (BaseScreen)
-------------------------------------------------------------------------------

function ExtraScreenBase:__init(name)
	BaseScreen.__init(self, name)

	self.buttons		 = nil			-- Таблица, хранящая данные про кнопки. Создается в методе createButtonsTable.
	self.pages			 = nil			-- Таблица, хранящая данные про страницы. Создается в методе initPages.
	self.currentPageName = nil			-- Имя страницы, отображаемой в данный момент.
	self.counterName	 = 'tf_counter'	-- Имя текстового поля (TextEntity), отвечающего за отображение счетчика.

	self:initButtons()
	self:initPages()

	for pageName, page in pairs(self.pages) do
		page.entity:hide()
	end

	self:getCounterTextField():setText('')
	self.timer:add(	bind(self.preCreateContent, self), 0.5)
end
-------------------------------------------------------------------------------

function ExtraScreenBase:preCreateContent()
	for id, pageInfo in pairs(self.pages) do
		local page = pageInfo.entity

		if not page:isContentCreated() then
			page:createContent()
		end
	end
end
-------------------------------------------------------------------------------

--[[
 * Метод создает таблицу, содержащую необходимую для инициализации кнопок информацию.
 * В качестве индексов используются строковые идетнификаторы кнопок. Для получения кнопки
 * можно использовать метод getButton, передав в него один из указаных ранее идентификаторов.
 * Example:
		['play'] =
		{
			entity	= self:getEntityNamed('bttn_play'),
			press	= bind(self.onPlayPress, self),
			bHide	= true,
		},
 * Метод должен быть переопределет в классе расширяемом данный. 
--]]
function ExtraScreenBase:createButtonsTable()
	local buttons =
	{
	}
	return buttons
end
-------------------------------------------------------------------------------

--[[
 * Метод инициализирует кнопки на основе созданой в методе createButtonsTable таблицы. 
--]]
function ExtraScreenBase:initButtons()
	self.buttons = self:createButtonsTable() or {}

	for id, info in pairs(self.buttons) do
		info.entity:setSFXTrackOnPress( info.sfx or getCommonSoundEntity('ButtonClick') )

		if info.press then
			info.entity.onPress:add( info.press )
		end

		if info.bHide then
			info.entity:hide()
		end
	end
end
-------------------------------------------------------------------------------

--[[
 * Отображает кнопки, идентификаторы которых переданы параметру buttons в виде таблицы.
 * @param	buttons		Индексированная таблица строковых идентификаторов кнопок, которые
 *						необходимо показать.
--]]
function ExtraScreenBase:showButtons(buttons)
	for _, name in ipairs(buttons) do
		self.buttons[name].entity:show()
	end
end
-------------------------------------------------------------------------------

--[[
 * Скрывает кнопки, идентификаторы которых переданы параметру buttons в виде таблицы.
 * @param	buttons		Индексированная таблица строковых идентификаторов кнопок, которые
 *						необходимо скрыть.
--]]
function ExtraScreenBase:hideButtons(buttons)
	for _, name in ipairs(buttons) do
		self.buttons[name].entity:hide()
	end
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает объект кнопки по указаному строковому идентификатору. Идентификаторы
 * для кнопок устанавливаются в методе createButtonsTable.
 * @param	id		Строковый идентификатор.
--]]
function ExtraScreenBase:getButton(id)
	return self.buttons[id].entity
end
-------------------------------------------------------------------------------

--[[
 * Метода возвращает текстовое поле (TextEntity), отвечающее за отображение счетчика.
--]]
function ExtraScreenBase:getCounterTextField()
	return self:getEntityNamed(self.counterName)
end
-------------------------------------------------------------------------------


--[[
 * Метод создает содержимое скрина в видет так называемых страниц и инициализирует
 * таблицу, храняцую эти страницы. Страницы должны быть реализованы склассами,
 * расширяющими базовый класс ExtraPageBase. В качестве индексов используются
 * строки, представляющие имя страшицы. Также в таблице для каждой страницы указываются
 * перечни строковых идентификаторов кнопок, которые должны быть видны при ее отображении.
 * Example:
	self.pages =
	{
		['conceptArt'] =
		{
			entity  = ExtraConceptArt(self, 2),
			buttons = {'prev', 'next', 'save'}
		},
	}
 * Метод должен быть переопределет в классе расширяемом данный.
--]]
function ExtraScreenBase:initPages()
	self.pages = {}
end
-------------------------------------------------------------------------------

function ExtraScreenBase:hideCurrentPage()
	local page = self:getCurrentPage()
	if page then
		page.entity:hide()
		self:hideButtons(page.buttons)
		self:getCounterTextField():setText('')
	end

	self.currentPageName = nil
end
-------------------------------------------------------------------------------

--[[
 * Метод отображает указаную в параметре pageName страницу, скрывая предыдущую.
 * Также происходит скрытие/отображение кнопок, привязаных к страницам.
 * @param	pageName	Имя страницы, заданое в методе initPages.
--]]
function ExtraScreenBase:showPage(pageName)
	self:hideCurrentPage()
	self.currentPageName = pageName

	local page = self:getCurrentPage()
	if page then
		self:showButtons(page.buttons)
		page.entity:show()
	end
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает таблицу, хранящую данные про страницу, имя которой передано
 * параметру pageName.
 * @param	pageName	Имя страницы, заданое в методе initPages.
--]]
function ExtraScreenBase:getPage(pageName)
	return self.pages[pageName]
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает таблицу, хранящую данные про страницу, отображаемую в данный момент.
--]]
function ExtraScreenBase:getCurrentPage()
	return self.pages[self.currentPageName]
end
-------------------------------------------------------------------------------


--[[
 * Обработчики нажатия кнопки начала игры в дополнительные локации (CollectorsEdition)
--]]
function ExtraScreenBase:onPlayGamePress()
	local state = ProfilesManager:getCurrentProfile().gameState

	if state:hasState(CE_OPENED, EGameStateTag.GENERAL) then
		if state:hasState(CE_COMPLETED, EGameStateTag.CE) then
			createYesNoScreen('RESTART_GAME_PROGRESS', bind(self.restartCEAgree,  self), bind(self.restartCECancel, self), false)
		else
			self:playCollectorsEdition()
		end
	else
		local msg = StringManager:getString('CE_CLOSED')
		createOkScreen(msg, nil, false)
	end
end
-------------------------------------------------------------------------------

function ExtraScreenBase:restartCEAgree()
	local state = ProfilesManager:getCurrentProfile().gameState
	state:clear(EGameStateTag.CE)

	self:playCollectorsEdition()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:restartCECancel()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:playCollectorsEdition()
	assert(not current_scene)
	
	local state = ProfilesManager:getCurrentProfile().gameState

	local start = function()
		PopUpScreensMgr:destroyAll()
		startGame(EGameStateTag.CE)
	end

	if state:hasState(PLAY_MODE, EGameStateTag.CE) then
		start()
	else
		createPlayingModeScreen(function()
									local msg = StringManager:getString('PLAY_MODE_CHANGE_NOTE')
									createOkScreen(msg, start, false)
								end, EGameStateTag.CE)
	end
end
-------------------------------------------------------------------------------

--[[
 * Обработчики нажатия кнопки возврата в главное меню.
--]]
function ExtraScreenBase:onMenuPress()
	self:hideCurrentPage()
	PopUpScreensMgr:pop()
	createMainMenu()
end
-------------------------------------------------------------------------------


--[[
 * Обработчики нажатия кнопок переключения содержимого скрина.
--]]
function ExtraScreenBase:onMusicPress()
	self:showPage('music')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onWallpapersPress()
	self:showPage('wallpapers')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onMiniGamesPress()
	self:showPage('miniGames')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onHiddenObjectsPress()
	self:showPage('hiddenObjects')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onVideoPress()
	self:showPage('video')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onScreensaversPress()
	self:showPage('screensavers')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onConceptArtPress()
	self:showPage('conceptArt')
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onCalendarPress()
    self:showPage('calendar')
end
-------------------------------------------------------------------------------
--[[
 * Обработчики нажатия кнопок управления содержимым скрина.
--]]
function ExtraScreenBase:onPrevPress()
	local page = self:getCurrentPage().entity
	assert(page)

	page:prev()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onNextPress()
	local page = self:getCurrentPage().entity
	assert(page)

	page:next()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onSavePress()
	local page = self:getCurrentPage().entity
	assert(page)

	if not isDemoMode() then
		page:save()
	else
		createOkScreen(GetString('SE_CLICK_ON_EXTRAS'), nil, false)
	end
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onSetPress()
	local page = self:getCurrentPage().entity
	assert(page)
	
	if not isDemoMode() then
		page:set()
	else
		createOkScreen(GetString('SE_CLICK_ON_EXTRAS'), nil, false)
	end
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onPlayPress()
	local page = self:getCurrentPage().entity
	assert(page)

	page:play()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onPlayMusicPress()
	self:onPlayPress()
end
-------------------------------------------------------------------------------

function ExtraScreenBase:onStopMusicPress()
	local page = self:getCurrentPage().entity
	assert(page)

	page:stop()
end
-------------------------------------------------------------------------------