/** \file
 * \brief IUPLua5 internal Functions
 *
 * See Copyright Notice in "iup.h"
 */
 
#ifndef __IL_H 
#define __IL_H

#ifdef __cplusplus
extern "C" {
#endif

int iuplistlua_open (lua_State * L);
int iuplabellua_open (lua_State * L);
int iupitemlua_open (lua_State * L);
int iupimagelua_open (lua_State * L);
int iuphboxlua_open (lua_State * L);
int iupframelua_open (lua_State * L);
int iupfilllua_open (lua_State * L);
int iupfiledlglua_open (lua_State * L);
int iupdialoglua_open (lua_State * L);
int iupcanvaslua_open (lua_State * L);
int iupbuttonlua_open (lua_State * L);
int iupzboxlua_open (lua_State * L);
int iupvboxlua_open (lua_State * L);
int iuptogglelua_open (lua_State * L);
int iuptimerlua_open (lua_State * L);
int iuptextlua_open (lua_State * L);
int iupsubmenulua_open (lua_State * L);
int iupseparatorlua_open (lua_State * L);
int iupradiolua_open (lua_State * L);
int iupmultilinelua_open (lua_State * L);
int iupmenulua_open (lua_State * L);
int iupcboxlua_open (lua_State * L);
int iupspinboxlua_open (lua_State * L);
int iupspinlua_open (lua_State * L);
int iupsboxlua_open (lua_State * L);
int iupscrollboxlua_open(lua_State * L);
int iupflatscrollboxlua_open(lua_State * L);
int iupgridboxlua_open(lua_State * L);
int iupmultiboxlua_open(lua_State * L);
int iuplinklua_open(lua_State * L);
int iupsplitlua_open (lua_State * L);
int iupgclua_open (lua_State * L);
int iupvallua_open (lua_State * L);
int iuptabslua_open (lua_State * L);
int iupflattabslua_open(lua_State * L);
int iupfontdlglua_open(lua_State * L);
int iupmessagedlglua_open(lua_State * L);
int iupcolordlglua_open(lua_State * L);
int iupimagergbalua_open(lua_State * L);
int iupimagergblua_open(lua_State * L);
int iupprogressbarlua_open(lua_State * L);
int iupnormalizerlua_open(lua_State * L);
int iupuserlua_open(lua_State * L);
int iuptreelua_open(lua_State * L);
int iupclipboardlua_open(lua_State * L);
int iupexpanderlua_open(lua_State * L);
int iupprogressdlglua_open(lua_State * L);
int iupdetachboxlua_open(lua_State * L);
int iupbackgroundboxlua_open(lua_State * L);
int iupflatbuttonlua_open(lua_State * L);
int iupflattogglelua_open(lua_State * L);
int iupflatframelua_open(lua_State * L);
int iupanimatedlabellua_open(lua_State * L);
int iupcalendarlua_open(lua_State * L);
int iupdatepicklua_open(lua_State * L);
int iupgaugelua_open(lua_State * L);
int iupdiallua_open(lua_State * L);
int iupcolorbarlua_open (lua_State * L);
int iupcolorbrowserlua_open (lua_State * L);
int iupflatlabellua_open(lua_State * L);
int iupdropbuttonlua_open(lua_State * L);
int iupflatseparatorlua_open(lua_State * L);
int iupspacelua_open(lua_State * L);
int iupflatlistlua_open(lua_State * L);
int iupflatvallua_open(lua_State * L);
int iupthreadlua_open(lua_State * L);
int iupflattreelua_open(lua_State * L);

void iupgetparamlua_open (lua_State * L);
void iupconfiglua_open(lua_State * L);
int iupparamlua_open(lua_State * L);
int iupparamboxlua_open(lua_State * L);
void iupluadraw_open(lua_State * L);

int iupluaScanf(lua_State *L);
void iupluaapi_open(lua_State * L);


#define IUPLUA_SDK_API IUPLUA_API

            /*     Registration    */

/** Gets the global environment iup.
    Used by secondary iuplua modules. */
IUPLUA_SDK_API void iuplua_get_env(lua_State *L);

/** Returns true if IupOpen was called from inside the IupLua initialization function (iuplua_open).
 * All the other C initialization functions are called from the respective IupLua initialization functions. */
IUPLUA_SDK_API int iuplua_opencall_internal(lua_State *L);

/** Register a function. */
IUPLUA_SDK_API void iuplua_register(lua_State *L, lua_CFunction func, const char* name);

/** Register a string. */
IUPLUA_SDK_API void iuplua_regstring(lua_State *L, const char* str, const char* name);

/* Register a library. */
IUPLUA_SDK_API void iuplua_register_lib(lua_State *L, const luaL_Reg* funcs);

/* Register several functions. */
IUPLUA_SDK_API void iuplua_register_funcs(lua_State *L, const luaL_Reg* funcs);



          /*              Callbacks             */

/** Stores the Lua State inside the IUP element,
 * so it can be retrieved from inside a callback.
 * Used in the creation of the element.
 * Only called before iuplua_pushihandle_raw.
 */
IUPLUA_SDK_API void iuplua_plugstate(lua_State *L, Ihandle *ih);

/** Retrieve the Lua State. Used inside a callback.
 */
IUPLUA_SDK_API lua_State* iuplua_getstate(Ihandle *ih);

/* Push iup[name] in the stack */
IUPLUA_SDK_API void iuplua_push_name(lua_State *L, const char* name);

/** First function called inside a callback. 
 * It prepares the stack for the call and returns the Lua state.
 */
IUPLUA_SDK_API lua_State * iuplua_call_start(Ihandle *ih, const char* name);

/** Called when a callback in Lua should be called. 
 * nargs is the number of arguments after the first Ihandle*.
 * Returns the callback return value. If nil returns IUP_DEFAULT.
 * At the end clears the Lua stack. 
 */
IUPLUA_SDK_API int iuplua_call(lua_State *L, int nargs);

/** Same as /ref iuplua_call, but returns a string.
 */
IUPLUA_SDK_API char* iuplua_call_ret_s(lua_State *L, int nargs);

/** Same as /ref iuplua_call, but returns a double.
 */
IUPLUA_SDK_API double iuplua_call_ret_d(lua_State *L, int nargs);

/** Same as lua_pcall, but if an error occour then
 * _ERRORMESSAGE is called. 
 */
IUPLUA_SDK_API int iuplua_call_raw(lua_State* L, int nargs, int nresults);

/** Register the callback in the iup.callbaks table.
 * If type is not NULL, register in a sub table with the controls class name.
 */
IUPLUA_SDK_API void iuplua_register_cb(lua_State *L, const char* name, lua_CFunction func, const char* type);


            /*     Functions                     */

/** Pushes a raw Ihandle into the stack (an userdata).
 * Used ONLY by the control creation functions.
 */
IUPLUA_SDK_API void iuplua_pushihandle_raw(lua_State *L, Ihandle *h);

/** Returns an array of string stored in a Lua table. 
 If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API char** iuplua_checkstring_array(lua_State *L, int pos, int count);

/** Returns an array of int stored in a Lua table.
 If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API int* iuplua_checkint_array(lua_State *L, int pos, int count);

/** Returns an array of float stored in a Lua table.
 If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API float* iuplua_checkfloat_array(lua_State *L, int pos, int count);

/** Returns an array of double stored in a Lua table.
If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API double* iuplua_checkdouble_array(lua_State *L, int pos, int count);

/** Returns an array of unsigned char stored in a Lua table.
 If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API unsigned char* iuplua_checkuchar_array(lua_State *L, int pos, int count);

/** Returns an array of Ihandle* stored in a Lua table.
 If count is 0, table size is used. Else table size must match count. */
IUPLUA_SDK_API Ihandle** iuplua_checkihandle_array(lua_State *L, int pos, int count);

/** Same as iuplua_checkihandle but also accepts nil. */
IUPLUA_SDK_API Ihandle *iuplua_checkihandleornil(lua_State *L, int pos);

#if LUA_VERSION_NUM > 501
#define iuplua_getn(L,i)          ((int)lua_rawlen(L, i))
#else
#define LUA_OK		0
#define iuplua_getn(L,i)          ((int)lua_objlen(L, i))
#endif


#ifdef __cplusplus
}
#endif

#endif
