#ifndef GUI_FILE_H
#define GUI_FILE_H

#define MWDEBUG 1

#include <clib/alib_protos.h>

#include <exec/memory.h>

#include <libraries/gadtools.h>
#include <libraries/icq.h>
#include <libraries/mui.h>

#include <datatypes/datatypes.h>
#include <datatypes/pictureclass.h>

#include <netinet/in.h>
#include <netinet/tcp.h>

#include <workbench/icon.h>

#include <MUI/Busy_mcc.h>
#include <MUI/Lamp_mcc.h>
#include <MUI/NListview_mcc.h>
#include <MUI/NFloattext_mcc.h>
#include <MUI/TextEditor_mcc.h>
#include <MUI/Textinput_mcc.h>
#include <MUI/Toolbar_mcc.h>
#include <MUI/TWFmultiLED_mcc.h>

#include <proto/exec.h>
#include <proto/icon.h>
#include <proto/intuition.h>
#include <proto/muimaster.h>

#include <sys/dir.h>

#include <memwatch.h>

#define REG(x) register __ ## x

#define DatatypeObject  MUI_NewObject("Dtpic.mui"

#define MUIA_Dtpic_Name 0x80423d72

#define LASTCHAR(c) c[strlen(c)-1]
#define BOOLP(b) ((b)?TRUE:FALSE)

#define UDPBUFLEN 0x0400
#define TCPBUFLEN 0x0900

#define LINE "\0"

#define SOCK_UDP     1
#define SOCK_MESSAGE 2
#define SOCK_CHAT    4
#define SOCK_FILE    8

#define TCP_DIR_OUT    1
#define TCP_DIR_IN     2
#define TCP_DIR_LISTEN 3

#define PORT_Trigger    TAG_USER
#define PORT_AddApp     TAG_USER+1
#define PORT_RemApp     TAG_USER+2
#define TIME_Trigger    TAG_USER+3
#define TIME_AddApp     TAG_USER+4
#define TIME_RemApp     TAG_USER+5
#define TIME_SetSecs    TAG_USER+6
#define TIME_SetMicro   TAG_USER+7
#define TIME_SetTrg     TAG_USER+8
#define TIME_SetSock    TAG_USER+9
#define CHAT_AddUIN     TAG_USER+10
#define CHAT_AddCWin    TAG_USER+11
#define TIME_Trigger1   TAG_USER+12
#define TIME_Trigger2   TAG_USER+13
#define TIME_Trigger_Parse TAG_USER+14

#define COLOR_ON       TAG_USER
#define COLOR_OFF      TAG_USER+1
#define COLOR_INVIS    TAG_USER+2
#define COLOR_NA       TAG_USER+3
#define COLOR_CHAT     TAG_USER+4
#define COLOR_OCCUPIED TAG_USER+5
#define COLOR_AWAY     TAG_USER+6
#define COLOR_DND      TAG_USER+7
#define COLOR_NEW      TAG_USER+8

#define NUM_STATUS        8
#define NUM_STATUS_COLORS 9
#define NUM_CHAT_COLORS   16
#define NUM_AFFILIATIONS  3
#define NUM_PASTS         3
#define NUM_INTERESTS     4

#define LOG_CLIENT 1
#define LOG_SERVER 2

enum {MSG_VIA_BEST=1, MSG_VIA_UDP, MSG_VIA_TCP};

enum {MSG_BOTH=1, MSG_LOCAL, MSG_REMOTE};

enum {OID_CHATIN=512, OID_CHATOUT};

enum {DBG_UDP_PKTS=1, DBG_UDP_ERRS, DBG_UDP_DBUG, DBG_TCP_PKTS, DBG_TCP_ERRS, DBG_TCP_DBUG, DBG_OTH_FATL, DBG_OTH_INFO};

enum {ONLINE=0, OFFLINE, INVISIBLE, NOTAVAILABLE, FREEFORCHAT, OCCUPIED, AWAY, DONOTDISTURB, NEWUSER};

struct Contact {
  ULONG ListID;
  char  LampTxt[10];
  APTR  LampObj;
  UWORD LampNum;
  ULONG UIN;
  char *Nick;
  char *First;
  char *Last;
  char *EMail;
  char *EMail_Secondary;
  char *EMail_Old;
  char *Street;
  char *City;
  char *State;
  char *ZipCode;
  char *Phone;
  char *FAX;
  char *Cellular;
  char *HomePage;
  char *About;
  char *Comment;
  char *Work_City;
  char *Work_State;
  char *Work_Phone;
  char *Work_FAX;
  char *Work_Address;
  char *Work_ZipCode;
  char *Work_Company;
  char *Work_Department;
  char *Work_Position;
  char *Work_URL;
  UWORD Occupation;
  UWORD Country;
  UWORD Work_Country;
  UWORD Work_Occupation;
  BYTE  TimeZone;
  UWORD Age;
  UBYTE Sex;
  UWORD BDay_Year;
  UBYTE BDay_Month;
  UBYTE BDay_Day;
  UBYTE Language1;
  UBYTE Language2;
  UBYTE Language3;
  ULONG Authorize;
  ULONG IP;
  ULONG Port;
  ULONG RealIP;
  UWORD Type;
  UBYTE CanTCP;
  ULONG Status;
  BOOL  SeeInvis;
  BOOL  BeInvis;
  BOOL  EditEMail;
  UBYTE NewMsg;
  ULONG MsgCount;
  BOOL  Changed;
  BOOL  ConnectMe;
  UWORD ChatListen;
  time_t LastOnline;
  time_t LastMessageFm;
  time_t LastMessageTo;
  struct UserWindow *UWin;
  struct ChatFileReqIn *CFWin;
  struct FileWin *FWin;
};

struct Sockets {
  UWORD Socket;
  ULONG UIN;
  UBYTE Dir;
  ULONG IP;
  UWORD Port;
  UWORD TCPLen;
  char  PktLen[2];
  char *LastTCP;
  struct sockaddr_in Address;
  struct sockaddr_in LocalAddr;
  time_t Timehack;
  BOOL Connecting;
  BOOL HadInit;
  BOOL Backward;
  BOOL Closing;
  BOOL Hidden;
  UBYTE Type;
  UWORD TCP_Version;
  UWORD TCP_Revision;
  ULONG TCP_Listen_Msg_Port;
  UBYTE TCP_Flag;
  ULONG TCP_Listen_Other_Port;
  UWORD TCP_ChatData;
  ULONG TCP_ChatHandShake;
  UWORD ConnectPort;
  struct RemoteChatObj *RCObj;
  struct ChatWin *CWin;
  struct Contact *ChatMode;
  struct Contact *FileMode;
};

struct ObjApp {
  struct DiskObject *DO_IconifyIcon;
  APTR App;
  APTR  NM_AppMenu;
  APTR  CC_Parse;
  APTR  WI_Main;
  APTR   TX_Port, TX_Timer, TX_Timer1, TX_Color;
  APTR   LV_OfflineList;
  APTR   BT_AddContact, BT_RemContact;
  APTR   CY_MyStatus;
  APTR  WI_About;
  APTR   TX_About;
  APTR  WI_Splash;
  APTR   DT_Splash;
  APTR  WI_Progress;
  APTR   GA_Contacts, TX_LoadProgress;
  APTR  WI_Log;
  APTR   LV_ICQCliLog, LV_ICQSrvLog;
  APTR  WI_Message;
  APTR   LV_Msgs;
  APTR   NM_MsgMenu;
  APTR   BT_ReplyMessage;
  APTR   BT_GetInfo;
  APTR   BT_RemMessage;
  APTR   BT_ClearMsgs;
  APTR   BT_Auth;
  APTR   BT_OpenURLWin;
  APTR   TI_QuickMsg;
  APTR   TX_QuickTo;
  APTR  WI_Send;
  APTR   TX_Sendto;
  APTR   TI_Message;
  APTR   BT_Sendit;
  APTR  WI_Information;
  APTR   STR_UserUIN;
  APTR   STR_UserNick;
  APTR   STR_UserFirst;
  APTR   STR_UserLast;
  APTR   STR_UserEMail;
  APTR   STR_UserAuth;
  APTR   TX_UserCity;
  APTR   TX_UserCountry, NU_UserZone;
  APTR   TX_UserState;
  APTR   TX_UserAge;
  APTR   TX_UserSex;
  APTR   TX_UserPhone;
  APTR   TX_UserURL;
  APTR   LV_UserAbout;
  APTR   BT_AddUpdate;
  APTR  WI_Searches;
  APTR   CH_SearchUIN;
  APTR   CH_SearchEMail;
  APTR   CH_SearchName;
  APTR   STR_SrchUIN;
  APTR   STR_SrchEMail;
  APTR   STR_SrchNick;
  APTR   STR_SrchFirst;
  APTR   STR_SrchLast;
  APTR   BT_StartSrch;
  APTR  WI_SrchResults;
  APTR   LV_SearchList;
  APTR   TX_SearchStat;
  APTR   BT_AddUpdate2;
  APTR   BT_GetInfo3;
  APTR  WI_SendURL;
  APTR   TX_SendURLto;
  APTR   STR_Desc;
  APTR   STR_URL;
  APTR   BT_URLSend;
  APTR  WI_URLMessage;
  APTR   LV_AdText;
  APTR   TX_AdURL;
  APTR   BT_AdGoURL;
  APTR   BT_AdOK;
  APTR  WI_MessageHist;
  APTR   TX_MsgUser;
  APTR   LV_MsgText;
  APTR   DL_MsgDir;
  APTR  WI_Activities;
  APTR   LV_Activity;
  APTR  WI_Sockets;
  APTR   LV_SockList;
  APTR  WI_ChatReqOut;
  APTR   LV_Sessions, TI_ChatReason;
  APTR   BT_SendChat, BT_JoinChat, BT_CancelChat;
  APTR  WI_FileSendOut;
  APTR   LV_FileList;
  APTR   TX_TotalFiles, TX_TotalSize;
  APTR   BT_AddFile, BT_RemFile;
  APTR   GP_FDescGroup;
  APTR    TI_FileReason;
  APTR    BT_SendFile, BT_CancelFile;
  APTR  WI_AddUIN;
  APTR   TX_Desc;
  APTR   LV_ToAddUIN;
  APTR   BT_AddUIN, BT_AddCancel;
  APTR  WI_WebPager;
  APTR   TX_WebName, TX_WebEMail, LV_WebMsg;
  APTR  WI_ErrorWin;
  APTR   CH_UDPPkts, CH_UDPDebug, CH_TCPPkts, CH_TCPDebug;
  APTR   LV_Errors, BT_ErrClr, BT_ErrSave;
  APTR  WI_EditIgnore;
  APTR   TX_IgnoreUIN, TX_IgnoreNick;
  APTR   NU_IgnoreDays, BT_IgnoreOK, BT_IgnoreCanx;
  APTR  WI_ICQPrefs;
  APTR   LV_InfoPages, GP_InfoPages;
  APTR   STR_ICQUIN, POP_SelectUIN, DL_UINList, TX_CurrentIP;
  APTR   STR_Nick, STR_First, STR_Last;
  APTR   STR_EMail, CH_HideEMail, STR_EMail2, STR_EMailOld;
  APTR   TI_StreetAd, STR_City, STR_State, STR_ZipCode, BT_DisplayMap;
  APTR   POP_Country, STR_Country, LV_Countries;
  APTR   STR_Phone, STR_FAX, STR_Cellular;
  APTR   NU_TimeZone, TX_LocalTime;
  APTR   STR_CoName, STR_DivDept, STR_Position, CY_Occupation;
  APTR   STR_WkPhone, STR_WkFAX;
  APTR   TI_WorkAd, STR_WkCity, STR_WkState, BT_DisplayWkMap, STR_WkZipCode, STR_WkURL;
  APTR   POP_WkCountry, STR_WkCountry, LV_WkCountries;
  APTR   STR_Page, CY_Sex, STR_Age, BT_URLCategory;
  APTR   CY_BDMonth, STR_BDDay, NU_BDYear, GP_DTGroup, DT_Zodiac;
  APTR   CH_BDNotify, BT_ViewHoroscope;
  APTR   CY_Lang1, CY_Lang2, CY_Lang3;
  APTR   TI_About;
  APTR   OB_Affiliations[NUM_AFFILIATIONS][3], OB_Pasts[NUM_PASTS][3], OB_Interests[NUM_INTERESTS][3];
  APTR   TX_PicLastUpdate, POP_Picture, STR_Picture, TX_PicSize, BT_PicClear;
  APTR   RD_PicPrivacies, CH_PicPrivacy;
  APTR   RD_ReqAuth, STR_ICQPass, STR_ICQPass2, BT_ChangePW;
  APTR   LV_IgnoreUIN, STR_UIN2Ignore, BT_AddIgnore, BT_EditIgnore, BT_RemIgnore;
  APTR   LV_ICQServers, STR_TheServer, STR_ThePort, BT_AddServer, BT_RemServer;
  APTR   STR_OnStartup, STR_OnShutdown, STR_MsgNotify, STR_MsgPreParse, STR_MsgParse, STR_OnlineNotify;
  APTR   STR_OfflineNotify, STR_ChatNotify, STR_FileDirect;
  APTR   STR_SysMsg, /*STR_URLCmnd,*/ STR_ChatBeep;
  APTR   POP_DLDir, STR_DownloadDir;   // <---
  APTR   PP_StatusColors[NUM_STATUS_COLORS], PP_ChatColors[NUM_CHAT_COLORS];
  APTR   STR_Messages[7], CH_UseMessages[7], CY_SetStatus[5], STR_TimedStatus[5];
  APTR   CH_OpenLog, CH_Reconnect, CH_MsgTime, CH_OpenMsg, CH_ActySort, CH_WebPresence, CH_HideIP, CH_MultiLine, CH_UseBeats;
  APTR   CH_NoInpBuf;
  APTR   CY_Lamp, CY_UDPVersion;
  APTR   CH_MsgPopup, CH_NoMsgLog, CH_Scrn2Frnt;
  APTR   LV_ColsStore, LV_StoreUser, LV_ColsUse, LV_UseUser;
  APTR   BT_GrabMyStats, BT_UpUInfo1;
};

struct UserWindow {
  BOOL DoNotDelete;
  char Title[80];
  char  UIN[32], Status[15], IP[25];
  char  Country[50], Age[12], Sex[12], Day[4], Year[6], LastOnline[32], MessageTo[32], MessageFm[32];
  APTR WI_UserWindow, RG_UserPages;
  APTR   LV_Msgs;
  APTR   TI_QuickMsg, BB_WaitTCP, BT_SendIt, CH_MultiSend;
  APTR   POP_Choices;
  APTR   BT_Auth, BT_ChatReq, BT_Clear, BT_FileSend, BT_Forward, BT_IgnoreMe, BT_Contacts, BT_WhitePage;
  APTR   STR_Desc, STR_URL, BT_URLSend;
  APTR   LV_InfoPages, GP_InfoPages, STR_Nick, TX_UIN, TX_IP;
  APTR   STR_First, STR_Last;
  APTR   STR_EMail, CH_EditEMail, TX_EMail2, TX_EMailOld;
  APTR   TI_StreetAd, BT_DisplayMap, TX_FAX, TX_Cellular, TX_LocalTime, TX_UserTime;
  APTR   BT_URLCategory, GP_DTGroup, DT_Zodiac, CH_BDNotify, BT_ViewHoroscope;
  APTR   TX_BDMonth, TX_BDDay, TX_BDYear, TX_Lang1, TX_Lang2, TX_Lang3;
  APTR   BT_Load, BT_Save, BT_Query;
  APTR   TX_City, TX_Country, NU_TimeZone, TX_State, TX_ZipCode, TX_Age, TX_Sex, TX_Phone;
  APTR   BT_HomePage, TE_About, SC_AboutScroll;
  APTR   TX_WKCity, TX_WKState, TX_WKPhone, TX_WKFAX, TX_WKAddress, TX_WKZipCode, TX_WKCompany;
  APTR   TX_WKDepartment, TX_WKPosition, TX_WKURL;
  APTR   CH_SeeInvis, CH_BeInvis;
  APTR   TX_LastOnline, TX_MessageTo, TX_MessageFm;
  APTR   TE_Comment, SC_CommentScroll;
  APTR   LV_History;
  APTR   BT_LoadHist, BT_RemoveLine, BT_ClearHist, BT_SaveHist, BT_DeleteHist;
};

struct ChatFileReqIn {
  APTR WI_ChatFileInWin;
  APTR  GP_Message;
  APTR  TX_Request, LV_Sessions, TI_Reason;
  APTR  BT_Accept, BT_Join, BT_Refuse;
};

struct ChatWin {
  BOOL DoNotDelete;
  char Title[256], LocalTime[20];
  APTR WI_ChatWin;
  APTR  POP_FColors, LV_FColorList;
  APTR  TB_ChatBar, POP_ChatFont, STR_ChatFont;
  APTR  TX_LocalTime;
  APTR  TE_ChatLocal, SC_ScrollBar;
  APTR  GP_ChatGroups;
  APTR   RT_Dummy;
};

struct RemoteChatObj {
  ULONG ChatID;
  char Nick[21], RemoteTime[20];
  APTR GP_RemoteObj;
  APTR  TB_RemoteChatBar;
  APTR  TX_Nick, TX_RemoteTime;
  APTR  TE_ChatRemote, SC_ScrollBar;
};

struct FileWin {
  BOOL DoNotDelete, Skip;
  char FilePcnt[10], BatchPcnt[10], Status[30];
  int PktCnt;
  time_t StartTime;
  ULONG Speed, ThisFile, ThisFileSize, CurrFiles, TotalFiles, TotAllFiles, TotFilesSize, CPS;
  char Title[150];
  APTR WI_FileWin;
  APTR TX_Filename, TX_FileCount;
  APTR TX_StoreDir, TX_Status;
  APTR GA_FileXfer, TX_FileStat;
  APTR GA_BatchXfer, TX_BatchStat;
  APTR TX_Elapsed, TX_Remain, TX_CPS;
  APTR NU_Speed, BT_Skip, BT_Abort;
  APTR CC_Timer;
  struct AsyncFile *File;
  struct TCP_FileData FileData;
};

struct SigData {
  Object *App;
  struct MUI_InputHandlerNode ihnode;
};

struct TimeData {
  ULONG  Seconds, Micros, Trigger;
  UWORD  Socket;
  Object *App;
  struct MsgPort     *port;
  struct timerequest *req_hbeat;
  struct MUI_InputHandlerNode ihnode;
};

struct ColorData {
  struct MUI_PenSpec StatusPens[NUM_STATUS_COLORS];
  BOOL ChangedPen[NUM_STATUS_COLORS];
  struct MUI_PenSpec ChatPens[NUM_CHAT_COLORS];
  BOOL ChangedChat[NUM_CHAT_COLORS];
};

struct ChatData {
  struct Sockets *Socks;
  struct MUI_EventHandlerNode Events;
};

struct ColsData {
  ULONG Dummy;
};

struct Colors {
  LONG StatusColors[NUM_STATUS_COLORS];
  LONG ChatColors[NUM_CHAT_COLORS];
};

struct ColorText {
  char Status[25];
  LONG Pen;
};

struct FileList {
  char  Filename[MAXNAMLEN];
  ULONG Filesize;
};

struct IgnoreUIN {
  ULONG  UIN;
  char   Nick[21];
  time_t Timehack;
  time_t ExpireDays;
};

struct ErrorMsgs {
  time_t Timehack;
  char  *Error;
};

struct ChatSession {
  UWORD ChatListen;
  char  Session[256];
};

extern char config_fl[MAXNAMLEN], *Sex[], *Months[];

extern struct MUI_CustomClass *mcc_Transfert, *mcc_Port, *mcc_Time, *mcc_Color, *mcc_Chat, *mcc_Cols;

extern struct ObjApp *CreateApp(char *);
extern void DisposeApp(struct ObjApp *);
extern void fail(struct ObjApp *, char *);

extern ULONG __asm MyDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm TransfertDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm TimeDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm TimeDispatcher1(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm ColorDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm ChatDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
extern ULONG __asm ColsDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);

extern struct Hook AddMsgHook;
extern struct Hook RemMsgHook;
extern struct Hook CmpMsgHook;
extern struct Hook DisplayMsgHook;

extern struct Hook AddSessionHook;
extern struct Hook RemSessionHook;
extern struct Hook CmpSessionHook;
extern struct Hook DisplaySessionHook;

extern struct Hook GetUINInfoHook;
extern struct Hook GoURLHook;
extern struct Hook SendMsg2ICQaHook;
extern struct Hook SaveContactJumpHook;
extern struct Hook LoadContactJumpHook;
extern struct Hook LoadHistoryHook;
extern struct Hook SaveHistoryHook;
extern struct Hook DeleteHistoryHook;
extern struct Hook SendChatReqHook;
extern struct Hook AcceptHook;
extern struct Hook RefuseHook;
extern struct Hook OpenChatReqWinHook;
extern struct Hook EndChatHook;
extern struct Hook Add2IgnoreHook;
extern struct Hook SetXferSpeedHook;
extern struct Hook SkipFileHook;
extern struct Hook AbortXferHook;
extern struct Hook KillXferWinHook;
extern struct Hook OpenFileDirectWinHook;
extern struct Hook ForwardMsgHook;
extern struct Hook ShareContactsHook;
extern struct Hook ChatWinStateHook;
extern struct Hook EndAllChatHook;
extern struct Hook SetBIUHook;
extern struct Hook SetLocalFColorHook;
extern struct Hook AdjustFColorPopHook;
extern struct Hook SetUserVisPrefsHook;

/*

Probably the best way to convert standard time to Beats, is by first
calculating the time in seconds.  A good formula to calculate standard time
to Internet time is:  hours(in BMT)*60*60 + minutes*60 + seconds.  Once
you've calculated this (let's call the total of the previous calculation
calculated_total):  calculated_total/86.4.  That should give you the time
in Beats.  Just to make sure, compare it with the time on the Swatch site.

*/

#endif
