/*
 * About dialog
 */

#define INCL_DOS
#define INCL_WIN

#include <os2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include "fm3dll.h"
#include "fm3dlg.h"
#include "fm3str.h"
#include "version.h"

#pragma data_seg(DATA1)
#pragma alloc_text(ABOUT,AboutDlgProc,AuthorDlgProc)


MRESULT EXPENTRY AuthorDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {

  return WinDefDlgProc(hwnd,msg,mp1,mp2);
}


MRESULT EXPENTRY AboutDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {

  SWP         swp;
  static HAB  hab = 0;
  BOOL        no = FALSE;
  static BOOL pause = FALSE;
  static INT  width,direction,ticktock,counter = 0;
  static HPOINTER stick1,stick2,stick3,stick4,stick12,stick22,stick32,stick42,
                  stick5,stick52;

  switch(msg) {
    case WM_INITDLG:
      if(hab) {
        WinDismissDlg(hwnd,0);
        break;
      }
      if(mp2)
        pause = TRUE;
      else
        pause = FALSE;
      AboutBox = hwnd;
      hab = WinQueryAnchorBlock(hwnd);
      WinQueryWindowPos(hwnd,&swp);
      width = swp.cx;
      {
        CHAR s[81];

        sprintf(s,
                "%s %d.%02d%s",
                GetPString(IDS_VERSIONTEXT),
                VERMAJOR,
                VERMINOR,
                VERREALMINOR);
        WinSetDlgItemText(hwnd,
                          ABT_VERSION,
                          s);
      }
      if(!strcmp(realappname,"FM/4"))
        WinSetDlgItemText(hwnd,
                          ABT_PROGNAME,
                          GetPString(IDS_FM2LITETEXT));
      if(!pause) {
        stick1  = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK1);
        stick2  = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK2);
        stick3  = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK3);
        stick4  = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK4);
        stick5  = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK5);
        stick12 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK12);
        stick22 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK22);
        stick32 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK32);
        stick42 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK42);
        stick52 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,ID_STICK52);
        direction = 2;
        ticktock = 0;
        WinStartTimer(hab,
                      hwnd,
                      ID_TIMER,
                      164);
        PostMsg(hwnd,
                UM_SETUP,
                MPVOID,
                MPVOID);
      }
      break;

    case UM_SETUP:
      if(counter++ > 1) {

        HPOINTER hbm,sk0,sk1,sk2,sk3,sk4,sk5,sk6,sk7,sk8,sk9;

        hbm = (HPOINTER)WinSendDlgItemMsg(hwnd,
                                          ABT_ICON,
                                          SM_QUERYHANDLE,
                                          MPVOID,
                                          MPVOID);
        if(hbm) {
          sk0 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL0);
          sk1 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL1);
          sk2 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL2);
          sk3 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL3);
          sk4 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL4);
          sk5 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL5);
          sk6 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL6);
          sk7 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL7);
          sk8 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL8);
          sk9 = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SKULL9);
          if(sk0 && sk1 && sk2 && sk3 && sk4 && sk5 && sk6 && sk7 &&
             sk8 && sk9) {
            WinShowWindow(WinWindowFromID(hwnd,ABT_ICON),FALSE);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk0),MPVOID);
            WinShowWindow(WinWindowFromID(hwnd,ABT_ICON),TRUE);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk1),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk2),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk3),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk4),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk5),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk6),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk7),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk8),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk9),MPVOID);
            DosSleep(257L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk8),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk7),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk6),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk5),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk4),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk3),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk2),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk1),MPVOID);
            DosSleep(33L);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(sk0),MPVOID);
            DosSleep(33L);
            WinShowWindow(WinWindowFromID(hwnd,ABT_ICON),FALSE);
            WinSendDlgItemMsg(hwnd,ABT_ICON,SM_SETHANDLE,
                              MPFROMLONG(hbm),MPVOID);
            WinShowWindow(WinWindowFromID(hwnd,ABT_ICON),TRUE);
          }
          if(sk0)
            WinDestroyPointer(sk0);
          if(sk1)
            WinDestroyPointer(sk1);
          if(sk2)
            WinDestroyPointer(sk2);
          if(sk3)
            WinDestroyPointer(sk3);
          if(sk4)
            WinDestroyPointer(sk4);
          if(sk5)
            WinDestroyPointer(sk5);
          if(sk6)
            WinDestroyPointer(sk6);
          if(sk7)
            WinDestroyPointer(sk7);
          if(sk8)
            WinDestroyPointer(sk8);
          if(sk9)
            WinDestroyPointer(sk9);
        }
      }
      if(counter > 4)
        WinDlgBox(HWND_DESKTOP,
                  hwnd,
                  AuthorDlgProc,
                  FM3ModHandle,
                  AUTHOR_FRAME,
                  NULL);
      return 0;

    case UM_SETDIR:
      WinSetFocus(HWND_DESKTOP,HWND_DESKTOP);
      DosSleep(2500L);
      return 0;

    case WM_TIMER:
      WinQueryWindowPos(WinWindowFromID(hwnd,ABT_STICK1),&swp);
      if(swp.x + (swp.cx * 3) > width - 3) {
        direction = -2;
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),FALSE);
        WinSendDlgItemMsg(hwnd,
                          ABT_STICK1,
                          SM_SETHANDLE,
                          MPFROMLONG(stick3),
                          MPVOID);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                      TRUE);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                      FALSE);
        WinSendDlgItemMsg(hwnd,
                          ABT_STICK2,
                          SM_SETHANDLE,
                          MPFROMLONG(stick32),
                          MPVOID);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                      TRUE);
        no = TRUE;
      }
      else if(swp.x < 3) {
        direction = 2;
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                      FALSE);
        WinSendDlgItemMsg(hwnd,ABT_STICK2,
                          SM_SETHANDLE,
                          MPFROMLONG(stick32),
                          MPVOID);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                      TRUE);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                      FALSE);
        WinSendDlgItemMsg(hwnd,
                          ABT_STICK1,
                          SM_SETHANDLE,
                          MPFROMLONG(stick3),
                          MPVOID);
        WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                      TRUE);
        no = TRUE;
      }
      swp.x += direction;
      WinSetWindowPos(WinWindowFromID(hwnd,ABT_STICK1),
                      HWND_TOP,
                      swp.x,
                      swp.y,
                      swp.cx,
                      swp.cy,
                      SWP_MOVE);
      WinSetWindowPos(WinWindowFromID(hwnd,ABT_ICON),
                      HWND_TOP,
                      swp.x + swp.cx,
                      swp.y,
                      swp.cx,
                      swp.cy,
                      SWP_MOVE);
      WinSetWindowPos(WinWindowFromID(hwnd,ABT_STICK2),
                      HWND_TOP,
                      swp.x + (swp.cx * 2),
                      swp.y,
                      swp.cx,
                      swp.cy,
                      SWP_MOVE);
      if(!no) {
        if(direction > 0) {
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                        FALSE);
          WinSendDlgItemMsg(hwnd,
                            ABT_STICK1,
                            SM_SETHANDLE,
                            MPFROMLONG((ticktock) ?
                            stick1 : stick2),
                            MPVOID);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                        TRUE);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                        FALSE);
          WinSendDlgItemMsg(hwnd,
                            ABT_STICK2,
                            SM_SETHANDLE,
                            MPFROMLONG((ticktock) ?
                            stick42 : stick52),
                            MPVOID);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                        TRUE);
        }
        else {
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                        FALSE);
          WinSendDlgItemMsg(hwnd,
                            ABT_STICK2,
                            SM_SETHANDLE,
                            MPFROMLONG((ticktock) ?
                            stick12 : stick22),
                            MPVOID);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK2),
                        TRUE);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                        FALSE);
          WinSendDlgItemMsg(hwnd,
                            ABT_STICK1,
                            SM_SETHANDLE,
                            MPFROMLONG((ticktock) ?
                            stick4 : stick5),
                            MPVOID);
          WinShowWindow(WinWindowFromID(hwnd,ABT_STICK1),
                        TRUE);
        }
      }
      ticktock = (ticktock) ? 0 : 1;
      break;

    case WM_COMMAND:
      switch(SHORT1FROMMP(mp1)) {
        case ABT_VERSION:
        case DID_CANCEL:
          WinDismissDlg(hwnd,0);
          break;
      }
      return 0;

    case WM_CLOSE:
      WinDestroyWindow(hwnd);
      return 0;

    case WM_DESTROY:
      if(hab) {
        if(!pause) {
          WinStopTimer(hab,
                       hwnd,
                       ID_TIMER);
          WinDestroyPointer(stick1);
          WinDestroyPointer(stick2);
          WinDestroyPointer(stick3);
          WinDestroyPointer(stick4);
          WinDestroyPointer(stick5);
          WinDestroyPointer(stick12);
          WinDestroyPointer(stick22);
          WinDestroyPointer(stick32);
          WinDestroyPointer(stick42);
          WinDestroyPointer(stick52);
        }
        hab = 0;
      }
      AboutBox = (HWND)0;
      break;
  }
  return WinDefDlgProc(hwnd,msg,mp1,mp2);
}
