class 'ExtraCollectionPageBase' (ExtraPageBase)

--[[
 * ExtraCollectionPageBase - класс, отвечающий за отображение контента в ЕхтраScreen в виде
 * коллекций. Описывает как должны храниться спрайты предпросмотра и каким образом пользователь
 * может переключаться между ними.
 * @param	extraScreen		Ссылка на ExtraScreen.
 * @param	name			Имя главного объекта текущего класса (Node:getMainEntity)
 * @param	order			Положение главного объекта текущего класса в списке рендра.
--]]
function ExtraCollectionPageBase:__init(extraScreen, name, order)
	ExtraPageBase.__init(self, extraScreen, name, order)

	self.previewFileFormat	= 'Data/ExtraContent/Screens/Extra/HiddenObject/preview_%s.png'
	self.previewNameFormat	= 'preview_%s'	-- префикс имени спрайта предпросмотра

	self.previews			= {}			-- таблица спрайтов предпросмотра
	self.index				= 1				-- индекс текущего спрайтов предпросмотра
	self.count        		= 0
	self.changeTime			= 0.25			-- время смены спрайтов предпросмотра
end
-------------------------------------------------------------------------------

function ExtraCollectionPageBase:createContent()
	ExtraPageBase.createContent(self)
	self:initPreviews()
end
-------------------------------------------------------------------------------

function ExtraCollectionPageBase:onShown()
	ExtraPageBase.onShown(self)

	self.screen:getCounterTextField():setText(tostring(self.index)..'/'..tostring(self.count))
end
-------------------------------------------------------------------------------

function ExtraCollectionPageBase:initPreviews()
	self:getCurrentPreview():setOpacity(1)
end
-------------------------------------------------------------------------------

function ExtraCollectionPageBase:createPreview( index )
	local filePath	= self:getPreviewFilePath( index )
	local name		= self:getPreviewName( index )

	if not resourceExists( filePath ) then
		filePath = 'Data/Textures/Common/Fade.png'
	end

	local preview = CreateSpriteEntityInstant( filePath )
	preview:setName(name)
	preview:attachTo(self:getMainEntity())
	preview:setXY(512, 384)
	preview:setOpacity(0)
	preview:setRespondable(false)

	return preview
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает имя полный путь к файлу спрайта предпросмотра на основе заданого индекса.
 * Метод необходим для инициализации таблицы объектов предпросмотра.
 * @param	index	Индекс объекта предпросмотра.
--]]
function ExtraCollectionPageBase:getPreviewFilePath(index)
	local id = (index > 9) and tostring(index) or '0'..index
	return string.format(self.previewFileFormat, id)
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает имя спрайта предпросмотра на основе заданого индекса.
 * Метод необходим для инициализации таблицы объектов предпросмотра.
 * @param	index	Индекс объекта предпросмотра.
--]]
function ExtraCollectionPageBase:getPreviewName(index)
	local id = (index > 9) and tostring(index) or '0'..index
	return string.format(self.previewNameFormat, id)
end
-------------------------------------------------------------------------------

--[[
 * Метод возвращает текущий объекто предпросмотра.
--]]
function ExtraCollectionPageBase:getCurrentPreview()
	if not self.previews[self.index] then
		self.previews[self.index] = self:createPreview( self.index )
	end

	return self.previews[self.index]
end
-------------------------------------------------------------------------------

--[[
 * Метод описывает логику установки индекса объекта предпросмотра. По-умолчанию
 * описана логика зацикленного просмотра.
 * @param	index	Индекс объекта предпросмотра.
--]]
function ExtraCollectionPageBase:setIndex(index)
	if index < 1 then
		index = self.count
	elseif index > self.count then
		index = 1
	end

	self.index = index
	self.screen:getCounterTextField():setText(tostring(self.index)..'/'..tostring(self.count))
end
-------------------------------------------------------------------------------

--[[
 * Метод установки предыдущего объекта коллекции.
--]]
function ExtraCollectionPageBase:prev()
	local preview

	preview = self:getCurrentPreview()
	preview:destroyEffectors()
	local eff = preview:ChangeOpacity(nil, 0, self.changeTime)
	eff.onFinish:add( bind(self.onPreviewHided, self, self.index))
	
	self:setIndex(self.index - 1)

	preview = self:getCurrentPreview()
	preview:destroyEffectors()
	preview:ChangeOpacity(nil, 1, self.changeTime)
end
-------------------------------------------------------------------------------

--[[
 * Метод установки следующего объекта коллекции.
--]]
function ExtraCollectionPageBase:next()
	local preview

	preview = self:getCurrentPreview()
	preview:destroyEffectors()
	local eff = preview:ChangeOpacity(nil, 0, self.changeTime)
	eff.onFinish:add( bind(self.onPreviewHided, self, self.index))
	
	self:setIndex(self.index + 1)

	preview = self:getCurrentPreview()
	preview:destroyEffectors()
	preview:ChangeOpacity(nil, 1, self.changeTime)
end
-------------------------------------------------------------------------------

function ExtraCollectionPageBase:onPreviewHided(index)
	local preview = self.previews[index]

	if (index ~= self.index) and preview then
		preview:destroy()
		self.previews[index] = nil
	end
end
-------------------------------------------------------------------------------