#ifndef __LUA_SCRIPT_HANDLER_MGR_H__
#define __LUA_SCRIPT_HANDLER_MGR_H__


extern "C" {
#include "tolua++.h"
}


#include "cocoa/CCObject.h"
#include "ccMacros.h"
#include "actions/CCActionInstant.h"
#include <vector>
#include <map>

NS_CC_BEGIN

class ScheduleHandlerDelegate;

typedef int EventType;
typedef int EventHandler;
typedef std::pair<EventType, EventHandler> PairEventHandler;
typedef std::vector<PairEventHandler> VecEventHandlers;
typedef std::map<void*,VecEventHandlers> MapObjectHandlers;
typedef std::vector<ScheduleHandlerDelegate*> VecShedule;
typedef std::map<cocos2d::Node*,VecShedule> MapNodeSchedules;

class ScheduleHandlerDelegate:public cocos2d::Object
{
public:
    ScheduleHandlerDelegate():_isUpdateSchedule(false)
    {}
    virtual ~ScheduleHandlerDelegate()
    {}
    
    static ScheduleHandlerDelegate* create();
    
    void scheduleFunc(float elapse);
    
    virtual void update(float elapse);
    
    void setUpdateSchedule(bool isUpdateSchedule){ _isUpdateSchedule = isUpdateSchedule; }
    bool isUpdateSchedule(){ return _isUpdateSchedule; }
private:
    bool _isUpdateSchedule;
};

class LuaCallFunc:public cocos2d::CallFuncN
{
public:
    LuaCallFunc()
    {}
    virtual ~LuaCallFunc()
    {}
    
    static LuaCallFunc * create(int nHandler);
    virtual void execute();
    virtual LuaCallFunc* clone() const;
};

class ScriptHandlerMgr
{
public:
    ScriptHandlerMgr(void);
    virtual ~ScriptHandlerMgr(void);
    static ScriptHandlerMgr* getInstance(void);
        
    void addObjectHandler(void* object,int handler,int eventType);
    void removeObjectHandler(void* object,int eventType);
    int  getObjectHandler(void* object,int eventType);
    void removeObjectAllHandlers(void* object);
            
    enum HandlerEventType
    {
       kNodeHandler = 0,
       kMenuClickHandler,
       kNotificationHandler,
       kCallFuncHandler,
       kScheduleHandler,
       kTouchesHandler,
       kKeypadHandler,
       kAccelerometerHandler,
       
       kControlTouchDownHandler,
       kControlTouchDragInsideHandler,
       kControlTouchDragOutsideHandler,
       kControlTouchDragEnterHandler,
       kControlTouchDragExitHandler,
       kControlTouchUpInsideHandler,
       kControlTouchUpOutsideHandler,
       kControlTouchCancelHandler,
       kControlValueChangedHandler,
       
       kWebSocketScriptHandlerOpen,
       kWebSocketScriptHandlerMessage,
       kWebSocketScriptHandlerClose,
       kWebSocketScriptHandlerError,
        
       kGLNodeDrawHandler,
        
       kScrollViewScrollHandler,
       kScrollViewZoomHandler,
    };
    
    
private:
    void init(void);
    static ScriptHandlerMgr* _scriptHandlerMgr;
    MapObjectHandlers _mapObjectHandlers;
};

NS_CC_END

TOLUA_API int tolua_Cocos2d_registerScriptHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterScriptHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_registerScriptTapHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterScriptTapHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_registerScriptTouchHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterScriptTouchHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_registerScriptKeypadHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterScriptKeypadHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_registerScriptAccelerateHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterScriptAccelerateHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_registerControlEventHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_unregisterControlEventHandler00(lua_State* tolua_S);

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
TOLUA_API int tolua_Cocos2d_WebSocket_registerScriptHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_WebSocket_unregisterScriptHandler00(lua_State* tolua_S);
#endif

TOLUA_API int tolua_Cocos2d_GLNode_registerScriptDrawHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_GLNode_unregisterScriptDrawHandler00(lua_State* tolua_S);

TOLUA_API int tolua_Cocos2d_ScrollView_registerScriptHandler00(lua_State* tolua_S);
TOLUA_API int tolua_Cocos2d_ScrollView_unregisterScriptHandler00(lua_State* tolua_S);

TOLUA_API int tolua_script_handler_mgr_open(lua_State* tolua_S);

#endif //__LUA_SCRIPT_HANDLER_MGR_H__