// A generic type and some helper functions
// for scripts

#ifndef INCLUDED_SCRIPTOBJECT
#define INCLUDED_SCRIPTOBJECT

#include "scripting/SpiderMonkey.h"

class CStrW;
class CScriptEvent;

class CScriptObject
{
    JSFunction* Function;
    JSObject* FunctionObject;
    void Root();
    void Uproot();

public:

    CScriptObject();
    CScriptObject( JSFunction* _Function );
    CScriptObject( jsval v );
    CScriptObject( const CScriptObject& copy );

    ~CScriptObject();

    // Initialize in various ways: from a JS function, a string to be compiled, or a jsval containing either.
    void SetFunction( JSFunction* _Function );
    void SetJSVal( jsval v );
    void Compile( const CStrW& FileNameTag, const CStrW& FunctionBody );

    inline bool Defined()
    {
        return( Function != NULL );
    }

    inline operator bool() { return( Function != NULL ); }
    inline bool operator!() { return( !Function ); }
    inline bool operator==( const CScriptObject& compare ) { return( Function == compare.Function ); }

    // JSObject wrapping the function if it's defined, NULL if it isn't.
    JSObject* GetFunctionObject();

    // Executes a script attached to a JS object.
    // Returns false if the script isn't defined, if the script can't be executed,
    // otherwise true. Script return value is in rval.
    bool Run( JSObject* Context, jsval* rval, uintN argc = 0, jsval* argv = NULL );
    // This variant casts script return value to a boolean, and passes it back.
    bool Run( JSObject* Context, uintN argc = 0, jsval* argv = NULL );

    // Treat this as an event handler and dispatch an event to it.
    bool DispatchEvent( JSObject* Context, CScriptEvent* evt );
};

#endif