/*
 * $LynxId: HTForms.h,v 1.33 2012/02/12 22:30:53 tom Exp $
 */
#ifndef HTFORMS_H
#define HTFORMS_H

#ifndef LYSTRUCTS_H
#include <LYStructs.h>
#endif /* LYSTRUCTS_H */

#ifdef __cplusplus
extern "C" {
#endif
/* change_form_link() calls change_form_link_ex() with all its args and FALSE
 * as last arg
 */ extern int change_form_link(int cur,
				DocInfo *newdoc,
				BOOLEAN *refresh_screen,
				int use_last_tfpos,
				int immediate_submit);

    extern int change_form_link_ex(int cur,
				   DocInfo *newdoc,
				   BOOLEAN *refresh_screen,
				   int use_last_tfpos,
				   int immediate_submit,
				   int draw_only);

/* InputFieldData is used to pass the info between HTML.c and Gridtext.c in
 * HText_beginInput()
 */
    typedef struct _InputFieldData {
	const char *accept;
	const char *align;
	int checked;
	const char *iclass;
	int disabled;
	int readonly;
	const char *error;
	const char *height;
	const char *id;
	const char *lang;
	const char *max;
	const char *maxlength;
	const char *md;
	const char *min;
	const char *name;
	int size;
	const char *src;
	const char *type;
	char *value;
	const char *width;
	int name_cs;		/* charset handle for name */
	int value_cs;		/* charset handle for value */
	const char *accept_cs;
    } InputFieldData;

/* The OptionType structure is for a linked list of option entries
 */
    typedef struct _OptionType {
	char *name;		/* the name of the entry */
	char *cp_submit_value;	/* the value to submit   */
	int value_cs;		/* charset value is in   */
	struct _OptionType *next;	/* the next entry        */
    } OptionType;

/*
 * The FormInfo structure is used to contain the form field data within each
 * anchor.  A pointer to this structure is in the TextAnchor struct.
 */
    typedef struct _FormInfo {
	char *name;		/* the name of the link */
	int number;		/* which form is the link within */
	int type;		/* string, int, etc. */
	char *value;		/* user entered string data */
	char *orig_value;	/* the original value */
	int size;		/* width on the screen */
	size_t maxlength;	/* max width of data */
	int group;		/* a group associated with the link
				 *  this is used for select's
				 */
	int num_value;		/* value of the numerical fields */
	int hrange;		/* high numerical range */
	int lrange;		/* low numerical range */
	OptionType *select_list;	/* array of option choices */
	char *submit_action;	/* form's action */
	int submit_method;	/* form's method */
	char *submit_enctype;	/* form's entype */
	char *submit_title;	/* form's title */
	BOOL no_cache;		/* Always resubmit? */
	char *cp_submit_value;	/* option value to submit */
	char *orig_submit_value;	/* original submit value */
	int size_l;		/* The length of the option list */
	int disabled;		/* If YES, can't change values */
	int readonly;		/* If YES, can't change values */
	int name_cs;
	int value_cs;
	char *accept_cs;
    } FormInfo;

#define FormIsReadonly(form) ((form) && ((form)->disabled || (form)->readonly))

/*
 * As structure for info associated with a form.  There is some redundancy
 * here, this shouldn't waste too much memory since the total number of forms
 * (as opposed to form fields) per doc is expected to be rather small.  More
 * things which are per form rather than per field could be moved here.  - kw
 */
    typedef struct _PerFormInfo {
	int number;		/* form number, see GridText.c */
	int disabled;		/* If YES, can't change values */
	FormInfo data;
	struct _PerFormInfo *next;	/* pointer to next form in doc */
	int nfields;		/* number of fields */
	FormInfo *first_field;
	FormInfo *last_field;	/* pointer to last field in form */
	char *accept_cs;
	char *thisacceptcs;	/* used during submit */
    } PerFormInfo;

#define HYPERTEXT_ANCHOR 1
#define INPUT_ANCHOR     2	/* forms mode input fields */
#define INTERNAL_LINK_ANCHOR 5	/* 1+4, can be used as bitflag... - kw */

    typedef enum {
	F_UNKNOWN = 0,
	F_TEXT_TYPE,
	F_PASSWORD_TYPE,
	F_CHECKBOX_TYPE,
	F_RADIO_TYPE,
	F_SUBMIT_TYPE,
	F_RESET_TYPE,
	F_OPTION_LIST_TYPE,
	F_HIDDEN_TYPE,
	F_TEXTAREA_TYPE,
	F_RANGE_TYPE,
	F_FILE_TYPE,
	F_TEXT_SUBMIT_TYPE,
	F_IMAGE_SUBMIT_TYPE,
	F_KEYGEN_TYPE,
	F_BUTTON_TYPE
    } FieldTypes;

#define F_SUBMITLIKE(type) ((type) == F_SUBMIT_TYPE || \
			    (type) == F_IMAGE_SUBMIT_TYPE || \
			    (type) == F_TEXT_SUBMIT_TYPE)

#define F_TEXTLIKE(type) ((type) == F_TEXT_TYPE || \
			  (type) == F_TEXT_SUBMIT_TYPE || \
			  (type) == F_PASSWORD_TYPE || \
			  (type) == F_FILE_TYPE || \
			  (type) == F_TEXTAREA_TYPE)

#define WWW_FORM_LINK_TYPE  1
#define WWW_LINK_TYPE   2
#define WWW_INTERN_LINK_TYPE   6	/* can be used as a bitflag... - kw */
#define LINK_LINE_FOUND	8	/* used in follow_link_number, others - kw */
#define LINK_DO_ARROWUP	16	/* returned by HTGetLinkOrFieldStart - kw */

/* #define different lynx modes */
#define NORMAL_LYNX_MODE 1
#define FORMS_LYNX_MODE  2

#define FIRST_ORDER  1
#define MIDDLE_ORDER 2
#define LAST_ORDER   3

/* in LYForms.c */
    extern void show_formlink_statusline(const FormInfo * form,
					 int for_what);
#ifdef __cplusplus
}
#endif
#endif				/* HTFORMS_H */
