View Issue Details

IDProjectCategoryView StatusLast Update
05105User patchesImport/Exportpublic2012-06-21 13:23
ReporterTMSWhite Assigned ToTMSWhite  
PrioritynormalSeverityminor 
Status closedResolutionfixed 
Product Version1.91RC5 
Fixed in Version2.00b 
Summary05105: Import Survey definitions from Excel
Description

I have research colleagues and epidemiologists who would like to create their surveys in Excel (with one row per question), and then import the final product into the survey tool. This is especially helpful for very long surveys, where Excel can be used to easily re-order questions, or common answer-lists can be re-used across blocks of questions.

This strategy has worked for me in the past for a different survey tool (Dialogix). One of LimeSurvey's "competitors", REDCap, also uses an Excel import structure, so it is definitely possible to do this. The challenge is agreeing upon the syntax and semantics within Excel.

In my case, I used 9 columns, with one row per Question/Item
(1) Concept - optional label of what the item was supposed to measure
(2) InternalName - the variable name (might be restricted to 8 or 12 characters, depending upon target statistical package)
(3) DisplayName - a more meaningful name for users
(4) Relevance - the conditions under which the question should be asked - processed by the equation parser and returns Boolean
(5) QuestionType - type of question or Evaluation
(6) ValidationCriteria - datatype,min,max,formatMask,extraAllowableValues
(7) Readback - optional text to help user remember the question - so, rather than, "when we asked you {X}"?, we'd display "When we asked about {X.readback}", you said "{X.answer}".
(8) QuestionOrEvaluationText - this is the text (with optional embedded HTML) that is parsed by the Equation Parser to either form a string to diplay, or compute the result of an Evaluation and store it in a variable.
(9) AnswerChoices - optional enumerated list of answer options (if QuestionType requires such an enumerated list)

LimeSurvey should be able to use a similar approach, but would need more columns to support the advanced option types for each question type.

I found that my users did not mind having a different syntax for each question type, as long as the InstrumentLoad function flagged any errors for them. That let the whole survey be compact and easier to read (rather than having 30+ sparsely filled columns and constantly having to horizontally scroll back and forth as you scrolled down to change data types).

As reference, I'm attaching the Dialogix instruction manual, which shows how it specified its Excel import structure. This just meant to be food for thought - the manual hasn't been updated since 2003, and Dialogix never included Matrix-style questions, so LimeSurvey would need a somewhat different set of columns within such an Excel import format.

Separately, I'll attach the Excel import schema for REDCap if there are no intellectual property restrictions on doing so.

Also note, this approach to importing surveys assumes the existance of an embedded equation parser (see Issue#05103), and a question type for Evaluations (see Issue#05104). This way the Excel could be internally consistent and let users refer to variables by the InternalName (e.g. in Conditions/Relevance, and Piping/Tailoring) rather than needing to adjust all of those references to SGQA notation after loading the instrument.

TagsNo tags attached.
Complete LimeSurvey version number (& build)9992

Activities

TMSWhite

TMSWhite

2011-04-11 21:17

reporter  

Dialogix_UserManual_2003.htm (73,887 bytes)   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        
        <title>Dialogix: UserManual</title>
    </head>
    <body>
                        <p align="CENTER"><b><font size="5">Dialogix System Instructions</font></b></p>
<p>
</p><hr align="CENTER">
<p></p>

<p><b><font size="4">Overview</font></b></p>

<p>Dialogix is a tool for authoring, validating, deploying, and analyzing human-computer dialogs.</p>

<p><a name="Authors"></a><b>The Role of the Author</b></p>

<p>The author (who is an expert in a content domain) creates an <b><a href="#instrumentFile"><i>instrumentFile</i></a></b>

(a tab-delimitted spreadsheet editable in any spreadsheet program) which encapsulates the content and flow of an
dialog.</p>

<p>Specifically an <b><a href="#instrumentFile"><i>instrumentFile</i></a></b> is implemented as a list of nodes,
with one node for row in the spreadsheet.&nbsp; In a node the author encapsulates the logic and rationale for each
possible action in the schedule and specifies the data type of the response (if any) to be stored.&nbsp; Dialogix
currently supports 2 basic kinds of actions -- displays and evaluations.&nbsp; The author defines display actions
to send a new display with information or a question and answer options to the browser.&nbsp; The author defines
evaluations that perform procedures on the data, e.g., count, list, logical and mathematical comparison.</p>

<p>For example, a display action might be a question that asks a person's age.&nbsp; The author specifies the text
of the question ("What is your age?"), the data type (double), and might specify a minimum value (e.g.,
5) or a maximum if appropriate.</p>

<p>For an evaluation action example, consider a schedule which has 5 nodes to ask questions with yes/no answers
about each of 5 symptoms.&nbsp; A subsequent node with an evaluation action to count the symptoms present might
take the form: <i>count(symptom1 == 'yes', symptom2 == 'yes', symptom3 == 'yes', symptom4 == 'yes', symptom5 ==
'yes') </i>and it will store the answer.&nbsp; If the symptom count is supposed to be above a threshold, say 3,
then another node can be defined to test for that, e.g., <i>symptom_count &gt; 3</i>.&nbsp; If it is not necessary
to store both facts separately, one could simply add the "&gt; 3" to the count expression.</p>

<p>Before a node's action is performed its <b><i><a href="#relevance">relevance</a></i></b> are checked to determine
if its action is applicable.&nbsp; The <b><i><a href="#relevance">relevance</a></i></b> are written as Boolean
expressions.&nbsp; If the expression is TRUE the action is applicable and will be performed storing the appropriate
data.&nbsp; If the expression is FALSE, the action is not applicable so the datum stored for that node is a special
value of <b><i><a href="#NOT%20APPLICABLE">notApplicable</a></i></b> and the flow moves on to the next node.&nbsp;

There are two important points to note about using <a href="#relevance"><b><i>relevance</i></b></a> like this.&nbsp;
First, each node in its <a href="#relevance"><b><i>relevance</i></b></a> expressions explicitly specifies the exact
circumstances in which it is applicable and its connections to other nodes.&nbsp; Second, one does not have to
record a "goto" for each answer option at a given node which eliminates the difficulty of following the
flow of a schedule through all the possible paths.</p>

<p>For example, consider an interview that asks for the subject's gender in one node, then asks whether the subject
has ever been pregnant in the next.&nbsp; The first node will always be asked so its dependency expression is simply
1 (Boolean TRUE).&nbsp; Let's say the response is "female".&nbsp; The second node should be asked only
if the subject is female, so its <a href="#relevance"><b><i>relevance</i></b></a> will be an expression like, <i>gender
== "female"</i>.&nbsp; If this evaluates to TRUE, as it will in this case, the node's action, asking
about pregnancy, will be performed and the response stored.&nbsp;&nbsp; Had the response been "male"

the dependency expression would evaluate to FALSE and a notApplicable would be stored.</p>

<p>As a schedule proceeds, then, each node is considered in order from first to last without jumps.&nbsp; Whether
or not the node's action is performed is determined by the evaluation of the node's <b><a href="#relevance"><i>relevance</i></a></b>.&nbsp;
An important consideration in authoring <b><a href="#relevance"><i>relevance</i></a></b> is how to handle their
evaluation in the event that one of the nodes was not answered.&nbsp; Dialogix currently supports the distinction
among and special treatment of such cases, including <b><i><a href="#UNASKED">notYetAsked</a>, <a href="#NOT%20APPLICABLE">notApplicable</a>,


<a href="#NOT%20UNDERSTOOD">notUnderstood</a></i></b> (the user did not understand the question), <b><i><a href="#UNKNOWN">notKnown</a></i></b>
(the user did not know the answer), and <b><i><a href="#REFUSED">refused</a></i></b> (the user refused to answer).</p>

<p>Once authors have created an <b><a href="#instrumentFile"><i>instrumentFile</i></a></b>, they copy it to the
<b><i><a href="#scheduleSrcDir">scheduleDirectory</a></i></b> to make it available to validators and users.</p>

<p><a name="Users"></a><b>The Role of the User</b></p>

<p>The user is anyone who navigates through an interview.&nbsp; The user may be an interviewer, interviewee, author,
or validator.</p>

<p>To start, the user launches a web browser and opens the URL of the Dialogix servlet.&nbsp; The opening screen
provides the means to select a new interview (from a drop-down list of available interviews) or restore an interview
in progress (from a drop-down list of suspended interviews).</p>

<p>After selecting an interview to start (using the <b>Start</b> button), or resume (using the <b>Resume</b> button),
users will see a series of screens in which they will be presented with information and asked questions. The standard
user-interface employed by HTML-based forms is used. After answering the questions on the screen, users must press
the <b>Next</b> button to proceed to the next set of questions. At each stage, Dialogix collects, processes, and
saves any information entered. If required questions are not answered, or if the answers do not conform to the
required data type or value ranges (as specified by the author), Dialogix will re-display the page with informative
messages saying what went wrong, and what needs to be done to correct it. For each question on which Dialogix detected
a problem, Dialogix will paint that question in red, and indicate what needs to be done (e..g <i>Please answer
this question</i>, or <i>Please enter a number in the range (5 - 14)</i>)</p>

<p>At any time, the user can also press the <b>Previous</b> button to return to prior screens and review or change
answers.</p>

<p>When the interview is completed, the users will be thanked and informed that they are done. Despite being finished,
users will have the opportunity to backup (via the <b>Previous</b> button) and review or change answers as needed.</p>

<p><a name="Analysts"></a><b>The Role of Analyst</b></p>

<p>The analyst is the person who analyzes the contents of the <b><i><a href="#DataFile">dataFile</a></i></b>.</p>

<p>
</p><hr align="CENTER">
<br>
<a name="instrumentFile"></a><b><font size="4">instrumentFile Format</font></b><p></p>

<p><b>Overview</b></p>

<p>This section applies to <b><i><a href="#instrumentFile">instrumentFiles</a></i></b>. Columns in which the values
are optional are marked with an asterix (*).</p>

<p>Each <b><i><a href="#instrumentFile">instrumentFile</a></i></b> contains three sections



</p><ul>
	<li><b><i>ReservedVariables</i></b>
	</li><li><b><i>Comments</i></b>
	</li><li><b><i>Nodes</i></b>
</li></ul>

<p>In each case, there is only one <b><i>ReservedVariable</i></b>, <b><i>Node</i></b>, or <b><i>Comment</i></b>

on a row. The differ in the number of columns required in each section.</p>
<p><b><u>ReservedVariables</u></b> conform to the following syntax: 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="33%"><b>RESERVED</b></td>
		<td width="33%"><b><i><a href="#ReservedVariableName">ReservedVariableName</a></i></b></td>
		<td width="34%">value</td>

	</tr>
</tbody></table>
<p></p>
<p><b><u>Comments</u></b> conform to the following syntax:</p>
<p>The line begins with the <i>string</i> <b>COMMENT</b>. Any content can follow this string, in zero or more columns.</p>
<p><b><u>Nodes</u></b> conform to the following syntax:</p>

<p>The first five columns contain this information: 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="20%"><b><i><a href="#concept">concept</a> (*)</i></b></td>
		<td width="20%"><b><i><a href="#internalName">internalName</a></i></b></td>
		<td width="20%"><b><i><a href="#externalName">externalName</a> (*)</i></b></td>

		<td width="20%"><b><i><a href="#relevance">relevance</a></i></b></td>
		<td width="20%"><b><i><a href="#questionOrEvalTypeField">questionOrEvalTypeField</a></i></b></td>
	</tr>
</tbody></table>
<p></p>
<p>The next four columns are repeated, once for each language to be supported. Thus, if three languages are to
be supported, there are three copies of these four columns, each with different, localized content. 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="25%"><b><i><a href="#readback">readback</a> (*)</i></b></td>

		<td width="25%"><b><i><a href="#questionOrEval">questionOrEval</a></i></b></td>
		<td width="25%"><b><i><a href="#answerChoices">answerChoices</a></i></b></td>
		<td width="25%"><b><i><a href="#helpURL">helpURL</a> (*)</i></b></td>
	</tr>
</tbody></table>
<p></p>
<p>These last four columns are only used for setting the default value for questions.</p>

<p>
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="25%"><b><i>NA (*)</i></b></td>
		<td width="25%"><b><i>NA (*)</i></b></td>
		<td width="25%"><b><i><a href="#answerGiven">defaultAnswer</a> (*)</i></b></td>
		<td width="25%"><b><i><a href="#comment">comment</a> (*)</i></b></td>

	</tr>
</tbody></table>
<p></p>

<p><b>Detailed Descriptions of Columns / Fields</b></p>

<p><a name="concept"></a><b><i>concept</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>

		<td width="6%">Unique?</td>

		<td width="87%">Syntax</td>
	</tr>
	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>

		<td width="87%"><b>string</b></td>
	</tr>

</tbody></table>
The concept is one possible name a node. Although this field is optional, we recommend that it be used, as it allows
authors to explicitly label the rational behind each node. It will also facilitate the creation of or linking to
controlled vocabularies. For example, a node designed to capture the height of a subject in inches might be labeled
as <i>subject.height.inches.</i><p></p>

<p><a name="internalName"></a><b><i>internalName</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>

		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>yes</b></td>

		<td width="87%"><b><a href="#Variable%20Names">NMTOKEN</a></b></td>
	</tr>
</tbody></table>
The internalName is the main name for a node. Names are commonly the variable names which will be used for analysis;
or other names that will help make equations more meaningful.<p></p>

<p><a name="externalName"></a><b><i>externalName</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>

		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>
	</tr>

	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>

		<td width="87%"><b>string</b></td>
	</tr>
</tbody></table>
The externalName is another possible name for a node. It is meant to be a reference to existing naming systems
for questions. This is the value that is displayed when <i><a href="#__SHOW_QUESTION_REF__">__SHOW_QUESTION_REF__</a></i>

equals <i>true</i>.<p></p>

<p><a name="relevance"></a><b><i>relevance</i></b> (whether the node is applicable - whether the question should
be asked) 

</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>

		<td width="87%">Syntax</td>
	</tr>
	<tr>

		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%"><b>Boolean equation (1 equals <i>true</i>)</b></td>

	</tr>
</tbody></table>
This field specifies whether a nodes is to be evaluated. If the equation evaluates to <i>false</i>, then the node
is *NA* (e.g. men should not be asked questions about menstruation). Below is an abbreviated example of how <b><a href="#relevance"><i>relevance</i></a></b> work. The goal is to ask all subjects their gender, age, whether they
have children, and whether they have a job. Additionally, women are asked if they menstruate; and if they do menstruate,
they are also asked for the date of their last period and the age of Menarche. Furthermore, if a subject has children,
they are asked how many children they have. Rather than using a procedural <i>if-then</i> approach to specifying
which questions to ask, Dialogix uses a declarative approach. Authors must explicitly specify the <a href="#relevance"><b><i>relevance</i></b></a>

of each node. Thus, q3 is only applicable if the subject is female (q1 == 0). Moreover, q4 and q5 are only applicable
for menstruating females. 
<table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>

		<td width="13%"><b><i>internalName</i></b></td>
		<td width="12%"><b><i>relevance</i></b></td>
		<td width="50%"><b><i>questionOrEval</i></b></td>
		<td width="25%"><b><i>answerChoices</i></b></td>

	</tr>
	<tr>
		<td width="13%">gender</td>

		<td width="12%">1</td>
		<td width="50%">Are you male or female?</td>
		<td width="25%">male=1, female=0</td>

	</tr>
	<tr>
		<td width="13%">age</td>
		<td width="12%">1</td>

		<td width="50%">How old are you?</td>
		<td width="25%">number</td>

	</tr>
	<tr>
		<td width="13%">menstruate</td>
		<td width="12%">gender==0</td>
		<td width="50%">Do you menstruate?</td>

		<td width="25%">yes=1, no=0</td>

	</tr>
	<tr>
		<td width="13%">LMP</td>
		<td width="12%">menstruate==1</td>
		<td width="50%">When was your last period?</td>
		<td width="25%">date</td>

	</tr>
	<tr>
		<td width="13%">menarche</td>
		<td width="12%">menstruate==1</td>
		<td width="50%">At what age did you start menstruating?</td>
		<td width="25%">number</td>
	</tr>

	<tr>
		<td width="13%">hasChildren</td>
		<td width="12%">1</td>
		<td width="50%">Do you have any children?</td>
		<td width="25%">yes=1,no=0</td>
	</tr>

	<tr>

		<td width="13%">numChildren</td>
		<td width="12%">hasChildren==1</td>
		<td width="50%">How many children do you have?</td>
		<td width="25%">number</td>
	</tr>

	<tr>
		<td width="13%">hasJob</td>

		<td width="12%">1</td>
		<td width="50%">Do you have a job?</td>
		<td width="25%">yes=1,no=0</td>
	</tr>

</tbody></table>
<p></p>

<p><a name="questionOrEvalTypeField"></a><b><i>questionOrEvalTypeField</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">

	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>
		<td width="7%"><b>no</b></td>

		<td width="6%"><b>no</b></td>
		<td width="87%"><i><a href="#questionOrEvalType">questionOrEvalType</a></i><b>;</b><i><a href="#dataType">dataType</a></i><b>;</b><i><a href="#min">min</a></i><b>;</b><i><a href="#max">max</a></i><b>;</b><i><a href="#formatMask">formatMask</a></i>;<a href="#extraAllowableValues">extraAllowableValues</a></td>

	</tr>

</tbody></table>


<blockquote>
	<p><a name="questionOrEvalType"></a><i>questionOrEvalType</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>
			<td width="6%">Unique?</td>

			<td width="87%">Syntax</td>

		</tr>
		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>no</b></td>
			<td width="87%">one of the following:</td>

		</tr>
	</tbody></table>

	<table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="16%">questionOrEvalType</td>
			<td width="84%">Meaning</td>
		</tr>

		<tr>
			<td width="16%"><b>q</b></td>

			<td width="84%">display information (e.g. a question), and optionally request a response</td>
		</tr>
		<tr>
			<td width="16%"><b>e</b></td>
			<td width="84%">evaluate an <i><a href="#Equation">equation</a></i></td>

		</tr>
		<tr>

			<td width="16%"><b>[</b></td>
			<td width="84%">start a display group, and treat this node as a <b>q</b>. The display group may not contain nested <b>e</b> <i><a href="#Equation">equations</a></i></td>
		</tr>

		<tr>
			<td width="16%"><b><font size="4">]</font></b></td>

			<td width="84%">stop a display group, and treat this node as a <b>q</b>.</td>
		</tr>
	</tbody></table>
<p></p>
	<p><a name="dataType"></a><i>dataType</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">

		<tbody><tr>
			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>no</b></td>

			<td width="6%"><b>no</b></td>
			<td width="87%">one of the following. If not set, then implicitly the default dataType from <b><i>answerChoices</i></b></td>

		</tr>
	</tbody></table>

	<table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>

			<td width="16%">dataType</td>
			<td width="84%">Meaning</td>
		</tr>

		<tr>
			<td width="16%"><b>number</b></td>
			<td width="84%">a decimal number</td>

		</tr>
		<tr>
			<td width="16%"><b>string</b></td>
			<td width="84%">any text</td>

		</tr>
		<tr>
			<td width="16%"><b>date</b></td>

			<td width="84%">year/month/day - default format is <i>MM/dd/yyyy</i> (e.g. 07/04/2000)</td>
		</tr>
		<tr>

			<td width="16%"><b>time</b></td>
			<td width="84%">hour/minute/second - default format is <i>HH:mm:ss</i> (e.g. 17:30:00)</td>

		</tr>
		<tr>
			<td width="16%"><b>year</b></td>
			<td width="84%">year - default format is <i>yyyy</i> (e.g. 1984)</td>

		</tr>
		<tr>

			<td width="16%"><b>month</b></td>
			<td width="84%">month - default format is <i>MMMM</i> (e.g. February)</td>
		</tr>
		<tr>

			<td width="16%"><b>day</b></td>

			<td width="84%">day - default format is <i>d</i> (e.g. 4)</td>
		</tr>
		<tr>
			<td width="16%"><b>weekday</b></td>
			<td width="84%">weekday - default format is <i>E</i> (e.g. Fri)</td>

		</tr>
		<tr>
			<td width="16%"><b>hour</b></td>
			<td width="84%">hour - default format is <i>H</i> (e.g. 17)</td>
		</tr>
		<tr>

			<td width="16%"><b>minute</b></td>
			<td width="84%">minute - default format is <i>m</i> (e.g. 10)</td>
		</tr>
		<tr>
			<td width="16%"><b>second</b></td>

			<td width="84%">second - default format it <i>s</i> (e.g. 35)</td>

		</tr>
		<tr>
			<td width="16%"><b>month_num</b></td>
			<td width="84%">month as number - default format is <i>M</i> (e.g. 7)</td>

		</tr>
		<tr>

			<td width="16%"><b>*</b><a name="INVALID"></a><b>INVALID*</b></td>
			<td width="84%">special datatype indicating a data error (e.g. multiplying a <i>string</i> by a <i>number</i>)</td>

		</tr>
		<tr>
			<td width="16%"><b>*</b><a name="UNASKED"></a><b>UNASKED*</b></td>

			<td width="84%">special datatype indicating that a node's questionOrEval has not yet been "asked"</td>
		</tr>
		<tr>

			<td width="16%"><b>*</b><a name="UNKNOWN"></a><b>UNKNOWN*</b></td>
			<td width="84%">special datatype indicating that the subject does not know the answer to a question</td>
		</tr>

		<tr>
			<td width="16%"><b>*</b><a name="REFUSED"></a><b>REFUSED*</b></td>
			<td width="84%">special datatype indicating that the subject refused to answer a question</td>

		</tr>
		<tr>
			<td width="16%"><b>*</b><a name="NA"></a><b>NA*</b></td>

			<td width="84%">special datatype indicating that the questionOrEval should not be asked (e.g. men should not be asked about menstruation)</td>
		</tr>
		<tr>
			<td width="16%"><b>*</b><a name="HUH"></a><b>HUH*</b></td>

			<td width="84%">special datatype indicating that the subject did not understand the question (e.g. language barriers)</td>
		</tr>
	</tbody></table>

<p></p>
	<p><a name="min"></a><i>min</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>

		<tr>
			<td width="7%"><b>no</b></td>
			<td width="6%"><b>no</b></td>

			<td width="87%">a variable name, number, or string (in quotes)</td>
		</tr>
	</tbody></table>
<p></p>
	<p><a name="max"></a><i>max</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">

		<tbody><tr>
			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>no</b></td>

			<td width="6%"><b>no</b></td>

			<td width="87%">a variable name, number, or string (in quotes)</td>
		</tr>
	</tbody></table>
<p></p>
	<p><a name="formatMask"></a><i>formatMask</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>

			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>no</b></td>
			<td width="6%"><b>no</b></td>

			<td width="87%">a valid SimpleDateFormat or DecimalFormat string, as per Java specifications. Examples are seen under <i><a href="#dataType">dataType</a></i>.</td>
		</tr>
	</tbody></table>
<p></p>

	<p><a name="extraAllowableValues"></a><i>extraAllowableValues</i></p>

	<p>

	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>
			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>
		<tr>

			<td width="7%"><b>no</b></td>
			<td width="6%"><b>no</b></td>
			<td width="87%">value ; [value] (e.g. 77;88;99)</td>
		</tr>
	</tbody></table>

</blockquote>

<p><a name="readback"></a><b><i>readback</i></b> 

</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>
	</tr>
	<tr>

		<td width="7%"><b>no</b></td>

		<td width="6%"><b>no</b></td>
		<td width="87%">a <i>string</i> - substitution is applied to the readback. This field is accessed by the <i><a href="#description">desc</a>()</i>
			function (short for <i>description</i>)</td>

	</tr>

</tbody></table>
<p></p>
<p><a name="questionOrEval"></a><b><i>questionOrEval</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>

	<tr>
		<td width="7%"><b>yes</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">if questionOrEvalType == 'e', then use <i><a href="#evalSyntax">evalSyntax</a><br>
			</i>otherwise, use <i><a href="#questionSyntax">questionSyntax</a></i></td>

	</tr>

</tbody></table>
<p></p>

<blockquote>
	<p><a name="questionSyntax"></a><i>questionSyntax</i></p>
	<p>
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>

			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>no</b></td>

			<td width="87%"><i>Question</i>: a <i>string</i>, which can contain embedded HTML tags (&lt;b&gt;&lt;/b&gt;, &lt;i&gt;&lt;/i&gt;,
				&lt;u&gt;&lt;/u&gt;, &lt;br&gt;, etc.), as well as embedded <i><a href="#Equation">equations</a></i>, surrounded
				by back-ticks (e.g. `5 + 3`). Substitution is performed on these questions.</td>

		</tr>
	</tbody></table>
<p></p>
	<p><a name="evalSyntax"></a><i>evalSyntax</i></p>
	<p>
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>

			<td width="6%">Unique?</td>
			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>no</b></td>

			<td width="87%"><i><a href="#Equation">Equations</a></i>: these are <i>not</i> surrounded by back-ticks.</td>

		</tr>
	</tbody></table>
<p></p>
</blockquote>

<p><a name="answerChoices"></a><b><i>answerChoices</i></b> 

</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>

		<td width="87%">Syntax</td>
	</tr>
	<tr>

		<td width="7%"><b>yes</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%"><i><a href="#answerType">answerType</a></i><b>|</b><i><a href="#value">value1</a>|<a href="#msg">msg1</a>|<a href="#value">value2</a>|<a href="#msg">msg2</a>;...</i></td>

	</tr>
</tbody></table>


<blockquote>
	<p><a name="answerType"></a><i>answerType</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>
			<td width="6%">Unique?</td>

			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>no</b></td>
			<td width="87%">one of the following:</td>

		</tr>

	</tbody></table>

	<table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="9%">answerType</td>
			<td width="11%">defaultDataType</td>
			<td width="64%">Meaning</td>

			<td width="16%">use value|msg pairs?</td>

		</tr>
		<tr>
			<td width="9%"><b>nothing</b></td>
			<td width="11%"><b>string (blank)</b></td>
			<td width="64%">display the question, but don't collect any information</td>

			<td width="16%">no</td>
		</tr>

		<tr>
			<td width="9%"><b>radio</b></td>
			<td width="11%"><b><i>string</i></b></td>
			<td width="64%">display value|msg pairs using radio buttons; collect value associated with selected msg</td>

			<td width="16%"><b>yes</b></td>
		</tr>
		<tr>

			<td width="9%"><b>check</b></td>
			<td width="11%"><b>string</b></td>
			<td width="64%">display value|msg pairs using check boxes; collect values associated with selected msgs</td>

			<td width="16%"><b>yes</b></td>
		</tr>
		<tr>
			<td width="9%"><b>combo</b></td>

			<td width="11%"><b>string</b></td>
			<td width="64%">display value|msg pairs using a combo box; collect value associated with selected msg</td>

			<td width="16%"><b>yes</b></td>
		</tr>
		<tr>
			<td width="9%"><b>list</b></td>
			<td width="11%"><b>string</b></td>

			<td width="64%">display value|msg pairs using a list box (max of 20 lines); collect value associated with selected msg</td>

			<td width="16%"><b>yes</b></td>
		</tr>
		<tr>
			<td width="9%"><b>text</b></td>
			<td width="11%"><b>string</b></td>
			<td width="64%">display a text entry box; collect entered <i>string</i></td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>double</b></td>
			<td width="11%"><b>number</b></td>
			<td width="64%">display a text entry box; collect entered <i>number</i></td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>radio2</b></td>
			<td width="11%"><b>string</b></td>
			<td width="64%">display value|msg pairs using radio buttons horizontally on next row; collect value associated with selected msg</td>

			<td width="16%"><b>yes</b></td>

		</tr>
		<tr>
			<td width="9%"><b>password</b></td>
			<td width="11%"><b>string</b></td>
			<td width="64%">display password entry box; collect entered <i>string</i></td>

			<td width="16%">no</td>

		</tr>
		<tr>
			<td width="9%"><b>memo</b></td>
			<td width="11%"><b>string</b></td>
			<td width="64%">display multi-line text entry box; collect selected <i>string</i></td>

			<td width="16%">no</td>

		</tr>
		<tr>
			<td width="9%"><b>date</b></td>
			<td width="11%"><b>date</b></td>
			<td width="64%">display text entry box; collect entered date (e.g. 07/04/1942)</td>

			<td width="16%">no</td>
		</tr>

		<tr>
			<td width="9%"><b>time</b></td>
			<td width="11%"><b>time</b></td>
			<td width="64%">display text entry box; collect entered time (e.g. 14:25:37)</td>

			<td width="16%">no</td>
		</tr>
		<tr>

			<td width="9%"><b>year</b></td>
			<td width="11%"><b>year</b></td>
			<td width="64%">display text entry box; collect entered year (e.g. 1937)</td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>month</b></td>

			<td width="11%"><b>month</b></td>
			<td width="64%">display text entry box; collect entered month (e.g. July)</td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>day</b></td>
			<td width="11%"><b>day</b></td>

			<td width="64%">display text entry box; collect entered day (e.g. 25)</td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>weekday</b></td>
			<td width="11%"><b>weekday</b></td>
			<td width="64%">display text entry box; collect entered weekday (e.g. Fri)</td>

			<td width="16%">no</td>
		</tr>
		<tr>
			<td width="9%"><b>hour</b></td>
			<td width="11%"><b>hour</b></td>
			<td width="64%">display text entry box; collect entered hour (e.g. 15)</td>
			<td width="16%">no</td>

		</tr>
		<tr>
			<td width="9%"><b>minute</b></td>
			<td width="11%"><b>minute</b></td>
			<td width="64%">display text entry box; collect entered minute (e.g. 10)</td>
			<td width="16%">no</td>

		</tr>

		<tr>
			<td width="9%"><b>second</b></td>
			<td width="11%"><b>second</b></td>
			<td width="64%">display text entry box; collect entered second (e.g. 37)</td>
			<td width="16%">no</td>

		</tr>
		<tr>

			<td width="9%"><b>month_num</b></td>
			<td width="11%"><b>month_num</b></td>
			<td width="64%">display text entry box; collect entered month as number (e.g. 7)</td>
			<td width="16%">no</td>

		</tr>
	</tbody></table>
<p></p>

	<p><a name="value"></a><i>value1...n</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>
			<td width="6%">Unique?</td>

			<td width="87%">Syntax</td>
		</tr>

		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>yes</b></td>
			<td width="87%"><i><a href="#Equation">equation</a></i> (no two <i>values</i> for a given node can be the same). If multiple languages
				are used, the system will check to make sure that each language has the same number of value|msg pairs, and that
				the order of values is the same.  Since this is an <a href="#Equation">equation</a>, it can refer to other variables,
				or be calculated; and it must not include back-ticks.  If you want the stored value to be a string, it needs to
				be surrounded by double quotes.  Numerical values can be listed as-is.</td>

		</tr>
	</tbody></table>
<p></p>
	<p><a name="msg"></a><i>msg1...n</i> 
	</p><table border="1" cellpadding="0" cellspacing="0" width="90%">
		<tbody><tr>
			<td width="7%">Required?</td>
			<td width="6%">Unique?</td>

			<td width="87%">Syntax</td>
		</tr>
		<tr>
			<td width="7%"><b>yes</b></td>
			<td width="6%"><b>no</b></td>
			<td width="87%"><i>string</i> - the msg is parsed to substitute&nbsp;equations (e.g. this can contain back-ticked <a href="#Equation">equations</a>)</td>

		</tr>
	</tbody></table>

</blockquote>

<p><a name="helpURL"></a><b><i>helpURL</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>

		<td width="87%">Syntax</td>
	</tr>
	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">a valid URL. No substitution is performed.  If present, this will appear as a help-icon to the right of the question.</td>

	</tr>

</tbody></table>
<p></p>
<p><a name="languageNum"></a><b><i>languageNum</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>

	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">Dialogix sets this value when the node is processed. This <i>number</i> value is the language used when asking
			a question. The valid range is 0 - (numLanguages-1).  This refers to the <a href="#__LANGUAGES__">__LANGUAGES__</a>

			option.</td>

	</tr>
</tbody></table>
<p></p>

<p><a name="questionAsAsked"></a><b><i>questionAsAsked</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>

		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>

		<td width="87%">Dialogix sets this value when the node is processed. This <i>string</i> value is the question exactly as it appeared
			to the subject - in the selected language, and with the appropriate substitutions.</td>
	</tr>

</tbody></table>
<p></p>

<p><a name="answerGiven"></a><b><i>answerGiven</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>

		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>
		<td width="7%"><b>no</b></td>

		<td width="6%"><b>no</b></td>
		<td width="87%">Dialogix sets this value when the node is processed. This <i>string</i> value is the data entered by the subject.</td>
	</tr>

</tbody></table>
<p></p>

<p><a name="defaultAnswer"></a><b><i>defaultAnswer</i></b> 

</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>

		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">If this value is present when the instrument is first loaded, it is stored as the default value for the node. 
			However, if the "startFresh" option is pressed, this value is not re-loaded.  You would need to re-load
			the instrument to reset </td>
	</tr>

</tbody></table>
<p></p>

<p><a name="comment"></a><b><i>comment</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>

	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">Dialogix sets this value when the node is processed. This <i>string</i> value is the optional comment entered by
			the interviewee via the Comment popup.</td>
	</tr>

</tbody></table>
<p></p>

<p><a name="timeStamp"></a><b><i>timeStamp</i></b> 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="7%">Required?</td>
		<td width="6%">Unique?</td>
		<td width="87%">Syntax</td>

	</tr>
	<tr>
		<td width="7%"><b>no</b></td>
		<td width="6%"><b>no</b></td>
		<td width="87%">Dialogix sets this value when the node is processed. This numbeical value is the number of milliseconds since 1/1/1970</td>
	</tr>
</tbody></table>

<p></p>

<p><b><i>dataType</i></b></p>

<p><a name="ReservedVariableName"></a><b><i>ReservedVariableName</i></b></p>
<p>All ReservedVariableNames are in upper case, and begin and end with two underscores ('__') 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="30%"><b>reservedVariableName</b></td>
		<td width="9%"><b>Syntax</b></td>

		<td width="61%"><b>meaning</b></td>

	</tr>
	<tr>
		<td width="30%">__ACTIVE_BUTTON_PREFIX__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">the prefix of the string that wraps a button when the button is active (e.g. &lt;&lt;)</td>

	</tr>
	<tr>

		<td width="30%">__ACTIVE_BUTTON_SUFFIX__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">the prefix of the string that wraps a button when the button is active (e.g. &gt;&gt;)</td>
	</tr>

	<tr>
		<td width="30%">__ALLOW_COMMENTS__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the comment icon is available</td>
	</tr>
	<tr>
		<td width="30%">__ALLOW_DONT_UNDERSTAND__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the icon for *HUH* is available</td>

	</tr>
	<tr>
		<td width="30%">__ALLOW_JUMP_TO__</td>
		<td width="9%"><i>true|false</i></td>

		<td width="61%">if true, then the jump_to button is available, even in non-Developer mode</td>
	</tr>
	<tr>

		<td width="30%">__ALLOW_LANGUAGE_SWITCHING__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then allows switching among languages</td>

	</tr>
	<tr>
		<td width="30%">__ALLOW_REFUSED__</td>
		<td width="9%"><i>true|false</i></td>

		<td width="61%">if true, then the icon for *REFUSED* is available</td>
	</tr>
	<tr>

		<td width="30%">__ALLOW_UNKNOWN__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the icon for *UNKNOWN* is available</td>
	</tr>

	<tr>
		<td width="30%">__ALWAYS_SHOW_ADMIN_ICONS__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the administrator icons (comment, refused, etc.) are always visible</td>
	</tr>
	<tr>
		<td width="30%">__ANSWER_OPTION_FIELD_WIDTH__</td>

		<td width="9%"><i>number</i></td>

		<td width="61%">the default width of text and menu boxes</td>
	</tr>
	<tr>
		<td width="30%">__AUTOGEN_OPTION_NUM__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then lists of of options (combo, list) will use sequential numbers (starting from 1), as their accelerator
			keys. If false, then the internal values associated with the displayed choices will be used as the accelerator
			keys</td>

	</tr>
	<tr>
		<td width="30%">__BROWSER_TYPE__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">[this is writtent to the data file the first time an instrument is loaded]</td>
	</tr>
	<tr>

		<td width="30%">__COMMENT_ICON_OFF__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the icon to use to indicate that there is <i>no</i> comment</td>
	</tr>
	<tr>

		<td width="30%">__COMMENT_ICON_ON__</td>

		<td width="9%"><i>filename</i></td>
		<td width="61%">the icon to use to indicate that there <i>is</i> a comment</td>
	</tr>
	<tr>

		<td width="30%">__COMPLETED_DIR__</td>
		<td width="9%"><i>dir</i></td>

		<td width="61%">[this is set internally by Dialogix]</td>
	</tr>
	<tr>
		<td width="30%">__CONNECTION_TYPE__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">HTTP or HTTPS</td>
	</tr>

	<tr>
		<td width="30%">__CURRENT_LANGUAGE__</td>
		<td width="9%"><i>string</i></td>

		<td width="61%">the language abbreviation</td>
	</tr>
	<tr>
		<td width="30%">__DEBUG_MODE__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then display the debugging information</td>

	</tr>
	<tr>
		<td width="30%">__DEVELOPER_MODE__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then display the developer mode information and buttons</td>

	</tr>
	<tr>

		<td width="30%">__DISPLAY_COUNT__</td>
		<td width="9%"><i>number</i></td>
		<td width="61%">[this is set internally by Dialogix - it reflects the number of screens the subject has seen]</td>
	</tr>
	<tr>

		<td width="30%">__DISALLOW_COMMENTS__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the comment icons are never visible, even if the other administrator icons are visible</td>
	</tr>
	<tr>
		<td width="30%">__DONT_UNDERSTAND_ICON_OFF__</td>
		<td width="9%"><i>filename</i></td>

		<td width="61%">the icon to use to indicate that the subject did understand the question</td>
	</tr>
	<tr>
		<td width="30%">__DONT_UNDERSTAND_ICON_ON__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the icon to use to show that the subject <i>did not</i> understand the question</td>

	</tr>
	<tr>
		<td width="30%">__FILENAME__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the name of the <b><i><a href="#DataFile">dataFile</a></i></b> to be saved in the <b><i><a href="#workingDir">workingDirectory</a></i></b></td>

	</tr>
	<tr>
		<td width="30%">__FLOPPY_DIR__</td>
		<td width="9%"><i>dir</i></td>
		<td width="61%">the directory of an secondary drive to which the completed datafiles are written. Alternatively, this can be a
			shared server drive, or nothing.</td>
	</tr>
	<tr>

		<td width="30%">__HEADER_MSG__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">the message to be displayed to the right of the __ICON__</td>
	</tr>
	<tr>
		<td width="30%">__HELP_ICON__</td>

		<td width="9%"><i>URL</i></td>

		<td width="61%">the filename for the help icon</td>
	</tr>
	<tr>
		<td width="30%">__ICON__</td>
		<td width="9%"><i>URL</i></td>

		<td width="61%">the filename for the logo icon</td>
	</tr>

	<tr>
		<td width="30%">__IMAGE_FILES_DIR__</td>
		<td width="9%"><i>dir</i></td>
		<td width="61%">[this is set internally by Dialogix. It is the directory for the icons (so that don't need full path name)]</td>

	</tr>
	<tr>
		<td width="30%">__IP_ADDRESS__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">[this is written to the data file the when the instrument is first loaded]</td>
	</tr>
	<tr>

		<td width="30%">__JUMP_TO_FIRST_UNASKED__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the jump-to-first-unasked button is always available</td>

	</tr>
	<tr>
		<td width="30%"><a name="__LANGUAGES__"></a>__LANGUAGES__</td>

		<td width="9%"><i>string|string|...</i></td>
		<td width="61%">a list of language names, separated by the pipe ('|') character. For example <b>en_US|es_PR</b></td>
	</tr>
	<tr>

		<td width="30%">__LOADED_FROM__</td>
		<td width="9%"><i>filename</i></td>

		<td width="61%">the location of the schedule file</td>
	</tr>
	<tr>
		<td width="30%">__PASSWORD_FOR_ADMIN_MODE__</td>
		<td width="9%"><i>string</i></td>

		<td width="61%">an optional password to enable access to the Developer mode</td>

	</tr>
	<tr>
		<td width="30%">__REFUSED_ICON_OFF__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the icon to use to indicate that the subject did not refuse to answer the question</td>
	</tr>

	<tr>

		<td width="30%">__REFUSED_ICON_ON__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the icon to use to indicate that the subject <i>did</i> refuse to answer the question</td>
	</tr>
	<tr>

		<td width="30%">__RECORD_EVENTS__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if false, then events are not recorded.  Defaults to <i>true</i></td>
	</tr>
	<tr>
		<td width="30%">__REDIRECT_ON_FINISH_MSG__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">If not empty, users will see this string after completing an interview to indicate that they will be re-directed
			to another site</td>
	</tr>
	<tr>
		<td width="30%">__REDIRECT_ON_FINISH_URL__</td>
		<td width="9%"><i>URL</i></td>

		<td width="61%">If not empty, users will be re-directed to this site 5 seconds after completing an interview</td>

	</tr>
	<tr>
		<td width="30%">__SCHED_AUTHORS__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">an optional string to indicate who authored the schedule - a way to give appropriate credit the those who originally
			created the instrument, and/or who transcribed it into Dialogix form</td>

	</tr>
	<tr>

		<td width="30%">__SCHED_HELP_URL__</td>
		<td width="9%"><i>URL</i></td>
		<td width="61%">an optional URL for the main help for the instrument</td>
	</tr>
	<tr>

		<td width="30%">__SCHED_VERSION_MAJOR__</td>
		<td width="9%"><i>string</i></td>

		<td width="61%">a way to track the revisions in the schedule</td>
	</tr>
	<tr>
		<td width="30%">__SCHED_VERSION_MINOR__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">a way to track the revisions in the schedule</td>
	</tr>

	<tr>
		<td width="30%">__SCHEDULE_DIR__</td>
		<td width="9%"><i>filename</i></td>

		<td width="61%">[this is set internally by Dialogix - it is the directory of where all of the schedules are located]</td>
	</tr>
	<tr>
		<td width="30%">__SCHEDULE_SOURCE__</td>

		<td width="9%"><i>filename</i></td>
		<td width="61%">the name of the schedule file</td>

	</tr>
	<tr>
		<td width="30%">__SET_DEFAULT_FOCUS__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the focus will automatically be set to the first data entry element or button.  If there will be
			many lengthly instructions screens, this can be set to false so that the browser does not scroll to the "next"

			button at the bottom  of the screen.</td>

	</tr>
	<tr>
		<td width="30%">__SHOW_ADMIN_ICONS__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, the pressing the admin icon allows admin mode to be entered</td>
	</tr>

	<tr>

		<td width="30%">__SHOW_QUESTION_REF__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the value for <b><i><a href="#externalName">externalName</a></i></b> will be shown as the first column
			of the table of questions asked.</td>
	</tr>
	<tr>

		<td width="30%">__SHOW_SAVE_TO_FLOPPY_IN_ADMIN_MODE__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the "save-to-floppy" button will be visible in admin mode</td>
	</tr>
	<tr>
		<td width="30%">__START_TIME__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">the time that the interview was started, in milliseconds since Jan 1, 1900</td>
	</tr>
	<tr>
		<td width="30%">__STARTING_STEP__</td>
		<td width="9%"><i>number</i></td>

		<td width="61%">the index of the first node (after the reserved variables and comments)</td>

	</tr>
	<tr>
		<td width="30%">__SUSPEND_TO_FLOPPY__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the "save-to-floppy" button will be visible all the time</td>

	</tr>

	<tr>
		<td width="30%">__SWAP_NEXT_AND_PREVIOUS__</td>
		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, the then "next" button will be to the right of the "previous" button</td>

	</tr>
	<tr>
		<td width="30%">__TITLE__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">the message to display on the web-browser title bar</td>
	</tr>
	<tr>

		<td width="30%">__TITLE_FOR_PICKLIST_WHEN_IN_PROGRESS__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">the descriptive name that will appear in the dropdown combobox on the splash screen for those files currently in
			the <b><i><a href="#workingDir">workingDirectory</a></i></b>. Files in the <b><i><a href="#scheduleSrcDir">scheduleSrcDir</a></i></b>
			are descriptively shown by their Title, and the available language options (if more than one)</td>
	</tr>

	<tr>
		<td width="30%">__TRICEPS_FILE_TYPE__</td>
		<td width="9%"><i>string</i></td>
		<td width="61%">either SCHEDULE or DATA</td>
	</tr>
	<tr>
		<td width="30%">__TRICEPS_VERSION_MAJOR__</td>

		<td width="9%"><i>string</i></td>
		<td width="61%">to track revisions of Dialogix - e.g. 2.8</td>
	</tr>
	<tr>
		<td width="30%">__TRICEPS_VERSION_MINOR__</td>
		<td width="9%"><i>string</i></td>

		<td width="61%">to track the revisions of Dialogix - e.g. 1</td>

	</tr>
	<tr>
		<td width="30%">__UNKNOWN_ICON_OFF__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the name of the icon to show when the subject does know the answer</td>

	</tr>
	<tr>

		<td width="30%">__UNKNOWN_ICON_ON__</td>
		<td width="9%"><i>filename</i></td>
		<td width="61%">the name of the icon to show when the subject does not know the answer</td>
	</tr>
	<tr>

		<td width="30%">__WORKING_DIR__</td>
		<td width="9%"><i>filename</i></td>

		<td width="61%">[this is set internally by Dialogix - it is the directory where temporary data files are stored]</td>
	</tr>
	<tr>
		<td width="30%">__WRAP_ADMIN_ICONS__</td>

		<td width="9%"><i>true|false</i></td>
		<td width="61%">if true, then the admin icons that appear to the right of a question will be word-wrapped.  This is helpful when
			the icons are large and textual.</td>
	</tr>

</tbody></table>
<p></p>
<p><a name="InitializationVariables"></a><b><i>InitializationVariables</i></b></p>

<p>These variables are set once when Dialogix loads. They are not available for change by the user. 
</p><table border="1" cellpadding="0" cellspacing="0">
	<tbody><tr>

		<td width="30%">InitializationVariables</td>
		<td width="21%">Syntax</td>
		<td width="49%">meaning</td>

	</tr>
	<tr>
		<td width="30%"><b>dialogix.dir</b></td>

		<td width="21%">directory</td>
		<td width="49%">canonical directory that acts as prefix for relative directories listed below</td>
	</tr>
	<tr>

		<td width="30%"><a name="scheduleSrcDir"></a><b>scheduleSrcDir</b></td>
		<td width="21%">URL or filename prefix</td>

		<td width="49%">canonical or relative directory where instrument files are located</td>
	</tr>
	<tr>
		<td width="30%"><a name="workingDir"></a><b>workingDir</b></td>
		<td width="21%">directory</td>

		<td width="49%">canonical or relative directory where working files are to be stored</td>

	</tr>
	<tr>
		<td width="30%"><a name="completedDir"></a><b>completedDir</b></td>
		<td width="21%">directory</td>
		<td width="49%">canonical or relative directory where completed files are stored.</td>
	</tr>

	<tr>

		<td width="30%"><a name="floppyDir"></a><b>floppyDir</b></td>
		<td width="21%">directory</td>
		<td width="49%">another directory where completed files are stored</td>
	</tr>
	<tr>
		<td width="30%"><a name="imageFilesDir"></a><b>imageFilesDir</b></td>

		<td width="21%">URL or directory</td>
		<td width="49%">prefix of image and ICON files</td>
	</tr>
	<tr>
		<td width="30%"><a name="helpIcon"></a><b>helpIcon</b></td>
		<td width="21%">filename</td>
		<td width="49%">name of the help icon</td>

	</tr>
	<tr>
		<td width="30%"><a name="logoIcon"></a><b>logoIcon</b></td>
		<td width="21%">filename</td>
		<td width="49%">name of default logo icon</td>
	</tr>
	<tr>

		<td width="30%"><a name="helpURL1"></a><b>helpURL</b></td>
		<td width="21%">URL</td>
		<td width="49%">name of default help URL</td>
	</tr>
	<tr>
		<td width="30%"><b>displayWorking</b></td>

		<td width="21%"><i>true|false</i></td>

		<td width="49%">whether the RESTORE option is visible.  Normally this is disabled in the web-server version; but there are rare
			cases where this should be visible</td>
	</tr>
</tbody></table>
<p></p>

<p><a name="Equation"></a><b><font size="4">Equation Syntax</font></b></p>
<p><a name="Variable%20Names"></a><b>Variable Names</b></p>
<p>Valid names must conform to the XML NMTOKEN specification. Briefly, names can be any combination of letters,
digits, and underscores ('_'), periods ('.'), hyphens ('-'), and colons (':'), so long as the first character is
either a letter or underscore.<b> </b>This restriction ensures portability to XML and into relational databases.</p>

<p><b>Weak DataTyping</b></p>

<p>Dialogix tries to treat values as generically as possible. Variables can always be treated as <i>strings</i>.
They can also be treated as a <i>number</i>s if they can be successfully parsed as a <i>number</i>. Their Boolean
value is <i>true</i> if they are <i>numbers</i> with a non-zero value, otherwise the Boolean value is <i>false</i>

(e.g. if they are not <i>numbers</i>, if they have a numerical value of 0, or if they are one of the special datatypes).
Variables can also be treated as <i>date</i> or <i>time</i> values, but only if explicitly declared as such (otherwise
there is no way for Dialogix to guess whether a value of 10 is supposed to be a year, month, day, hour, etc.).</p>

<p><b>Operators</b></p>

<p>The following operators are available, and use the following precedence (top to bottom): 
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">

	<tbody><tr>

		<td width="33%">Name</td>
		<td width="25%">Syntax</td>
		<td width="42%">meaning</td>
	</tr>
	<tr>
		<td width="33%">negation <br>

			boolean not</td>

		<td width="25%">-X <br>
			!X</td>
		<td width="42%">negative X (<i><a href="#INVALID">invalid</a></i> for <i>strings</i>) <br>

			not X - the boolean</td>

	</tr>
	<tr>
		<td width="33%">multiply <br>
			divide <br>
			string concatenate</td>

		<td width="25%">X * Y <br>
			X / Y <br>

			X . Y</td>
		<td width="42%">X times Y (<i><a href="#INVALID">invalid</a></i> for <i>strings</i>) <br>

			X divided by Y (<i><a href="#INVALID">invalid</a></i> for <i>strings</i>) <br>

			Y appended string-wise to X (e.g. 5 . 6 = 56)</td>
	</tr>
	<tr>
		<td width="33%">add <br>

			subtract</td>
		<td width="25%">X + Y <br>
			X - Y</td>

		<td width="42%">X plus Y (<i><a href="#INVALID">invalid</a></i> for <i>strings</i>) <br>

			X minus Y (<i><a href="#INVALID">invalid</a></i> for <i>strings</i>)</td>
	</tr>

	<tr>
		<td width="33%">greater than <br>
			greater than or equal to <br>

			less than <br>
			less than or equal to</td>
		<td width="25%">X &gt; Y <br>

			X &gt;= Y <br>
			X &lt; Y <br>

			X &lt;= Y</td>
		<td width="42%">is X greater than Y? <br>
			is X greater than or equal to Y? <br>

			is X less than Y? <br>
			is X less than or equal to Y?</td>

	</tr>
	<tr>
		<td width="33%">equality <br>
			inequality</td>
		<td width="25%">X == Y <br>

			X != Y</td>

		<td width="42%">does X equal Y? <br>
			does X not equal Y?</td>
	</tr>
	<tr>
		<td width="33%">binary AND</td>
		<td width="25%">X &amp; Y</td>

		<td width="42%">&nbsp;</td>
	</tr>
	<tr>
		<td width="33%">binary inclusive OR</td>
		<td width="25%">X | Y</td>
		<td width="42%">&nbsp;</td>
	</tr>

	<tr>

		<td width="33%">binary exclusive OR</td>
		<td width="25%">X ^ Y</td>
		<td width="42%">&nbsp;</td>
	</tr>
	<tr>
		<td width="33%">logical AND</td>

		<td width="25%">X &amp;&amp; Y</td>

		<td width="42%">&nbsp;</td>
	</tr>
	<tr>
		<td width="33%">logical OR</td>
		<td width="25%">X || Y</td>

		<td width="42%">&nbsp;</td>
	</tr>
	<tr>

		<td width="33%">conditional</td>
		<td width="25%">(X) ? T : F</td>
		<td width="42%">if X is true, then select T, else select F</td>
	</tr>

	<tr>
		<td width="33%">assignment</td>
		<td width="25%">X = Y</td>

		<td width="42%">assign the value of Y to the variable X</td>
	</tr>
	<tr>
		<td width="33%">equation separators</td>

		<td width="25%">E1, E2 <br>
			E1; E2</td>
		<td width="42%">first evaluate equation E1, then evaluate equation E2</td>

	</tr>
</tbody></table>
<p></p>
<p><a name="Functions"></a><b>Functions</b></p>
<p>

</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="15%"><b>Name</b></td>
		<td width="15%"><b>Syntax</b></td>
		<td width="60%"><b>Description</b></td>

	</tr>
	<tr>

		<td width="15%">abs</td>
		<td width="15%">abs(X)</td>
		<td width="60%">returns the absolute value of X</td>
	</tr>
	<tr>

		<td width="15%">acos</td>

		<td width="15%">acos(X)</td>
		<td width="60%">returns the arc cosine of X</td>
	</tr>
	<tr>
		<td width="15%">asin</td>
		<td width="15%">asin(X)</td>

		<td width="60%">returns the arc sine of X</td>
	</tr>
	<tr>
		<td width="15%">atan</td>
		<td width="15%">atan(X)</td>
		<td width="60%">returns the arc tangent of X</td>
	</tr>

	<tr>
		<td width="15%">atan2</td>
		<td width="15%">atan2(X,Y)</td>
		<td width="60%">returns the arc tangent of (X,Y)</td>
	</tr>
	<tr>
		<td width="15%">ceil</td>

		<td width="15%">ceil(X)</td>
		<td width="60%">returns the ceiling of X (round number to next larger integer)</td>
	</tr>
	<tr>
		<td width="15%">charAt</td>
		<td width="15%">charAt(X,Y)</td>

		<td width="60%">returns the character at the Yth position in string X, where the first position is 0</td>

	</tr>
	<tr>
		<td width="15%">compareTo</td>
		<td width="15%">compareTo(X,Y)</td>
		<td width="60%">lexically compares two strings. If they are equal, returns 0. If X is less than Y, returns -1. If X is greater
			than Y, returns 1</td>

	</tr>
	<tr>

		<td width="15%">compareToIgnoreCase</td>
		<td width="15%">compareToIgnoreCase(X,Y)</td>
		<td width="60%">like compareTo(), but ignores case</td>
	</tr>
	<tr>

		<td width="15%">cos</td>
		<td width="15%">cos(X)</td>

		<td width="60%">returns the cosine of X</td>
	</tr>
	<tr>
		<td width="15%">count</td>

		<td width="15%">count(X,...)</td>
		<td width="60%">the number of positive values</td>
	</tr>

	<tr>
		<td width="15%">createTempFile</td>
		<td width="15%">createTempFile()</td>

		<td width="60%">returns a new tempory, but unique, filename</td>
	</tr>
	<tr>
		<td width="15%">desc</td>

		<td width="15%">desc(X)</td>
		<td width="60%">the language-specific <a href="#readback">readback</a> string for a node.</td>

	</tr>
	<tr>
		<td width="15%">e</td>
		<td width="15%">e()</td>

		<td width="60%">returns the value <i>e</i></td>
	</tr>

	<tr>
		<td width="15%">endsWith</td>
		<td width="15%">endsWith(X,Y)</td>
		<td width="60%">returns true if string X ends with string Y</td>

	</tr>
	<tr>
		<td width="15%">eraseData</td>

		<td width="15%">eraseData()</td>
		<td width="60%">reset all of the data to *unasked*</td>
	</tr>
	<tr>

		<td width="15%">exec</td>
		<td width="15%">exec(X)</td>

		<td width="60%">runs the external function X -- this does not currently work properly on all platorms</td>
	</tr>
	<tr>
		<td width="15%">exp</td>
		<td width="15%">exp(X)</td>

		<td width="60%">return the value of exp(X)</td>

	</tr>
	<tr>
		<td width="15%">fileExists</td>
		<td width="15%">fileExists(X)</td>
		<td width="60%">returns true of the file X exists.  Canonical names can be used by adding `__WORKING_DIR__` or other prefixes</td>
	</tr>

	<tr>

		<td width="15%">floor</td>
		<td width="15%">floor(X)</td>
		<td width="60%">returns the floor of X (round number to next smaller integer)</td>
	</tr>
	<tr>
		<td width="15%">formatDate</td>

		<td width="15%">formatDate(X,PAT)</td>
		<td width="60%">return the string value of date X formatted according to Java data format pattern PAT</td>
	</tr>
	<tr>
		<td width="15%">formatNumber</td>
		<td width="15%">formatNumber(X,PAT)</td>
		<td width="60%">return the string value of number X formatted according to Java number format pattern PAT</td>

	</tr>
	<tr>
		<td width="15%">getActionText</td>
		<td width="15%">getActionText(X)</td>
		<td width="60%">return the actionText for node named X -- this lets one access the text of a previously asked question (e.g. for
			generating a report)</td>
	</tr>
	<tr>

		<td width="15%">getAnsOption</td>
		<td width="15%">getAnsOption(X)<br>
			getAnsOption(X,Y)</td>
		<td width="60%">returns the text corresponding to the selected option for node X<br>
			returns the text corresponding to the option at index Y of node X</td>
	</tr>

	<tr>
		<td width="15%">getComment</td>
		<td width="15%">getComment(X)</td>
		<td width="60%">returns the comment for node X</td>
	</tr>
	<tr>
		<td width="15%">getConcept</td>

		<td width="15%">getConcept(X)</td>
		<td width="60%">returns the concept field for node X</td>
	</tr>
	<tr>
		<td width="15%">getDependencies</td>
		<td width="15%">getDependencies(X)</td>

		<td width="60%">returns the relevance field for node X (this field was formerly called "dependencies")</td>

	</tr>
	<tr>
		<td width="15%">getExternalName</td>
		<td width="15%">getExternalName(X)</td>
		<td width="60%">returns the external name field for node X -- this is usually the display name</td>

	</tr>
	<tr>

		<td width="15%">getLocalName</td>
		<td width="15%">getLocalName(X)</td>
		<td width="60%">returns the internal, unique, variable name for node X</td>
	</tr>
	<tr>

		<td width="15%">getNow</td>
		<td width="15%">getNow()</td>

		<td width="60%">returns the date corresponding to the current system time (if the computer clock is accurate)</td>
	</tr>
	<tr>
		<td width="15%">getStartTime</td>

		<td width="15%">getStartTime()</td>
		<td width="60%">returns the date corresponding to the system time when the interview was started</td>
	</tr>

	<tr>
		<td width="15%">getType</td>
		<td width="15%">getType(X)</td>

		<td width="60%">returns the string name of the datatype - e.g. *NA* if isNA()</td>
	</tr>
	<tr>
		<td width="15%">gotoFirst</td>

		<td width="15%">gotoFirst()</td>
		<td width="60%">jumps to the first node in the instrument -- this violates the normal flow of the system</td>

	</tr>
	<tr>
		<td width="15%">gotoNext</td>
		<td width="15%">gotoNext()</td>
		<td width="60%">jumps to the next set of relevant nodes in the instrument -- this violates the normal flow of the system</td>

	</tr>
	<tr>

		<td width="15%">gotoPrevious</td>
		<td width="15%">gotoPrevious()</td>
		<td width="60%">jumps to the previous set of relevant nodes to the instrumetn -- this violates the normal flow of the system</td>
	</tr>
	<tr>

		<td width="15%">hasComment</td>

		<td width="15%">hasComment(X)</td>
		<td width="60%">returns true is node X has a comment</td>
	</tr>
	<tr>
		<td width="15%">indexOf</td>
		<td width="15%">indexOf(X,Y)</td>

		<td width="60%">the first index (base 0) of string Y in string X. Returns -1 if Y is not contained within X</td>
	</tr>
	<tr>
		<td width="15%">isAnswered</td>
		<td width="15%">isAnswered(X)</td>
		<td width="60%">returns true if the answer is neither (*UNASKED* nor *INVALID*), and the is not empty if the answer is of type
			STRING</td>
	</tr>

	<tr>
		<td width="15%">isAsked</td>
		<td width="15%">isAsked(X)</td>
		<td width="60%">returns true if the answer is neiter *NA*, *INVALID*, nor *UNASKED*</td>
	</tr>
	<tr>
		<td width="15%">isDate</td>

		<td width="15%">isDate(X)</td>
		<td width="60%">returns true if the answer happens to be a valid date</td>
	</tr>
	<tr>
		<td width="15%">isInvalid</td>
		<td width="15%">isInvalid(X)</td>

		<td width="60%">returns true if the answer is of type *INVALID*</td>

	</tr>
	<tr>
		<td width="15%">isNA</td>
		<td width="15%">isNA(X)</td>
		<td width="60%">returns true if the answer is of type *NA*</td>

	</tr>
	<tr>

		<td width="15%">isNotUnderstood</td>
		<td width="15%">isNotUnderstood(X)</td>
		<td width="60%">returns true if the answer if of type *HUH*</td>
	</tr>
	<tr>

		<td width="15%">isNumber</td>
		<td width="15%">isNumber(X)</td>

		<td width="60%">returns true if the answer is a valid number</td>
	</tr>
	<tr>
		<td width="15%">isRefused</td>

		<td width="15%">isRefused(X)</td>
		<td width="60%">returns true if the answer is of type *REFUSED*</td>
	</tr>

	<tr>
		<td width="15%">isSpecial</td>
		<td width="15%">isSpecial(X)</td>

		<td width="60%">returns true if the answer is of type *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN*, or *HUH*</td>
	</tr>
	<tr>
		<td width="15%">isUnknown</td>

		<td width="15%">isUnknown(X)</td>
		<td width="60%">returns true if the answer is of type *UNKNOWN*</td>

	</tr>
	<tr>
		<td width="15%">jumpTo</td>
		<td width="15%">jumpTo(X)</td>
		<td width="60%">jump to a named node -- this violates the normal flow of the system</td>

	</tr>
	<tr>

		<td width="15%">jumpToFirstUnasked</td>
		<td width="15%">jumpToFirstUnasked()</td>
		<td width="60%">jump to the first unasked question -- thus bypassing previous answered questions -- this violates the norma flow
			of the system</td>
	</tr>
	<tr>

		<td width="15%">lastIndexOf</td>

		<td width="15%">lastIndexOf(X,Y)</td>
		<td width="60%">returns the last index (base 0) of string Y in string X. Returns -1 if Y is not contained within X</td>
	</tr>
	<tr>
		<td width="15%">length</td>
		<td width="15%">length(X)</td>

		<td width="60%">returns the number of characters in string X</td>
	</tr>
	<tr>
		<td width="15%">list</td>
		<td width="15%">list(X,...)</td>
		<td width="60%">a <i>string</i> containing a comma separated list of the positive values with "and" separating the last
			two</td>

	</tr>
	<tr>
		<td width="15%">log</td>
		<td width="15%">log(X)</td>
		<td width="60%">returns the natural log of X</td>
	</tr>
	<tr>

		<td width="15%">max</td>
		<td width="15%">max(X,...)</td>
		<td width="60%">returns the maxium value of the list of values passed to the function</td>
	</tr>
	<tr>
		<td width="15%">mean</td>

		<td width="15%">mean(X,...)</td>

		<td width="60%">returns the mean of a list of values</td>
	</tr>
	<tr>
		<td width="15%">min</td>
		<td width="15%">min(X,...)</td>

		<td width="60%">returns the minimum value of the list of values passed to the function</td>
	</tr>

	<tr>
		<td width="15%">newDate</td>
		<td width="15%">newDate(W)<br>
			newDate(S,M)<br>

			newDate(Y,M,D)</td>
		<td width="60%">returns a date corresponding to day of the week W (1 = Sunday, 2 = Monday, ...)<br>

			returns a date corresponding to string S as parsed by date mask M<br>
			returns a date corresponding to year Y, month M, and day D</td>
	</tr>
	<tr>

		<td width="15%">newTime</td>
		<td width="15%">newTime(S,M)<br>
			newTime(H,M,S)</td>

		<td width="60%">returns a date/time corresponding to string S as parsed by time mask M<br>
			returns a date/time corresponding to hour H, minutes M, and seconds S</td>
	</tr>

	<tr>
		<td width="15%">numAnsOptions</td>
		<td width="15%">numAnsOptions(X)</td>
		<td width="60%">returns the number of answer options that node X has</td>

	</tr>
	<tr>
		<td width="15%">orlist</td>

		<td width="15%">orlist(X,...)</td>
		<td width="60%">a <i>string</i> containing a comma separated list of the positive values, with "or" separting the last
			two</td>

	</tr>
	<tr>

		<td width="15%">parseDate</td>
		<td width="15%">parseDate(X,PAT)</td>
		<td width="60%">returns the date value of string X parsed with Java date format pattern PAT</td>
	</tr>
	<tr>

		<td width="15%">parseNumber</td>

		<td width="15%">parseNumber(X,PAT)</td>
		<td width="60%">returns the numerical value of string X parsed with Java number format pattern PAT</td>
	</tr>
	<tr>
		<td width="15%">pi</td>
		<td width="15%">pi()</td>

		<td width="60%">returns the value of <i>pi</i></td>
	</tr>
	<tr>
		<td width="15%">pow</td>
		<td width="15%">pow(X,Y)</td>
		<td width="60%">returns the value of X raised to the power of Y</td>

	</tr>
	<tr>
		<td width="15%">random</td>
		<td width="15%">random()</td>
		<td width="60%">returns a random number -- the value is seeded based upon the starting time of the instrument</td>
	</tr>
	<tr>

		<td width="15%">regexMatch</td>
		<td width="15%">regexMatch(X,Y)</td>
		<td width="60%">returns Boolean of whether string X matches the regular expression pattern Y</td>
	</tr>
	<tr>
		<td width="15%">round</td>

		<td width="15%">round(X)</td>

		<td width="60%">returns the value of X rounded to the nearest whole integer</td>
	</tr>
	<tr>
		<td width="15%">saveData</td>
		<td width="15%">saveData(X)</td>

		<td width="60%">saves all of the current Dialogix data for an instance to the file X, returning true if successful.  One commonly
			uses a temp file for this.  The two column, tab delimited file format has the variable name in the first column
			and the value in the second.  This does not work on all platforms.</td>
	</tr>

	<tr>
		<td width="15%">sin</td>
		<td width="15%">sin(X)</td>
		<td width="60%">returns the sine of X</td>

	</tr>
	<tr>
		<td width="15%">sqrt</td>

		<td width="15%">sqrt(X)</td>
		<td width="60%">returns the square root of X</td>
	</tr>
	<tr>

		<td width="15%">startsWith</td>
		<td width="15%">startsWith(X,Y)</td>
		<td width="60%">returns true if the string X starts with string Y</td>

	</tr>
	<tr>
		<td width="15%">stddev</td>

		<td width="15%">stddev(X,...)</td>
		<td width="60%">returns the standard deviation of a list of values</td>
	</tr>
	<tr>

		<td width="15%">substring</td>
		<td width="15%">substring(X,Y,Z)</td>

		<td width="60%">returns the part of string X that lies between indices Y and Z</td>
	</tr>
	<tr>
		<td width="15%">suspendToFloppy</td>
		<td width="15%">suspendToFloppy()</td>

		<td width="60%">saves the data and events files, as a jar file, to the floppy directory -- this is often used for archiving of
			intermediate files</td>

	</tr>
	<tr>
		<td width="15%">tan</td>
		<td width="15%">tan(X)</td>
		<td width="60%">returns the tangent of X</td>
	</tr>

	<tr>

		<td width="15%">toDate</td>
		<td width="15%">toDate(X)</td>
		<td width="60%">returns the answer for node X, as a date if possible, otherwise returns *INVALID*</td>
	</tr>
	<tr>
		<td width="15%">toDay</td>

		<td width="15%">toDay(X)</td>
		<td width="60%">returns the day components of X if possible, otherwise returns *INVALID*</td>
	</tr>
	<tr>
		<td width="15%">toDayNum</td>
		<td width="15%">toDayNum(X)</td>
		<td width="60%">returns the day number components of X (day of the year) if possible, otherwise returns *INVALID*</td>

	</tr>
	<tr>
		<td width="15%">toHour</td>
		<td width="15%">toHour(X)</td>
		<td width="60%">returns the hour component of X</td>
	</tr>
	<tr>

		<td width="15%">toLowerCase</td>
		<td width="15%">toLowerCase(X)</td>
		<td width="60%">returns string X as lowercase</td>
	</tr>
	<tr>
		<td width="15%">toMinute</td>

		<td width="15%">toMinute(X)</td>

		<td width="60%">returns the minute component of X if possible, otherwise returns *INVALID*</td>
	</tr>
	<tr>
		<td width="15%">toMonth</td>
		<td width="15%">toMonth(X)</td>

		<td width="60%">returns the month component of X if possible, otherwise returns *INVALID*</td>
	</tr>

	<tr>
		<td width="15%">toMonthNum</td>
		<td width="15%">toMonthNum(X)</td>
		<td width="60%">returns the month number (1-12) component of X if possible, otherwise returns *INVALID*</td>

	</tr>
	<tr>
		<td width="15%">toSecond</td>

		<td width="15%">toSecond(X)</td>
		<td width="60%">returns the seconds component of X if possible, otherwise returns *INVALID*</td>
	</tr>
	<tr>

		<td width="15%">toTime</td>
		<td width="15%">toTime(X)</td>
		<td width="60%">returns X as a time value (hh:mm:ss) if possible, otherwise returns *INVALID*</td>

	</tr>
	<tr>
		<td width="15%">toUpperCase</td>

		<td width="15%">toUppercase(X)</td>
		<td width="60%">returns string X as uppercase</td>
	</tr>
	<tr>

		<td width="15%">toWeekday</td>
		<td width="15%">toWeekday(X)</td>

		<td width="60%">returns the weekday component of X if possible (e.g. 'Monday'), otherwise returns *INVALID*</td>
	</tr>
	<tr>
		<td width="15%">toYear</td>
		<td width="15%">toYear(X)</td>

		<td width="60%">returns the year component of X if possible, otherwise returns *INVALID*</td>

	</tr>
	<tr>
		<td width="15%">todegrees</td>
		<td width="15%">todegrees(X)</td>
		<td width="60%">converts from radians to degrees</td>
	</tr>

	<tr>

		<td width="15%">toradians</td>
		<td width="15%">toradians(X)</td>
		<td width="60%">converts from degrees to radians</td>
	</tr>
	<tr>
		<td width="15%">trim</td>

		<td width="15%">trim(X)</td>
		<td width="60%">removes trailing whitespace from string X</td>
	</tr>
</tbody></table>
<p></p>
<p><a name="DataFile"></a><b><font size="4">DataFile Format</font></b></p>

<p>Each time the user interacts with the interview (e.g. when a user presses the <b>Next</b> button), the <b><i><a href="#DataFile">dataFile</a></i></b> and <b><i><a href="#eventFile">eventFile</a></i></b> are updated and written
to the <b><i><a href="#workingDir">workingDirectory</a></i></b>. When the interview is completed, the finalized


<b><i><a href="#DataFile">dataFile</a></i></b> is written to both the <b><i><a href="#completedDir">completedDirectory</a></i></b>
and the <b><i><a href="#floppyDir">floppyDirectory</a></i></b> (e.g. to the floppy disk, if Dialogix is being run
on a local machine). The <b><i><a href="#DataFile">dataFile</a></i></b> is a spreadsheet with 7 columns, as indicated
below. There are two interleaved syntaxes - one for reserved words, the other for regular data. Each time new information
is collected, it is appended to the dataFile. Thus, if a node is answered multiple times, each answer will be recorded.
This makes it possible to check for changed answers.</p>

<p>For each node, the following information is collected:

</p><ul>
	<li><b><i><a href="#languageNum">languageNum</a></i></b> - indicates which of the available languages was used
	to display information and questions
	</li><li><b><i><a href="#questionAsAsked">questionAsAsked</a></i></b> - the exact question asked, in the appropriate
	language, with any substitutions appropriately inserted
	</li><li><b><i><a href="#answerGiven">answerGiven</a></i></b> - the data collected by the node - either information
	entered by the user, the internal value associated with pick-list choices, or the results of evaluations.
	</li><li><b><i><a href="#comment">comment</a></i></b> - any additional comment the user might want to make about a question
	(e.g. a reason for refusing to answer, or an answer that was not available on a pick-list)
	</li><li><b><i><a href="#timeStamp">timeStamp</a></i></b> - the date and time (to the second) at which the data for
	the node was collected (e.g. when a question was answered)


</li></ul>

<p>
</p><table border="1" cellpadding="0" cellspacing="0" width="100%">
	<tbody><tr>
		<td width="10%">&nbsp;</td>
		<td width="14%"><b><i><a href="#internalName">internalName</a></i></b></td>
		<td width="14%"><b><i><a href="#languageNum">languageNum</a></i></b></td>
		<td width="10%"><b><i><a href="#timeStamp">timeStamp</a></i></b></td>

		<td width="14%"><b><i><a href="#questionAsAsked">questionAsAsked</a></i></b></td>
		<td width="14%"><b><i><a href="#answerGiven">answerGiven</a></i></b></td>
		<td width="10%"><i><b><a href="#comment">comment</a></b></i></td>
	</tr>
	<tr>
		<td width="10%"><b>RESERVED</b></td>

		<td width="14%"><b><i><a href="#ReservedVariableName">ReservedVariableName</a></i></b></td>

		<td width="14%"><b>value</b></td>
		<td width="10%"><b><i><a href="#timeStamp">timeStamp</a></i></b></td>
		<td width="14%">&nbsp;</td>
		<td width="14%">&nbsp;</td>
		<td width="10%">&nbsp;</td>
	</tr>

</tbody></table>

</body></html>
Dialogix_UserManual_2003.htm (73,887 bytes)   
TMSWhite

TMSWhite

2012-03-21 05:57

reporter   ~18020

Fixed with Github commits https://github.com/LimeSurvey/LimeSurvey/commit/576c76883e45aa5dee4a421cb50fbbe6733d4f59 (Yii) and https://github.com/TMSWhite/LimeSurvey/commit/9d9fec37bf29d19a5cad3d38e0e093b321421a7a (1.92+)

Issue History

Date Modified Username Field Change
2011-04-11 21:17 TMSWhite New Issue
2011-04-11 21:17 TMSWhite File Added: Dialogix_UserManual_2003.htm
2011-05-07 11:58 c_schmitz Status new => acknowledged
2012-03-21 05:57 TMSWhite Note Added: 18020
2012-03-21 05:57 TMSWhite Status acknowledged => resolved
2012-03-21 05:57 TMSWhite Fixed in Version => 2.00b
2012-03-21 05:57 TMSWhite Resolution open => fixed
2012-03-21 05:57 TMSWhite Assigned To => TMSWhite
2012-06-21 13:23 c_schmitz Status resolved => closed