/*
** ar_main.h
**
*/

#include <mm_all.h>

//#define CUSTOMER_OTHER   1
//#define CUSTOMER_WATZ    1
#define CUSTOMER_SABU    1

#if defined(CUSTOMER_OTHER)
#   define USER_LIMIT 10
#endif
#if defined(CUSTOMER_WATZ)
#   define USER_LIMIT 16
#endif
#if defined(CUSTOMER_SABU)
#   define USER_LIMIT 10
#endif

//#include <toolhelp.h>
#include <shellapi.h> // DragQueryFile DragAcceptFiles DragFinish

#if defined(VISUAL_C)
#define M_PI 3.14159265358979323846
#else
#include <values.h>
#endif

//#define ARCHIV_OCR 1
#define ARCHIV_GRAB 1  
#define ARCHIV_IPROC 1

#if defined(ARCHIV_IPROC) && !defined(ARCHIV_OCR)
#define ARCHIV_OCR 1
#include "ar_ocr.h"
#endif

#include "ar_idc.h"
//#include "im_twain.h"
#include "ar_zoom.h"
#include "ar_pmon.h"
#include "ar_thumb.h"

#if defined(ARCHIV_GRAB)
#include <mil.h>
#include <mwinmil.h>
IMAGE *ImageCreateVideoGrab(VO);
extern HWND hWndVarioMil;
#endif

#define lenof(char_arr) (sizeof(char_arr)-1)

#define IN_POINT struct in_point
IN_POINT {
   IN x;
   IN y;
} ;

#define AC_CLIID     1
#define AC_CLINAME   2
#define AC_GEBDAT    3
#define AC_WER       4
#define AC_INFO      5

#define AC_KEY_CLIID   1
#define AC_KEY_CLINAME 2
#define AC_KEY_GEBDAT  3
#define AC_KEY_INFO    4

#define AD_DOCID     1
#define AD_CLIID     2
#define AD_DOCNAME   3
#define AD_DOCDATE   4
#define AD_WER      10

#define AD_KEY_DOCID   1
#define AD_KEY_CIDDATE 2

#define AP_FILE     1
#define AP_DOCID    2
#define AP_PAGE     3
#define AP_SCANDATE 4
#define AP_PATH     5
#define AP_TYPE     6
#define AP_DPI      7
#define AP_WER      8

#define AP_KEY_FILE       1
#define AP_KEY_DOCPAGE    2

/* String/Versionsanpassungen */
#define SE1 0
#define SE2 1
#define SE3 2
#define SE4 3
#define SM1 4
#define SM2 5
#define SM3 6
#define SM4 7
CH *StrClient(IN zf);
CH *StrClientColon(IN zf);

extern HWND hModalWnd;

VO ImagePageCreateFileArchiv(CH *fnam);
VO ArchivScanClassInit(VO);
ER ArchivScanCreate(CH *name,IN x,IN y,IN nx,IN ny);
extern IN ArchivPixeltype;
extern IN ArchivScanSize;
extern IN ArchivScanOri;

//VO RectSetWidth(RECT *pr,IN width);

extern CH ArchivUserId[];
extern IN TitelShowUserIdFlag; // Anzeige des Bearbeiters im Image-Window-Titel

extern IN ScannerTurn;

VO WinProtoVarDel(WINDOW *w,CH *var);
ER WinProtoVarSetVal(WINDOW *w,CH *var,CH *val);

extern IN RectSelectFlag;
extern VO HdcDrawRectSelectAll(HDC hdc,IN on_flag);
extern VO HwndDrawRectSelectAll(HWND hwnd,IN on_flag);

extern ER RectSelectTabGetRect(RECT *pr);
extern VO ImageGetRect(IMAGE *im,RECT *pr);
extern IMAGE *ImageCreateImageRect(IMAGE *im,RECT *pr);

extern VO WmCommandSetAllPar(WPARAM *pwParam,LPARAM *plParam,IN cid,HWND hctrl,IN nc);
extern VO DlgDoCmd(HWND hdlg,CH *cmd);
extern VO UpdateDocListAll(VO);
extern VO RecItemGetStrAnsi(RECDEF *d,IN i,CH *s);
extern VO RecItemSetStrAnsi(RECDEF *d,IN i,CH *s);
extern VO ImageInvert(IMAGE *im);
extern ER TaskOcrArchiv(VO);

extern CH OcrMap[256]; // Wert der einzelnen Pixel 16=Schwarz 0=Weiss
extern CH OcrMapLimit; // Grenze fuer Trennung Schwarz/Weiss
extern IN OcrMapLoMax;
extern IN OcrMapHiMax;

#if 0
extern DO ImageFilterSupport_std;
DO ImageFilterFunc_std(DO t);
extern DO ImageFilterSupport_box;
DO ImageFilterFunc_box(DO t);
extern DO ImageFilterSupport_triangle;
DO ImageFilterFunc_triangle(DO t);
extern DO ImageFilterSupport_bell;
DO ImageFilterFunc_bell(DO t);
extern DO ImageFilterSupport_spline;
DO ImageFilterFunc_spline(DO t);
extern DO ImageFilterSupport_lanczos;
DO ImageFilterFunc_lanczos(DO t);
extern DO ImageFilterSupport_mitchell;
DO ImageFilterFunc_mitchell(DO t);
#endif

ER KnowFindVarGetStrLen(CH *var,CH *s,IN slen);
extern CH ScanTaskName[];

/* AR_DLG */
extern HWND hArchivDlg;
extern HWND hFormatDlg;
extern HWND hScanDlg;
extern HWND hClientDlg;
extern HWND hDocDlg;
extern HWND hChangeDocDlg;
extern HWND hChangePageDlg;
extern HWND hChangeClientDlg;
extern HWND hPrintOptionDlg;

extern IN PrintOptionKeepAspect;
extern IN PrintOptionCenterHor;
extern IN PrintOptionCenterVer;
extern IN PrintOptionReduceColor; // 1=Grau 2=Mono
extern IN PrintOptionFitOnPage;
extern IN PrintOptionScaleProc;
extern POINT_DO PrintAreaOffsetMeasuredCm;
extern RECT_DORN PrintAreaWantedCm;

extern CH DocTypPath[MAXPATH];
extern CH ArchivDialogName[40];
extern CH ScanDialogName[40];
extern CH DocListText[81];
extern CH DocListText[81];
extern CH ListBoxFindStrSetSel_Last[256];
extern IN NextPageInc;
extern CH NextPageName[20];
extern CH ArchivEinstellungen[200];
extern IN DocNewAutoCurrentDate;

BOOL CALLBACK ArchivDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK ScanDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK ClientDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK DocDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK ChangeDocDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK ChangePageDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK ChangeClientDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK PrintOptionDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);
BOOL CALLBACK FormatDlgProc(HWND hwnd,UINT msg,WPARAM wpar,LPARAM lpar);

VO CreateScanDialog(VO);
VO CreateArchivDialog(VO);

VO ArchivThemeGetInfo(CH *theme,IN *plen,IN *pflag);
IN DocNameCmpThemeInfo(CH *docname,CH *theme,IN tlen,IN themeflag);

ER PageSortTabInit(VO);
VO NextPageSetStr(CH *s);
VO ArchivSetTheme(CH *theme);
VO UpdateClientText(VO);
VO ArchivDlgPaint(VO);
VO ArchivDestroyAllDlg(IN startup);
VO OpenDefaultDialog(VO);
VO NextPageNameCreate(CH *next0,CH *last0);
ER ListBoxFindStrSetSel(HWND hDlg,IN cid,CH *s);
VO UpdatePageListAll(IN preview_flag);
VO UpdateDoc(VO);
VO ScanButtonsSetDisable(IN state);
ER PageListBuild(HWND hwnd,IN cid);

/* AR_FILE */
ER DirCreate(CH *dnam);
IN DirExist(CH *dnam);
VO FnamGetDir(CH *fnam,CH *dir);
ER FileCpyPlus(CH *toPath,CH *fromPath,IN changemedia);
VO FileNameClean(CH *fnam);
VO RecPageGetFile(CH *fnam);
VO FnamGetDir(CH *fnam,CH *dir);
ER DirCreatePlus(CH *newdir);
LO IdxFindKeyGen(IN xnr,IN knr,CH *key);
LO RecFileKeyRetCount(RECDEF *d,IN knr,CH *key);
DO DiskRetSizeFree(CH *path);
VO RecItemGetStrAnsi(RECDEF *d,IN i,CH *s);
VO RecItemSetStrAnsi(RECDEF *d,IN i,CH *s);
VO RecItemGetStrStrip(RECDEF *d,IN inr,CH *s);


/* AR_IMAGE */

IMAGE *ImageCreateFileProj(CH *fnam);
IMAGE *ImageCreateFileProjSilent(CH *fnam);
ER ImageAdd(IMAGE *im,IN inc);
IMAGE *ImageGrayCreateImageTrue(IMAGE *im);
IMAGE *ImagePalGrayCreateImageTrue(IMAGE *im);
ER ImageGetPixelTrue(IMAGE *im,IN x,IN y,CH *pr,CH *pg,CH *pb);
ER ImageSetPixelTrue(IMAGE *im,IN x,IN y,CH r,CH g,CH b);
ER FileIsImage(CH *fnam);
VO ImagePrintProj(IMAGE *im);
IMAGE *ImageGrayCreateImageMonoFact_2(IMAGE *im1);
IMAGE *ImageGrayCreateImageMonoFact_4(IMAGE *im1);
IMAGE *ImageGrayCreateImageMonoFact_8(IMAGE *im1);
VO TaskImageTurn(IN deg);
extern IMAGE *ImageCreateImage(IMAGE *im);
extern IMAGE *ImageCreateImageSize(IMAGE *im,IN nx,IN ny);
ER ImageTruePlaneGetImage(IMAGE *im,IN plane,IMAGE *im2);


/* AR_MAIN */
extern RECDEF *d_arcli;
extern RECDEF *d_ardoc;
extern RECDEF *d_arpag;

extern CH ArchivId[81];
extern CH ArchivClient[81];
extern CH ArchivGebDat[81];
extern CH ArchivInfo[81];
extern CH ArchivIdRead[81];  // aus CurrentClient-File

extern IN ArchivPixeltype;
extern IN ArchivResolution;
extern IN ArchivScanLandscape;

extern CH ProgStartDialog[];
extern IN ScannerFlag;
extern IN ClientCurrentExistChangeLockFlag;
extern IN MasterUserFlag;
extern IN ForceSameUserDelFlag;
extern IN ForceSameDateDelFlag;
extern IN ClientAllowNewFlag;
extern IN ClientAllowNewNoScannerFlag;
extern IN ScanAllowLoadFlag;
extern IN ShowInfoFlag;
extern IN DocNewClearForm;
extern IN StdDocFlag;
extern IN PaletteCvtFlag;
extern IN FocusChangeIgnoreFlag; // wegen TWAIN-Focuswechsel
extern IN ArchivThemeFlag;


extern WINDOW *WinStdDoc;


extern CH MonochromeResolution[10];
extern CH GrayAndColorResolution[10];

extern CH ArchivDocId[81];
extern CH ArchivDocName[81];
extern CH LastPageLine[81];
extern CH NextPageName[20];
extern CH StoredPageName[20];
extern CH AutoDocName[MAXPATH];

extern CH LastNewDocId[81];

extern IN PageNameSize;
extern CH *PageNameStr;  // Liste aller umbenannten Seiten

extern CH ClientLabel[41];
extern CH InfoLabel[41];
extern CH DateLabel[41];

ER DocCheckValid(CH *archivid,CH *docname,LO docdate);
VO PageNameWork(CH *pnam);
IN PageExist(CH *docid,CH *page);
VO ArchivSetIdClientDateInfo(CH *id,CH *client,CH *gebdat,CH *info);
VO ArchivClientReset(VO);
VO ArchivDocReset(VO);
VO UpdateScanSize(VO);
ER DocCreateNew(VO);
VO ImageDropInternal(CH *fnam);
VO UpdateEinstellungen(VO);
ER AutoDocNameBuildCountUp(VO);
VO RecFileOpenAllProj(VO);

/* AR_PRMON */
extern IN ProgressSuppressFlag;

/* AR_SCAN */
extern IN ScannerSurface;

/* AR_STR */
VO StrAnsiGetOemKey(CH *s,CH *key);
VO StrCpyTillChr(CH *d,CH *s,CH c);
CH *StrMoveToLastChr(CH *s);
ER StrStripBrackets(CH *s,CH c1,CH c2);

/* AR_THUMB */
//extern HWND hPreviewWnd;
extern IN AutoPreviewCreateFlag;                   /* Automatische Erzeugung der Preview-Bilder */
extern CH AutoPreviewPath[80];
extern IN ThumbImageSizeMax;
IMAGE *ThumbImageCreateImage(IMAGE *im);
VO PathCvtAutoThumb(CH *path);
VO ArchivDocIdCreateThumbAll(CH *doc_id);
VO ArchivIdDocCreateWioThumb(CH *id,CH *doc_id);   /* doc_id=NULL (alle) */
ER AutoPreviewCreate(IMAGE *im,CH *fnam);
IMAGE *ThumbImageCreateImageFact(IMAGE *im,IN dfact);
extern VARIO_THUMB *WioThumb;

/* AR_WND */
VO HwndSetSizeMaxProj(HWND hWnd,IN val);
VO HwndSetPosScr(HWND hWnd,IN x,IN y);

/* Überbrückung Sprachanpassung */
#define MessNormal MessNormalFmt //$$$
#define MessError MessErrorFmt
#define MessAbort MessAbortFmt

extern VO HwndGetRectRelParent(HWND hwnd,RECT *pr);
CH ImageRetPixelGray(IMAGE *im,IN x,IN y);

IMAGE *ArchivRetImageCurMess(VO);
VARIO_ZOOM *ArchivRetZoomCur(VO);
LO RectRetArea(RECT *pr);

IN WindowsRetThickCaptionHeight(VO);
IN WindowsRetThickWidth(VO);
IN WindowsRetThickHeight(VO);

ER DocCreateNewAllPar(CH *id,CH *dnam,LO ddate);

#if defined(CUSTOMER_SABU)
ER ShowClientsDoctypePagecount(CH *doc_ss,IN limit);
VO DocSplitDialog(VO);
VO TaskDocSplit(VO);
#endif

extern CH PrintFrameLeftText[80];
extern CH PrintFrameRightText[80];
