Web Form API
				 Pass 2.00

*** The User's code must define the following functions: ***
Function: createForm
Calling Sequence: void createForm (int newForm);
Purpose: Create the form that is sent back over the Internet. When newForm =
  NOT_NEW_FORM, the form fields are filled in before being sent over.
Arguments: newForm: A flag (NEW_FORM, NOT_NEW_FORM) telling if this form has
	  ever been displayed previously.

Function: evaluateForm
Calling Sequence: void evaluateForm (void);
Purpose: evaluateForm is called when a query or other data request has been
  submitted. It causes an SQL statement to be executed, and causes the results
  to be shown.

** The Common Code API consists of the following functions: ***
Function: main
Calling Sequence: int main (int argc, char **argv);
Purpose: This is the first function that is called from CGI. It calls
  createForm () and evaluateForm (), which you must supply.

Function: informixEnv
Calling Sequence: int informixEnv (void);
Purpose: Initialise the environment for Informix. This is called from within
  main () which is defined by the API.
Returns: Success / Failure

Function: htmlErrorMsg
Calling Sequence: void htmlErrorMsg (void);
Purpose: Prints message if fatal error occurred.

Function: paragraph
Calling Sequence: void paragraph (void);
Purpose: Issue the HTML to ensure a new line in the Web document.

Function: boldPrint
Calling Sequence: void boldPrint (char *msg);
Purpose: Print the passed message in bold print.
Arguments: msg: A pointer to the string that is to be printed in bold.

Function: htmlTitle
Calling Sequence: void htmlTitle (char *brTitle, char *backFile, char *iconFile,
  char *pgTitle1, char *pgTitle2);
Purpose: Issue the HTML for the browser and page titles. Each page title prints
  on a separate line.
Arguments: brTitle: Browser title. Appears at top of browser.
	backFile: Graphics file containing the background. For future, look
	  into method to specify solid color only.
	iconFile: An optional icon to be placed at the upper left.
	pgTitle1: Page title. Appears centered at top of document.
	pgTitle2: Page subtitle. Appears centered below page title. If not
	  needed, pass NULL for this argument.

Function: sectionTitle
Calling Sequence: void sectionTitle (char *title);
Purpose: Issue the HTML for the section title.
Arguments: title: Section title. Appears in a larger font than the rest of the
	  document.

Function: formBegin
Calling Sequence: void formBegin (void);
Purpose: Issue HTML to start a web form.

Function: formEnd
Calling Sequence: void formEnd (void);
Purpose: Issue HTML to end a web form.

Function: fillHidden
Calling Sequence: void fillHidden (char *name, char *textFill);
Purpose: Create a "hidden" GUI element. This can save information between CGI
  invocations, such as record list information or application state info.
Arguments: name: Name of this hidden element. No spaces allowed.
	textFill: The value of this hidden element.
	
Function: fillText
Calling Sequence: void fillText (int newForm, char *name, int size, int maxSize,
  char *textFill);
Purpose: Create a text GUI element. If this is not the 1st time this form has
  been displayed, fill in the element before displaying.
Arguments: newForm: A flag (NEW_FORM, NOT_NEW_FORM) telling if this form has
	  ever been displayed previously.
	name: Name of this text element. No spaces allowed.
	size: The size of the text element to be displayed, in characters.
	maxSize: The largest number of characters the user is allowed to type.
	  If 0, there is no maximum.
	textFill: The initial value of the text element. Only applies if
	  "newForm" is "NEW_FORM".

Function: fillPassword
Calling Sequence: void fillPassword (char *name, int size, int maxSize);
Purpose: Create a password GUI element. This element starts out blank, and
  prints *'s no matter what the user types.
Arguments: name: Name of this text element. No spaces allowed.
	size: The size of the text element to be displayed, in characters.
	maxSize: The largest number of characters the user is allowed to type.
	  If 0, there is no maximum.

Function: fillTextArea
Calling Sequence: void fillTextArea (int newForm, char *name, int rows,
  int cols, char *textFill);
Purpose: Create a text area GUI element. If this is not the 1st time this form
  has been displayed, fill in the element before displaying.
Arguments: newForm: A flag (NEW_FORM, NOT_NEW_FORM) telling if this form has
	  ever been displayed previously.
	name: Name of this text area element. No spaces allowed.
	rows: The number of rows displaying in the text area element.
	cols: The number of columns displaying in the text area element.
	textFill: The initial value of the text element. Only applies if
	  "newForm" is "NEW_FORM".

Function: fillSelectBegin
Calling Sequence: void fillSelectBegin (char *name, int size);
Purpose: Create a select (list box) element. Note that the creation of a list
  box involves 3 sets of calls: 1 fillSelectBegin, 0 or more fillSelectAdd, and
  1 fillSelectEnd.
Arguments: name: Name of this list box element. No spaces allowed.
	size: The number of items that the list box displays at once.

Function: fillSelectAdd
Calling Sequence: void fillSelectAdd (int newForm, char *textFill,
  int selected);
Purpose: Add a selection to a list box, only if this is not a new form.
Arguments: newForm: A flag (NEW_FORM, NOT_NEW_FORM) telling if this form has
	  ever been displayed previously.
	textFill: A value to be contained in the list box.
	selected: Should this item be displayed as selected?

Function: fillSelectEnd
Calling Sequence: void fillSelectEnd (void);
Purpose: Finish creation of a select (list box) element.

Function: fillPopupBegin
Calling Sequence: void fillPopupBegin (char *name);
Purpose: Create a pop up menu element. Note that the creation of a pop up menu
  involves 3 sets of calls: 1 fillPopupBegin, 0 or more fillPopupAdd, and
  1 fillPopupEnd.
Arguments: name: Name of this pop up menu element. No spaces allowed.

Function: fillPopupAdd
Calling Sequence: void fillPopupAdd (int newForm, char *textFill);
Purpose: Add a selection to a pop up menu, only if this is not a new form.
Arguments: newForm: A flag (NEW_FORM, NOT_NEW_FORM) telling if this form has
	  ever been displayed previously.
	textFill: A value to be contained in the pop up menu.

Function: fillPopupEnd
Calling Sequence: void fillPopupEnd (void);
Purpose: Finish creation of a pop up menu element.

Function: fillCheckbox
Calling Sequence: void fillCheckbox (int checked, char *name, char *title);
Purpose: Create a checkbox element.
Arguments: checked: Is this element pre-checked? (TRUE/FALSE)
	name: Name of this checkbox element. No spaces allowed.
	title: String identifying this checkbox on the document.

Function: fillRadiobutton
Calling Sequence: void fillRadiobutton (char *boxName, char *buttonLabel,
  int def);
Purpose: Create a radio box button of a radio box element.
Arguments: boxName: Name of this radio box element. No spaces allowed.
	buttonLabel: String identifying the individual radio button.
	def: Is this radio button the default of the box?

Function: fillReset
Calling Sequence: void fillReset (char *name);
Purpose: Create a reset button element.
Arguments: name: Name of this reset button element. No spaces allowed. If
	  supplied as NULL, the name defaults to "Reset".

Function: fillButton
Calling Sequence: void fillButton (char *name);
Purpose: Create a generalized button element.
Arguments: name: Name of this button element. No spaces allowed. If supplied as
	  NULL, the name defaults to "SubmitQuery".

Function: fillQueryButton
Calling Sequence: void fillQueryButton (void);
Purpose: Create a Query button element.

Function: fillHelp
Calling Sequence: void fillHelp (char *name);
Purpose: Create an online "Help" link with the text "Help!!".
Arguments: name: Name of HTML file that contains the help for this form.

Function: traverseButtons
Calling Sequence: void traverseButtons (void);
Purpose: Create buttons used for traversing record lists.

Function: remainCount
Calling Sequence: void remainCount (char *table, int newForm);
Purpose: Display which record in the current list is being displayed.
Arguments: table: The name of the table that this call is about.
	newForm: Is this call for a new or old (response) form?

Function: getCount
Calling Sequence: void getCount (char *table);
Purpose: Fetch the record information (which one, how many) from the submitted
  form.
Arguments: table: The name of the table that this call is about.

Function: border
Calling Sequence: void border (void);
Purpose: Start definition of a bordered area.

Function: endBorder
Calling Sequence: void endBorder (void);
Purpose: End definition of a bordered area.

Function: traverseOn
Calling Sequence: int traverseOn (void);
Purpose: Detects if one of the traverse buttons was pressed.
Returns: Which traversal button was pressed, if any.

Function: traverseList
Calling Sequence: int traverseList (int buttonNum, char *table, ...);
Purpose: Traverse the active list of records (the result of a query).
Arguments: buttonNum: Integer identifying pressed traversal button.
	table: What table list are we traversing?
	...: List of additional arguments passed onto "fetch". They are:
	    field list:
		fieldPtr: Pointer to area receiving field value. NULL indicates
		  end of the field list.
		fieldName: Name of the field. Does not appear after NULL.
	    orderBy: Comma-separated list of fields to perform ordering by.
Example: traverseList (1, "aspec", aspecPara, "aspec_para", aspecShall,
  "aspec_shall", NULL, "aspec_para, aspec_shall");
Returns: Failure / Success of called "fetch" (see entry for "fetch")

Function: initSqlTable
Calling Sequence: void initSqlTable (char *table);
Purpose: Initialize the view assocviated with the specified table.
Arguments: table: name of an Informix table or view.

Function: queryTable
Calling Sequence: void queryTable (char *table, char *linkTable, char *fields,
  ...);
Purpose: Query an Informix table, putting results in a temp view.
Arguments: table: name of an Informix table or view.
	linkTable: Table that is linked to.
	fields: Fields to include in the temp view.
	...: List of additional field arguments. They are:
	    field list:
		fieldName: Name of the field. NULL indicates end of the field
		  list.
		fieldType: Type of the field. LINK indicates how 2 tables are
		  linked. Uses fieldVal literally. SQLxxx indicates the field
		  type in the database. Does not appear after NULL.
		fieldVal: Value of the field to look for. This is of type char*
		  if fieldType is LINK, otherwise, the type is t_cgi_entry*.
		  The wild cards "*" and ":" are recognized. Does not appear
		  after NULL.
Example: queryTable ("aspec_build", "aspec", "aspec_seq, imple_build",
  "aspec_seq", LINK, "aspec.aspec_seq", "imple_build", SQLCHAR, impleBuildOne,
  NULL);

Function: fetch
Calling Sequence: void fetch (char *table, int whichRecord, ...);
Purpose: fetch gets the specified record from the current list.
Arguments: table: name of an Informix table or view.
	whichRecord: Which record to get. Record numbering is 1-based.
	...: List of additional arguments. They are:
	    field list:
		fieldPtr: Pointer to area receiving field value. NULL indicates
		  end of the field list.
		fieldName: Name of the field. Does not appear after NULL.
	    orderBy: Comma-separated list of fields to perform ordering by.
Example: fetch ("aspec", 17, aspecPara, "aspec_para", aspecShall,
  "aspec_shall", NULL, "aspec_para, aspec_shall");
Returns: Success / Failure

Function: queryFloat
Calling Sequence: t_cgi_entry *queryFloat (float flNum);
Purpose: Translate a float into CGI entry format.
Arguments: flNum: the number to translate.
Returns: Pointer to CGI entry containing the Float.

Function: queryDouble
Calling Sequence: t_cgi_entry *queryDouble (double dblNum);
Purpose: Translate a double into CGI entry format.
Arguments: dblNum: the number to translate.
Returns: Pointer to CGI entry containing the Double.

Function: queryShort
Calling Sequence: t_cgi_entry *queryShort (short shNum);
Purpose: Translate a short into CGI entry format.
Arguments: shNum: the number to translate.
Returns: Pointer to CGI entry containing the Short.

Function: queryInt
Calling Sequence: t_cgi_entry *queryInt (int intNum);
Purpose: Translate a integer into CGI entry format.
Arguments: intNum: the number to translate.
Returns: Pointer to CGI entry containing the Int.

Function: clearList
Calling Sequence: void clearList (void);
Purpose: Reset the database list to empty, reset the counters.

Function: wordWrap
Calling Sequence: void wordWrap (char *str, int maxLength);
Purpose: Break a string into displayable "lines", according to max line length
  passed.
Arguments: str: The string to break up.
	maxLength: Longest possible length of a line.

Function: unWordWrap
Calling Sequence: void unWordWrap (char *str);
Purpose: Merge the logical lines of a field into one long string.
Arguments: str: The string to merge. All lines are separated by the newline
  character.

Function: hashName
Calling Sequence: char *hashName (char *table, char *user);
Purpose: Create a unique name for a "temporary view" that incorporates the
  original table name and the UNIX user name.
Arguments: table: The name of the table.
	user: The UNIX user name.
Returns: The created hash name. These names start with "tv" and have 1-8
  hexadecimal digits (0-9, a-f) appended. This is the name of the "temporary
  view".
Explanation: A "temporary view" is one that is meaningless outside of the
  context of these Web forms. When a query needs to be made to the database,
  a view is created that incorporates the query. This is done because a Web
  form session will almost always cause more than one invocation of the form
  (each invocation is caused by pressing one of the buttons on the form);
  "temporary view"s cause the result of a query to be available to all such
  invocations. A "temporary view"s life ends when the same user performs
  another query on the same table, thus re-creating the "temporary view"...

Function: spaceFill
Calling Sequence: void spaceFill (char *string, int howLong);
Purpose: Fill a "C" string with spaces to make it 100% compatible with a
  database CHAR field.
Arguments: string: The "C" string to be filled.
	howLong: The size of the database CHAR field (i.e., CHAR (howlong) ).

Function: add
Calling Sequence: int add (char *table, ...);
Purpose: Add a record to a table.
Arguments: table: name of an Informix table or view.
	...: List of additional field arguments. They are:
	    field list:
		fieldName: Name of the field. NULL indicates end of the field
		  list.
		fieldType: Type of the field. SQLxxx indicates the field
		  type in the database. Does not appear after NULL.
		fieldVal: Value of the field to look for. This is of type 
		  t_cgi_entry*. Does not appear after NULL.
Example: add ("aspec_build", "aspec_seq", SQLINT, aspecSeq",
  "imple_build", SQLCHAR, impleBuildOne, NULL);
Returns: Success / Failure

Function: removeRec
Calling Sequence: int removeRec (char *table, ...);
Purpose: Remove one or more records from a table.
Arguments: table: name of an Informix table or view.
	...: List of additional field arguments. They are:
	    field list:
		fieldName: Name of the field. NULL indicates end of the field
		  list.
		fieldType: Type of the field. LINK indicates how 2 tables are
		  linked. Uses fieldVal literally. SQLxxx indicates the field
		  type in the database. Does not appear after NULL.
		fieldVal: Value of the field to look for. This is of type char*
		  if fieldType is LINK, otherwise, the type is t_cgi_entry*.
		  The wild cards "*" and ":" are recognized. Does not appear
		  after NULL.
Example: removeRec ("aspec_build", "aspec_seq", LINK, "aspec.aspec_seq",
  "imple_build", SQLCHAR, impleBuildOne, NULL);
Returns: Success / Failure

Function: updateRec
Calling Sequence: int updateRec (char *table, int recNum, ...);
Purpose: Update a record in a table.
Arguments: table: name of an Informix table or view.
	recNum: Which record in the current list to update.
	...: List of additional field arguments. They are:
	    field list:
		fieldName: Name of the field. NULL indicates end of the field
		  list.
		fieldVal: Value of the updated field. This is of type
		  t_cgi_entry*. Does not appear after NULL.
Example: updateRec ("aspec_build", "imple_build", impleBuildOne, NULL);
Returns: Success / Failure

    Source: geocities.com/bourbonstreet/1317

               ( geocities.com/bourbonstreet)