%\iffalse
% makeindex -s gglo.ist -o pmdb.gls pmdb.glo
% makeindex -s gind.ist -o pmdb.ind pmdb.idx
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% pmdb.sty package,,                                    %%
%% Copyright (C) 2019-2021  D. P. Story                       %%
%%   dpstory@uakron.edu  dpstory@acrotex.net             %%
%%                                                       %%
%% 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.2 of the %%
%% License, or (at your option) any later version.       %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{pmdb}
%<package> \ProvidesPackage{pmdb}[2021/06/07 v1.0 Mark for input files]
%<*driver>
\documentclass{ltxdoc}
\usepackage[colorlinks,hyperindex=false,linktocpage,bookmarksnumbered]{hyperref}
\usepackage{calc}
%\def\texorpdfstring#1#2{#1}
%\pdfstringdefDisableCommands{\let\\\textbackslash}
\OnlyDescription  % comment out for implementation details
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\gdef\brpr#1{\texttt{\char123\relax#1\char125\relax}}
\let\darg\brpr
\let\env\texttt
\let\opt\texttt
\let\app\textsf
\let\pkg\textsf
\let\uif\textsf
\let\tops\texorpdfstring
\def\EXCL{!}
\def\nmpsep#1{\hskip-\marginparsep\texttt{#1}}
\def\visispace{\symbol{32}}
\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
\def\meta#1{\textsl{\texttt{#1}}}
\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
\def\CMD#1{\textbackslash#1}
\makeatletter
\renewcommand{\paragraph}
    {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}}
\renewcommand{\subparagraph}
    {\@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}%
    {\normalfont\normalsize\bfseries}}
  \let\@latex@warning\@gobble
\makeatother
\InputIfFileExists{aebdocfmt.def}{\PackageInfo{pmdb}{Inputting aebdocfmt.def}}
    {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
     \PackageInfo{pmdb}{aebdocfmt.def cannot be found}}
\begin{document}
\addtolength{\marginparwidth}{3pt}
  \GetFileInfo{pmdb.sty}
  \title{The  \textsf{pmdb} Package}
  \author{D. P. Story\\
    Email: \texttt{dpstory@acrotex.net}}
  \date{processed \today}
  \maketitle
\setcounter{secnumdepth}{5}
\setcounter{tocdepth}{5}
\bgroup
\value{secnumdepth}=3
\value{tocdepth}=3
  \tableofcontents
\egroup
  \DocInput{pmdb.dtx}
\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}
  {\paragraph*{Index} The index goes here. Execute
  \begin{quote}\texttt{makeindex -s gind.ist -o pmdb.ind pmdb.idx}\end{quote}
  on the command line and recompile
  \texttt{pmdb.dtx}.}
\IfFileExists{\jobname.gls}{\PrintChanges}
  {\paragraph*{Change History} The list of changes goes here. Execute
    \begin{quote}
    \texttt{makeindex -s gglo.ist -o pmdb.gls pmdb.glo}
    \end{quote}
    on the command line and recompile \texttt{pmdb.dtx}.}
\end{document}
%</driver>
% \fi
% \MakeShortVerb{|}
% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}}
%    {\PackageInfo{web}{cannot find aebdonotindex.def}}
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
%    \section{Introduction}
%    This package addresses the issue of a poor-man's database. Educators who use {\LaTeX} to construct
%    exams and homework sometimes have a collection of problems. Each problem is in its own TEX file. The educator
%    creates a document and \cs{inputs} several of these packaged questions. This package attempts to provide some
%    ``user interface'' to the questions and provides a mechanism of selecting which questions are to be included in the
%    document.
%
%\paragraph*{What does this package do?} For a document that inputs content using the {\LaTeX} command \cs{input},
%the same content can be input using the command \cs{pmInput} (capitalized). When content is input by \cs{pmInput}, a check
%box is created in the margin at the insertion point of the content. The check boxes so created can be checked or cleared.
%When the user clicks on push button provided by this package, a list of all \emph{selected} \cs{input} statements are listed
%in the JavaScript console. This list can then be copied and pasted into another document the author is developing. If you
%\uif{Ctrl+Click} on a check box, the associated content is opened in the default TEX editor. In this way, the document author
%can see a typeset of the content and decide whether the content should be included in the developing document.
%
%\paragraph*{The DB stage:} When you have a collection of questions (or content) in various files and want to use
%this package to \cs{input} them into your document, the following comments are apropos:
%
%\subparagraph*{PDF creators:} Any PDF creator current in the {\LaTeX} world is valid for use with this package.
%
%\subparagraph*{PDF viewers:}
%The ideal viewer is \app{Acrobat}, however, \app{Adobe Reader} and \app{PDF-XChange Editor} can also be used.
%In the case of \app{Adobe Reader}, there is an annoying security dialog box that appears each time you use the
%\uif{Ctrl+Click} feature of the check box; the \uif{Ctrl+Click} feature does not WORK with \app{PDF-XChange Editor}.
%
%\paragraph*{The production stage:} After the document has been assembled (using \pkg{pmdb}), and you build your final document
%(perhaps an \pkg{exerquiz} quiz), the end user can use an appropriate PDF reader. If an \pkg{exerquiz} quiz is used, then
%a minimum of \app{Adobe Acrobat Reader} is required.
%\changes{v1.0}{2021/06/07}{Upgrading v0.6 to  v1.0 for publication}
%    \section{The main code}
%    \begin{macrocode}
\edef\th@dquoteCat{\the\catcode`\"}
\catcode`\"=12\relax
\newif\ifpmdbmode \pmdbmodetrue
%    \end{macrocode}
%\subsection{Package options and package requirements}
%
%\leavevmode\IndexOpt{dbmode}^^A
% The default option is \opt{dbmode}. When in effect, check boxes
% appear in the margins at each \cs{pmInput} point.
%    \begin{macrocode}
\DeclareOption{dbmode}{\pmdbmodetrue}
%    \end{macrocode}
%\leavevmode\IndexOpt[\protect\EXCL]{!dbmode}^^A
% A convenient way to turn off the creation of the check boxes
% is to simply place an exclamation point (!) in front of the \opt{dbmode} option.
%    \begin{macrocode}
\DeclareOption{!dbmode}{\pmdbmodefalse}
%    \end{macrocode}
%\leavevmode\IndexOpt{tight}^^A
% When this option is taken, the checkboxes are tight against the text box
% area.
%    \begin{macrocode}
\newif\ifpmdbtight \pmdbtightfalse
\DeclareOption{tight}{\pmdbtighttrue}
%    \end{macrocode}
%\leavevmode\IndexOpt[\protect\EXCL]{!tight}^^A
%The default for the package, the checkboxes are placed
%to extreme left (or right) in the margins.
%    \begin{macrocode}
\DeclareOption{!tight}{\pmdbtightfalse}
\ProcessOptions
\RequirePackage{eforms}
%    \end{macrocode}
%\subsection{Special attention to Thor}
% One motivation for this package is to support the \pkg{thorshammer} package, to that end
% we make the following assignment, if Thor is not present.
% This is to prevent stoppage:
% if you are inputting a \cs{RespBoxEssay} question that is accompanied by the
% \cs{essayQ} command, defined in \pkg{thorshammer}.
%    \begin{macrocode}
\def\pmdb@ckThor{\@ifundefined{essayQ}{\let\essayQ\@gobble}{}}
\AtBeginDocument{\pmdb@ckThor}
%    \end{macrocode}
%\subsection{Some switches}
% \textbf{Some Booleans and counters.}
% The \cs{ifpmdbFP} switch is set to true when the path to the resource is a full path; otherwise, it is set to false.
% The \cs{ifpmdbDQs} switch is set to true of double-quotes are detected; otherwise it is false.
%    \begin{macrocode}
\newif\ifpmdbFP \pmdbFPfalse
\newif\ifpmdbDQs \pmdbDQsfalse
%    \end{macrocode}
%\subsection{Form field creation}
%  In version dated 2021/01/03, we introduce a button to edit the resource directly in the default application.
%  If can be turned on with \DescribeMacro\editSourceOn\cs{editSourceOn} and off again with \DescribeMacro\editSourceOff
%  \cs{editSourceOff}. The default is off. These commands can be placed
% anywhere in the document and affect all subsequent insertions of \cs{cbSelectInput}.
%    \changes{v0.6}{2021/01/03}{Added \string\cs{editSourceOn} and \string\cs{editSourceOff}}
%    \begin{macrocode}
\newif\ifeditSource \editSourcefalse
\def\editSourceOn{\editSourcetrue}
\def\editSourceOff{\editSourcefalse}
\newcount\pmdb@Cnt
%    \end{macrocode}
%
%\subsubsection{Marginal edit source creation}
%
%    First up is the design for the edit pushbutton or link annotation.
%    \begin{macro}{\editSourceBtn}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{wd}}\darg{\ameta{ht}}}
%    The button to show the current referenced content in the default application.
%    \changes{v0.6}{2021/01/03}{Added \string\cs{editSourceBtn}}
%    \begin{macrocode}
\newcommand{\editSourceBtn}[3][]{\def\@editSourceBtn##1{%
    \pushButton[\A{/S/Launch/F(##1)}\protect\A#1
    ]{editPb.\the\pmdb@Cnt}{#2}{#3}}}
%    \end{macrocode}
%    \end{macro}
%    \begin{macro}{\editSourceBtn}\hskip-\marginparsep\texttt{[\ameta{options}]\darg{\ameta{wd}}\darg{\ameta{ht}}\darg{\ameta{txt}}}
%    The link version of the button.
%    \changes{v0.6}{2021/01/03}{Added \string\cs{editSourceLnk}}
%    \begin{macrocode}
\newcommand{\editSourceLnk}[4][]{\def\@editSourceLnk##1{%
    \raisebox{1bp}{\setLinkBbox[\A{/S/Launch/F(##1)}
      \protect\A#1]{#2}{#3}[c]{\makebox[#2][l]{\thinspace#4}}}}}
%    \end{macrocode}
%    Declare the appearance of this push button and link
%    \begin{macrocode}
\editSourceBtn[\TU{View in default editor}\S{S}]{11bp}{11bp}
\editSourceLnk[\linktxtcolor{red}\H{N}]{11bp}{11bp}{E}
%    \end{macrocode}
%    We provide a control for setting the annot used to edit the source:
%    \DescribeMacro\useEditBtn\cs{useEditBtn}, a pushbutton is used;
%    \DescribeMacro\useEditLnk\cs{useEditLnk}, a link is used. The default
%    is to use a pushbutton.
%    \changes{v0.6}{2021/01/03}{Added \string\cs{useEditBtn} and \string\cs{useEditLnk}}
%    \begin{macrocode}
\def\useEditBtn{\def\@editSourceBorL{\@editSourceBtn}}
\def\useEditLnk{\def\@editSourceBorL{\@editSourceLnk}}
\useEditBtn
%    \end{macrocode}
%\subsubsection{Marginal checkbox creation}
%\DescribeMacro\cbSelectInput\nmpsep{\darg{\ameta{path}}} creates a check box with a tool tip of \ameta{path}
%The mouse up action \cs{ccBoxMU} fixes up relative paths, and defines a \uif{Ctrl+Click} action. When the check box
%is so clicked, the \ameta{path} is opened in the default browser. The \ameta{path} can be relative or absolute.
%This command is used within \cs{insertCkBx}; its \ameta{path} argument is passed to it from \cs{insertCkBx}.
%\changes{v0.6}{2021/01/03}{Added hard wired action to launch the default application.}
%    \begin{macrocode}
\def\pmCBPresets#1{\def\pm@CBPresets{#1}}
\pmCBPresets{}
%    \end{macrocode}
%    Here is the check box that appears in the margins and the edit source button
%    \cs{ifeditSource} is true.
%    \begin{macrocode}
\def\cbSelectInput#1{\mbox{\checkBox[\TU{#1}\presets{\pm@CBPresets}
  \cmd{\bParams{#1}{\the\pmdb@Cnt}\eParams}
  \AAmouseup{\ccBoxMU}]{pmdbCkBx.\the\pmdb@Cnt}{11bp}{11bp}{On}%
  \ifeditSource\olBdry\@editSourceBorL{#1}\fi}\global
  \advance\pmdb@Cnt\@ne
}
%    \end{macrocode}
%    \end{macro}
%\leavevmode\DescribeMacro\insertCkBx\nmpsep{\darg{\ameta{method}}}
% The argument of this macro describes the method
%of inserting the checkbox. The default definition works well for a straightforward document, where you are inputting
%ordinary {\LaTeX} code (such as sections or chapters).\smallskip
%    \begin{macrocode}
\def\insertCkBx#1{\def\@insertCkBx##1{#1}}
%    \end{macrocode}
%    Placement of check boxes in the margin. \DescribeMacro\pmAlignCB\cs{pmAlignCB} controls the marginpar placement.
%    \DescribeMacro\altCBMargins\cs{altCBMargins} alternates the margin placement, forces the check box to the
%    extreme left (on odd pages) and extreme right (on even pages).
%    \begin{macrocode}
\def\setCBsMarg{%
  \ifpmdbtight
    \if@reversemargin
      \def\pmAlignCBAlt{\ifodd\value{page}\leavevmode
        \hfill\else\fi}\else
      \def\pmAlignCBAlt{\ifodd\value{page}\else\hfill\fi}\fi
  \else
    \if@reversemargin
      \def\pmAlignCBAlt{\ifodd\value{page}\hfil\else\hfil\fi}\else
      \def\pmAlignCBAlt{\ifodd\value{page}\hfill\else\fi}\fi
  \fi
}
\def\altCBMargins{\let\pmAlignCB\pmAlignCBAlt}
\def\pmAlignCB{%
  \if@reversemargin
    \ifpmdbtight\hfill\else\fi
  \else
    \ifpmdbtight\else\hfill\fi
  \fi
}
\@ifundefined{chapter}{}{\AtBeginDocument{\setCBsMarg\altCBMargins}}
%    \end{macrocode}
% This is the default declaration. It works well when you are inputting content
% that goes into horizontal mode. We insert the check box at the beginning of the
% first paragraph. When you are inputting files that come into a list environment, this method
% does not work satisfactory.
%
%\section{\tops{\cs}{\textbackslash}{pmInput} states}
%    The switch \cs{ifqzInput} is set to true when \cs{InputQuizItems} is expanded;
%    otherwise, it is set to false.
%    \begin{macrocode}
\newif\ifqzInput \qzInputfalse
%    \end{macrocode}
% \DescribeMacro\InputParas This macro declares that the next \cs{pmInput} macros are for paragraph content.
%This is the default state of the package.
%    \begin{macrocode}
\def\InputParas{\global\qzInputfalse
  \insertCkBx{\ifpmdbmode
  \everypar{\marginpar{\pmAlignCB
    \cbSelectInput{##1}}\global\everypar{}}\fi}}
%    \end{macrocode}
%    Set the default to be \cs{InputParas}
%    \begin{macrocode}
\InputParas
%    \end{macrocode}
%    The \DescribeMacro\InputProbs\cs{InputProbs} is a command that declares
%    the next \cs{pmInput} is for questions for an \pkg{eqexam}
%    document. Currently this command is still under development.
%    \begin{macrocode}
\def\InputProbs{\global\qzInputfalse
  \insertCkBx{\ifpmdbmode
  \def\prior@questionsHook{\marginpar
    {\pmAlignCB\cbSelectInput{##1}}}\fi}}
%    \end{macrocode}
%\leavevmode
%\DescribeMacro\InputQuizItems The macro declares that the next \cs{pmInput} is for items in
%a \env{quiz} environment of \pkg{exerquiz}
%\changes{v0.4}{2019/12/09}{Modified to work when no points are specified}
%    \begin{macrocode}
\newcount\saveQNo \saveQNo\z@
\def\pmHook@qzItems{%
  \let\item@pmOld\item
  \def\item@pmNew{\item@pmOld\itemhook\let\item\item@pmOld}%
  \let\item\item@pmNew}
\def\InputQuizItems{\global\qzInputtrue
  \let\pmHook\pmHook@qzItems
  \saveQNo\z@
  \insertCkBx{\def\cbInQzMargin{\cbSelectInput{##1}}}%
  \ItemHook{\leavevmode\ifpmdbmode
  \ifnum\saveQNo<\value{eqquestionnoi}%
    \marginpar{\pmAlignCB\cbInQzMargin}\fi
  \saveQNo=\arabic{eqquestionnoi}\fi}}
%    \end{macrocode}
%\leavevmode
%\DescribeMacro\InputItems This command declares that the next \cs{pmInput} macros are for items in
%an list environment 2019/12/09 v0.4
%\changes{v0.4}{2019/12/09}{Added \string\cs{InputItems}}
%    \begin{macrocode}
\def\pmHook@item{\let\item@pmOld\item
  \def\item@pmNew{%
    \ifx\pmiarg\@empty
      \ifx\pm@Brk\ef@YES
        \def\pm@next{\item@pmOld[]}\else
        \let\pm@next\item@pmOld
      \fi
    \else
      \def\pm@next{\item@pmOld[\pmiarg]}%
    \fi\pm@next\itemhook\let\item\item@pmOld}%
  \let\item\item@pmNew
}
\def\ItemHook#1{\def\itemhook{#1}}
\def\InputItems{\global\qzInputfalse
  \let\pmHook\pmHook@item
  \insertCkBx{\def\cbInQzMargin{\cbSelectInput{##1}}}%
  \ItemHook{\leavevmode\ifpmdbmode
  \marginpar{\pmAlignCB\cbInQzMargin}\fi}}
%    \end{macrocode}
%
%\paragraph*{Place checkbox and input \ameta{path}}\leavevmode\par\medskip
%\noindent
%\DescribeMacro\ckBxInput\nmpsep{\darg{\ameta{path}}} Places the check box and inputs the \ameta{path}.
%    \begin{macrocode}
\let\pmHook\relax
\def\ckBxInput#1{\@insertCkBx{#1}%
  \ifpmdbDQs\def\donext{\pmHook\input{"#1"}}\else
    \def\donext{\pmHook\input{#1}}\fi
  \donext}
%    \end{macrocode}
%\subsection{Other pushbutton creations}
%This package provides two form fields that are used for the DB step.\par\medskip
%\noindent
%\DescribeMacro\displayChoices\nmpsep{[\ameta{options}]\darg{\ameta{wd}}\darg{\ameta{ht}}} inserts a push button
%whose action is to display the selections in the console window. The argument \ameta{wd} can be empty, in which
%case, the width of the field is determined from the \cs{CA} key.
%    \begin{macrocode}
\newcommand{\displayChoices}[3][]{\pushButton[\TU{\displayChoice@TU}
  \CA{\displayChoice@CA}#1\AAmouseup{\sldInputs}\protect\AA
]{sldInputs}{#2}{#3}}
%    \end{macrocode}
%    Easy access to the \cs{CA} and \cs{TU} keys, for language localization, are provided.
%    These are \DescribeMacro\displayChoiceCA\cs{displayChoiceCA\darg{\ameta{text}}} and
%    \DescribeMacro\displayChoiceTU\cs{displayChoiceTU\darg{\ameta{text}}}.
%    \begin{macrocode}
\def\displayChoiceCA#1{\def\displayChoice@CA{#1}}
\def\displayChoiceTU#1{\def\displayChoice@TU{#1}}
\displayChoiceCA{Display Choices}
\displayChoiceTU{Display all choices in the console window}
%    \end{macrocode}
%\DescribeMacro\clrChoices\nmpsep{[\ameta{options}]\darg{\ameta{wd}}\darg{\ameta{ht}}} inserts a push button
% whose action is to clear all check boxes (and underlying JavaScript variables) created by this package.
% The argument \ameta{wd} can be empty, in which
% case, the width of the field is determined from the \cs{CA} key.
%    \begin{macrocode}
\newcommand{\clrChoices}[3][]{\pushButton[\TU{\clrChoices@TU}
  \CA{\clrChoices@CA}#1\AAmouseup{\clrAction}\protect\AA
]{Inputs}{#2}{#3}}
%    \end{macrocode}
%    Easy access to the \cs{CA} and \cs{TU} keys, for language localization, are provided.
%    These are \DescribeMacro\clrChoicesCA\cs{clrChoicesCA\darg{\ameta{text}}} and
%    \DescribeMacro\clrChoicesTU\cs{clrChoicesTU\darg{\ameta{text}}}.
%    \begin{macrocode}
\def\clrChoicesCA#1{\def\clrChoices@CA{#1}}
\def\clrChoicesTU#1{\def\clrChoices@TU{#1}}
%    \end{macrocode}
%    The default declarations for these two.
%    \begin{macrocode}
\clrChoicesCA{Clear Choices}
\clrChoicesTU{Clear all check boxes created by pmdb}
%    \end{macrocode}
%
%\subsection{Defining the \tops{\protect\cs}{}{pmInput} command}
%
%\DescribeMacro\pmInput\nmpsep{*[\ameta{arg}]\darg{\ameta{path}}} is the main user-interface for inputting a file; here,
%the macro's name is \cs{pmInput}, ultimately it calls \cs{input} with the same path. Paths with spaces
%must be enclosed in double quotes (|\pmInput{my cool problem.tex}|) and the extensions must always be used.
%It the \texttt* option is specified, \cs{pmInput} gobbles up all remaining arguments and does nothing otherwise.
%The optional argument \ameta{arg} is only obeyed when \cs{InputItems} is in affect; it is passed on to
%the underlying \cs{item}, as in \cs{item[\ameta{arg}]}. The \ameta{path} argument is the path to the content to be input;
%if the \ameta{path} contains spaces, then the path must be enclosed in double quotes (\texttt{"my cool path/file.tex"}).
%    \begin{macrocode}
\newcommand\@gobbleOR[2][]{}
\def\pmInput{\@ifstar{\@gobbleOR}{\pmInput@i}}
\def\pmInput@i{\@ifnextchar[%]
  {\let\pm@Brk\ef@YES\inputConta}
  {\let\pm@Brk\ef@NO\inputConta}}
\let\pm@Brk\ef@NO
\def\inputConta{\bgroup\@makeother\"\inputContb}
\newcommand\inputContb[2][]{\egroup\def\pmiarg{#1}\inputConti#2;;}
%    \end{macrocode}
% Determine if double quotation marks are used.
%    \begin{macrocode}
\def\inputConti{\@ifnextchar"%
  {\global\pmdbDQstrue\removedqs}
  {\global\pmdbDQsfalse\removesemis}}
\def\removedqs"#1";;{\inputContii{#1}}
\def\removesemis#1;;{\inputContii{#1}}
%    \end{macrocode}
% Determine if this is a full path, we do this by searching for a colon (\texttt:).
% Following the search for the colon, pass on to the final step of \cs{doinput}.
%    \begin{macrocode}
\def\inputContii#1{\isItFullPath#1:\@nil\doinput{#1}}
%    \end{macrocode}
% A command to detect presence of a colon.
%    \begin{macrocode}
\def\isItFullPath#1:#2\@nil{%
  \def\@rgii{#2}\ifx\@rgii\@empty
    \global\pmdbFPfalse\else
    \global\pmdbFPtrue\fi}
%    \end{macrocode}
% Final step, if the switch \cs{ifpmdbmode} is true, we insert the check box
% \cs{ckBxInput}; otherwise, we pass \ameta{path} to \cs{input}.
%    \begin{macrocode}
\def\doinput#1{\ifpmdbmode\def\donext{\ckBxInput{#1}}\else
  \ifpmdbDQs\def\donext{\input{"#1"}}\else
    \def\donext{\input{#1}}\fi\fi
  \donext}
%    \end{macrocode}
%    During the development of this package, the original command name used was \cs{Input}.
%    There are a few users that use this old definition; the command \cs{Input} is defined
%    in other package, in particular in the \pkg{srcltx}. So we allow the use of \cs{Input}
%    if \cs{Input} is not otherwise defined.
%    \begin{macrocode}
\def\pmInputWarni{\PackageWarningNoLine{pmdb}{The command
  \string\Input\space is already defined.\MessageBreak
  The checkboxes may not appear in the margins.\MessageBreak
  Use the supported command \string\pmInput\space instead}}
\def\pmInputWarnii{\PackageWarningNoLine{pmdb}{Letting
  \string\Input\space to \string\pmInput. You are \MessageBreak
  encouraged to use the supported\MessageBreak
  command \string\pmInput\space instead}}
\def\pmInputChk{%
  \@ifundefined{Input}{%
  \gdef\Input{\pmInputWarnii
    \global\let\pmInputWarnii\relax
    \global\let\pmInputWarni\relax
    \pmInput}}{\pmInputWarni}}
\AtBeginDocument{\pmInputChk}
%    \end{macrocode}
%
% \section{Field JavaScript}
% \leavevmode
%\DescribeMacro\ccBoxMU
% This is the JavaScript action of the check box, used in \cs{cbSelectInput}
% This code uses two parameters \cs{p(1)=\ameta{path}} and \cs{p(2)=\ameta{cnt}} (|\the\pmdb@Cnt|).
%    \begin{macrocode}
\begin{defineJS}[\makeesc\@\makecmt\%]{\ccBoxMU}
@ifpmdbFP%
event.target.userName=("@p(1)");
@else%
%    \end{macrocode}
%    This part of the code is Windows specific. Don't know enough about Mac OS
%    to form the proper path.
%    \begin{macrocode}
// device independent path
var pos=this.path.lastIndexOf("/");
var thispath=this.path.substring(0,pos+1);
%    \end{macrocode}
%    \enspace|/<drive>/user/documents/.../myfolder/|
%    \begin{macrocode}
pos=thispath.indexOf("/",1);
var drive=thispath.substring(1,pos);
var platform=app.platform;
%    \end{macrocode}
%    \uif{Windows} platform
%    \begin{macrocode}
if (platform=="WIN")
%    \end{macrocode}
%    \enspace|<drive>:/user/documents/.../myfolder/|
%    \begin{macrocode}
  thispath=drive+":/"+thispath.substring(pos+1);
%    \end{macrocode}
%    \uif{MacOS} platform: I'm not familiar with the \uif{MacOS} file system, so we'll just
%    assume it is the same as with Windows.
%    \begin{macrocode}
if (platform=="MAC")
%    \end{macrocode}
%    \enspace|<drive>/user/documents/.../myfolder/|
%    \begin{macrocode}
  thispath=drive+"/"+thispath.substring(pos+1);
event.target.userName=thispath+("@p(1)");@fi
if (event.modifier){
  event.target.checkThisBox(0,!event.target.isBoxChecked(0));
  try {
    aebTrustedFunctions(this,aebLaunchURL,%
{cURL: "file:///"+event.target.userName});
  } catch(e) {
    console.show();
    console.println("The Ctrl+Click action is not supported, %
installation of aeb\_pro.js or aeb-reader.js is required.");
  }
%    \end{macrocode}
%     (2020/04/29)  Add a shift event for quizzes.
%    \changes{v0.5}{2020/04/29}{Added \string\texttt{event.shift} for quizzes}
%    \begin{macrocode}
}
if (event.shift) {
	event.target.checkThisBox(0,!event.target.isBoxChecked(0));%
@ifqzInput
  this.gotoNamedDest("@currQuiz."+(@p(2)+1));@fi
} else {
  if (event.target.isBoxChecked(0)){
    _oSPaths["pmdbCkBx.@p(2)"]=%
[("@p(1)"),@ifpmdbDQs true@else false@fi];
    _aInputs[@p(2)]=true;
    _numInputs++;
  }else{
    _oSPaths["pmdbCkBx.@p(2)"]=null;
    _aInputs[@p(2)]=false;
    _numInputs--;
  }
  event.target["_boxState"]=!!event.target.isBoxChecked(0);
}
\end{defineJS}
%    \end{macrocode}
%\leavevmode
%\DescribeMacro\sldInputs
% This is the mouse up action for a push button. It lists all selected content
% and displays them in the console window of \app{Acrobat/Reader}, used in
% \cs{displayChoices}.
%    \begin{macrocode}
\begin{defineJS}[\makecmt\%]{\sldInputs}
console.clear();console.show();
if (_numInputs==0) console.println("No inputs selected");
else {
  for(var i=0;i<_aInputs.length;i++){
    if (!!_aInputs[i]){
      if(_oSPaths["pmdbCkBx."+i][1])
        console.println('\\\\input\{\\"'+(_oSPaths["pmdbCkBx."+i][0])%
+'\\"\}');
      else
        console.println('\\\\input\{'+(_oSPaths["pmdbCkBx."+i][0])%
+'\}');
    }
  }
}
\end{defineJS}
%    \end{macrocode}
%\leavevmode
%\DescribeMacro\clrAction
% Mouse up action to clear the checkboxes and to re-initialize internal
% internal JS variables. Used in \cs{clrChoices}.
%    \begin{macrocode}
\begin{defineJS}{\clrAction}
var _oSPaths=new Object;
var _aInputs=new Array;
var _numInputs=0;
this.resetForm("pmdbCkBx");
\end{defineJS}
%    \end{macrocode}
% \section{Document JavaScript}
%    \begin{macrocode}
\begin{insDLJS}{mrki}{Supporting JavaScript for pmdb}
var _oSPaths=new Object;
var _aInputs=new Array;
var _numInputs=0;
\end{insDLJS}
%    \end{macrocode}
%    \begin{macrocode}
\catcode`\"=\th@dquoteCat
%</package>
%    \end{macrocode}
%\Finale