summaryrefslogtreecommitdiff
path: root/texmf-dist/source/latex/eq2db/eq2db.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'texmf-dist/source/latex/eq2db/eq2db.dtx')
-rw-r--r--texmf-dist/source/latex/eq2db/eq2db.dtx730
1 files changed, 730 insertions, 0 deletions
diff --git a/texmf-dist/source/latex/eq2db/eq2db.dtx b/texmf-dist/source/latex/eq2db/eq2db.dtx
new file mode 100644
index 00000000..8911e10d
--- /dev/null
+++ b/texmf-dist/source/latex/eq2db/eq2db.dtx
@@ -0,0 +1,730 @@
+% \iffalse
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Eq2DB.sty package, 2001-9-01 %%
+%% Copyright (C) 2014 D. P. Story %%
+%% dpstory@uakron.edu %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%</copyright>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{eq2db}
+%<package> [2016/01/02 v2.0 Save Exerquiz results to a Database, Email, or text file (dps)]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex]{hyperref}
+\makeatletter
+\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}}
+\makeatother
+\pdfstringdefDisableCommands{\let\\\textbackslash}%
+\EnableCrossrefs \CodelineIndex
+\let\pkg\textsf
+\let\env\texttt
+\let\opt\texttt
+\def\AEBBook{\textsl{{Acro\negthinspace\TeX} eDucation System Tools:
+ {\LaTeX} for interactive PDF documents}}
+\begin{document}
+ \GetFileInfo{eq2db.sty}
+ \title{The \texttt{eq2db} Package}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@uakron.edu}}
+ \date{processed \today}
+ \maketitle
+ \tableofcontents
+ \let\Email\texttt
+ \DocInput{eq2db.dtx}
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+% \section{Introduction}
+%
+% The \pkg{eq2db} package is meant to be used with the \pkg{exerquiz} package, one
+% of the components of the \textbf{{Acro\negthinspace\TeX} eDucation Bundle}.
+% The package is used to convert a quiz created by the \env{quiz} environment
+% of \pkg{exerquiz} to one that submits the quiz results to a server-side script.
+%
+% The package can be designed to submit PDF form data as FDF, HTML, or XML. In the latter
+% case, there are no supporting scripts; for FDF and HTML, I've written simple scripts that
+% can be used on the server-side.
+% \begin{itemize}
+% \item For FDF submittal, the FDF Toolkit is required. Server-side scripts for a Windows server are provided
+% for the \opt{eqRecord}, \opt{eqEmail}, and \opt{eqText} options. Additional details are found
+% in the \pkg{eq2db} documentation manual.
+%
+% \item For HTML submittal, I've written eight
+% server-side scripts for both Windows and Linux servers are provided.
+% The \opt{eqEmail} and \opt{eqText} options are supported. These are available from the
+% CD-ROM of my yet-to-be-submitted book, \AEBBook.
+% Refer to the \pkg{eq2db} documentation
+% manual for additional details.
+% \end{itemize}
+% Whether you submit as FDF, HTML, or XML is determined by the \opt{submitAs} option.
+%
+% \section{Package Options}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+\let\eq@optioncode\@empty
+% \end{macrocode}
+% \begin{macro}{eqRecord}
+% An option to store exerquiz data in a database, see \hyperref[eqrecord]{eqRecord}.
+% \begin{macrocode}
+\DeclareOptionX{eqRecord}{\def\eq@optioncode{\input{eqrecord.def}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{eqEmail}
+% An option to email exerquiz data to an instructor, see \hyperref[eqemail]{eqEmail}.
+% \begin{macrocode}
+\DeclareOptionX{eqEmail}{\def\eq@optioncode{\input{eqemail.def}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{eqText}
+% Save exerquiz data to a tab-delimited text field, see \hyperref[eqtext]{eqText}.
+% \begin{macrocode}
+\DeclareOptionX{eqText}{\def\eq@optioncode{\input{eqtext.def}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{taoas}
+% Private option for TAOAS
+% \begin{macrocode}
+\DeclareOptionX{taoas}{\def\eq@optioncode{\input{taoas.def}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{custom}
+% A option so developers can create their own custom set up for their own script.
+% \begin{macrocode}
+\DeclareOptionX{custom}[eq2dbcus]{\def\eq@optioncode{\input{#1.def}}}
+\def\eq@optioncode{\input{eq2dbcus.def}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{tagged}
+% The exerquiz quiz results are put into a quasi-XML format.
+% \begin{macrocode}
+\let\eqdb@YES=y \let\eqdb@NO=n
+\DeclareOptionX{tagged}{\let\eqdb@tagged\eqdb@YES}
+\let\eqdb@tagged\eqdb@NO
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{submitAs}
+% Allow user to submit as FDF, HTML, or XML. The scripts provided by this package
+% are designed FDF submittal. The other submittal types are offered for anyone wishing
+% to use this package for submitting forms to personally developed server-side scripts.
+%
+% When submitting as HTML and using the \texttt{eqText} option, the distribution does supply a
+% scripts \texttt{eqText\_html.asp} (windows) and \texttt{eqText\_html.ph}p (linux/unix).
+% \begin{macrocode}
+\define@choicekey*+{eq2db.sty}{submitAs}[\val\nr]{FDF,HTML,XML}[FDF]{%
+ \ifcase\nr\relax
+ \def\eqdb@submitType{FDF}\or
+ \def\eqdb@submitType{HTML}\or
+ \def\eqdb@submitType{XML}\else
+ \def\eqdb@submitType{FDF}\fi
+ }{\PackageWarning{eq2db}{Bad choice for submitAs,
+ permissible values are\MessageBreak FDF, HTML, and XML.\MessageBreak
+ Using the default FDF}%
+}
+\def\eqdb@submitType{FDF}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\ProcessOptionsX
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{exerquiz}
+% \end{macrocode}
+% \section{Main Code}
+% This code creates a way of hiding text fields. These fields are typically
+% used to hold data that is sent to server-side script on submission.
+%
+%\medskip\noindent
+% This is a token list to hold the list of hidden fields to be inserted into
+% the document. We also provide a command for initializing the token list.
+% \begin{macrocode}
+\newtoks\addtohidden \addtohidden={}
+% \end{macrocode}
+%\medskip\noindent
+% The macro \cs{eq@addHiddenTextFields} will be used to hold the accumulated
+% hidden fields as we add another hidden field to the token list.
+% \begin{macrocode}
+\def\eq@addHiddenTextFields{}
+% \end{macrocode}
+% \begin{macro}{\addHiddenTextField}
+% This macro adds a new hidden text field to the token list
+% \cs{addtohidden}. The command takes three parameters,
+% the first of which is optional. The command
+% \cs{hiddenTextField} actually creates the text field.
+%\paragraph*{Parameters:}
+%\begin{verbatim}
+%[#1] = parameter to modify the parameters of the text field
+% #2 = field name of the field being constructed
+% #3 = default value of the field
+%\end{verbatim}
+% \begin{macrocode}
+\renewcommand\addHiddenTextField[3][]{%
+ \addtohidden=\expandafter{\eq@addHiddenTextFields
+ \llap{\hiddenTextField[#1]{#2}{#3}}}%
+ \edef\eq@addHiddenTextFields{\the\addtohidden}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\hiddenTextField}
+%
+% This command actually creates a hidden text field \texttt{10bp} wide
+% and \texttt{10bp} high. It is used by \cs{addHiddenTextField}, but can
+% be used be the macro author as well. The command takes three parameters,
+% the first of which is optional.
+%\paragraph*{Parameters:}
+%\begin{verbatim}
+%[#1] = parameter to modify the parameters of the text field
+% #2 = field name of the field being constructed
+% #3 = default value of the field
+%\end{verbatim}
+% \begin{macrocode}
+\newcommand\hiddenTextField[3][]{\textField
+ [\DV{#3}\V{#3}\F2#1]{#2}{10bp}{10bp}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\populateHiddenField}
+% Command for populating the value of a (hidden) text field at run time. This is executed
+% by the `End Quiz' button.
+%\paragraph*{Parameters:}
+%\begin{verbatim}
+% #1 = field name of the field
+% #2 = field value. Strings need to be enclosed in double quotes
+%\end{verbatim}
+% \begin{macrocode}
+\newtoks\populatehiddenfields \populatehiddenfields={}
+\def\eq@populateHiddenFields{}
+\def\eq@initializepopulate{\gdef\eq@populateHiddenFields{}%
+ \global\populatehiddenfields={}}
+\renewcommand\populateHiddenField[2]{%
+ \populatehiddenfields=\expandafter{\eq@populateHiddenFields
+ this.getField("#1").value=#2;\jsR\jsT\jsT}%
+ \edef\eq@populateHiddenFields{\the\populatehiddenfields}%
+}
+\def\eq@clearHiddenFields{\global\let\eq@populateHiddenFields=\@empty
+ \global\let\eq@addHiddenTextFields=\@empty
+}
+% \end{macrocode}
+% \end{macro}
+% These hidden fields are created under the `End Quiz' button or link, and are populated
+% when the user clicks on `End Quiz'. The following flag, set to \texttt{n} will be set
+% to \texttt{y} when the fields are created, in this way, we can avoid creating them
+% more than once.
+% \begin{macrocode}
+\let\basicFieldsSet\eqdb@NO
+% \end{macrocode}
+% \DescribeMacro{\rtnURL} For a non-FDF submittal, after the user submits, he must return to some
+% web page. Use \cs{rtnURL} to pass the return url to the server-side script. The command
+% \cs{definePath} is defined in \textsf{eforms}. Usage:
+%\begin{verbatim}
+% \rtnURL{http://www.math.uakron.edu/~dpstory}
+%\end{verbatim}
+% \begin{macrocode}
+\providecommand{\rtnURL}{\definePath{\thisRtnURL}}
+\let\thisRtnURL\@empty
+% \end{macrocode}
+% \paragraph*{Input option code.} Now input the chosen option.
+% \begin{macrocode}
+\eq@optioncode
+% \end{macrocode}
+% \section{Tagged Responses}
+% An option for this package is \texttt{tagged}, when the document
+% author takes this option, the quiz responses are sent out in an
+% XML-like encoding.
+%
+% The JavaScript function \texttt{gatherTaggedQuizData} builds up a
+% "tagged" response string, which contains various pieces of
+% information about the quiz results.
+% \begin{macrocode}
+\ifx\eqdb@tagged\eqdb@YES
+\begin{insDLJS}[gatherTaggedQuizData]{eqtagged}%
+{Eq2db: Gather Tagged Data}
+function gatherTaggedQuizData(currQuiz,filename,nQuestions) {
+ var hasGroupedResp=false;
+ var xmlResp="";
+ var cResponses="<results id=\""+currQuiz+"\" file=\""+filename%
++"\" n=\""+nQuestions+"\">";
+ var eqCredit;
+ for ( var i=1; i <= nQuestions; i++)
+ {
+ if (typeof RightWrong[i] == "undefined") RightWrong[i]=0;
+ if (typeof Responses[i] == "undefined") { %
+Responses[i]=""; eqCredit=0; }
+ if ( typeof ProbDist[i] == "undefined" ) ProbDist[i]=0;
+ if (typeof ProbType[i] == "undefined") ProbType[i]="na";
+ else eqCredit=ProbDist[i];
+% eqCredit=(typeof ProbValue[i] == "number") ? 0 : %
+%( ProbValue[i][0]==0 )? ProbValue[i][2] : ProbDist[i];
+ hasGroupedResp=( (typeof ProbValue[i] == "object") && %
+(ProbValue[i][0]==1) );
+ cResponses += "<question n=\"" + i + "\" type=\""
+ + aPointType[i][1]+"\"";
+ cResponses += " ptype=\""+ProbType[i]+"\"";
+ switch ( aPointType[i][1] ) {
+ case "grp":
+ if ( hasGroupedResp ) {
+ var f=this.getField("grpobj."+currQuiz+"."+i);
+ var l=f.getArray().length;
+ RightWrong[i].length=l+1;
+ Responses[i].length=l+1;
+ if (hasGroupedResp)
+ cResponses += %
+" points=\""+ProbValue[i][2] + "\"";
+ else
+ cResponses += %
+" points=\""+aPointType[i][0] + "\"";
+ cResponses += " credit=\""+eqCredit + "\"";
+ xmlResp="";
+ for ( var j=1; j < RightWrong[i].length; j++) {
+ if ( typeof RightWrong[i][j] == "undefined" ) %
+RightWrong[i][j]=0;
+ xmlResp += %
+( typeof Responses[i][j] == "undefined" ) ? %
+"<grpvalue></grpvalue>" : "<grpvalue>"+Responses[i][j]+"</grpvalue>";
+ }
+ cResponses += %
+" correct=\"["+RightWrong[i].slice(1)+"]\">";
+ cResponses += "<value>"+xmlResp+"</value>";
+ } else {
+ cResponses += " points=\""+aPointType[i][0] + "\"";
+ cResponses += " credit=\""+eqCredit + "\"";
+ cResponses += " correct=\""+RightWrong[i]+"\">";
+ cResponses += "<value>"+Responses[i]+"</value>";
+ }
+ break;
+ case "ms":
+ cResponses += " points=\""+aPointType[i][0] + "\"";
+ cResponses += " credit=\""+eqCredit + "\"";
+ if ( typeof RightWrong[i][2] == "undefined" ) {
+ cResponses += " correct=\"0\">";
+ cResponses += "<value></value>";
+ } else {
+ var f=this.getField("mck."+currQuiz+"."+i);
+ var l=f.getArray().length;
+ RightWrong[i][2].length=l+1;
+ Responses[i].length=l+1;
+ RightWrong[i][2].shift();
+ cResponses += %
+" correct=\""+RightWrong[i].toSource()+"\">";
+ xmlResp="";
+ for ( var j=1; j < RightWrong[i][2].length; j++) {
+ if (typeof RightWrong[i][2][j] == "undefined") %
+RightWrong[i][2][j]=0;
+ xmlResp +=
+( typeof Responses[i][j] == "undefined" ) ? %
+"<msvalue></msvalue>" : "<msvalue>"+Responses[i][j]+"</msvalue>";
+ }
+ cResponses += "<value>"+xmlResp+"</value>";
+ }
+ break;
+ default:
+ cResponses += " points=\""+aPointType[i][0] + "\"";
+ cResponses += " credit=\""+eqCredit + "\"";
+ cResponses += " correct=\""+RightWrong[i]+"\">";
+ cResponses += "<value>"+Responses[i]+"</value>";
+ }
+ cResponses += "</question>";
+ }
+ cResponses += "</results>";
+ return cResponses;
+}
+\end{insDLJS}
+\fi
+%</package>
+% \end{macrocode}
+% \section{eqRecord}\label{eqrecord}
+% Save quiz results to a database. The \texttt{eqRecord} option is meant to
+% be used with the ASP code \textsf{eqRecord.asp}.
+%
+% The form the macro \cs{eqSubmit} is
+%\begin{verbatim}
+%\eqSubmit{http://..../eqRecord.asp\#FDF}
+% {database_name}{table_name}
+%\end{verbatim}
+% The first parameter is the URL to the \textsf{eqRecord.asp} script. The second is the
+% DNS of the database. The third parameter is the name of the table into which the
+% quiz data is to be stored.
+% For example,
+%\begin{verbatim}
+%\eqSubmit{http://localhost/scripts/eqRecord.asp\#FDF}
+% {eqQuiz}{Math101}
+%\end{verbatim}
+% As with \textsf{eqRecord}, the first parameter of the \texttt{quiz} environment is
+% the name of the quiz begin taken.
+%\begin{verbatim}
+%\begin{quiz*}{Quiz1}
+%...
+%\end{quiz*}
+%\end{verbatim}
+% \begin{macrocode}
+%<*eqrecord>
+% \end{macrocode}
+% \begin{macro}{\eq@insertHiddenFields}
+% Create and add the hidden text fields for this option. The macro
+% \cs{eq@insert\-Hid\-den\-Fields} is defined in \textsf{exerquiz} as
+% empty. Now we redefine it for the purpose of inserting hidden text
+% fields.
+% \begin{macrocode}
+\def\eq@insertHiddenFields{%
+ \ifx\basicFieldsSet\eqdb@NO
+ \addHiddenTextField{dbName}{}%
+ \addHiddenTextField{dbTable}{}%
+ \addHiddenTextField{quizName}{}%
+ \global\let\basicFieldsSet\eqdb@YES
+ \fi
+ \addHiddenTextField{\curr@quiz.numQuestions}{\thequestionno}%
+ \addHiddenTextField{\curr@quiz.numCorrect}{}%
+ \addHiddenTextField{\curr@quiz.Responses}{}%
+ \eq@addHiddenTextFields
+ \eq@clearHiddenFields
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\eq@URL}
+% The JavaScript of the `End Quiz' button has a command \cs{eq@submitURL}, which has
+% an empty definition for quizzes that are not to be submitted. We define this
+% macro appropriately. We populate each of the hidden fields and submit.
+% \begin{macrocode}
+\def\eq@submitURL{%
+ this.getField("dbName").value="\db@Name";\jsR\jsT\jsT
+ this.getField("dbTable").value="\db@Table";\jsR\jsT\jsT
+ this.getField("quizName").value="\curr@quiz";\jsR\jsT\jsT
+ this.getField("\curr@quiz.numCorrect").value=Score;\jsR\jsT\jsT
+ var aPointType=new Array(\aPointType);\jsR\jsT\jsT
+\ifx\eqdb@tagged\eqdb@YES
+ var cResponses=gatherTaggedQuizData("\currQuiz",%
+ this.documentFileName,\thequestionno);\jsR\jsT\jsT
+\else
+ var cResponses=Responses.toString().substr(1);\jsR\jsT\jsT
+\fi
+ this.getField("\curr@quiz.Responses").value=cResponses;\jsR\jsT\jsT
+ \eq@populateHiddenFields
+ var aSubmitFields=new Array("\curr@quiz","IdInfo",%
+ "dbName","dbTable","quizName");\jsR\jsT\jsT
+ \priorSubmitQuiz
+ this.submitForm(\eq@CGI,true,false,aSubmitFields);\jsR\jsT\jsT
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</eqrecord>
+% \end{macrocode}
+% \section{eqEmail}\label{eqemail}
+% \begin{macrocode}
+%<*eqemail>
+% \end{macrocode}
+% Report results via e-mail. The \texttt{eqEmail} option is meant to
+% be used with the ASP code \textsf{eqEmail.asp}. When the user
+% submits his/her quiz, \textsf{eqEmail} builds an e-mail message
+% the body of which are the quiz results, and sends it to the
+% instructor.
+%
+% The form the macro \cs{eqSubmit} is\vskip6pt
+%\begin{verbatim}
+% \eqSubmit{http://..../eqEmail.asp\#FDF}
+% {instr@someedu.edu}{course}
+%\end{verbatim}
+% The first parameter is the URL to the \textsf{eqEmail.asp} script. The second is the
+% e-mail address to which the quiz results is to be sent. The third parameter is the
+% course name.
+% For example,
+%\begin{verbatim}
+% \eqSubmit{http://localhost/scripts/eqEmail.asp\#FDF}
+% {dpstory@uakron.edu}{Math101}
+%\end{verbatim}
+% As with \textsf{eqRecord}, the first parameter of the \texttt{quiz} environment is
+% the name of the quiz begin taken.
+%\begin{verbatim}
+% \begin{quiz*}{Quiz1}
+% ...
+% \end{quiz*}
+%\end{verbatim}
+% \begin{macro}{\eq@insertHiddenFields}
+% Create and add the hidden text fields for this option. The macro
+% \cs{eq@insert\-Hid\-den\-Fields} is defined in \textsf{exerquiz} as
+% empty. Now we redefine it for the purpose of inserting hidden text
+% fields.
+% \begin{macrocode}
+\def\htmlSubmitType{HTML}
+\def\insertHTMLs{,"pdfFileName","rtnURL"}
+\def\eq@insertHiddenFields{%
+ \ifx\basicFieldsSet\eqdb@NO
+ \addHiddenTextField{mailTo}{}%
+ \addHiddenTextField{courseName}{}%
+ \addHiddenTextField{quizName}{}%
+% \end{macrocode}
+% If submitting as HTML, we'll include \texttt{pdfFileName} and \texttt{rtnURL}.
+% \begin{macrocode}
+ \ifx\eqdb@submitType\htmlSubmitType
+ \addHiddenTextField{pdfFileName}{}
+ \addHiddenTextField{rtnURL}{\thisRtnURL}\fi
+ \global\let\basicFieldsSet\eqdb@YES
+ \fi
+ \addHiddenTextField{\curr@quiz.ptScore}{}
+ \addHiddenTextField{\curr@quiz.nPointTotal}{\theeqpointvalue}
+ \addHiddenTextField{\curr@quiz.numQuestions}{\thequestionno}%
+ \addHiddenTextField{\curr@quiz.numCorrect}{}%
+ \addHiddenTextField{\curr@quiz.Responses}{}%
+ \eq@addHiddenTextFields
+ \eq@clearHiddenFields
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\eq@submitURL}
+% The JavaScript of the `End Quiz' button has a command \cs{eq@submitURL}, which has
+% an empty definition for quizzes that are not to be submitted. We define this
+% macro appropriately. We populate each of the hidden fields and submit.
+% \begin{macrocode}
+\def\eq@submitURL{%
+ this.getField("mailTo").value="\db@Name";\jsR\jsT\jsT
+ this.getField("courseName").value="\db@Table";\jsR\jsT\jsT
+ this.getField("quizName").value="\curr@quiz";\jsR\jsT\jsT
+ this.getField("\curr@quiz.numCorrect").value=Score;\jsR\jsT\jsT
+ this.getField("\curr@quiz.ptScore").value=ptScore;\jsR\jsT\jsT
+% \end{macrocode}
+% When submitting as HTML, populate the field \texttt{pdfFileName}.
+% \begin{macrocode}
+\ifx\eqdb@submitType\htmlSubmitType
+ this.getField("pdfFileName").value=%
+ this.documentFileName;\jsR\jsT\jsT
+\fi
+ var aPointType=new Array(\aPointType);\jsR\jsT\jsT
+\ifx\eqdb@tagged\eqdb@YES
+ var cResponses=gatherTaggedQuizData("\currQuiz",%
+ this.documentFileName,\thequestionno);\jsR\jsT\jsT
+\else
+ var cResponses=Responses.toString().substr(1);\jsR\jsT\jsT
+\fi
+ this.getField("\curr@quiz.Responses").value=cResponses;\jsR\jsT\jsT
+ \eq@populateHiddenFields
+ var aSubmitFields=new Array("\curr@quiz","IdInfo",%
+ "mailTo","courseName","quizName"%
+% \end{macrocode}
+% If submitting as HTML, we include \cs{insertHTMLs} into the list
+% of fields to submit.
+% \begin{macrocode}
+\ifx\eqdb@submitType\htmlSubmitType\insertHTMLs\fi);\jsR\jsT\jsT
+ \priorSubmitQuiz
+ this.submitForm({cURL: \eq@CGI,bEmpty: false,%
+ aFields: aSubmitFields,%
+ cSubmitAs: "\eqdb@submitType" });\jsR\jsT\jsT
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</eqemail>
+% \end{macrocode}
+% \section{eqText}\label{eqtext}
+% \begin{macrocode}
+%<*eqtext>
+% \end{macrocode}
+% Record the quiz results in a text tab delimited text file. The
+% distribution provides three scripts: (1) \texttt{eqText.asp} submitting
+% as FDF to a windows server; when submitting as HTML, (2)
+% \texttt{eqText\_html.asp} (windows), and (3) \texttt{eqText\_html.ph}p
+% (linux/unix).
+%
+%
+% The form the macro \cs{eqSubmit} is\vskip6pt
+%\begin{verbatim}
+%\usepackage[eqText,tagged]{eq2db}
+%\eqSubmit{http://..../eqText.asp\#FDF}
+% {<path to text file>}{<course name>}
+%\end{verbatim}
+% The first parameter is the URL to the \textsf{eqText.asp} script. The second is the
+% path on the server to where the text file is located. The third parameter is the
+% course name.
+% For example,
+%\begin{verbatim}
+% \eqSubmit{http://localhost/scripts/eqText.asp\#FDF}
+% {c:/Inetpub/DB/qResults.txt}{Math101}
+%\end{verbatim}
+% For submitting as HTML
+%\begin{verbatim}
+% \usepackage[submitAs=html,eqText,tagged]{eq2db}
+% \eqSubmit{http://..../eqText_h.asp} % for window servers
+% {<path to text file>}{<course name>}
+%or
+% \eqSubmit{http://..../eqText_h.php} % for linux/unix servers
+% {<path to text file>}{<course name>}
+%\end{verbatim}
+% As with \textsf{eqRecord}, the first parameter of the \texttt{quiz} environment is
+% the name of the quiz begin taken.
+%\begin{verbatim}
+%\begin{quiz*}{Quiz1}
+%...
+%\end{quiz*}
+%\end{verbatim}
+% \begin{macro}{\eq@insertHiddenFields}
+% Create and add the hidden text fields for this option. The macro
+% \cs{eq@insert\-Hid\-den\-Fields} is defined in \textsf{exerquiz} as
+% empty. Now we redefine it for the purpose of inserting hidden text
+% fields.
+%
+% For HTML submittal, we define \DescribeMacro{\insertHTMLs}\cs{insertHTMLs}, additional fields to be
+% submitted.
+% \begin{macrocode}
+\def\htmlSubmitType{HTML}
+\def\insertHTMLs{,"pdfFileName","rtnURL"}
+\def\eq@insertHiddenFields{%
+ \ifx\basicFieldsSet\eqdb@NO
+ \addHiddenTextField{pathToTxtFile}{}%
+ \addHiddenTextField{courseName}{}%
+ \addHiddenTextField{quizName}{}%
+% \end{macrocode}
+% If submitting as HTML, we'll include \texttt{pdfFileName} and \texttt{rtnURL}.
+% \begin{macrocode}
+ \ifx\eqdb@submitType\htmlSubmitType
+ \addHiddenTextField{pdfFileName}{}
+ \addHiddenTextField{rtnURL}{\thisRtnURL}\fi
+ \global\let\basicFieldsSet\eqdb@YES
+ \fi
+ \addHiddenTextField{\curr@quiz.ptScore}{}
+ \addHiddenTextField{\curr@quiz.nPointTotal}{\theeqpointvalue}
+ \addHiddenTextField{\curr@quiz.numQuestions}{\thequestionno}%
+ \addHiddenTextField{\curr@quiz.numCorrect}{}%
+ \addHiddenTextField{\curr@quiz.Responses}{}%
+ \eq@addHiddenTextFields
+ \eq@clearHiddenFields
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\eq@submitURL}
+% The JavaScript of the `End Quiz' button has a command \cs{eq@submitURL}, which has
+% an empty definition for quizzes that are not to be submitted. We define this
+% macro appropriately. We populate each of the hidden fields and submit.
+% \begin{macrocode}
+\def\eq@submitURL{%
+ this.getField("pathToTxtFile").value="\db@Name";\jsR\jsT\jsT
+ this.getField("courseName").value="\db@Table";\jsR\jsT\jsT
+ this.getField("quizName").value="\curr@quiz";\jsR\jsT\jsT
+ this.getField("\curr@quiz.numCorrect").value=Score;\jsR\jsT\jsT
+ this.getField("\curr@quiz.ptScore").value=ptScore;\jsR\jsT\jsT
+% \end{macrocode}
+% When submitting as HTML, populate the field \texttt{pdfFileName}.
+% \begin{macrocode}
+\ifx\eqdb@submitType\htmlSubmitType
+ this.getField("pdfFileName").value=%
+ this.documentFileName;\jsR\jsT\jsT
+\fi
+ var aPointType=new Array(\aPointType);\jsR\jsT\jsT
+\ifx\eqdb@tagged\eqdb@YES
+ var cResponses=gatherTaggedQuizData("\currQuiz",%
+this.documentFileName,\thequestionno);\jsR\jsT\jsT
+\else
+ var cResponses=Responses.toString().substr(1);\jsR\jsT\jsT
+\fi
+ this.getField("\curr@quiz.Responses").value=cResponses;\jsR\jsT\jsT
+ \eq@populateHiddenFields
+ var aSubmitFields=new Array("IdInfo","\curr@quiz",%
+ "pathToTxtFile","courseName","quizName"%
+% \end{macrocode}
+% If submitting as HTML, we include \cs{insertHTMLs} into the list
+% of fields to submit.
+% \begin{macrocode}
+\ifx\eqdb@submitType\htmlSubmitType\insertHTMLs\fi);\jsR\jsT\jsT
+ \priorSubmitQuiz
+ this.submitForm({cURL: \eq@CGI,bEmpty: true,%
+aFields: aSubmitFields,cSubmitAs: "\eqdb@submitType" });\jsR\jsT\jsT
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</eqtext>
+% \end{macrocode}
+% \section{TAOAS}
+% TAOAS (The AcroTeX Online Assessment System) is an online quiz system under development.
+% It is not publicly available.
+% \begin{macrocode}
+%<*taoas>
+% \end{macrocode}
+% \begin{macro}{\eq@insertHiddenFields}
+% Create and add the hidden text fields for this option. The macro
+% \cs{eq@insert\-Hid\-den\-Fields} is defined in \textsf{exerquiz} as
+% empty. Now we redefine it for the purpose of inserting hidden text
+% fields.
+% \begin{macrocode}
+\def\eq@insertHiddenFields{%
+ \ifx\basicFieldsSet\eqdb@NO
+ \addHiddenTextField{dbName}{}%
+ \addHiddenTextField{dbTable}{}%
+ \addHiddenTextField{quizName}{}%
+ \addHiddenTextField{UserValid}{false}%
+ \addHiddenTextField{SID}{}%
+ \addHiddenTextField{randomID}{}%
+ \addHiddenTextField{fileName}{\jobname}%
+ \ifeq@noquizsolutions
+ \addHiddenTextField{requestSolutions}{false}%
+ \else
+ \addHiddenTextField{requestSolutions}{true}%
+ \fi
+ \global\let\basicFieldsSet\eqdb@YES
+ \fi
+% \end{macrocode}
+% (4/28/10) Added the field \texttt{Admin} (possible values \texttt{Yes}, \texttt{No}, or empty)
+% \begin{macrocode}
+ \addHiddenTextField{Admin}{}%
+ \addHiddenTextField{\curr@quiz.numCorrect}{}%
+ \addHiddenTextField{\curr@quiz.numQuestions}{\thequestionno}%
+ \addHiddenTextField{\curr@quiz.ptScore}{}%
+ \addHiddenTextField{\curr@quiz.nPointTotal}{\theeqpointvalue}
+ \addHiddenTextField{\curr@quiz.Responses}{}%
+ \eq@addHiddenTextFields
+ \eq@clearHiddenFields
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\eq@submitURL}
+% The JavaScript of the `End Quiz' button has a command \cs{eq@submitURL}, which has
+% an empty definition for quizzes that are not to be submitted. We define this
+% macro appropriately. We populate each of the hidden fields and submit.
+% \begin{macrocode}
+\def\eq@true{true}
+\def\eq@submitURL{%
+ this.getField("dbName").value=dbName;\jsR\jsT\jsT
+ this.getField("dbTable").value="\db@Table";\jsR\jsT\jsT
+ this.getField("quizName").value="\curr@quiz";\jsR\jsT\jsT
+% \end{macrocode}
+% (05/03/10) When \cs{correctionsOn} is \texttt{false} (defined in the taoas package),
+% the document is a survey, or some other document that does not require a score.
+% So, we put in a large (in absolute value) negative number as a signal. The \texttt{manage.asp}
+% and the \texttt{\_viewresults.asp} script files then look for a value of -1000 and replaces
+% it in the Score field with \texttt{N/A}.
+% \begin{macrocode}
+\ifx\correctionsOn\eq@true
+ this.getField("\curr@quiz.numCorrect").value=Score;\jsR\jsT\jsT
+ this.getField("\curr@quiz.ptScore").value=ptScore;\jsR\jsT\jsT
+\else
+ this.getField("\curr@quiz.numCorrect").value=-1000;\jsR\jsT\jsT
+ this.getField("\curr@quiz.ptScore").value=-1000;\jsR\jsT\jsT
+\fi
+ var aPointType=new Array(\aPointType);\jsR\jsT\jsT
+\ifx\eqdb@tagged\eqdb@YES
+ var cResponses=gatherTaggedQuizData("\currQuiz",%
+ this.documentFileName,\thequestionno);\jsR\jsT\jsT
+\else
+ var cResponses=Responses.toString().substr(1);\jsR\jsT\jsT
+\fi
+ this.getField("\curr@quiz.Responses").value=cResponses;\jsR\jsT\jsT
+ \eq@populateHiddenFields
+ var aSubmitFields=new Array("\curr@quiz","IdInfo",%
+ "randomID","dbName","dbTable","quizName","fileName",%
+ "requestSolutions");\jsR\jsT\jsT
+ \priorSubmitQuiz
+ this.submitForm(submitURL,true,false,aSubmitFields);\jsR\jsT\jsT
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</taoas>
+% \end{macrocode}
+\endinput