#define PLUGINDLL_API extern "C" __declspec(dllexport)

#define typeVariableInt     0
#define typeVariableFloat   1
#define typeVariableString  2

#define MAX(x,y) (x>y?x:y)
#define MAX3(x,y,z) MAX(MAX(x,y),z)
#define MIN(x,y) (x>y?y:x)
#define MIN3(x,y,z) MIN(MIN(x,y),z)


// to have life easy, here are few defines of the commands
// TODO: fill the rest according the lab-Talk

#define MenuGetCount()              (CALLSCRIPT("MenuGetCount"))
#define MenuGetCurSel()             (CALLSCRIPT("MenuGetCurSel"))
#define MenuAdd(bIsVmg,sName,bOpen) (CALLSCRIPT2("MenuAdd",bIsVmg,sName,bOpen))
#define MenuDelete(nMenu)           (CALLSCRIPT("MenuDelete",nMenu))
#define MenuActivate(nMenu) (CALLSCRIPT("MenuActivate",nMenu))

// etc

#define ObjectGetCount(nMenu)       (CALLSCRIPT("ObjectGetCount",nMenu))
#define ObjectGetCurSel(nMenu)      (CALLSCRIPT("ObjectGetCurSel",nMenu))
#define ObjectGetType(nMenu,nObject)(CALLSCRIPT("ObjectGetType",nMenu, nObject))

// etc..
#define ObjectGetXPos(nMenu,nObject)(CALLSCRIPT("ObjectGetXPos",nMenu, nObject))
#define ObjectGetYPos(nMenu,nObject)(CALLSCRIPT("ObjectGetYPos",nMenu, nObject))
#define ObjectGetWidth(nMenu,nObject)(CALLSCRIPT("ObjectGetWidth",nMenu, nObject))
#define ObjectGetHeight(nMenu,nObject)(CALLSCRIPT("ObjectGetHeight",nMenu, nObject))

#define ObjectSetSize(nMenu,nObject,nWidth,nHeight) (CALLSCRIPT("ObjectSetSize",nMenu, nObject,nWidth,nHeight))
#define ObjectSetPos(nMenu,nObject,nX,nY) (CALLSCRIPT("ObjectSetPos",nMenu, nObject,nX,nY))

// etc...
#define ImgGrabObject(imgNum,nMenu,nObject) (CALLSCRIPT("ImgGrabObject",imgNum,nMenu,nObject))
#define ImgSetToObject(imgNum,nMenu,nObject)    (CALLSCRIPT("ImgSetToObject",imgNum,nMenu,nObject))

#define ImgInflate(imgNum,addW,addH)    (CALLSCRIPT("ImgInflate",imgNum,addW,addH))
#define ImgBlurAlpha(imgNum,nBlur)  (CALLSCRIPT("ImgBlurAlpha",imgNum,nBlur))

#define ImgGetWidth(imgNum)         (CALLSCRIPT("ImgGetWidth",imgNum))
#define ImgGetHeight(imgNum)        (CALLSCRIPT("ImgGetHeight",imgNum))
// etc...
// etc....

// One "secret" command that is not described in lab-talk (because it has no sense there)
// ImgGetRGBABuffer returns the pointer to the RGBA buffer
// be careful what you writing to it!
// the size of buffer is ImgGetWidth(imgNum)*ImgGetHeight(imgNum)*4
#define ImgGetRGBABuffer(imgNum)    (CALLSCRIPT("ImgGetRGBABuffer",imgNum))



void RunScript();


struct _PLVariable
{
    int     m_nVariableType;
    float   m_fValue;
    int     m_nValue;
    char* m_sValue;
};


typedef void (*PLCallBack)(char* sName, _PLVariable *result,_PLVariable *param1,_PLVariable *param2,_PLVariable *param3,_PLVariable *param4);

PLUGINDLL_API void PL_RunScript(PLCallBack pCallback,HWND hWnd);