--- глобальный объект, в котором хранится информация о текущем квесте
g_QuestState = {
		Clear = function (_object)
			g_QuestState.SetScriptObject(nil)
			g_QuestState.SetCurrentLevel(nil)
			g_QuestState.SetMainSceneWidget(nil)
			g_QuestState.SetCurrentScene(nil)
			g_QuestState.SetCurrentClickThread(nil)
			--g_QuestState.SetLevelTimer(nil)   -- уровень таймера пока не сбрасывается, но будет
			g_QuestState.SetParentWindow(nil)
			
		end, 
	
		SetScriptObject = function (_object)
			g_QuestState._click_object = _object
		end,
		GetScriptObject = function ()
			return g_QuestState._click_object
		end,

		SetCurrentLevel = function (_object)
			g_QuestState._current_level = _object
		end,
		GetCurrentLevel = function ()
			return g_QuestState._current_level
		end,
		
		SetMainSceneWidget = function (_object)
			g_QuestState._scene_widget = _object
		end,
		GetMainSceneWidget = function ()
			return g_QuestState._scene_widget
		end,

		SetCurrentScene = function (_object)
			g_QuestState._current_scene = _object
		end,
		GetCurrentScene = function ()
			return g_QuestState._current_scene
		end,

		SetCurrentClickThread = function (_object)
			g_QuestState._curent_click_thread = _object
		end,
		GetCurrentClickThread = function ()
			return g_QuestState._curent_click_thread
		end,

		SetLevelTimer = function (_object)
			g_QuestState._level_timer = _object
		end,
		GetLevelTimer = function ()
			return g_QuestState._level_timer
		end,

		SetParentWindow = function (_object)
			g_QuestState._parent_window = _object
		end,
		GetParentWindow = function ()
			return g_QuestState._parent_window
		end,
		
		_click_object = nil, --- текущий объект для скрипта на клик
		_current_level = nil, --- текущий уровень
		_scene_widget = nil, --- текущий виджет сцены
		_current_scene = nil, --- текущая сцена
		_curent_click_thread = nil,  --- текущий тред события на клик
		_level_timer = sf.core.CTimerWrapper(sf.core.g_Application.GetTimeManager().GetTimer("game_timer").AttachTimer("")), --- таймер уровня
		_parent_window = nil
	}
	
quest = quest or {}

-- загружаем необходимые файлы скриптов
quest.g_Lua = sf.lua.CLua.GetLua("main")
assert(quest.g_Lua)
quest.g_Lua.LoadScript("scripts/qe_lite/states.lua")
quest.g_Lua.LoadScript("scripts/qe_lite/save_game.lua")
quest.g_Lua.LoadScript("scripts/qe_lite/modifers.lua")
quest.g_Lua.LoadScript("scripts/qe_lite/helpers.lua")
quest.g_Lua.LoadScript("scripts/qe_lite/hog_widget.lua")


function quest.show_object_find_error(_object, current_object)
    if not current_object then
        __message("Объект ".._object.." не найден", "Ошибка")
    end
end

function quest.RemoveObject(_id)
    local object = quest.find_object_by_id(_id, false, false)
    if object ~= nil then
        object.RaiseObjectFlag(qe.CBaseSceneObject.ObjectFlagRemoved)
    end
end

function quest.FindRootObjectById(_id, _find_reomved)
    return quest.find_object_by_id(_id, false, _find_reomved)
end

function quest.FindObjectById(_id, _find_reomved)
    return quest.find_object_by_id(_id, true, _find_reomved)
end

function quest.find_object_by_id(_id, _find_group_childs, _find_reomved)
    if not _find_group_childs then _find_group_childs = false end
    if not _find_reomved then _find_reomved = false end
	if not g_QuestState.GetCurrentLevel() then 
		return nil 
	end
    return g_QuestState.GetCurrentLevel().FindObjectById(_id, _find_group_childs, _find_reomved) 
end

--- запуск сцены на указаном виджете
-- _parent_window - родительсок окно для виджета сйцены
-- _widget - целевой виджет
-- _level_id  - id урвоня
-- _scene_id - id сцены
-- _load_file_name - имя файла с сохраненной сценой
function quest.StartScene(_parent_window, _widget, _level_id, _scene_id, _load_file_name)
	
	qe.CSceneWidget.ClearScriptCache()
	qe.g_EffectsList.Instance().Clear()
	
	hog_widget.Clear()
	
	g_QuestState.Clear()
	
	local level = qe.g_Quest.Instance().GetLevelById(_level_id).Clone()
	if not level then
		__message("Level ".._level_id.." not found")
		return
	end
	--- скрываем отображение областей
	level.SetShowChildSceneAreas(false)
	g_QuestState.SetCurrentLevel(level)
	g_QuestState.SetMainSceneWidget(_widget)
	g_QuestState.SetParentWindow(_parent_window)
	
	--if _load_file_name and _load_file_name.c_str() ~= "" then
		--save_game.Load(_load_file_name)
	--end
	local scene = level.GetSceneById(_scene_id)
	if not scene then
		__message("Scene ".._scene_id.." in level ".._level_id.." not found")
		return
	end
	
	g_QuestState.SetCurrentScene(scene)
	_widget.SetScene(scene)
	
	g_QuestState.GetCurrentLevel().RunLevelScript()
end

--- апдейт квеста. вызывается из окна содержащего квест виджет
function quest.Update()
	qe.g_LuaThreadManager.Instance().ResumeLuaThreads();
	qe.g_EffectsList.Instance().Update();
end

--- получение позиции объекта сцены, относительно виджета-родителья сцены
function quest.get_object_pos(_id)
	local main_scene = g_QuestState.GetCurrentScene()

	local taked_object = nil
	taked_object = main_scene.IsContentObject(_id)
	if not taked_object then
		taked_object = main_scene.IsContentArea(_id)
	end
	
    if taked_object ~= nil then
		return g_QuestState.GetMainSceneWidget().GetAbsPos(false) + taked_object.GetPos()
    end
    return sf.misc.FloatVector(0, 0)    
end

function quest.get_object_angle(_id)
	local main_scene = g_QuestState.GetCurrentScene()

	local taked_object = nil
	taked_object = main_scene.IsContentObject(_id)
	if not taked_object then
		taked_object = main_scene.IsContentArea(_id)
	end
	
    if taked_object ~= nil then
		return taked_object.GetAngle()
    end
    return 0    
end

--- функция, которая вызывается если отсутсвует скрипт на клик
function EmptyScriptFunction()

end

--- перегрузка имен, для запуска функцияф из скриптов
hide = modifers.hide
show = modifers.show
show_ex = modifers.show_ex
hide_ex = modifers.hide_ex

disable = modifers.disable
enable = modifers.enable
is_hide = modifers.is_hide
is_disable = modifers.is_disable

play_clip = modifers.play_clip

change_state = states.change_state
state = states.state

sleep = threads_managment.sleep
form_event = threads_managment.form_event

change_state_ex = states.change_state_ex

init_hog = function() end