%\iffalse
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ecards.sty package,                                  %%
%% Copyright (C) 1999-2016  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}[1997/12/01]
%<package>\ProvidesPackage{ecards}
%<package>  [2016/09/03 v2.0e eCards: An electronic flash cards package (dps)]
%<*driver>
\documentclass{ltxdoc}
\usepackage[colorlinks,hyperindex=false]{hyperref}
%\pdfstringdefDisableCommands{\let\\\textbackslash}
\OnlyDescription  % comment out for implementation details
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\InputIfFileExists{aebdocfmt.def}{\PackageInfo{ecards}{Inputting aebdocfmt.def}}
     {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
     \PackageInfo{ecards}{aebdocfmt.def cannot be found}}
\let\pkg\textsf
\let\env\texttt
\begin{document}
  \GetFileInfo{ecards.sty}
  \title{eCards: Electronic Flash Cards}
  \author{D. P. Story\\
    Email: \texttt{dpstory@uakron.edu}}
  \date{processed \today}
  \maketitle
  \tableofcontents
  \let\Email\texttt
  \DocInput{ecards.dtx}
\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
    \texttt{makeindex -s gind.ist -o ecards.ind ecards.idx} on the command line and recompile
    \texttt{ecards.dtx}.}
\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
    \texttt{makeindex -s gglo.ist -o ecards.gls ecards.glo} on the command line and recompile
    \texttt{ecards.dtx}.}
\end{document}
%</driver>
% \fi
% \MakeShortVerb{|}
% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}}
%    {\PackageInfo{web}{cannot find aebdonotindex.def}}
% \DoNotIndex{\kern}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \changes{v2.0e}{2016/09/03}{Improved documentation in \string\texttt{ecardsman.pdf}}
%
% \section{Introduction}
%
% The initial version of this package was developed at the request of
% my colleague, Dr.\ Thomas Price, for use in the senior honors
% project of Ms.\ Katie Jones on
% \href{http://www.math.uakron.edu/~teprice/Trig/}{Trig Flash Cards}.
% Upon completion of the honors project, I generalized and extended
% the original package developed specifically for them.
%
% \section{Documentation}
%
% In this section, the major elements of this package are highlighted. For those
% who want to know more, you can peruse the {\LaTeX} code, there are comments
% contained there as well.
%
% \subsection{Preamble: Required Packages and Options}
%
% \subsubsection{Required Packages}
%
% This package depends heavily on the
% \textbf{\href{http://www.math.uakron.edu/~dpstory/webeq.html}
% {Acro\negthinspace\TeX{} eDucation Bundle}}: (1) the \textsf{web}
% package provides page setup, backgrounds, and navigation
% elements; (2) the \textsf{exerquiz} package allows you to author
% the questions, both non-responsive and responsive (fill-in and
% multiple choice); and (3) the \textsf{insdljs} packages is the
% mechanism for introducing document-level JavaScripts into the
% final document.
%
% Each of the packages listed above have their own required packages:
% \textsf{hyperref}, \textsf{color}, \textsf{verbatim}, \textsf{everyshi}
% and \textsf{eso-pic}. Theses are all available as part of the standard
% distribution of {\LaTeX} or through any CTAN site.
%
% \subsubsection{Options}
%
% \paragraph{eCards options.}\hskip-\lastskip\
% The \textsf{eCards} package really has only 4 options:
% \begin{enumerate}
%    \item \texttt{nohints}: If you do not want to provide hints in your eCards,
%        use this option. See also the comments in \Nameref{hint}.
%    \item \texttt{listing}:\label{listing} This option gives you a printable version of your
%        eCards. In this way, you can proofread, check your questions, hints,
%        and answers. Suggested packages and options are given below:
%\begin{verbatim}
%\usepackage[<driver_option>,forpaper,tight,nodirectory]{web}
%\usepackage[solutionsafter,proofing,preview]{exerquiz}
%\usepackage[listing]{eCards}
%\end{verbatim}
%   \item \texttt{memLogo}: The logo, if any, is read and re-read
%       for each page on which it appears.  Using this option, the logo
%    is read once and saved in a box for use.
%   \item \texttt{custom}: If this option is chosen, the package
%        will look for and input a file \texttt{ecard.cus}. This file can
%        be used to customize the environments. This file should be kept
%        in the source directory, not in the {\LaTeX} search path.
% \end{enumerate}
%
% \paragraph{Other options.}\hskip-\lastskip\
% Selecting the various options of the \textsf{web} and
% \textsf{exerquiz} packages can give you different looks.  It is
% important to be aware of all the options associated with these
% two package; in the paragraphs below, various options are
% discussed that may be useful in \textsf{eCards}.
%
%\paragraph{Useful Web Package Options.}\hskip-\lastskip\
% There are three background/panel options: \texttt{usetemplates},
% \texttt{rightpanel} and \texttt{leftpanel}.  Using the
% \texttt{usetemplates} option does not give you the vertical
% navigation strip, but it does give you the background colors;
% the \texttt{rightpanel} and \texttt{leftpanel} given you a
% vertical panel on the right and left, respectively.  Use one of
% these three options only, if any at all. Using none of these three
% will just get you the default white background.
%
%There are certain ``standard'' page designs, or you can create your own using
%the \cs{margins} and \cs{screensize}; the demo document has
%\begin{verbatim}
%\margins{.25in}{.25in}{24pt}{.25in} % left,right,top, bottom
%\screensize{3.72in}{366.24bp}       % height, width
%\end{verbatim}
% See the \textsf{Web} package documentation for details on these and other
% options.
%
% \paragraph{Useful Exerquiz Package Options.}\hskip-\lastskip\
% If you are not using  multiple choice or fill-in questions, you should use
% the \texttt{exercisesonly} option. This removes much of the document level JavaScript
% from the PDF document.
%
% For authors that use the full Acrobat~5.0, or the newer Acrobat
% 6.0 Standard or Acrobat 6.0 Professional, you can use the
% \texttt{execJS} option. If this option is taken, then when the
% document is first loaded into Acrobat (following distillation, or
% creation using \textsf{dvipdfm} or \textsf{pdftex}), the document
% will be automatically saved; this saves any imported document
% level JavaScript in the document. The document always needs to be saved
% after creation so save the scripts with the document, this does it automatically
% so you can't forget to do it---as one of my colleagues once did.
%
% The \texttt{nosolutions} option removes the \texttt{response} environment
% leaving only the questions. The \texttt{proofing} and \texttt{preview} options
% can be useful for proofreading, as described in the \texttt{\hyperref[listing]{listing}}
% option described above.
%
% \subsection{\texorpdfstring{\protect\cs{begin\{document\}}}{\textbackslash begin\{document\}}: Start creating Cards}
%
% The process of creating these electronic cards is quite simple, the sections below
% describe the various environments used.
%
% \subsubsection{The \texttt{card} Environment}
%
% The main environment is the \texttt{card} environment, which is used for posing
% questions, offering a hint, and an answer. The \hypertarget{cardsyntax}{syntax} is
%\begin{verbatim}
%\begin{card}
%   < a question >
%   \begin{response}
%       \begin{hint}
%           < a hint >
%       \end{hint}
%       \begin{answer}
%           < an answer >
%       \end{answer}
%   \end{response}
%\end{card}
%\end{verbatim}
% \textcolor{red}{Important.} You can pose a question which requires
% a verbal response, or one for which there is a choice of
% alternatives, or a fill-in the blank (math or text). See the demo
% file \texttt{ecardstst.tex} for examples.
%
%   \subsubsection{The \texttt{response} Environment}
%
% Immediately following and nested within the \texttt{card} environment is the \texttt{response}
% environment.  This sets things up for the responses to the question: the hint
% and the answer.
%
%   \subsubsection{The \texttt{hint} Environment}\label{hint}
%
% The first environment to appear within the \texttt{response} is
% the \texttt{hint} environment.  Here you can provide additional
% information to help the student answer the question successfully.
% I've you've posed a multiple choice or fill-in question, you can simply
% copy the multiple choice or fill-in into the hint, just as I have done
% in the demo file \texttt{ecardstst.tex}.
%
% In this release, hints can be provided for \textbf{all} of the questions or for
% \textbf{none} of the questions. You can enter hints using the
% \texttt{hint} environment, illustrated \hyperlink{cardsyntax}{above}, or not include a
% \texttt{hint} environment.  When you do not want to include
% hints---whether you've entered the environments or not---use the
% \texttt{nohints} package option. This will convert the
% \texttt{hint} environment into a \texttt{comments}, and redefined
% some of the navigation buttons.
%
% \subsubsection{\texttt{answer} Environment}
%
% After the hint environment comes the answer environment where the answer to the original question
% can be presented. At the end of this environment, you need to back out of your nest:
% \verb+\end{answer}+, \verb+\end{response}+ and \verb+\end{card}+.
%
% \subsection{\texorpdfstring{\protect\cs{end\{document\}}}{\textbackslash end\{document\}}}
%
% \section{Main Code}
%
% \subsection{Declare Options}
%
% This package builds upon the \textbf{Acro\negthinspace\TeX{} eDucation Bundle}, the options of the
% \textsf{web} and \textsf{exerquiz} packages can be used with with \textsf{eCards}. Additional options
% are declared below.
% The logo, if any, is read and re-read for each page on which it appears.  Using the \texttt{memLogo}\IndexOpt{memLogo}
% option, the logo is read once and saved in a box for use.
%    \begin{macrocode}
\let\ec@YES=y \let\ec@NO=n
\DeclareOption{memLogo}{\let\@memLogo\ec@YES}
\let\@memLogo\ec@NO
%    \end{macrocode}
% The \texttt{listing}\IndexOpt{listing} gives a listing of questions, hints, and answers. When used in conjunction
% with various \textsf{exerquiz} options, this option can be used to review all cards and answers.
% Suggested options:
%\begin{verbatim}
%\usepackage[<driver_option>,forpaper,tight]{web}
%\usepackage[solutionsafter,proofing]{exerquiz}
%\usepackage[memLogo,listing]{ecards}
%\end{verbatim}
% The boolean switch \cs{ecListing} can be used to get a better looking listing by removing
% graphics---see the demo file \texttt{ecardstst.tex}.
%    \begin{macrocode}
\DeclareOption{listing}{\ecListingtrue}
\newif\ifecListing \ecListingfalse
%    \end{macrocode}
% If \texttt{custom}\IndexOpt{custom} option is chosen, the package will look for and input a file \texttt{ecard.cus}.
% This file can be used to customize the environments. This file should be kept in the
% source directory, not in the {\LaTeX} search path.
%    \begin{macrocode}
\DeclareOption{custom}{\let\@ecCustom\ec@YES}
\let\@ecCustom\ec@NO
%    \end{macrocode}
% In some applications, the author may not want to have hints provided, so, compile
% the document with the \texttt{nohints}\IndexOpt{nohints} option.
%    \begin{macrocode}
\DeclareOption{nohints}{\def\opts@ecNoHints{nohint}%
\def\defaultecNoHints{\useNoHints}\defaultecNoHints}
\newif\ifisQues \isQuesfalse
%    \end{macrocode}
%    \DescribeMacro{\useNoHints} is a user accessible command for changing the default setting of whether
%    to provide a hint or not.  It must be expanded outside the \env{card} environment. The \cs{useNoHints}
%    command starts a new page unless the \texttt{listing} option has been taken. The \cs{newpage} enables
%    the navigation panel to get state of the hint correctly.
%    \begin{macrocode}
\def\useNoHints{\ifecListing\else\newpage\fi\ecUseNoHints}
%    \end{macrocode}
% \changes{v2.0a}{2016/07/23}{For the Hint page, changed the address to conform to what works
% in the new exerquiz, \cs{hintDest} (\string\texttt{ex\cs{exnoCard}} rather than \string\texttt{ex.\cs{exnoCard}}),
% same for \cs{solnDest}}
% Changed the destinations for \cs{hintDest} and \cs{solnDest}.
%
% The \cs{ecUseNoHints} is an ``internal'' command used within the \env{card}
% environment and in the solutions file; it is also the continuation of \cs{useNoHints}.
% \changes{v2.0d}{2016/08/02}{Added \string\cs{ecUseNoHints} and \string\cs{ecUseHints}}
%    \begin{macrocode}
\def\ecUseNoHints{\ifisQues
    \expandafter\def\else\expandafter\gdef\fi\opts@ecNoHints{nohint}%
    \global\let\@ecNoHints\ec@YES
    \gdef\hintDest{ex\exnoCard}\gdef\solnDest{ex\exnoCard.s}%
    \gdef\hintDestJS{ex.\exnoCard}\gdef\quesDestJS{ex.\exnoCard}%
}
%    \end{macrocode}
%    \DescribeMacro{\useHints} is a user accessible command for changing the default setting of whether
%    to provide a hint or not. It must be expanded outside the \env{card} environment. The \cs{useHints}
%    command starts a new page unless the \texttt{listing} option has been taken. The \cs{newpage} enables
%    the navigation panel to get state of the hint correctly.
%    \begin{macrocode}
\def\useHints{\ifecListing\else\newpage\fi\ecUseHints}
%    \end{macrocode}
% The \cs{ecUseHints} is an ``internal'' command used within the \env{card}
% environment and in the solutions file; it is also the continuation of \cs{useHints}.
%    \begin{macrocode}
\def\ecUseHints{\ifisQues
    \expandafter\def\else\expandafter\gdef\fi\opts@ecNoHints{hint}%
    \global\let\@ecNoHints\ec@NO
    \gdef\hintDest{ex\exnoCard}\gdef\solnDest{ex\exnoCard.s}%
    \gdef\hintDestJS{ex.\exnoCard}\gdef\quesDestJS{qex.\exnoCard}%
}
\def\opts@ecNoHints{hint}
\def\defaultecNoHints{\useHints}
\defaultecNoHints
%    \end{macrocode}
% To present the cards are presented to the user in their natural order, rather
% than in a randomized order, use the \texttt{notrandomized}\IndexOpt{notrandomized} option.
%    \begin{macrocode}
\DeclareOption{notrandomized}{\def\israndomized{false}
    \def\cbInitState{Off}}
\def\israndomized{true}
\def\cbInitState{randomOrder}
%    \end{macrocode}
% \subsection{ProcessOptions and Required Packages}
%    \begin{macrocode}
\ProcessOptions
\RequirePackage{web}
\RequirePackage{exerquiz}[2016/04/18]
%    \end{macrocode}
% \subsection{String Data}
%    \begin{macro}{\cardsFinishedMsg}
% When user finishes the cards, a message appears announcing that event. The
% \cs{cardsFinishedMsg} holds the content of that message.
%    \begin{macrocode}
\newcommand{\cardsFinishedMsg}[1]{\def\CARDSFINISHED{#1}}
\cardsFinishedMsg{You've seen all the cards!}
%    \end{macrocode}
%    \end{macro}
% \subsection{Colors for Backgrounds}
% Some definitions for coloring the background page for the question page, the
% hint page and the answer page.
%    \begin{macrocode}
\textBgColor{cornsilk}
\def\cardColor#1{\def\@cardColor{#1}}
\def\hintColor#1{\def\@hintColor{#1}}
\def\solnColor#1{\def\@solnColor{#1}}
%    \end{macrocode}
% Default colors
%    \begin{macrocode}
\cardColor{vlightblue}
\hintColor{cornsilk}
\solnColor{webyellow}
%    \end{macrocode}
% \subsection{Modifying Exerquiz Environments}
%    \begin{macrocode}
% \let\web@copyright\@gobble
\let\exnoCard\the@exno
\let\web@rightheader\@empty
\def\io#1{\immediate\write\@auxout{#1}}
%    \end{macrocode}
% \subsubsection{Modify the \texttt{exercise} Environment}
% The \cs{endsolnexerhookaux} macro gets executed just prior to the end of the
% solution environment, but before the final trailer is written to the .sol file. Here,
% we use it to insert a navigation bar at the bottom of the solution page.
%    \begin{macrocode}
\def\endsolnexerhookaux{%
    \ifnum\@panelconfig=0\relax
        \immediate\write\verbatim@out
            {\string\insNaviBar*{\hfil\string\NextCard\string\ %
             \string\PrevCard\string\ \string\ToggleOrder\hfil}}%
    \fi
}
\def\include@solutions{%
    \let\webnewpage\relax
    \immediate\closeout\ex@solns
    \ifeq@nosolutions\else
        \iftherearesolutions\newpage\markright{\exsecrunhead}%
            \ifx\webnewpage\relax
                \def\webnewpage{\let\webnewpage\newpage}%
            \fi
            \eqsolutionshook
            \addcontentsline{toc}{section}
                {\protect\numberline{}\exsectitle}%
            \input{\jobname.sol}%
        \fi
    \fi
}
%    \end{macrocode}
% Write the total number of questions (cards) to the aux file.
%    \begin{macrocode}
\AtEndDocument{\io{\string\gdef\string\totalCards{\exnoCard}}\clearpage}
%    \end{macrocode}
% This macro holds the number of cards composed.
%    \begin{macrocode}
\def\theNumCards{\csname totalCards\endcsname}
%    \end{macrocode}
% \cs{nMarker} identifies the type of page, 0 for a question, 1 for a hint, 2 for a solution
%    \begin{macrocode}
\let\ec@Zero=0 \let\ec@One=1 \let\ec@Two=2
\def\ec@Ques{0}\def\ec@Hint{1}\def\ec@Soln{2}
\def\nMarkerSet#1{\gdef\nMarker{#1}}
\nMarkerSet\ec@Ques
%    \end{macrocode}
% Redefine \cs{ReturnTo} so there is no link, we encourage the user to use the navigation
% buttons.
%    \begin{macrocode}
\def\ReturnTo#1#2{\eq@fititin#2}
%    \end{macrocode}
% Miscellaneous macro definitions associated with the \textsf{exercise} environment.
%    \begin{macrocode}
\renewcommand\exsecrunhead{}
\renewcommand\exlabel{}
\renewcommand\exsectitle{}
%    \end{macrocode}
%\changes{v2.0a}{2016/07/23}{Added modified formatting for the \string\texttt{proofing} option
% of \string\textsf{exerquiz}}
% Modified formatting for the \texttt{proofing} option of \textsf{exerquiz}. Added two new commands
% \DescribeMacro{\leadAnsFmtForPaper}\cs{leadAnsFmtForPaper}
% and \DescribeMacro\trailAnsFmtForPaper\cs{trailAnsFmtForPaper}.
% \changes{v2.0c}{2016/07/29}{Added forpaper formatting}
%    \begin{macrocode}
\newcommand{\leadAnsFmtForPaper}{\textbf{Ans:\thinspace[}}
\newcommand{\trailAnsFmtForPaper}{\textbf{]}}
\def\math@correctAnswer{\unskip\ifeqforpaper\leadAnsFmtForPaper\fi
    {\ttfamily\color{\@proofingsymbolColor}\spaceskip=2pt\xspaceskip=2pt
    \expandafter\gobbleMacro\meaning\eqCorrectAns}%
    \ifeqforpaper\trailAnsFmtForPaper\fi
}
\def\txt@correctAnswer{\unskip\ifeqforpaper\textbf{Ans:\thinspace[}\fi
    {\ttfamily\color{\@proofingsymbolColor}%
    \spaceskip=2pt\xspaceskip=2pt
    \expandafter\gobbleTxt\meaning\rbTxtAlt}\ifeqforpaper\textbf{]}\fi
}
%    \end{macrocode}
%
% \subsubsection{The \texttt{multiChoice} Environment}
%
% The \texttt{multiChoice} environment is an \texttt{answer} environment (of \textsf{exerquiz} placed within
% an \texttt{oQuestion} environment (\textsf{exerquiz}).
%
%    \begin{environment}{multiChoice}
% An environment for posing a multiple choice question, based on the \texttt{shortquiz} environment
% of \textsf{exerquiz}.
%    \begin{macrocode}
\newenvironment{multiChoice}[1]{\par
    \if\nMarker\ec@Ques
        \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
            this.gotoNamedDest("\hintDestJS");}%
    \fi
%    \end{macrocode}
% \changes{v2.0}{2016/07/20}{\string\cs{sq@IDTxtField} in the new \string\textsf{exerquiz} is enclosed in an \string\cs{makebox},
% text normally follows it, but here is does not, so we'll have to compensate.}
% \changes{v2.0}{2016/07/20}{Remove \string\texttt{shortquiz} environment, replace with \string\texttt{oQuestion}}
% \cs{sq@IDTxtField} in the new \textsf{exerquiz} is enclosed in an \cs{makebox},
% text normally follows it, but here is does not, so we'll have to compensate.
%    \begin{macrocode}
    \vskip-\baselineskip % dps
    \begin{oQuestion}{\if\nMarker\ec@Ques\hintDest
        \ifisHint.h\fi\else\solnDest\fi}%
        \begin{answers}[\solnDest]{#1}%
}{%
        \end{answers}
    \end{oQuestion}
}
%    \end{macrocode}
%    \end{environment}
%
% \subsubsection{The \texttt{fillIn} Environment}
%
% The \texttt{fillIn} environment is modified \texttt{oQuestion} environment (\textsf{exerquiz}),
% within which the commands \cs{RespBoxMath} and \cs{RespBoxTxt} (\textsf{exerquiz}) are defined.
%
% Set the appearance of any text fields that the author might use.
%    \begin{macrocode}
\ifecListing
    \ifeq@proofing
        \everyRespBoxTxt{\Ff\FfReadOnly\BG{}\BC{}}
        \everyRespBoxMath{\Ff\FfReadOnly\BG{}\BC{}}\else
        \everyRespBoxTxt{\BG{1 1 1}}\everyRespBoxMath{\BG{1 1 1}}\fi
\else
    \everyRespBoxTxt{\BG{1 1 1}}\everyRespBoxMath{\BG{1 1 1}}
\fi
%    \end{macrocode}
%    \begin{environment}{fillIn}
% The \texttt{fillIn} environment one to pose a fill in type question, either
% text or math.  Based on the \texttt{oQuestion} environment of \textsf{exerquiz}.
%    \begin{macrocode}
\newenvironment{fillIn}{%
    \def\RespBoxTxtOnBlur{ecOnBlurRespBox(retn, \exnoCard, \nMarker);}%
    \begin{oQuestion}{\if\nMarker\ec@Ques\hintDest\else\solnDest\fi}%
}{\end{oQuestion}}
%    \end{macrocode}
%    \end{environment}
%
% \subsection{New Environments}
% \subsubsection{The \texttt{card} Environment}
%    \begin{environment}{card}
% This is the main environment for writing questions, hints and answers. This environment
% encloses all. It is based on the \texttt{exercise} environment of \textsf{exerquiz}.
%    \begin{macrocode}
\def\ec@isHint{hint}
\def\ec@isNoHint{nohint}
\def\ec@HintsWarning{\PackageWarning{ecards}
    {The use of \string\useHints\space and \string\useNoHints
    \MessageBreak is prohibited, ignoring this use}}
\def\ec@BadArgWarning{\PackageWarning{ecards}
    {The argument `\ec@rgi' is not an acceptable option.\MessageBreak
    Will use `hint' instead}}
\def\ecInfoToSolns{\string\def\string\exnoCard{\exnoCard}%
    \string\def\string\solndest{\solnDest}%
    \expandafter\string\ec@thisHintOpt
    \string\nMarkerSet{\ec@Hint}\string\defineSoln}
\newenvironment{card}[1][\opts@ecNoHints]{\newpage\isQuestrue
%    \end{macrocode}
%    We redefine \cs{useHints} and \cs{useNoHints} to a warning message within the \env{card}
%    environment.
%    \begin{macrocode}
    \let\useHints\ec@HintsWarning\let\useNoHints\ec@HintsWarning
    \edef\ec@rgi{#1}\ifx\ec@rgi\ec@isHint
        \def\ec@thisHintOpt{\ecUseHints}\else
        \ifx\ec@rgi\ec@isNoHint
            \def\ec@thisHintOpt{\ecUseNoHints}\else
%    \end{macrocode}
%    The user did not pass a recognized option (neither \texttt{hint} nor \texttt{nohint}),
%    use \texttt{hint} instead and send a warning to the log.
%    \begin{macrocode}
            \def\ec@thisHintOpt{\ecUseHints}%
            \ec@BadArgWarning
        \fi
    \fi
    \xdef\ecLoc@lSt@te{\ec@rgi}%
    \ec@thisHintOpt\nMarkerSet\ec@Ques
    \def\eqexheader{\noindent}%
        \renewcommand\exsllabelformat{\protect\noindent}%
    \renewcommand\exrtnlabelformat{}%
    \renewcommand\exsecrunhead{}%
    \let\afterlabelhskip\@empty
    \def\exersolnheadhook{\ecInfoToSolns}%
    \begin{exercise}
        \textBgColor{\@cardColor}%
        \headCard
}{%
        \tailCard
    \end{exercise}%
    \ifnum\@panelconfig=0\relax\aftergroup\cardNaviBar\fi
}
%    \end{macrocode}
%    \end{environment}
% \DescribeMacro\headCard\cs{headCard} determines the design of the question page. Can re-design.
% \changes{v2.0c}{2016/07/29}{Added after skips and widths for questions page}
% Use \DescribeMacro\ecAfterQuesSkip\cs{ecAfterQuesSkip} to change the vertical distance after \textbf{QUESTIONS}
% and the content below. Use \DescribeMacro\ecQuesWidth\cs{ecQuesWidth} to set the width of
% the minipage on the question page.
%    \begin{macrocode}
\def\ecAfterQuesSkip#1{{\setlength{\@tempdima}{#1}%
    \xdef\ec@fterQuesSkip{\the\@tempdima}}}
\ecAfterQuesSkip{.25in}
\def\ecQuesWidth#1{\def\ec@QuesWidth{#1}}
\ecQuesWidth{.85\linewidth}
\def\ecSetQuesWidth{\setlength{\@tempdima}{\ec@QuesWidth}%
    \edef\ec@QuesWidth{\the\@tempdima}}
%    \end{macrocode}
% Use the \DescribeMacro{\ecQUESTION} command to format the question page.
% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecQUESTION}}
%    \begin{macrocode}
\newcommand{\ecQUESTION}{\textbf{QUESTION}}
\newcommand{\headCard}{%
    \vspace*{\stretch{.1}}%
    \begin{center}\ecSetQuesWidth
    \Large\ecQUESTION\par\vspace*{\ec@fterQuesSkip}%
    \begin{minipage}{\ec@QuesWidth}%
        \large\noindent\ignorespaces
}
%    \end{macrocode}
%    \begin{macro}{\tailCard}
% Complete any environments begun by \cs{headCard}
%    \begin{macrocode}
\newcommand{\tailCard}{%
    \end{minipage}
    \end{center}
    \par\vspace{\stretch{2}}%
}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{The \texttt{response} Environment}
%    \begin{environment}{response}
% Nested within the \texttt{card} environment is the
% \texttt{response} environment, which, in turn, contains the
% \texttt{hint} and \texttt{answer} environments. This basically
% the \texttt{solution} environment for an \texttt{exercise} of
% \textsf{exerquiz}.
%    \begin{macrocode}
\newenvironment{response}{\solnexer@woparts[]} %dps
    {\endsolnexer@woparts}
%    \end{macrocode}
%    \end{environment}
%    \begin{environment}{hint}
% Place this environment within the \texttt{response}
% environment and \textit{before} the \texttt{answer} environment.
%    \begin{macrocode}
\newif\ifisHint \isHintfalse
\newenvironment{hint}{%
    \isHinttrue
    \if\@ecNoHints\ec@YES\textBgColor{\@hintColor}\headHint
    \centering\noHintProvided\tailHint\expandafter\ec@comment@hint
    \else\expandafter\ec@hint\fi}{%
    \if\@ecNoHints\ec@YES\expandafter\endec@comment@hint
    \else\expandafter\endec@hint\fi}
%    \end{macrocode}
%    \begin{macro}{\noHintProvided}
% A short typeset message that appears on hint pages when there is no hint
% available.
%    \begin{macrocode}
\newcommand{\noHintProvided}{No hint provided for this question.}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\newenvironment{ec@comment@hint}{\comment}{%
    \endcomment
    \ifnum\@panelconfig=0\relax
        \insNaviBar{\hfill\hintSoln\ \hintNextCard\ %
        \PrevCard\ \ToggleOrder\hfill}\fi
    \newpage\nMarkerSet{\ec@Soln}\noindent\hypertarget{\solndest}{}%
}
\newenvironment{ec@hint}{%
    \textBgColor{\@hintColor}%
    \headHint
}{%
    \tailHint
    \ifnum\@panelconfig=0\relax
        \insNaviBar{\hfill\hintSoln\ \hintNextCard\ %
        \PrevCard\ \ToggleOrder\hfill}\fi
    \newpage\nMarkerSet{\ec@Soln}\noindent\hypertarget{\solndest}{}%
}
%    \end{macrocode}
%    \end{environment}
% Use \DescribeMacro\headHint\cs{headHint} to design he hint page. \DescribeMacro{\ecAfterHintSkip}\cs{ecAfterHintSkip}
% sets the vertical skip following the header (HINT). \DescribeMacro\ecHintWidth\cs{ecHintWidth} sets the width
% of the minipage on the HINT page.
% \changes{v2.0c}{2016/07/29}{Added after skips and widths for hints page}
%    \begin{macrocode}
\def\ecAfterHintSkip#1{{\setlength{\@tempdima}{#1}%
    \xdef\ec@fterHintSkip{\the\@tempdima}}}
\ecAfterHintSkip{.25in}
\def\ecHintWidth#1{\def\ec@HintWidth{#1}}
\ecHintWidth{.85\linewidth}
\def\ecSetHintWidth{\setlength{\@tempdima}{\ec@HintWidth}%
    \edef\ec@HintWidth{\the\@tempdima}}
%    \end{macrocode}
% Use the \DescribeMacro{\ecHINT}\cs{ecHint} command to format the hint page.
% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecHINT}}
%    \begin{macrocode}
\newcommand{\ecHINT}{\textbf{HINT}}
\newcommand{\headHint}{%
    \vspace*{\stretch{.1}}%
    \begin{center}\ecSetHintWidth
        \Large\ecHINT\par\vspace*{\ec@fterHintSkip}%
        \begin{minipage}{\ec@HintWidth}%
        \large\noindent\ignorespaces
}
%    \end{macrocode}
%    \begin{macro}{\tailHint}
% Close any environments begun in \cs{headHint}
%    \begin{macrocode}
\newcommand{\tailHint}{%
        \end{minipage}
    \end{center}
    \par\vspace{\stretch{2}}%
}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{The \texttt{answer} Environment}
%    \begin{environment}{answer}
% The \texttt{answer} environment follows the \texttt{hint}, also listed within
% the \texttt{response} environment.
%    \begin{macrocode}
\newenvironment{answer}{%
    \textBgColor{\@solnColor}%
    \headAnswer
}{\tailAnswer}
%    \end{macrocode}
%    \end{environment}
% \DescribeMacro\headAnswer Use \cs{headAnswer} to design of the answer page. \DescribeMacro\ecAfterAnsSkip
% \cs{ecAfterAnsSkip} sets the vertical skip following the header (ANSWER). \DescribeMacro\ecAnsWidth
% sets the width of the minipage on the ANSWER page.
% \changes{v2.0c}{2016/07/29}{Added after skips and widths for answers page}
%    \begin{macrocode}
\def\ecAfterAnsSkip#1{{\setlength{\@tempdima}{#1}%
    \xdef\ec@fterAnsSkip{\the\@tempdima}}}
\ecAfterAnsSkip{.25in}
\def\ecAnsWidth#1{\def\ec@AnsWidth{#1}}
\ecAnsWidth{.85\linewidth}
\def\ecSetAnsWidth{\setlength{\@tempdima}{\ec@AnsWidth}%
    \edef\ec@AnsWidth{\the\@tempdima}}
%    \end{macrocode}
% Use the \DescribeMacro{\ecANS} command to format the hint page.
% \changes{v2.0c}{2016/07/29}{Added \string\cs{ecANS}}
%    \begin{macrocode}
\newcommand{\ecANS}{\textbf{ANSWER}}
\newcommand{\headAnswer}{%
    \vspace*{\stretch{.1}}%
    \begin{center}\ecSetAnsWidth
        \Large\ecANS\par\vspace*{\ec@fterAnsSkip}%
        \begin{minipage}[t]{\ec@AnsWidth}%
        \large\noindent\ignorespaces}
%    \end{macrocode}
%    \begin{macro}{\tailAnswer}
% Close any environments opened by \cs{headAnswer}
%    \begin{macrocode}
\newcommand{\tailAnswer}{%
        \end{minipage}
    \end{center}
    \vspace*{\stretch{2}}
}
%    \end{macrocode}
%    \end{macro}
% \subsection{Navigation Support}
%
% In this section we build navigation support. The \DescribeMacro\iconWidth\cs{iconWidth} and
% \DescribeMacro\iconHeight\cs{iconHeight} are the width and height of the icons as they appear
% on the bottom of the page. When using a panel option, the width vale is reset, see \cs{iconWidthPanel}
% and \cs{panelGrpWidth}.
%    \begin{macrocode}
\newcommand\iconWidth{40pt}\newcommand\iconHeight{15pt}
%    \end{macrocode}
%    \begin{macro}{\ecHomePage}
%    \begin{macro}{\ecLogo}
%    \begin{macro}{\ecLogoLink}
% \cs{ecHomePage}, for the `Home' button, and \cs{ecLogo}, for the logo. The argument
% for \cs{ecLogo} should be a LaTeX graphics command such as \cs{includegraphics}. See
% the default for an example. With \cs{ecLogoLink}, you can optionally associate a link
% with your logo.
%    \begin{macrocode}
\def\ecHomePage{\hyper@normalise\ec@HomePage}
\def\ec@HomePage#1{\def\@ecHomePage{#1}}
\ecHomePage{http://www.math.uakron.edu/~dpstory/acrotex.html}
\def\ecLogo#1{\def\@ecLogo{#1}}
\ecLogo{\includegraphics[scale=.4]{graphics/uakron}}
\def\ecLogoLink{\hyper@normalise\ec@LogoLink}
\def\ec@LogoLink#1{\def\@ecLogoLink{#1}}
\let\@ecLogoLink\@empty
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%
% \subsubsection{Toggle between Random and Nonrandom Delivery}
%
%    \begin{macro}{\toggleRandomize}
%    \begin{macro}{\randomizedMsg}
%    \begin{macro}{\nonrandomizedMsg}
%    \begin{macro}{\toggleRandomizeTU}
% We provide a push button for toggling between random mode and nonrandom mode.
% The button resets the cards and alerts the user.
%    \begin{macrocode}
\newcommand{\randomizedMsg}{The cards will be delivered
    to you in random order.}
\newcommand{\nonrandomizedMsg}{The cards will be delivered
    to you in their natural order.}
\newcommand{\toggleRandomizeTU}{%
    Click to toggle between random and natural order.}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%
% \subsubsection{Define JS Actions for Icons}
% Below are some JavaScript definitions that are used for navigation.
%    \begin{macrocode}
\def\makeesc#1{\catcode`#1=0\relax}
%    \end{macrocode}
%    \DescribeMacro{\fsJS}\noindent
% Action for the fullscreen button `FS'.
%    \begin{macrocode}
\begin{defineJS}{\fsJS}
if (app.viewerVersion < 5.0)
    app.fullscreen = !app.fullscreen
else {
    app.fs.cursor = cursor.visible;
    app.fs.defaultTransition = "";
    app.fs.useTimer = false;
    app.fs.isFullScreen = !app.fs.isFullScreen;
}
\end{defineJS}
%    \end{macrocode}
% \subsubsection{Define Navigation Icons}
% Some navigation icons, \cs{newNaviIcon} is defined in the \textsf{Web Package}.
%    \begin{macrocode}
% if  nohint option is used, this is the JS action when hint is clicked.
\newcommand\noHintJSAction{}
\def\NaviIconActionJS#1{\ifecListing
    \if\nMarker\ec@Ques\else
        this.gotoNamedDest("\quesDestJS");\fi
    \else
        #1;
    \fi
}
%    \end{macrocode}
%\changes{v2.0c}{2016/07/29}{Added labels for navigation icons to make customization easier}
%    \begin{macro}{\ecSolnLabel}
%    \begin{macro}{\ecHintLabel}
%    \begin{macro}{\ecNextLabel}
%    \begin{macro}{\ecPrevLabel}
%    \begin{macro}{\ecHintNextLabel}
%    \begin{macro}{\ecHintSolnLabel}
%    \begin{macro}{\ecBeginLabel}
%    \begin{macro}{\ecHomeLabel}
%    \begin{macro}{\ecFinHomeLabel}
%    \begin{macro}{\ecFSLabel}
%    \begin{macro}{\ecCloseLabel}
%    \begin{macro}{\ecRandomLabel}
% Define labels for navigation icons to make customization easier.
%    \begin{macrocode}
\def\ec@defineLabel#1#2#3{\def#1{#2 #3}}
\newcommand{\ecSolnLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@SolnLabel{#1}{#2}}
\ecSolnLabel{Soln}
\newcommand{\ecHintLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@HintLabel{#1}{#2}}
\ecHintLabel{Hint}
\newcommand{\ecNextLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@NextLabel{#1}{#2}}
\ecNextLabel{Next}
\newcommand{\ecPrevLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@PrevLabel{#1}{#2}}
\ecPrevLabel{Prev}
\newcommand{\ecHintNextLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@HintNextLabel{#1}{#2}}
\ecHintNextLabel{Next}
\newcommand{\ecHintSolnLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@HintSolnLabel{#1}{#2}}
\ecHintSolnLabel{Soln}
\newcommand{\ecBeginLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@BeginLabel{#1}{#2}}
\ecBeginLabel{Begin}
\newcommand{\ecHomeLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@HomeLabel{#1}{#2}}
\ecHomeLabel{Home}
\newcommand{\ecFinHomeLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@FinHomeLabel{#1}{#2}}
\ecFinHomeLabel{Home}
\newcommand{\ecFSLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@FSLabel{#1}{#2}}
\ecFSLabel{FS}
\newcommand{\ecCloseLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@CloseLabel{#1}{#2}}
\ecCloseLabel{Close}
\newcommand{\ecRandomLabel}[2][\footnotesize]
    {\ec@defineLabel\ec@RandomLabel{#1}{#2}}
\ecRandomLabel{Random}
%    \end{macrocode}
% The definitions of the navigation icons, \cs{newNaviIcon} is defined in the \pkg{web} package.
%    \begin{macrocode}
\newNaviIcon[j]{\Soln}\iconWidth\iconHeight{\ec@SolnLabel}
    {\NaviIconActionJS{this.gotoNamedDest("\solnDest")}}
\newNaviIcon[j]{\Hint}\iconWidth\iconHeight{\ec@HintLabel}
    {\if\@ecNoHints\ec@YES\noHintJSAction\else
        \NaviIconActionJS{this.gotoNamedDest("\hintDestJS")}\fi} % dps
\newNaviIcon[j]{\NextCard}\iconWidth\iconHeight{\ec@NextLabel}
    {\NaviIconActionJS{getNextCard()}}
\newNaviIcon[j]{\PrevCard}\iconWidth\iconHeight{\ec@PrevLabel}
    {\NaviIconActionJS{getPrevCard()}}
\newNaviIcon[j]{\hintNextCard}\iconWidth\iconHeight
    {\ec@HintNextLabel}{getNextCard();}
\newNaviIcon[j]{\hintSoln}\iconWidth\iconHeight{\ec@HintSolnLabel}
    {\NaviIconActionJS{this.gotoNamedDest("\solndest")}}
\newNaviIcon[j]{\Begin}\iconWidth\iconHeight
    {\ec@BeginLabel}{beginECards();}
\newNaviIcon[l]{\Home}\iconWidth\iconHeight{\ec@HomeLabel}
    {\ifnum\arabic{page}=1\relax\def\ec@next{\href{\@ecHomePage}}\else
    \def\ec@next{\hyperlink{page.1}}\fi\ec@next}
\newNaviIcon[j]{\Finished}\iconWidth\iconHeight{\ec@FinHomeLabel}
    {resetToFirstPage();}
\newNaviIcon[j]{\FullScreen}\iconWidth\iconHeight
    {\ec@FSLabel}{\fsJS}
\newNaviIcon[j]{\Close}\iconWidth\iconHeight{\ec@CloseLabel}
    {closeCards=true; app.execMenuItem("Close")}
%    \end{macrocode}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \end{macro}
%    \begin{macrocode}
\def\ec@CB@toggleOrder{%
    \checkBox[\A{\JS{toggleOrder();}}\DV{\cbInitState}\V{\cbInitState}%
    \TU{\toggleRandomizeTU}\textSize{0}\textColor{1 0 0}
    \BC{0 0 .8}]{eccbtoggleorder}{9bp}{9bp}{randomOrder}}
\providecommand{\nopNaviIcon}[4]{%
    \def#1{{\setlength{\fboxsep}{0pt}%
        \web@colorbox@w@transparency{\@menuBgColor}%
        {\parbox[c][#3][c]{#2}%
        {\normalsize\centering\color{\@menucolor}#4}}%
    }}%
}
\nopNaviIcon{\fpToggleOrder}\iconWidth\iconHeight
    {\ec@RandomLabel\space\ec@CB@toggleOrder}
\nopNaviIcon{\ToggleOrder}\iconWidth\iconHeight
    {\footnotesize\ec@CB@toggleOrder}
%    \end{macrocode}
% If \cs{@memLogo} has a value of `y', then the logo is put in a box and copied
% onto each page; otherwise, the logo is read from its file on each page.
%    \begin{macrocode}
\edef\@@Logo{\if\@memLogo\ec@YES\relax
    \noexpand\unhcopy\noexpand\Logo\else\noexpand\@ecLogo\fi}
%    \end{macrocode}
% Build the button panel for the navigation bar. Can re-design as desired.
% \changes{v2.0b}{2016/07/27}{Added \string\cs{iconWidthPanel} and \string\cs{panelGrpWidth}}
% Use \DescribeMacro{\iconWidthPanel}\cs{iconWidthPanel} to set the width of a panel button, and
% \DescribeMacro\panelGrpWidth\cs{panelGrpWidth} to set the width of the group of buttons.
%    \begin{macrocode}
\newcommand\iconWidthPanel{28pt}
\newcommand\panelGrpWidth{57pt}
\ifnum\@panelconfig>0\relax
%    \end{macrocode}
% if \cs{@panelconfig} (a macro defined in \textsf{web}, is positive, then the author has chosen
% a left or a right navigation panel. So, we must build a panel.
%    \begin{macro}{\panelNaviGroup}
% This is the group of panel buttons used for navigation purposes.
%    \begin{macrocode}
    \renewcommand\panelNaviGroup {%
        \def\iconWidth{\iconWidthPanel}%
        \ifnum\thepage=1\relax
            \parbox[c]{\panelGrpWidth}
            {%
                \Begin\hfill\FullScreen\\
                \Close\hfill\Home\\
                \let\iconWidth\linewidth
                \fpToggleOrder
            }%
            \else
            \parbox[c]{\panelGrpWidth}
            {%
                {\ifecListing\else\if\nMarker\ec@Ques
                    \if\@ecNoHints\ec@YES
                        \navibarTextColor{lightblue}\fi
                 \else
                    \navibarTextColor{lightblue}\fi\fi\Hint}\hfill
                {\if\nMarker\ec@Soln
                    \navibarTextColor{lightblue}\fi\Soln}\\
                \NextCard\hfill\PrevCard\\
                \ToggleOrder\hfill\Finished
            }%
        \fi
    }
%    \end{macrocode}
%    \end{macro}
% If \cs{@memLogo} is `y', create a new box, read logo with \cs{@ecLogo}, and store
% in box
%    \begin{macrocode}
    \newbox\Logo
    \if\@memLogo\ec@YES\relax
        \AtBeginDocument{\global\setbox\Logo=\hbox{\@ecLogo}}%
    \fi
%    \end{macrocode}
%    \begin{macro}{\buildpanel}
% The \cs{buildpanel} command is defined in the \pkg{web} package and determines the layout of
% the vertical navigation panel. You can re-design your own. \DescribeMacro{\raiseLogoBy}\cs{raiseLogoBy}
% may be used to adjust the vertical position of the logo.
% \changes{v2.0b}{2016/07/27}{Added \string\cs{raiseLogoBy}}
%    \begin{macrocode}
\def\raiseLogoBy#1{{\setlength\@tempdima{#1}%
    \xdef\r@iseLogoBy{\the\@tempdima}}}\raiseLogoBy{0pt}
    \buildpanel{\raisebox{\r@iseLogoBy}{\ifx\@ecLogoLink\@empty\@@Logo
        \else\href{\@ecLogoLink}{\@@Logo}\fi}%
        \par\vspace{\stretch{1}}%
        \rotatebox{-90}{\aebLogo}%
        \par\vspace{\stretch{1}}%
        \panelNaviGroup
    }
%    \end{macrocode}
%    \end{macro}
% Delay the expansion of the \cs{newNaviIcon} macro for the solution page
%    \begin{macrocode}
    \def\defineSoln{\newNaviIcon[j]{\Soln}\iconWidth\iconHeight
        {\ec@SolnLabel}{%
        \NaviIconActionJS{this.gotoNamedDest("\solndest")}}%
        \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
            this.gotoNamedDest("\solndest");}%
    }
\else
%    \end{macrocode}
%    \begin{macro}{\cardNavibar}
% \cs{@panelconfig} must be zero, the author does not want a navigation panel, so well
% put buttons at the bottom of each page to navigate by.
% Standard navigation bar.
%    \begin{macrocode}
    \def\cardNaviBar{\insNaviBar{\hfill
        \if\@ecNoHints\ec@NO\Hint\ \fi\Soln\ \NextCard\
            \PrevCard\ \ToggleOrder\ \Home\hfill}}
    \def\defineSoln{\newNaviIcon[j]{\Soln}\iconWidth\iconHeight
        {\ec@SolnLabel}{%
        \NaviIconActionJS{this.gotoNamedDest("\solndest")}}%
        \def\sqWrongRespJS{app.alert(\eqsqwgmsg,3);
            this.gotoNamedDest("\solndest");}%
    }
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\fi
%    \end{macrocode}
%
%\subsection{Close Page Action}
%
% We tap into \textsf{eforms} through the \cs{@CloseAction} macro. If \texttt{aeb\_pro}
% is used, the document author may overwrite this definition.
%
%    \begin{macrocode}
\newcommand{\pressBeginMsg}{Press the \eqbs\eqbs"Begin\eqbs\eqbs"
    button to begin viewing the cards.}
\ifecListing\else
\thisPageAction{\JS{}}{\JS{if (!closeCards&&!beginPressed){\jsR\jsT
    var b=app.setTimeOut("this.pageNum=0;
        app.alert(pressBeginMsg);",50);\jsR}}}
\fi
%    \end{macrocode}
% \subsection{Document Level JavaScript}
% Insert document level JavaScripts to get the functionality of randomly selected questions.
%
% \smallskip\noindent If author has used the \texttt{nodljs} or \texttt{exercises} only, then
% we need to turn the \textsf{insdljs} package back on by emitting
%    \begin{macrocode}
\let\importdljs=y
%    \end{macrocode}
% This is the JavaScript to control the eCards action. Some global variables followed by the
% \texttt{getNextCard()} method.
%    \begin{macrocode}
\begin{insDLJS}[isCardloaded]{flashcrd}{Flash Card JS}
var isCardloaded=true;
var closeCards=false;
var beginPressed=false;
var maxNumberCards = Math.pow(10,Math.ceil(%
Math.LOG10E*Math.log(\theNumCards)));
var aCardsNaturalOrder=new Array();
var aCardsRandomOrder=new Array();
var aCardsViewOrder;
var ptrCards=0;
var cardsFinished = "\CARDSFINISHED";
var pressBeginMsg = "\pressBeginMsg";
var isRandomized=\israndomized;
%    \end{macrocode}
% Get the next card, and notify the user if all cards have been viewed.
%    \begin{macrocode}
function getNextCard() {
    numCards = \theNumCards;
    if ( ptrCards == numCards ) {
        app.alert(cardsFinished,3);
        resetToFirstPage();
    } else {
        ptrCards+=1;
        this.gotoNamedDest("qex."+aCardsViewOrder[ptrCards]);
    }
}
%    \end{macrocode}
% Get the previous card.
%    \begin{macrocode}
function getPrevCard() {
    if ( ptrCards <= 1 ) {
%        this.gotoNamedDest("page.1");
        resetToFirstPage();
    } else {
        ptrCards-=1;
        this.gotoNamedDest("qex."+aCardsViewOrder[ptrCards]);
    }
}
%    \end{macrocode}
% We also define a function \texttt{ecOnBlurRespBox()} to
% correctly control the page changes: If a wrong answer is given, then we go to
% the hint or the solution depending on whether user is responding to the original
% question or to the hint.
%    \begin{macrocode}
function ecOnBlurRespBox (retn, exnoCard, nMarker) {
    if (retn != null) {
        if (retn) {
            app.alert(\eqsqrtmsg,3);
            var dest = "ex" + exnoCard + ".s"; // dps
            this.gotoNamedDest(dest);
        } else {
            app.alert(\eqsqwgmsg,3);
            if (nMarker==0) {
                var dest = "ex." + exnoCard; // dps
                this.gotoNamedDest(dest);
            }
            else {
                var dest = "ex" + exnoCard + ".s"; // dps
                this.gotoNamedDest(dest);
            }
        }
    } else {
        var str = event.target.value.toString();
        if (str.replace(/\s/g,"") == "")
        event.target.strokeColor = \defaultColorJSDef; // dps
    }
}
%    \end{macrocode}
% This executes when the user clicks the begin link.
%    \begin{macrocode}
function beginECards() {
    PrepareViewingOrder();
    beginPressed=true;
    getNextCard();
    var f, g, bState;
    f=this.getField("eccbtoggleorder");
    bState=f.isBoxChecked(0);
    this.resetForm();
    f.checkThisBox(0,bState);
    for (var card=1; card<=\theNumCards; card++) {// dps
        f = this.getField("obj.ex"+card);
        if ( f != null ) {
            g = f.getArray();
            for (var i = 0; i < g.length; i++)
                g[i].strokeColor  = \defaultColorJSDef; // dps
        }
    }
}
%    \end{macrocode}
% Sets \texttt{ptrCards} to 0, then builds two new matrices,
% \texttt{aCardsNaturalOrder} consisting of the numbers 1,2,...\cs{theNumCards},
% and \texttt{aCardsRandomOrder}. If \texttt{isRandomized} is \texttt{true},
% \texttt{aCardsViewOrder} is set to \texttt{aCardsRandomOrder}, otherwise it is set
% to \texttt{aCardsNaturalOrder}.
%    \begin{macrocode}
function PrepareViewingOrder() {
    ptrCards=0;
    var i, rand;
    for (i=0; i<=\theNumCards; i++) {
        aCardsNaturalOrder[i]=i;
        aCardsRandomOrder[i]=i;
    }
%    \end{macrocode}
% We randomize the entries in \texttt{aCardsRandomOrder}, which at this moment
% is the same as \texttt{aCardsNaturalOrder}.
%    \begin{macrocode}
    for (i=1; i<=\theNumCards; i++) {
        var rand = Math.random();
        rand *= maxNumberCards;
        rand = Math.ceil(rand);
        rand = rand \% \theNumCards;
        rand += 1;
        temp = aCardsRandomOrder[i];
        aCardsRandomOrder[i]=aCardsRandomOrder[rand];
        aCardsRandomOrder[rand]=temp;
    }
    aCardsViewOrder=(isRandomized)?aCardsRandomOrder:aCardsNaturalOrder;
}
%    \end{macrocode}
% Toggles between viewing the cards in random order and their natural order.
%    \begin{macrocode}
function toggleOrder() {
    isRandomized=!isRandomized;
    if (aCardsNaturalOrder.length==0) PrepareViewingOrder();
    if (isRandomized) {
        for (var i=1; i<=\theNumCards; i++)
            if (aCardsRandomOrder[i]==ptrCards) break;
        ptrCards=i;
        aCardsViewOrder=aCardsRandomOrder;
        app.alert("\randomizedMsg");
    } else {
        ptrCards=aCardsViewOrder[ptrCards];
        aCardsViewOrder=aCardsNaturalOrder;
        app.alert("\nonrandomizedMsg");
    }
}
function resetToFirstPage() {
    this.gotoNamedDest("page.1");
    beginPressed=false;
}
\end{insDLJS}
%    \end{macrocode}
% If we have the \texttt{listing} option taken, then we import the \texttt{ecardslist.def}
% file to redefine portions of the \texttt{card} environment.
% just the Adobe Reader.
%    \begin{macrocode}
\ifecListing\input{ecardslist.def}\fi
%    \end{macrocode}
% If document author  wants to modify these environments, s/he can place redefinitions in
% \texttt{ecard.cus}.
%    \begin{macrocode}
\if\@ecCustom\ec@YES\InputIfFileExists{ecard.cus}{}{}\fi
%</package>
%    \end{macrocode}
% \subsection{Support for the \texttt{listing} option}
% When the \texttt{listing} option is taken, we list out the questions, hints, and answers.
% In this section, a number of environments and commands are defined, the name of each
% begin with `\texttt{listing@}'. The document author can \cs{renewcommand} there to
% create a printed listing of easy review. If you say
%\begin{verbatim}
%\usepackage[forpaper,tight]{web}
%\usepackage[solutionsafter,proofing]{exerquiz}
%\usepackage[memLogo,listing]{ecards}
%\end{verbatim}
% then the multiple choice and fill-in questions will display the correct answers. Place any
% customizations in a text field named \texttt{ecard.cus}, and use the \texttt{custom}
% option.
% \subsubsection{The \texttt{card} Environment}
%    \begin{macrocode}
%<*listing>
%    \end{macrocode}
%    \begin{environment}{card}
% This is the main environment for writing questions, hints and answers. This environment
% encloses all.
%    \begin{macrocode}
\newcounter{ecCnt}
\let\exsolafter\@empty
\eqexerskip{0pt}
\newenvironment{listing@card}[1][\opts@ecNoHints]{%
    \isQuestrue\let\useHints\ec@HintsWarning
    \let\useNoHint\ec@HintsWarning\edef\ec@rgi{#1}%
    \ifx\ec@rgi\ec@isHint
        \def\ec@thisHintOpt{\ecUseHints}\else
        \ifx\ec@rgi\ec@isNoHint
            \def\ec@thisHintOpt{\ecUseNoHints}\else
            \def\ec@thisHintOpt{\ecUseHints}\ec@BadArgWarning
    \fi\fi
    \ec@thisHintOpt\nMarkerSet{\ec@Ques}%
    \stepcounter{ecCnt}%
    \def\eqexheader{\noindent}%
        \renewcommand\exsllabelformat{\protect\noindent}%
    \renewcommand\exrtnlabelformat{}%
    \renewcommand\exsecrunhead{}%
    \let\afterlabelhskip\@empty
    \def\exersolnheadhook{\ecInfoToSolns}%
    \begin{exercise}%
        \textBgColor{\@cardColor}%
        \headCard
}{%
    \tailCard
    \end{exercise}%
}
%    \end{macrocode}
%    \end{environment}
%    \begin{macro}{\headCard}
% The design of the question page. Can re-design.
%    \begin{macrocode}
\newcommand{\listing@headCard}{\ifeqforpaper
    \makebox[0pt][r]{\textbf{\arabic{ecCnt}.\thinspace}}\else
    \makebox[0pt][r]{\textbf{\hyperlink{ex.\exnoCard}%
        {\arabic{ecCnt}.\thinspace}}}\fi\ignorespaces}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\tailCard}
% Complete any environments begun by \cs{headCard}
%    \begin{macrocode}
\newcommand{\listing@tailCard}{\removelastskip\par} % dps
%    \end{macrocode}
%    \end{macro}
% \subsubsection{The \texttt{response} Environment}
%    \begin{environment}{response}
% Nested within the \texttt{card} environment is the
% \texttt{response} environment, which, in turn, contains the
% \texttt{hint} and \texttt{answer} environments. This basically
% the \texttt{solution} environment for an \texttt{exercise} of
% \textsf{exerquiz}.
%    \begin{macrocode}
\def\setSolutionsAfterSkip{\expandafter
    \def\expandafter\solutionsafterSkip
    \expandafter{\solutionsafterSkip\kern0pt}}
\AtBeginDocument{\setSolutionsAfterSkip}
\newenvironment{listing@response}
    {\solutionsafterSkip\solnexer@woparts[]}{\endsolnexer@woparts}
%    \end{macrocode}
%    \end{environment}
%    \begin{environment}{hint}
% Right now, a hint is required. Place this environment within the \texttt{response}
% environment and \textit{before} the \texttt{answer} environment.
%    \begin{macrocode}
\newenvironment{listing@hint}{%
    \textBgColor{\@hintColor}%
    \headHint
}{\tailHint}
%    \end{macrocode}
%    \end{environment}
%    \begin{macro}{\headHint}
% The design of the hint page. Can re-design.
%    \begin{macrocode}
\newcommand{\listing@headHint}{%
    \par\textit{Hint}:\space\ignorespaces}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\tailHint}
% Close any environments begun in \cs{headHint}
%    \begin{macrocode}
\newcommand{\listing@tailHint}{}
%    \end{macrocode}
%    \end{macro}
% \subsubsection{The \texttt{answer} Environment}
%    \begin{macro}{\headAnswer}
% The design of the answer page. Can re-design.
%    \end{macro}
%    \begin{environment}{answer}
% The \texttt{answer} environment follows the \texttt{hint}, also listed within
% the \texttt{response} environment.
%    \begin{macrocode}
\newenvironment{listing@answer}{%
    \textBgColor{\@solnColor}%
    \headAnswer
}{\tailAnswer}
%    \end{macrocode}
%    \end{environment}
%    \begin{macrocode}
\newcommand{\listing@headAnswer}{%
    \par\textit{Answer}:\space\ignorespaces}
%    \end{macrocode}
%    \begin{macro}{\tailAnswer}
% Close any environments opened by \cs{headAnswer}
%    \begin{macrocode}
\newcommand{\listing@tailAnswer}{}
%    \end{macrocode}
%    \end{macro}
%    \begin{macrocode}
\def\ec@redefForListing{%
    \let\card\listing@card
    \let\endcard\endlisting@card
    \let\headCard\listing@headCard
    \let\tailCard\listing@tailCard
    \let\response\listing@response % dps
    \let\endresponse\endlisting@response % dps
    \let\headhint\listing@hint
    \let\endhint\listing@endhint
    \let\headHint\listing@headHint
    \let\tailHint\listing@tailHint
    \let\answer\listing@answer
    \let\endanswer\listing@endanswer
    \let\headAnswer\listing@headAnswer
    \let\tailAnswer\listing@tailAnswer
}
\AtBeginDocument{\ec@redefForListing}
%</listing>
%    \end{macrocode}
\endinput
