This document describes the Frinex markup language (XML) which is used to describe a Frinex experiment configuration. When used with the automated build system the experiment configuration can be committed and pushed to the build server, which triggers the build process. The build process can be tracked on the build listing page which contains links to the compiled web app, Android, iOS, Electron and administration system for both the staging and production version. By default only the web app and administration system for the staging version will be build. To enable other options you will need to edit the listing.json file next to your configuration file. Stimuli files can be added in a directory (next to your configuration file) of the same name as the experiment configuration file. Each experiment XML file should have the Frinex XSD declared in the XML document namespace. Adding this XSD will enable XML validation, preemptive typing and the documentation of each element and attribute to be shown in your preferred XML editing tool.

experiment

Each experiment XML configuration file must have one "experiment" element of which only one is permitted and it must contain all other elements of the configuration file.

<experimentappNameDisplay="String" String
appNameInternal="Lowercase Value (optional)" String Lowercase
availableLocales="String (optional)" List of all locales provided in this experiment. The list of locales must be comma separated without whitespace characters. For example "en,de,nl,es" or "en_GB,en_US,en_SG".
backgroundColour="RGB Hex Value (optional)" RGB Hex Value
complementColour0="RGB Hex Value (optional)" RGB Hex Value
complementColour1="RGB Hex Value (optional)" RGB Hex Value
complementColour2="RGB Hex Value (optional)" RGB Hex Value
complementColour3="RGB Hex Value (optional)" RGB Hex Value
complementColour4="RGB Hex Value (optional)" RGB Hex Value
defaultLocale="String (optional)" The default locale to be shown when the user preferred locale is not specified. For example "en" or "en_GB".
defaultScale="Decimal (optional)" Decimal Number
isScalable="Boolean (optional)" Boolean
obfuscateBrowserStorage="Boolean (optional)" Boolean: By default the browser local storage is obfuscated to make it difficult to cheat the system, by setting this to false the obfuscation can be disabled making it easier to debug the application. This can also be achieved by adding the get parameter '?debug=true' to the URL.
preserveLastState="Boolean (optional)" When true the use of browser navigation buttons will be restricted.
primaryColour0="RGB Hex Value (optional)" RGB Hex Value
primaryColour1="RGB Hex Value (optional)" RGB Hex Value
primaryColour2="RGB Hex Value (optional)" RGB Hex Value
primaryColour3="RGB Hex Value (optional)" RGB Hex Value
primaryColour4="RGB Hex Value (optional)" RGB Hex Value
rotatable="Boolean (optional)" Boolean
showMenuBar="Boolean (optional)" Boolean
splashPresenter="PresenterName (optional)" When provided the named presenter will be used as the initial presenter on page reloads.
textFontSize="Integer (optional)" Integral Number
userIdGetParam="String (optional)" String
>
<preventWindowClosefeatureText="String" Text that will be visible to the user.
>
<deploymentexpiryDate="Date Value YYYY-MM-DD (optional)" The date after which the experiment can be undeployed.
frinexVersion="String (optional)" By default the version of Frinex used to compile the experiment is determined by the noNamespaceSchemaLocation attribute in the experiment element which is also used by XML editors to validate the XML. However when frinexVersion is provided it will override the noNamespaceSchemaLocation attribute. (Regardless of which method is used to determine the version of Frinex being compiled the specified version must be available on the build server at the time of compilation).
isAndroid="Boolean (optional)" If true an Android version of this experiment will be generated.
isDesktop="Boolean (optional)" If true a desktop version of this experiment will be generated. To debug the desktop app you can run pass the --debug-mode switch from the terminal. This is only available in the non production versions. On osX this can be done with "open with_stimulus_example.app --args --debug-mode" and on Windows "with_stimulus_example.exe --debug-mode".
isUnity="Boolean (optional)" Experimental feature, if true a Unity version of this experiment will be generated.
isVirtualReality="Boolean (optional)" Experimental feature, if true an UnrealEngine version of this experiment will be generated.
isWebApp="Boolean (optional)" If true a web version of this experiment will be generated.
isiOS="Boolean (optional)" If true an iOS version of this experiment will be generated.
productionServer="String (optional)" When provided determines which production server the experiment is deployed to.
publishDate="Date Value YYYY-MM-DD (optional)" The date from which the experiment will be deployed.
stagingServer="String (optional)" When provided determines which staging server the experiment is deployed to.
state="[validate, debug, draft, staging, production, undeploy, transfer]" The type of deployment to be run when changes are pushed to the build server. Validate will check the XML. Debug will build a version that produces a staging version that outputs more debug information. Draft will build a staging version faster but might not be as reliable in different browsers. Staging will deploy only to the staging server and any existing production deployment will be unaffected. Production will deploy both staging and production and can only be done when the previous production version, if it exists, has been undeployed. Undeploy will remove the experiment from both the staging and production servers. While undeployment will make the database unaccessible the data remains unaffected and will be there for future deployments. Transfer releases ownership of the experiment to allow it to be built from an other GIT repository.
stunServer="String (optional)" When provided determines which stun server will be used for group experiments which stream the participants camera, microphone or canvas. When not provided no stun server will be used and any group streaming will have to be within the same local area network.
>
<validationServiceproductionUrl="String (optional)" The URL to an external production registration service (for example external participant validation or registration or similar service). When not specified the Frinex <validation> service is used.
stagingUrl="String (optional)" The URL to an external staging registration service (for example to avoid cluttering the production validation service with mock data). When not specified the Frinex <validation> service is used.
>
<administrationallowDataDeletion="Boolean (optional)" Participant data cannot be deleted when this is omitted or false. Participant data can be deleted via the administration system when this is set to true.
>
<scss>
<metadata>
<presenterback="PresenterName (optional)" The value of this attribute must exist in one presenter self attributes. If the back attribute is provided the back button will be shown and it will cause the menu/title bar to be shown in the presenter even if it is otherwise hidden.
menuLabel="String (optional)" String
next="PresenterName (optional)" The value of this attribute must exist in one presenter self attributes. The value of this attribute is used as the target for gotoNextPresenter etc..
self="PresenterName (optional)" The name of the presenter, which must be unique per configuration file.
title="String (optional)" String
type="[transmission, metadata, preload, stimulus, colourPicker, colourReport, kindiagram, menu, debug, text, timeline] (optional)" The type of presenter which also determines the features that can be used in the presenter.
>
<stimuli>
</experiment>

preventWindowClose

When true a popup will warn before closing the browser window by showing the message in 'featureText'. Not all browsers will respect this in the same way, so test this on the intended platforms.

<preventWindowClosefeatureText="String" Text that will be visible to the user.
/>

deployment



<deploymentexpiryDate="Date Value YYYY-MM-DD (optional)" The date after which the experiment can be undeployed.
frinexVersion="String (optional)" By default the version of Frinex used to compile the experiment is determined by the noNamespaceSchemaLocation attribute in the experiment element which is also used by XML editors to validate the XML. However when frinexVersion is provided it will override the noNamespaceSchemaLocation attribute. (Regardless of which method is used to determine the version of Frinex being compiled the specified version must be available on the build server at the time of compilation).
isAndroid="Boolean (optional)" If true an Android version of this experiment will be generated.
isDesktop="Boolean (optional)" If true a desktop version of this experiment will be generated. To debug the desktop app you can run pass the --debug-mode switch from the terminal. This is only available in the non production versions. On osX this can be done with "open with_stimulus_example.app --args --debug-mode" and on Windows "with_stimulus_example.exe --debug-mode".
isUnity="Boolean (optional)" Experimental feature, if true a Unity version of this experiment will be generated.
isVirtualReality="Boolean (optional)" Experimental feature, if true an UnrealEngine version of this experiment will be generated.
isWebApp="Boolean (optional)" If true a web version of this experiment will be generated.
isiOS="Boolean (optional)" If true an iOS version of this experiment will be generated.
productionServer="String (optional)" When provided determines which production server the experiment is deployed to.
publishDate="Date Value YYYY-MM-DD (optional)" The date from which the experiment will be deployed.
stagingServer="String (optional)" When provided determines which staging server the experiment is deployed to.
state="[validate, debug, draft, staging, production, undeploy, transfer]" The type of deployment to be run when changes are pushed to the build server. Validate will check the XML. Debug will build a version that produces a staging version that outputs more debug information. Draft will build a staging version faster but might not be as reliable in different browsers. Staging will deploy only to the staging server and any existing production deployment will be unaffected. Production will deploy both staging and production and can only be done when the previous production version, if it exists, has been undeployed. Undeploy will remove the experiment from both the staging and production servers. While undeployment will make the database unaccessible the data remains unaffected and will be there for future deployments. Transfer releases ownership of the experiment to allow it to be built from an other GIT repository.
stunServer="String (optional)" When provided determines which stun server will be used for group experiments which stream the participants camera, microphone or canvas. When not provided no stun server will be used and any group streaming will have to be within the same local area network.
/>

validationService

Server side validation / registration services.

<validationServiceproductionUrl="String (optional)" The URL to an external production registration service (for example external participant validation or registration or similar service). When not specified the Frinex <validation> service is used.
stagingUrl="String (optional)" The URL to an external staging registration service (for example to avoid cluttering the production validation service with mock data). When not specified the Frinex <validation> service is used.
>
<validationallowValidationOnMissing="Boolean" If there are no records for this user then if set to true the validation will succeed, if false then the user will need to be manually added into the admin system.
errorField="String" If a validation error occurs the error message will be returned from the admin server in this metadatafield.
errorMessage="String" If no records match and a validation error occurs this is the error message that will be returned.
>
</validationService>

validation

When metadata is sent to the server via transmitResults, this validation section defines the server side validation of metadata fields and optional restoring the value of metadata fields from the most recent validated record. Note that the intention of validation is not to authenticate, but to compare values in the admin system to client side equivalents such as an invitation code. Optionally metadata values in the admin system can be returned to the client to restore a session to the last stored values on a new device or browser. This section is not used when an external <validationService> is specified.

<validationallowValidationOnMissing="Boolean" If there are no records for this user then if set to true the validation will succeed, if false then the user will need to be manually added into the admin system.
errorField="String" If a validation error occurs the error message will be returned from the admin server in this metadatafield.
errorMessage="String" If no records match and a validation error occurs this is the error message that will be returned.
>
<recordMatchadminField="String" The value of the admin systems copy of this metadatafield is compared to the postField for validation.
errorField="String" If a record match error occurs the error message will be returned from the admin server in this metadatafield.
errorMessage="String" If a record match error occurs this is the error message that will be returned.
postField="String" The value of this metadatafield is sent to the admin server for validation.
responseField="String" If validation succeeds then the matched value (of the postField and adminField) is returned to this metadata field. Usually this is the only way that this field is populated on the client.
validationRegex="String (optional)" If provided then this regex is matched against the postField for validation.
>
<fieldMatchadminField="String" If validation succeeds then the value this metadatafield is returned.
errorField="String" If provided the value of the postField must match the value of the adminField then the error message will be returned in this metadatafield.
errorMessage="String" If provided the value of the postField does not match the value of the adminField then this message is returned.
postField="String (optional)" If provided the value of the postField must match the value of the adminField for validation to succeed.
responseField="String (optional)" If validation succeeds the response value is returned to the client in this metadata field.
validationRegex="String (optional)" If provided then this regex is matched against the value for validation.
>
</validation>

recordMatch

The value sent to the server must match the last valid record stored on in the admin system.

<recordMatchadminField="String" The value of the admin systems copy of this metadatafield is compared to the postField for validation.
errorField="String" If a record match error occurs the error message will be returned from the admin server in this metadatafield.
errorMessage="String" If a record match error occurs this is the error message that will be returned.
postField="String" The value of this metadatafield is sent to the admin server for validation.
responseField="String" If validation succeeds then the matched value (of the postField and adminField) is returned to this metadata field. Usually this is the only way that this field is populated on the client.
validationRegex="String (optional)" If provided then this regex is matched against the postField for validation.
/>

fieldMatch

On successful validation the values stored in the admin system can be returned to the client. For example to restore a previous session on a new device or browser.

<fieldMatchadminField="String" If validation succeeds then the value this metadatafield is returned.
errorField="String" If provided the value of the postField must match the value of the adminField then the error message will be returned in this metadatafield.
errorMessage="String" If provided the value of the postField does not match the value of the adminField then this message is returned.
postField="String (optional)" If provided the value of the postField must match the value of the adminField for validation to succeed.
responseField="String (optional)" If validation succeeds the response value is returned to the client in this metadata field.
validationRegex="String (optional)" If provided then this regex is matched against the value for validation.
/>

administration

Administration

<administrationallowDataDeletion="Boolean (optional)" Participant data cannot be deleted when this is omitted or false. Participant data can be deleted via the administration system when this is set to true.
>
<adminUsername="String" For use with additional or external users a username for access to the administration system and JSON REST interface for this experiment.
>
<dataAgreementFieldfieldName="String" String
matchingRegex="String" String
>
<dataChannelchannel="Integer" Integral Number
label="String" String
logToSdCard="Boolean" Boolean
>
<chartlabel="String" String
type="[bar, line, pie, bubble, radar]" The type of chart to be displayed.
>
<dataTablecolumnNames="Column name list" Comma separated list of columns that will be shown in the data table. Tables of metadata can use the fieldNames from the XML. Not all columns exist for all sources.
label="String" String
matching="String (optional)" Only records matching this query will be counted for this dataset. The query consists of a column name or fieldName followed by = and the search string. Multiple colums or fieldNames can be queried when separated by ;. The percent sign will match zero, one, or multiple characters. The underscore will match any single character.
source="[stimulusResponse, tagpair, tagdata, metadata, timestamp, mediaResponse]" The data source for the table.
>
</administration>

adminUser

User that can access to the administration system and JSON REST interface for this experiment. Multiple users can be defined.

<adminUsername="String" For use with additional or external users a username for access to the administration system and JSON REST interface for this experiment.
/>

dataAgreementField

When present the named metadata field is used to prevent specific data types from being sent to the server until the agreement field matches the required value.

<dataAgreementFieldfieldName="String" String
matchingRegex="String" String
/>

dataChannel



<dataChannelchannel="Integer" Integral Number
label="String" String
logToSdCard="Boolean" Boolean
/>

chart

When present defines a chart that will be displayed on the main page of the experiment admin. Multiple charts can be used.

<chartlabel="String" String
type="[bar, line, pie, bubble, radar]" The type of chart to be displayed.
>
<datasetcolour="RGB Hex Value" RGB Hex Value
label="String" String
matching="String" Only records matching this query will be counted for this dataset. The query consists of a column name or fieldName followed by = and the search string. Multiple colums or fieldNames can be queried when separated by ;. The percent sign will match zero, one, or multiple characters. The underscore will match any single character.
source="[stimulusResponse, tagpair, tagdata, metadata, timestamp, mediaResponse]" The data source for chart.
>
</chart>

dataset

Adds dataset to the graph.

<datasetcolour="RGB Hex Value" RGB Hex Value
label="String" String
matching="String" Only records matching this query will be counted for this dataset. The query consists of a column name or fieldName followed by = and the search string. Multiple colums or fieldNames can be queried when separated by ;. The percent sign will match zero, one, or multiple characters. The underscore will match any single character.
source="[stimulusResponse, tagpair, tagdata, metadata, timestamp, mediaResponse]" The data source for chart.
/>

dataTable

When present defines a table that will be displayed on the main page of the experiment admin.

<dataTablecolumnNames="Column name list" Comma separated list of columns that will be shown in the data table. Tables of metadata can use the fieldNames from the XML. Not all columns exist for all sources.
label="String" String
matching="String (optional)" Only records matching this query will be counted for this dataset. The query consists of a column name or fieldName followed by = and the search string. Multiple colums or fieldNames can be queried when separated by ;. The percent sign will match zero, one, or multiple characters. The underscore will match any single character.
source="[stimulusResponse, tagpair, tagdata, metadata, timestamp, mediaResponse]" The data source for the table.
/>

scss

Custom SCSS or CSS styles can be added in this element. The SCSS content will be processed into CSS and the combined result will be included in the experiments CSS file. The resulting styles can then be used on any feature that takes a styleName attribute.

<scss>
String
</scss>

metadata

The fields of data to be collected for each participant and for use as storage data. The value of each field will be stored in the admin metadata table (participant listing). It is advisable to explicitly sendMetadata at relevant points in the experiment. If the URL used to access the experiment contains a GET parameter matching the postName of a metadata field, the value of the field will be set to the value of the provided GET parameter. This for example allows links to be distributed each of which determines the initial parameters as required for a given experiment.

<metadata>
<fieldcontrolledMessage="String" String
controlledRegex="String" String
duplicatesControlledMessage="String (optional)" String
postName="Post Name String" An identifying name for each metadata field, also used in the column names of the admin system.
preventServerDuplicates="Boolean (optional)" Boolean
registrationField="String" String
>
</metadata>

field



<fieldcontrolledMessage="String" String
controlledRegex="String" String
duplicatesControlledMessage="String (optional)" String
postName="Post Name String" An identifying name for each metadata field, also used in the column names of the admin system.
preventServerDuplicates="Boolean (optional)" Boolean
registrationField="String" String
>
<translationcontrolledMessage="String (optional)" String
locale="String" String
registrationField="String (optional)" String
>
</field>

presenter

Each screen in an experiment configuration is described in a PRESENTER element.

<presenterback="PresenterName (optional)" The value of this attribute must exist in one presenter self attributes. If the back attribute is provided the back button will be shown and it will cause the menu/title bar to be shown in the presenter even if it is otherwise hidden.
menuLabel="String (optional)" String
next="PresenterName (optional)" The value of this attribute must exist in one presenter self attributes. The value of this attribute is used as the target for gotoNextPresenter etc..
self="PresenterName (optional)" The name of the presenter, which must be unique per configuration file.
title="String (optional)" String
type="[transmission, metadata, preload, stimulus, colourPicker, colourReport, kindiagram, menu, debug, text, timeline] (optional)" The type of presenter which also determines the features that can be used in the presenter.
>
</presenter>

stimuli

All stimulus elements must be contained in the stimuli element.

<stimuli>
<stimulusaudioPath="String (optional)" String
code="String (optional)" String
correctResponses="String (optional)" String
identifier="Stimulus Identifier" An identifier for the stimulus consisting of three or more [a-Z0-9_] characters, which must be unique per configuration file.
imagePath="String (optional)" String
label="String (optional)" String
pauseMs="Integer (optional)" Integral Number
ratingLabels="String (optional)" String
tags="Stimulus Tags (optional)" Space separated list of stimulus tags [a-Z0-9]
videoPath="String (optional)" String
>
</stimuli>

stimulus

Each individual stimulus can be described in the form of label, image, audio and video.

<stimulusaudioPath="String (optional)" String
code="String (optional)" String
correctResponses="String (optional)" String
identifier="Stimulus Identifier" An identifier for the stimulus consisting of three or more [a-Z0-9_] characters, which must be unique per configuration file.
imagePath="String (optional)" String
label="String (optional)" String
pauseMs="Integer (optional)" Integral Number
ratingLabels="String (optional)" String
tags="Stimulus Tags (optional)" Space separated list of stimulus tags [a-Z0-9]
videoPath="String (optional)" String
>
<translationcode="String (optional)" String
label="String (optional)" String
locale="String" String
ratingLabels="String (optional)" String
>
</stimulus>

General Features

actionButton

Creates a button which when clicked evaluates the contents of its element.

<actionButtoneventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</actionButton>

actionFooterButton

Creates a button in the footer which when clicked evaluates the contents of its element.

<actionFooterButtoneventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</actionFooterButton>

actionTokenButton

Creates a button where any tokens in its label, styleName and groupId are evaluated before displaying. When clicked evaluates the contents of its element.

<actionTokenButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</actionTokenButton>

activateRandomItem

Randomly activates one menu item on the current presenter providing that the target presenter has not already been completed. If all targets have been completed then the user will be sent to the next presenter as specified by the current presenter.

<activateRandomItem/>

addDebugWidgets

For use in the debug type presenters to enable debugging tools.

<addDebugWidgets/>

addKeyboardDebug

For use in the debug type presenters to show the keycodes entered by devices attached to the device. Such as bluetooth remotes or pointers.

<addKeyboardDebug/>

addKinTypeGui



<addKinTypeGuidiagramName="String" String
/>

addMediaTrigger

Adds a media recording or playback event that will trigger when the media first passes the provided milliseconds value. The timing of this event will have a resolution not less than the length of the recording buffer. If the events is triggered later than the threshold value in milliseconds (20ms is the minimum recommended value) beyond the requested time the onError will be triggered.

<addMediaTriggerevaluateMs="String" String
mediaId="String" String
threshold="Integer" Threshold value.
>
<onTime>
<onError>
</addMediaTrigger>

addPadding



<addPadding/>

addRecorderDtmfTrigger

Adds a web recorder event that will trigger when the provided DTMF tone is detected in the recorded audio stream. Only one trigger can be assigned per DTMF code.

<addRecorderDtmfTriggerdtmf="dtmfType [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, *, #, off] (optional)" Starts or stops the production of DTMF tones (dual-tone multi-frequency signaling) which can be used to encode some timing information in an audio output. The DTMF tone values can be decoded directly from the audio output or from subsequent audio recordings.
>
</addRecorderDtmfTrigger>

addRecorderLevelTrigger

Adds a web recorder event that will trigger when the a sound in the recorded audio stream exceeds the provided threshold above the ambient noise floor for greater than the provided milliseconds. If the levelIndicatorStyle is set then a recording threshold indicator will be shown. If levelIndicatorStyle is set and a region with the ID of AudioThresholdIndicator exists then that region will be used to position the recording threshold indicator.

<addRecorderLevelTriggerlevelIndicatorStyle="String (optional)" The CSS style name to use for the audio recording level indicator. When not present the audio level indicator will not be shown.
threshold="Integer" Threshold value.
thresholdMs="Integer" The milliseconds required to reach the threshold.
>
</addRecorderLevelTrigger>

addTimerTrigger

Adds an onTimer action to the named persistent timer that will be triggered at the moment in ms defined in evaluateTokens. If the named persistent timer is not running it will be started. The persistent timer is identified by its listenerId based on the value of metadata, stimulus responses or scores etc. The value of evaluateTokens will have any string tokens replaced, followed by mathematical evaluation. The resulting number is the time in milliseconds at which the onTimer should occur. The evaluated value will be constrained so that it is within the minimum or maximum values. When the time is up the onTimer element will be triggered. If there is an error evaluating the token string then onError will be triggered.

<addTimerTriggerevaluateTokens="String" String
listenerId="String" String
maximum="Integer" Maximum value.
minimum="Integer" Minimum value.
>
<onTimer>
<onError>
</addTimerTrigger>

allMenuItems



<allMenuItemsstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

allMetadataFields

Adds an input for all metadata fields. Equivalent to metadataField for each field.

<allMetadataFields/>

audioButton



<audioButtonautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
dataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
poster="String" String
src="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</audioButton>

audioInputSelectWeb

Shows a select box of the available audio input devices for use with startAudioRecorderWeb. When an device is selected it will be used as the first preference when the next recording is made.

<audioInputSelectWebdeviceRegex="String (optional)" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<onSuccess>
<onError>
</audioInputSelectWeb>

backgroundImage

Sets the background with the provided image.

<backgroundImagemsToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
src="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</backgroundImage>

bestScoreAboveThreshold



<bestScoreAboveThresholdcorrectStreak="String (optional)" String
errorStreak="String (optional)" String
errorThreshold="String (optional)" String
gamesPlayed="String (optional)" String
potentialThreshold="String (optional)" String
scoreThreshold="String (optional)" String
>
<aboveThreshold>
<withinThreshold>
</bestScoreAboveThreshold>

cancelPauseAll



<cancelPauseAll/>

cancelPauseTimers



<cancelPauseTimers/>

centrePage



<centrePage/>

clearCurrentScore

Clears the current score and sets the current score group string based on the evaluateTokens. The score group is a marker shown in the admin system to keep track of the records and does not affect the score collection process.

<clearCurrentScoredataChannel="Integer (optional)"
evaluateTokens="String" String
/>

clearPage

Clears visual elements from the current presenter, stops timers and other listeners then submits any pending timestamps.

<clearPagestyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

clearStimulusResponses

Clears all locally stored responses to all stimulus that have all the supplied tags. Stimuli that do not have ALL the provided tags will not be affected.

<clearStimulusResponsestags="Stimulus Tags" Space separated list of stimulus tags [a-Z0-9]
/>

clearTimer

Clears the start time and terminates any pending events of any persistent timer matching listenerId (from the local storage data). After this a subsequent startTimer can be used to assign a new start time with this listenerId.

<clearTimerlistenerId="String" String
/>

column



<columnstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</column>

compareTimer

Compares the current time of a persistent timer that was started by startTimer with the same listenerId.

<compareTimerlistenerId="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
<aboveThreshold>
<withinThreshold>
</compareTimer>

countdownLabel



<countdownLabelfeatureText="String" Text that will be visible to the user.
msLabelFormat="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</countdownLabel>

createUserButton

Creates a button that when clicked creates a new user and then navigates to the target presenter as the new user.

<createUserButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
target="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</createUserButton>

disableButtonGroup

Disables any buttons with a groupId that matches the provided regex string.

<disableButtonGroupmatchingRegex="String" Regular expression that will be used to determin a match.
/>

displayCompletionCode



<displayCompletionCode/>

doLater

After the specified milliseconds have passed the contents of this element are evaluated. If tokens are required to calculate the ms value, an evaluatePause can be used.

<doLatermsToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</doLater>

dtmfTone

Produces the specified DTMF tone for the given time in milliseconds. When the milliseconds is set to 0 or omitted the tone will continue until it is stopped by setting the DTMF code to off.

<dtmfTonedtmf="dtmfType [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, *, #, off] (optional)" Starts or stops the production of DTMF tones (dual-tone multi-frequency signaling) which can be used to encode some timing information in an audio output. The DTMF tone values can be decoded directly from the audio output or from subsequent audio recordings.
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
/>

editableKinEntitesDiagram



<editableKinEntitesDiagramdiagramName="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</editableKinEntitesDiagram>

enableButtonGroup

Enables any buttons with a groupId that matches the provided regex string.

<enableButtonGroupmatchingRegex="String" Regular expression that will be used to determin a match.
/>

eraseLocalStorageButton

For use in the debug type presenters to erase the local storage data. This action cannot be undone and if the local storage data has not be sent to the server or stored in the device storage, the data will be lost permanently.

<eraseLocalStorageButtongroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

eraseLocalStorageOnWindowClosing



<eraseLocalStorageOnWindowClosing/>

eraseUsersDataButton



<eraseUsersDataButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
target="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</eraseUsersDataButton>

evaluatePause

Pause based on the value of metadata, stimulus responses or scores etc. The value of evaluateTokens will have any string tokens replaced, followed by mathematical evaluation. The resulting number is the time of the pause in milliseconds. The evaluated value will be constrained so that it is within the minimum or maximum values. When the time is up the onSuccess element will be triggered. If there is an error evaluating the token string then onError will be triggered.

<evaluatePauseevaluateTokens="String" String
maximum="Integer" Maximum value.
minimum="Integer" Minimum value.
>
<onSuccess>
<onError>
</evaluatePause>

evaluateTokenText

The value of evaluateTokens will have any string tokens replaced, followed by mathematical evaluation. The result be shown as HTML and styled with styleName if provided.

<evaluateTokenTextevaluateTokens="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<onSuccess>
<onError>
</evaluateTokenText>

existingUserCheck



<existingUserCheck>
<multipleUsers>
<singleUser>
</existingUserCheck>

generateCompletionCode



<generateCompletionCode>
<onSuccess>
<onError>
</generateCompletionCode>

gotoNextPresenter



<gotoNextPresenter/>

gotoPresenter



<gotoPresentertarget="String" String
/>

groupStimuli



<groupStimuliadjacencyThreshold="Integer (optional)" Sets a window of allowed proximity between stimuli that can be condisered the same. When greater than 0 the list of stimuli will be checked after randomisation for adjacency within the specified window and modified accordingly. If matching items are within the adjacency window, one of the items will be moved to a new position, in some cases a new position without an adjacent match will not be possible. The first attribute that has a value out of image, audio, video or label is used in the comparison. For example adjacencyThreshold 3 would disallow abcad and an attempt to rerandomise would follow. Defaults to 3 when not provided.
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
maxStimuli="String (optional)" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
repeatCount="Integer (optional)" When greater than zero the list will be repeated the selected items by the number of times specified without changing the order of the items. For example if repeat count was 3 then the result might be 321432143214 for example.
repeatRandomWindow="Integer (optional)" When greater than 0 all items will be randomised again after the repeatCount has been applied. This randomisation is constrained to the designated window of items causing the randomisation to be done in a moving window across all items. When used in conjunction with repeatCount this allows randomisation without adjacency at the boundary of repeats. For example, if a repeatCount of 3 resulted in 321432143214 a repeatRandomWindow of 2 could produce 231342413124 but cannot produce 214331322144. Whereas a repeatRandomWindow of 12 would randomise all items to any location and could produce 214331322144.
>
<groupNetwork>
<endOfStimulus>
<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
</groupStimuli>

randomGrouping

List of stimuli tag names one of which will be randomly selected, unless the selection has been predetermined by a metadata field value or by URL GET parameters.

<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
</randomGrouping>

tag

Optional stimuli tag which will be used to select stimuli when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL.

<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
String
</tag>

list

Optional list of stimulus IDs separated by - which will be used when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL. Any whitespace will be ignored so the configuration can have one stimulus per line (providing the - is present), if needed for readability.

<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
String
</list>

stimuli

List of stimuli tag names which determine which stimuli are selected. All stimuli which contain any of the tags will be included in the list of stimuli. The number of selected stimuli will be limited to the maximum that has been requested. The stimuli selected by these tags will always be selected even if a randomGrouping is used.

<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
<tag>
</stimuli>

tag



<tag>
String
</tag>

habituationParadigmListener



<habituationParadigmListenerlistenerId="String" String
maximum="Integer" Maximum value.
threshold="Integer" Threshold value.
>
</habituationParadigmListener>

hardwareTimeStamp

When the URL parameter "hardwareTimeStamp" is provided hardware measurable markers will be produced either visually on screen or as an audible tone or both. The visual markers are in the form of two black/white squares at the top of the screen. The audio markers are in the form of tones. These markers are equivalent to <logTimeStamp> and should be used in a similar way.

<hardwareTimeStampdtmf="dtmfType [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, *, #, off] (optional)" Starts or stops the production of DTMF tones (dual-tone multi-frequency signaling) which can be used to encode some timing information in an audio output. The DTMF tone values can be decoded directly from the audio output or from subsequent audio recordings.
opto1="false, true, invert (optional)" Sets the state of the on screen indicator for optical sensor one.
opto2="false, true, invert (optional)" Sets the state of the on screen indicator for optical sensor two.
/>

hasGetParameter



<hasGetParameterparameterName="String" String
>
<conditionTrue>
<conditionFalse>
</hasGetParameter>

hasMetadataValue

Replaces any token values in the matchingRegex then checks if the metadata field value matches the resulting regex. If the regex matches then coditionTrue is triggered otherwise conditionFalse is triggered.

<hasMetadataValuefieldName="Post Name String" The postName used to identify a metadata field.
matchingRegex="String" Regular expression that will be used to determin a match.
>
<conditionTrue>
<conditionFalse>
</hasMetadataValue>

helpDialogue



<helpDialoguecloseButtonLabel="String" String
featureText="String" Text that will be visible to the user.
>
<translationcloseButtonLabel="String (optional)" String
featureText="String (optional)" String
locale="String" String
>
</helpDialogue>

hideButtonGroup

Hides any buttons with a groupId that matches the provided regex string.

<hideButtonGroupmatchingRegex="String" Regular expression that will be used to determin a match.
/>

hotKeyInput

Creates a key listener that will respond to keyboard or bluetooth button input. This input will not be visible but can be enabled or disabled with enableButtonGroup and disableButtonGroup. The behaviour of this feature will be to some degree platform dependant, for example the behaviour of key repeat and the certainty of onKeyUp being triggered.

<hotKeyInputgroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
>
<onKeyUp>
<onKeyDown>
</hotKeyInput>

htmlText

The contents of featureText will be shown as HTML and styled with styleName if provided

<htmlTextfeatureText="String" Text that will be visible to the user.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</htmlText>

htmlTokenText

When the featureText contains string tokens they will be replaced with the relevant values, eg score values <groupScore> <channelScore> etc.

<htmlTokenTextfeatureText="String" Text that will be visible to the user.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</htmlTokenText>

image



<imagemsToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
src="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
</image>

kinTypeStringDiagram



<kinTypeStringDiagramkintypestring="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</kinTypeStringDiagram>

loadKinTypeStringDiagram



<loadKinTypeStringDiagramdiagramName="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</loadKinTypeStringDiagram>

loadSdCardStimulus



<loadSdCardStimulusadjacencyThreshold="Integer (optional)" Sets a window of allowed proximity between stimuli that can be condisered the same. When greater than 0 the list of stimuli will be checked after randomisation for adjacency within the specified window and modified accordingly. If matching items are within the adjacency window, one of the items will be moved to a new position, in some cases a new position without an adjacent match will not be possible. The first attribute that has a value out of image, audio, video or label is used in the comparison. For example adjacencyThreshold 3 would disallow abcad and an attempt to rerandomise would follow. Defaults to 3 when not provided.
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
excludeRegex="String (optional)" String
matchingRegex="String" Regular expression that will be used to determin a match.
maxStimuli="String (optional)" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
repeatCount="Integer (optional)" When greater than zero the list will be repeated the selected items by the number of times specified without changing the order of the items. For example if repeat count was 3 then the result might be 321432143214 for example.
repeatRandomWindow="Integer (optional)" When greater than 0 all items will be randomised again after the repeatCount has been applied. This randomisation is constrained to the designated window of items causing the randomisation to be done in a moving window across all items. When used in conjunction with repeatCount this allows randomisation without adjacency at the boundary of repeats. For example, if a repeatCount of 3 resulted in 321432143214 a repeatRandomWindow of 2 could produce 231342413124 but cannot produce 214331322144. Whereas a repeatRandomWindow of 12 would randomise all items to any location and could produce 214331322144.
replacementRegex="String (optional)" String
>
<hasMoreStimulus>
<endOfStimulus>
<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
</loadSdCardStimulus>

randomGrouping

List of stimuli tag names one of which will be randomly selected, unless the selection has been predetermined by a metadata field value or by URL GET parameters.

<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
</randomGrouping>

tag

Optional stimuli tag which will be used to select stimuli when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL.

<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
String
</tag>

list

Optional list of stimulus IDs separated by - which will be used when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL. Any whitespace will be ignored so the configuration can have one stimulus per line (providing the - is present), if needed for readability.

<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
String
</list>

stimuli

List of stimuli tag names which determine which stimuli are selected. All stimuli which contain any of the tags will be included in the list of stimuli. The number of selected stimuli will be limited to the maximum that has been requested. The stimuli selected by these tags will always be selected even if a randomGrouping is used.

<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
<tag>
</stimuli>

tag



<tag>
String
</tag>

loadStimulus



<loadStimulusadjacencyThreshold="Integer (optional)" Sets a window of allowed proximity between stimuli that can be condisered the same. When greater than 0 the list of stimuli will be checked after randomisation for adjacency within the specified window and modified accordingly. If matching items are within the adjacency window, one of the items will be moved to a new position, in some cases a new position without an adjacent match will not be possible. The first attribute that has a value out of image, audio, video or label is used in the comparison. For example adjacencyThreshold 3 would disallow abcad and an attempt to rerandomise would follow. Defaults to 3 when not provided.
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
maxStimuli="String (optional)" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
repeatCount="Integer (optional)" When greater than zero the list will be repeated the selected items by the number of times specified without changing the order of the items. For example if repeat count was 3 then the result might be 321432143214 for example.
repeatRandomWindow="Integer (optional)" When greater than 0 all items will be randomised again after the repeatCount has been applied. This randomisation is constrained to the designated window of items causing the randomisation to be done in a moving window across all items. When used in conjunction with repeatCount this allows randomisation without adjacency at the boundary of repeats. For example, if a repeatCount of 3 resulted in 321432143214 a repeatRandomWindow of 2 could produce 231342413124 but cannot produce 214331322144. Whereas a repeatRandomWindow of 12 would randomise all items to any location and could produce 214331322144.
>
<hasMoreStimulus>
<endOfStimulus>
<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
</loadStimulus>

randomGrouping

List of stimuli tag names one of which will be randomly selected, unless the selection has been predetermined by a metadata field value or by URL GET parameters.

<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
</randomGrouping>

tag

Optional stimuli tag which will be used to select stimuli when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL.

<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
String
</tag>

list

Optional list of stimulus IDs separated by - which will be used when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL. Any whitespace will be ignored so the configuration can have one stimulus per line (providing the - is present), if needed for readability.

<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
String
</list>

stimuli

List of stimuli tag names which determine which stimuli are selected. All stimuli which contain any of the tags will be included in the list of stimuli. The number of selected stimuli will be limited to the maximum that has been requested. The stimuli selected by these tags will always be selected even if a randomGrouping is used.

<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
<tag>
</stimuli>

tag



<tag>
String
</tag>

loadStimulusPlugin

This feature allows plugins to be used to extend the functionality of loadStimulusType." style="text-transform: uppercase;"> class="Classpath to the required plugin which must be available at compile time."
*="Custom attributes can be assigned in the plugin associated with this feature."

localStorageData

For use in the debug type presenters to show the data stored in the local storage. Use with caution because there can be a lot of data.

<localStorageData/>

logMediaTimeStamp

Logs a timestamp with the current time position for any media with a mediaId that matches the provided regex string.

<logMediaTimeStampeventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
mediaId="String" String
/>

logTimeStamp

Records a timestamp similar to the way image and media onLoad events etc. are logged. The logged ms is relative to the load time of the presenter.

<logTimeStampeventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
/>

logTimerValue

Added a record in the admin system of the current milliseconds for a persistent timer which is identified by its listenerId.

<logTimerValuedataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
listenerId="String" String
/>

logTokenText

Logs data to the tag pair data table. The value of dataLogFormat will have any string tokens replaced and stored in the TagValue2 column. When provided the value of type and headerKey will be stored in the EventTag and TagValue1 columns respectively.

<logTokenTextdataChannel="Integer (optional)"
dataLogFormat="String" String
headerKey="String (optional)" String
type="String" String
/>

matchOnEvalTokens

Compares the matchingRegex against the result of evaluateTokens after any metadata field tokens have been resolved, any arithmetic and boolean comparisons have been resolved.

<matchOnEvalTokensevaluateTokens="String" String
matchingRegex="String" Regular expression that will be used to determin a match.
>
<conditionTrue>
<conditionFalse>
<onError>
</matchOnEvalTokens>


<menuItemfeatureText="String" Text that will be visible to the user.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
target="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</menuItem>

metadataField

Adds a single metadata field input. The type of input depends on the regex of the metadata field. A date input will be used if the regex is [0-3][0-9]/[0-1][0-9]/[1-2][0-9][0-9][0-9]. A checkbox will be used if the regex is true|false. A text area will be used (multiline) rather than a text box (single line) if the regex contains \\s. A select box will be used if the regex is a | separated list (except when { is used indicating a regular expression).

<metadataFieldfieldName="Post Name String" The postName used to identify a metadata field.
/>

metadataFieldConnection



<metadataFieldConnectionfieldName="Post Name String" The postName used to identify a metadata field.
linkedFieldName="Post Name String" The postName used to identify a linked metadata field.
oneToMany="String" String
/>

metadataFieldDateTriggered

Adds a metadata field input, the value and state of which is linked to the value of a date input field. This field must be a selection list type and the selected item is determined by a corresponding item in the daysThresholds which is a list of values representing the days since the other field date. The intended use is to trigger the selection of the item index of this metadataField based on the calculated age in days from linkedFieldName. When value of the linked input field matches the visibleRegex this input field will be visible, otherwise it will be hidden. If the value of the linked input field matches the enabledRegex this input field will be enabled and the user can modify the selected value, otherwise it will be disabled to prevent the date assigned value being changed.

<metadataFieldDateTriggereddaysThresholds="String" String
enabledRegex="String" String
fieldName="Post Name String" The postName used to identify a metadata field.
linkedFieldName="Post Name String" The postName used to identify a linked metadata field.
visibleRegex="String" String
/>

metadataFieldVisibilityDependant

Adds a metadata field input, the state of which is linked to the value of another input field. When value of the linked input field matches the visibleRegex this input field will be visible, otherwise it will be hidden. If the value of the linked input field matches the enabledRegex this input field will be enabled, otherwise it will be disabled to prevent input.

<metadataFieldVisibilityDependantenabledRegex="String" String
fieldName="Post Name String" The postName used to identify a metadata field.
linkedFieldName="Post Name String" The postName used to identify a linked metadata field.
visibleRegex="String" String
/>

pause

Pause in milliseconds. When the time is up the contents of this element are evaluated. If tokens are required to calculate the ms value, an evaluatePause can be used.

<pausemsToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</pause>

pauseMedia

Triggers pause on any media with a mediaId that matches the provided regex string.

<pauseMediamediaId="String" String
/>

plainText



<plainTextfeatureText="String" Text that will be visible to the user.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</plainText>

playMedia

Triggers play on any media with a mediaId that matches the provided regex string.

<playMedialoop="Boolean (optional)" When true the media playback will be set to play in a loop. When false the media will be set to play once then stop.
mediaId="String" String
/>

preloadAllStimuli



<preloadAllStimulitags="Stimulus Tags" Space separated list of stimulus tags [a-Z0-9]
>
<onSuccess>
<onError>
</preloadAllStimuli>

progressIndicator



<progressIndicatorevaluateTokens="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<onSuccess>
<onError>
</progressIndicator>

randomMsPause

Pause for a random number of milliseconds that is not less than minimum and not more than maximum. When the time is up the contents of this element are evaluated.

<randomMsPausemaximum="Integer" Maximum value.
minimum="Integer" Minimum value.
>
</randomMsPause>

recorderToneInjection

Injects an audible tone into the current recording stream (providing there is an active recording) for use as a timestamp when processing the resulting data. The audio marker is in the form a DTMF tone. A timestamp will also be stored in the database similar to that produced by <logTimeStamp>.

<recorderToneInjectiondtmf="dtmfType [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, *, #, off] (optional)" Starts or stops the production of DTMF tones (dual-tone multi-frequency signaling) which can be used to encode some timing information in an audio output. The DTMF tone values can be decoded directly from the audio output or from subsequent audio recordings.
/>

redirectToUrl

Redirects the experiment to the URL specified in src. This feature cannot do error checking and therefore does not have onError or onSuccess because the experiment (calling page) has gone out scope by the time any error might occur.

<redirectToUrlsrc="String" String
/>

regionAppend

Starts or resumes a region, allowing contents to be added to a given location in the presenter. If no region matching the regionId exists then a new region is created in the current location and then appended to. If a region of the same regionId already exists then it will be appended to.

<regionAppendregionId="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</regionAppend>

regionClear

If a region matching the regionId exists then it will cleared. Unlike clearPage clearing a region only removes the visual components, so any media that has been placed in the region should be stopped first. If no matching region exists then nothing will be done.

<regionClearregionId="String" String
/>

regionReplace

If a region matching the regionId exists then it will cleared. If no region matching the regionId exists then a new region is created in the current location. The resulting region is then appended to.

<regionReplaceregionId="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</regionReplace>

regionStyle

If a region matching the regionId exists then it will have the style applied. If no matching region exists then nothing will be done.

<regionStyleregionId="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

requestFocus

Requests focus to a single input specified by the matchingRegex if it exists and is visible. Only one input can have focus at a time so if multiple inputs match then the rest will be fail to gain focus.

<requestFocusmatchingRegex="String" Regular expression that will be used to determin a match.
/>

requestNotification

Request mobile notifications at given times in the future on Android and iOS apps. The presenters listed in targetOptions need to be comma separated and will be shown as buttons in the notification.

<requestNotificationdataLogFormat="String" String
featureText="String" Text that will be visible to the user.
fieldName="Post Name String" The postName used to identify a metadata field.
targetOptions="String (optional)" String
>
<onSuccess>
<onError>
<translationfeatureText="String (optional)" String
locale="String" String
>
</requestNotification>

resetStimulus

Clears the presenter's selected stimulus and the list of stimulus that have been seen so that the presenter can select a fresh list of stimuli.

<resetStimulustarget="String" String
/>

resetTrigger

Reset the threshold and maximum counters for triggerListeners matching the listenerId.

<resetTriggerlistenerId="String" String
/>

rewindMedia

Rewinds any media with a mediaId that matches the provided regex string.

<rewindMediamediaId="String" String
/>

row



<row>
</row>

saveMetadataButton

Checks the currently displayed metadata fields for valid input. If there are errors the relevant field input is highlighted. If sendData is true then the metadata is sent to the admin system before proceeding and network errors will trigger an onError. If sendData is false onSuccess will be triggered if the metadata is valid regardless of network connectivity.

<saveMetadataButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
sendData="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<onSuccess>
<onValidationError>
<onNetworkError>
<dataAgreementError>
<translationfeatureText="String (optional)" String
locale="String" String
>
</saveMetadataButton>

scoreAboveThreshold



<scoreAboveThresholdcorrectStreak="String (optional)" String
errorStreak="String (optional)" String
errorThreshold="String (optional)" String
gamesPlayed="String (optional)" String
potentialThreshold="String (optional)" String
scoreThreshold="String (optional)" String
>
<aboveThreshold>
<withinThreshold>
</scoreAboveThreshold>

scoreIncrement

Applies the provided score. When the value is positive, both the score and potential are incremented by the value and any correct streak is maintained. When the score is negative only the potential is incremented by the value and any incorrect streak is maintained. When the score is zero no change is made to either the score or potential, however both the correct and incorrect streaks are cleared.

<scoreIncrementdataChannel="Integer (optional)"
scoreValue="Integer" A positive number for achievements or a negative number for failures or zero for neither.
/>

scoreLabel



<scoreLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

selectLocaleMenu



<selectLocaleMenustyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

selectUserMenu

Shows a menu listing the users in the system. The label on each menu item is determined by value of the provided metadata field. When a menu item is clicked the active user is changed and the next presenter is shown.

<selectUserMenufieldName="Post Name String" The postName used to identify a metadata field.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

sendAllData



<sendAllData>
<onSuccess>
<onError>
</sendAllData>

sendMetadata

Sends the currently stored metadata field values to the admin system. For use in transmission type presenters.

<sendMetadata>
<onSuccess>
<onError>
</sendMetadata>

serverValueAssign

Assigns a value from targetOptions based on the distribution data known by the server for the given presenter and puts the result into the metadata field identified by fieldName. Any value in the metadata field will be overwritten when valueOptions is supplied. However if the metadata field contains an item from targetOptions it will be unchanged and the server assigned counts will not be affected.

<serverValueAssignfieldName="Post Name String" The postName used to identify a metadata field.
targetOptions="String (optional)" String
>
<onSuccess>
<onError>
</serverValueAssign>

serverValueComplete

Marks the server assigned value stored in the metadata field identified by fieldName as completed on the server. This will not change the value stored in the metadata field. If a new assignment is required then the metadata field would need to be manually cleared before requesting a new value via serverValueAssign. The completion of values will affect the distribution and therefore which values might be assigned next.

<serverValueCompletefieldName="Post Name String" The postName used to identify a metadata field.
>
<onSuccess>
<onError>
</serverValueComplete>

setMetadataEvalTokens

The value of evaluateTokens will have any string tokens replaced, followed by mathematical evaluation. The resulting number is then stored in the specified metadata field.

<setMetadataEvalTokensevaluateTokens="String" String
fieldName="Post Name String" The postName used to identify a metadata field.
>
<onSuccess>
<onError>
</setMetadataEvalTokens>

setMetadataValue

The value of dataLogFormat will have any string tokens replaced. Next if the replacementRegex is provided then the regex is applied and only the values of the regex capture groups will be kept, otherwise the entire string is used. The result is then stored in the specified metadata field.

<setMetadataValuedataLogFormat="String" String
fieldName="Post Name String" The postName used to identify a metadata field.
replacementRegex="String (optional)" String
/>

showButtonGroup

Shows any buttons with a groupId that matches the provided regex string.

<showButtonGroupmatchingRegex="String" Regular expression that will be used to determin a match.
/>

showColourReport



<showColourReportscoreThreshold="String (optional)" String
>
<aboveThreshold>
<withinThreshold>
</showColourReport>

showCurrentMs



<showCurrentMs/>

showHtmlPopup



<showHtmlPopupfeatureText="String" Text that will be visible to the user.
>
<actionButton>
<actionTokenButton>
<translationfeatureText="String (optional)" String
locale="String" String
>
</showHtmlPopup>

startFrameRateTimer

Starts a timer that evaluates its triggers before each frame is rendered in the browser. The resolution of these triggering events will be no less that the framerate, but the actual time resolution is browser dependant.

<startFrameRateTimer>
<addFrameTimeTrigger>
</startFrameRateTimer>

startTimer

Starts a persistent timer which is identified by its listenerId. The start time is the moment the first startTimer for a given listenerId is encountered (this start time is recorded in the local storage data). This start time is persistent over page loads and navigation and can only be reset by a clearTimer followed by a startTimer. The content of the startTimer element is scoped to the presenter and will not trigger outside of the presenter that contains it. Each startTimer creates a callback that will trigger when the timer reaches the ms value, but will not trigger if that time has already passed while the presenter was not active. Multiple startTimer tags with the same listenerId can be used, each will share the same start moment allowing multiple events to be synchronised on one timer.

<startTimerlistenerId="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</startTimer>

stimuliValidation

For use in the debug type presenters to show the results of stimuli randomisation for each selection in the configuration file.

<stimuliValidation/>

stopStimulusStopwatch

Each stimulus response can have a number of stimulus time periods recorded. At the point when the time period should end the named period should be stopped. The stopwatch values are recorded in the stimulus response events for each stimulus based on the eventId attribute.

<stopStimulusStopwatcheventId="Post Name String (optional)" Event identifier.
/>

styleButtonGroup

Applies the provided style to any buttons with a groupId that matches the provided regex string.

<styleButtonGroupmatchingRegex="String" Regular expression that will be used to determin a match.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

submitTestResults



<submitTestResults>
<onSuccess>
<onError>
</submitTestResults>

svgLoadGroups

Load compiled SVG data for use as image groups. Each group must be named in the SVG file.

<svgLoadGroupssrc="String" String
>
</svgLoadGroups>

switchUserIdButton

Switch the user id to the value in the specified metadata field. The value of the field is first validated against the provided regex. Care should be used to make sure that the field contains a valid user id.

<switchUserIdButtonfeatureText="String" Text that will be visible to the user.
fieldName="Post Name String" The postName used to identify a metadata field.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
validationRegex="String" String
>
<onSuccess>
<onError>
<translationfeatureText="String (optional)" String
locale="String" String
>
</switchUserIdButton>

table



<tableshowOnBackButton="Boolean (optional)" When true the component will be invisible until the browser back button is clicked. Repeated clicks will toggle the visibility. The feature cannot be used in conjunction with a presenter back attribute.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</table>

targetButton

Creates a button which when clicked navigates to the target presenter.

<targetButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
target="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</targetButton>

targetFooterButton

Creates a button in the footer which when clicked navigates to the target presenter.

<targetFooterButtonfeatureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
target="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</targetFooterButton>

timerLabel

Adds a label that shows the time value of listenerId minus msToNext and formats the result with msLabelFormat (similar to countdownLabel).

<timerLabellistenerId="String" String
msLabelFormat="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

totalScoreAboveThreshold



<totalScoreAboveThresholderrorThreshold="String (optional)" String
gamesPlayed="String (optional)" String
potentialThreshold="String (optional)" String
scoreThreshold="String (optional)" String
>
<aboveThreshold>
<withinThreshold>
</totalScoreAboveThreshold>

transmitResults

Transmits the values of the metadata fields that match the sendingRegex to the endpoint defined in stagingUrl and productionUrl of the validationService. Any metadata fields returned from that service which match the sendingRegex will be updated if there is such a field. If the connection to the registration service returns a 200 response then onSuccess is triggered. Depending on the validation service an onSuccess might only indicate a network success and does not always indicate a validated state from the validation service, you will also need to check the receiving fields. If there is a network error or the registration service returns a non 200 response then onError will be triggered. One and only one of either onError or onSuccess will always be triggered, however the time required to trigger will depend on network conditions.

<transmitResultsdataLogFormat="String" String
receivingRegex="String" String
sendingRegex="String" String
>
<onSuccess>
<onError>
</transmitResults>

triggerDefinition

The contents of this element will be activated when matched by the listenerId attribute of trigger or triggerRandom (for example). Based on the threshold and maximum values a trigger request does not always result in the trigger activating. The threshold is the number of activation requests before it will trigger. The maximum is the number of times the trigger can occur after which activation requests will be ignored. So a triggerDefinition with threshold 3 and maximum 1 would require three activation requests to trigger and it would not trigger again. A triggerDefinition can have more than one stimulus available (eg when it is in an eachStimulus or hasMoreStimulus). If this is the case then stimulus where triggerDefinition is defined will be used. If there is no stimulus where the triggerDefinition is defined then the stimulus from the point at which it is triggered will be used.

<triggerDefinitionlistenerId="String" String
maximum="Integer" Maximum value.
threshold="Integer" Threshold value.
>
</triggerDefinition>

triggerMatching

Trigger all triggerListeners matching the listenerId providing the threshold and maximum values are within the required values. The listenerId can contain tokens eg <stimulusCode>.

<triggerMatchinglistenerId="String" String
/>

triggerRandom

Randomly trigger one any of the triggerListeners where the listenerId matches the matchingRegex and its maximum trigger count has not been reached. When there are no triggerListeners that match these criteria the child contents of tag will be triggered.

<triggerRandommatchingRegex="String" Regular expression that will be used to determin a match.
>
</triggerRandom>

uploadUsersDataMenu

For use in the debug type presenters to show a data upload menu for all participants that have data on the local device. The participant label on each button is determined by the fieldName attribute. Data for each participant will be automatically uploaded unless the dataAgreementField is set in the XML, in which case the data will be uploaded only if the agreement field matches the required value. If the participant data has been successfully sent to the server then a deletion button will be shown to remove the participant from the device. If there is an error writing to the local storage an error page will be shown that includes this menu.

<uploadUsersDataMenufieldName="Post Name String" The postName used to identify a metadata field.
/>

userInfo



<userInfo/>

validateMetadata

Validates the current user id and the metadata fields (as listed in the validationService section of the experiment configuration file) to the to the Frinex admin (unless another endpoint is defined in the stagingUrl and productionUrl of the validationService), the corresponding return metadata fields from this validationService section will be updated locally from the values previously saved in the admin system.

<validateMetadata>
<onSuccess>
<onError>
</validateMetadata>

versionData



<versionData/>

videoInputSelectWeb

Shows a select box of the available video input devices for use with streamGroupCamera. When an device is selected it will be used as the first preference when the next stream is started.

<videoInputSelectWebdeviceRegex="String (optional)" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<onSuccess>
<onError>
</videoInputSelectWeb>

withStimuli



<withStimuliadjacencyThreshold="Integer (optional)" Sets a window of allowed proximity between stimuli that can be condisered the same. When greater than 0 the list of stimuli will be checked after randomisation for adjacency within the specified window and modified accordingly. If matching items are within the adjacency window, one of the items will be moved to a new position, in some cases a new position without an adjacent match will not be possible. The first attribute that has a value out of image, audio, video or label is used in the comparison. For example adjacencyThreshold 3 would disallow abcad and an attempt to rerandomise would follow. Defaults to 3 when not provided.
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
maxStimuli="String (optional)" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
repeatCount="Integer (optional)" When greater than zero the list will be repeated the selected items by the number of times specified without changing the order of the items. For example if repeat count was 3 then the result might be 321432143214 for example.
repeatRandomWindow="Integer (optional)" When greater than 0 all items will be randomised again after the repeatCount has been applied. This randomisation is constrained to the designated window of items causing the randomisation to be done in a moving window across all items. When used in conjunction with repeatCount this allows randomisation without adjacency at the boundary of repeats. For example, if a repeatCount of 3 resulted in 321432143214 a repeatRandomWindow of 2 could produce 231342413124 but cannot produce 214331322144. Whereas a repeatRandomWindow of 12 would randomise all items to any location and could produce 214331322144.
>
<beforeStimulus>
<eachStimulus>
<afterStimulus>
<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
</withStimuli>

randomGrouping

List of stimuli tag names one of which will be randomly selected, unless the selection has been predetermined by a metadata field value or by URL GET parameters.

<randomGroupingconsumedTagGroup="String (optional)" When a tag is selected for use, it is put into this named list and will not be selected again, providing this named list is used. This allows a stimuli selection process to carry over between presenters.
storageField="String (optional)" If this metadata field contains one of the tags or alias, it will be used. Otherwise a random tag is selected for use, it is then stored in this metadata field. This allows a stimuli selection process to carry over between presenters.
>
<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
</randomGrouping>

tag

Optional stimuli tag which will be used to select stimuli when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL.

<tagalias="String (optional)" This tag will be used when the contents of the storageField matches the value of alias.
>
String
</tag>

list

Optional list of stimulus IDs separated by - which will be used when the value of the storageField equals the alias. In practice the storageField would usually be set by GET parameter in the URL. Any whitespace will be ignored so the configuration can have one stimulus per line (providing the - is present), if needed for readability.

<listalias="String" This list will be used when the contents of the storageField matches the value of alias. For example storageField="selectList" and alias="s6" would match with GET parameter selectList=s6 in the URL.
>
String
</list>

stimuli

List of stimuli tag names which determine which stimuli are selected. All stimuli which contain any of the tags will be included in the list of stimuli. The number of selected stimuli will be limited to the maximum that has been requested. The stimuli selected by these tags will always be selected even if a randomGrouping is used.

<stimuliidListField="String (optional)" When provided this metadata field must contain a list of stimuli IDs separated by commas which will then be used in the stimuli selection process. This allows stimuli lists to be generated and stored between presenters.
>
<tag>
</stimuli>

tag



<tag>
String
</tag>

zeroStimulusStopwatch

Each stimulus response can have a number of stimulus time periods recorded. At the point when the time period should start the named period should be zeroed. The stopwatch values are recorded in the stimulus response events for each stimulus based on the eventId attribute.

<zeroStimulusStopwatcheventId="Post Name String (optional)" Event identifier.
/>


Stimulus Features

AnnotationTimelinePanel



<AnnotationTimelinePanelcolumnCount="String" String
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
maxStimuli="String (optional)" String
poster="String" String
src="String" String
>
</AnnotationTimelinePanel>

VideoPanel



<VideoPanelmaxHeight="String" String
maxWidth="String" String
percentOfPage="String" String
poster="String" String
src="String" String
/>

addStimulusCodeResponseValidation

Adds a stimulus validation listener for StimulusCodeResponses, so that they can be validated like other stimulus response types. The response is validated based on the matching of the validationRegex. If the validation fails the featureText will be shown to hint the user what is required. The groupId determines the stimulus response group so that multiple responses can exist for each stimulus. If groupId contain tokens they will be replaced with the respective values.

<addStimulusCodeResponseValidationdataChannel="Integer (optional)"
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
validationRegex="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</addStimulusCodeResponseValidation>

clearCurrentScore

Clears the current score and sets the current score group string based on the evaluateTokens. The score group is a marker shown in the admin system to keep track of the records and does not affect the score collection process.

<clearCurrentScoredataChannel="Integer (optional)"
evaluateTokens="String" String
/>

clearStimulusResponse

Clears the locally stored response to the current stimulus. If groupId is provided then only the matching response group will be cleared, otherwise all responses for that stimulus are cleared.

<clearStimulusResponsegroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
/>

currentStimulusHasTag



<currentStimulusHasTagtags="Stimulus Tags" Space separated list of stimulus tags [a-Z0-9]
>
<conditionTrue>
<conditionFalse>
</currentStimulusHasTag>

endAudioRecorderTag



<endAudioRecorderTageventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
eventTier="String" String
/>

keepStimulus



<keepStimulus/>

matchingStimulusGrid



<matchingStimulusGridanimate="String (optional)" String
columnCount="String" String
dataChannel="Integer (optional)"
matchingRegex="String" Regular expression that will be used to determin a match.
maxStimuli="String (optional)" String
maxWidth="String" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
>
<responseCorrect>
<responseIncorrect>
</matchingStimulusGrid>

nextMatchingStimulus



<nextMatchingStimulus/>

nextStimulus

Increments the current stimulus and triggers hasMoreStimulus. This will not submit a stimulus response on its own. If however there are no more stimuli then endOfStimulus will be triggered.

<nextStimulusrepeatIncorrect="String" String
/>

nextStimulusButton

Adds a button that when clicked increments the current stimulus and triggers hasMoreStimulus. This button will not submit a stimulus response on its own. If however there are no more stimuli then endOfStimulus will be triggered when the button is clicked.

<nextStimulusButtoneventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
repeatIncorrect="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</nextStimulusButton>

prevStimulus

Decrements the current stimulus and triggers hasMoreStimulus. This will not submit a stimulus response on its own. If however there is no previous stimulus then endOfStimulus will be triggered.

<prevStimulusrepeatIncorrect="String" String
/>

prevStimulusButton

Adds a button that when clicked decrements the current stimulus and triggers hasMoreStimulus. This button will not submit a stimulus response on its own. If however there is no previous stimuli then endOfStimulus will be triggered when the button is clicked.

<prevStimulusButtoneventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
repeatIncorrect="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</prevStimulusButton>

ratingButton

Adds rating buttons based on the ratingLabels provided. If the rating label contains the numbers 0 to 9 then those number keys will be available as hotkeys. If there are exactly two rating labels then the keys z and . will be available as hotkeys. If groupId contains tokens they will be replaced with the respective values.

<ratingButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
ratingLabels="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</ratingButton>

ratingCheckbox



<ratingCheckboxdataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
ratingLabels="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</ratingCheckbox>

ratingFooterButton

Adds rating buttons in the footer based on the ratingLabels provided. If the rating label contains the numbers 0 to 9 then those number keys will be available as hotkeys. If there are exactly two rating labels then the keys z and . will be available as hotkeys. If groupId contains tokens they will be replaced with the respective values.

<ratingFooterButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
ratingLabels="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</ratingFooterButton>

ratingRadioButton



<ratingRadioButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
ratingLabels="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</ratingRadioButton>

regionCodeStyle

If a region matching the regionId exists then the styleName will have any tokens evaluated before the resulting style name is applied to the region. If no matching region exists then nothing will be done.

<regionCodeStyleregionId="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

regionDragDrop

If a region matching the regionId exists then the options of draggable and droppable will be applied making the region draggable or a drop target or both. The codeFormat of both the dragged item and the drop target will be set as the stimulus response for the drag action. If no matching region exists then nothing will be done.

<regionDragDropcodeFormat="String" String
dataChannel="Integer (optional)"
draggable="Boolean (optional)" When true the item will be set as draggable. Will have no effect when false or not present.
droptarget="Boolean (optional)" When true the item will be set as a drop target for drag actions. Will have no effect when false or not present.
regionId="String" String
>
<ondragstart>
<ondragover>
<ondrop>
</regionDragDrop>

removeMatchingStimulus



<removeMatchingStimulusmatchingRegex="String" Regular expression that will be used to determin a match.
/>

scoreIncrement

Applies the provided score. When the value is positive, both the score and potential are incremented by the value and any correct streak is maintained. When the score is negative only the potential is incremented by the value and any incorrect streak is maintained. When the score is zero no change is made to either the score or potential, however both the correct and incorrect streaks are cleared.

<scoreIncrementdataChannel="Integer (optional)"
scoreValue="Integer" A positive number for achievements or a negative number for failures or zero for neither.
/>

sendStimuliReport



<sendStimuliReportdataChannel="Integer (optional)"
headerKey="String (optional)" String
separator="String (optional)" String
type="String" String
/>

setStimulusCodeResponse

Sets a response to the current stimulus with the value of codeFormat. The groupId determines the stimulus response group so that multiple responses can exist for each stimulus. If groupId or codeFormat contain tokens they will be replaced with the respective values.

<setStimulusCodeResponseapplyScore="Boolean" If set to true then the stimulus response is compared to the stimulus correctResponses and a score is given accordingly.
codeFormat="String" String
dataChannel="Integer (optional)"
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
/>

showStimuliReport



<showStimuliReport/>

showStimulus

Repeats the current stimulus by triggering hasMoreStimulus. If there is no current stimulus then endOfStimulus will be triggered.

<showStimulus>
</showStimulus>

showStimulusGrid



<showStimulusGridanimate="String (optional)" String
columnCount="String" String
dataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
imageWidth="String" String
maxStimuli="String (optional)" String
>
<responseCorrect>
<responseIncorrect>
</showStimulusGrid>

showStimulusProgress



<showStimulusProgressstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

startAudioRecorderApp

Starts the Android wav recorder, the recorded wav files will be saved on the device in a sub directories based on value of the provided metadata field and the eventTag. The recording indicator can be customised by redefining the .recordingLabel style, however it must be clear to the user that audio is being recorded, otherwise your mobile apps might get banned by iOS and PlayStore.

<startAudioRecorderAppeventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
fieldName="Post Name String" The postName used to identify a metadata field.
filePerStimulus="String" String
>
<onSuccess>
<onError>
</startAudioRecorderApp>

startAudioRecorderTag



<startAudioRecorderTageventTier="String" String
/>

startAudioRecorderWeb

Starts the HTML5 audio recorder which will send the recorded audio to the admin database. If downloadPermittedWindowMs is a positive number then the uploaded audio can be downloaded from the server for playback within that period of time for user verification, otherwise playback will not be possible. The onSuccess will be triggered when the recording has started. The onError will be triggered if the recorder cannot start. If the upload or playback fails then mediaLoadFailed will be triggered. Upload failure will also result in a subsequent upload attempt. When the recorded audio data has been submitted the mediaLoaded will be triggered even if playback is not enabled by downloadPermittedWindowMs, this allows upload verification before proceeding. The featureText is shown in the recording label. When the featureText is 00:00:00 the recording time will be shown in the recording label. When the featureText is "hidden" the recording label will not be shown (never record without explicit consent). The name of the audio input device used for the recording will be stored in the admin system. If the levelIndicatorStyle is set then a recording level indicator will be shown. If levelIndicatorStyle is set and a region with the ID of AudioRecorderWebLevelIndicator exists then that region will be used to position the recording level indicator. The recording indicator can be customised by redefining the .recordingLabel style, however it must be clear to the user that audio is being recorded, otherwise your mobile apps might get banned by iOS and PlayStore.

<startAudioRecorderWebautoGainControl="Boolean (optional)" When present this value will be passed on to web browser when the recording starts. Implementation is browser and platform specific.
deviceRegex="String (optional)" String
downloadPermittedWindowMs="Integer" A time window in milliseconds within which download from the server will be allowed. When set to a non zero value the recording will be downloaded from the server ready for playback. So if playback of the recorded audio is not needed then this should be set to 0 to save bandwidth.
echoCancellation="Boolean (optional)" When present this value will be passed on to web browser when the recording starts. Implementation is browser and platform specific.
featureText="String" Text that will be visible to the user.
levelIndicatorStyle="String (optional)" The CSS style name to use for the audio recording level indicator. When not present the audio level indicator will not be shown.
mediaId="String" String
noiseSuppression="Boolean (optional)" When present this value will be passed on to web browser when the recording starts. Implementation is browser and platform specific.
recordingFormat="recordingFormatType [wav, ogg, ogv] (optional)"
>
<onSuccess>
<onError>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
<translationfeatureText="String (optional)" String
locale="String" String
>
</startAudioRecorderWeb>

stimulusAudio



<stimulusAudioautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
mediaId="String" String
showPlaybackIndicator="String" String
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</stimulusAudio>

stimulusButton



<stimulusButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</stimulusButton>

stimulusCodeAudio



<stimulusCodeAudioautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
codeFormat="String" String
mediaId="String" String
showPlaybackIndicator="String" String
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</stimulusCodeAudio>

stimulusCodeImage



<stimulusCodeImagecodeFormat="String" String
dataChannel="Integer (optional)"
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
</stimulusCodeImage>

stimulusCodeImageButton



<stimulusCodeImageButtoncodeFormat="String" String
dataChannel="Integer (optional)"
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<onActivate>
</stimulusCodeImageButton>

stimulusCodeVideo



<stimulusCodeVideoautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
codeFormat="String" String
loop="Boolean (optional)" When true the media playback will be set to play in a loop. When false the media will be set to play once then stop.
maxHeight="String" String
maxWidth="String" String
mediaId="String" String
percentOfPage="String" String
showControls="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</stimulusCodeVideo>

stimulusExists



<stimulusExistsoffset="String" String
>
<conditionTrue>
<conditionFalse>
</stimulusExists>

stimulusFreeText

Adds a free text input for stimulus responses to be entered. If allowedCharCodes is provided then only those characters can be entered into the text box, if a disallowed character is entered then the inputErrorMessage will be shown. The stimulus response text is validated against the validationRegex which can also contain tokens such as <stimulusCorrectResponses>. If the stimulus response text does not match the validationRegex then the featureText message will be shown on validation. If a hotKey is provided and its value corresponds to the hotKey of a button in the presenter then that button will be activated by that key in the free text field. If the hotKey="ENTER" then the text input will be limited to a single line (because only one line can be entered without the enter key). When multiline input is allowed the validationRegex will need to match on all lines, so that any empty line does not fail the validation test. Matching all lines can be done with a validationRegex of [\\s\\S]{1,} where the 1 indicates the minimum input, alternatively [\\s\\S]* can be used if no minimum input is required.

<stimulusFreeTextallowedCharCodes="String (optional)" String
dataChannel="Integer (optional)"
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
inputErrorMessage="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
validationRegex="String" String
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</stimulusFreeText>

stimulusHasRatingOptions



<stimulusHasRatingOptions>
<conditionTrue>
<conditionFalse>
</stimulusHasRatingOptions>

stimulusHasResponse

When groupId is omitted conditionTrue will trigger if the current stimulus has any response. If groupId and matchingRegex are provided this will only trigger if a the current stimulus has a response in that group that matches the regex. If groupId contains tokens they will be replaced with the respective values before the evaluation.

<stimulusHasResponsegroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
matchingRegex="String" Regular expression that will be used to determin a match.
>
<conditionTrue>
<conditionFalse>
</stimulusHasResponse>

stimulusImage



<stimulusImagedataChannel="Integer (optional)"
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
</stimulusImage>

stimulusImageCapture



<stimulusImageCapturefeatureText="String" Text that will be visible to the user.
maxHeight="String" String
maxWidth="String" String
msToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
percentOfPage="String" String
>
</stimulusImageCapture>

stimulusLabel



<stimulusLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

stimulusMetadataField

Adds a metadata field input for the current stimulus. The user entered value will be stored in the stimulus data identifiable via the postName of the field.

<stimulusMetadataFielddataChannel="Integer (optional)"
fieldName="Post Name String" The postName used to identify a metadata field.
/>

stimulusPause



<stimulusPause>
</stimulusPause>

stimulusPresent



<stimulusPresentanimate="String (optional)" String
dataChannel="Integer (optional)"
maxHeight="String" String
maxWidth="String" String
percentOfPage="String" String
replacement="String (optional)" String
replacementRegex="String (optional)" String
showControls="String" String
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</stimulusPresent>

stimulusRatingButton

Adds rating buttons for the current stimulus based on the ratingLabels of the stimulus. If the rating label contains the numbers 0 to 9 then those number keys will be available as hotkeys. If there are exactly two rating labels then the keys z and . will be available as hotkeys. If groupId contains tokens they will be replaced with the respective values.

<stimulusRatingButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</stimulusRatingButton>

stimulusRatingCheckbox

Adds a checkbox group for the current stimulus based on the ratingLabels of the stimulus.

<stimulusRatingCheckboxdataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</stimulusRatingCheckbox>

stimulusRatingRadio

Adds a radio button group for the current stimulus based on the ratingLabels of the stimulus.

<stimulusRatingRadiodataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
ratingLabelLeft="String (optional)" String
ratingLabelRight="String (optional)" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</stimulusRatingRadio>

stimulusSlider



<stimulusSliderdataChannel="Integer (optional)"
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
initial="Integer" Initial value.
maximum="Integer" Maximum value.
minimum="Integer" Minimum value.
orientation="orientationType [horizontal, vertical, flow] (optional)" Option List
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</stimulusSlider>

stimulusVideo



<stimulusVideoautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
loop="Boolean (optional)" When true the media playback will be set to play in a loop. When false the media will be set to play once then stop.
mediaId="String" String
showControls="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</stimulusVideo>

stopAudioRecorder



<stopAudioRecorder/>

stopStimulusStopwatch

Each stimulus response can have a number of stimulus time periods recorded. At the point when the time period should end the named period should be stopped. The stopwatch values are recorded in the stimulus response events for each stimulus based on the eventId attribute.

<stopStimulusStopwatcheventId="Post Name String (optional)" Event identifier.
/>

streamRecordStart

If a matching group stream exists then its contents will be recorded by the receiver and stored on the server simular to audio recordings. Recordings will be stored in 5-10 second sections. If no matching stream exists then nothing will be done.

<streamRecordStartmatchingRegex="String" Regular expression that will be used to determin a match.
>
<onSuccess>
<onError>
</streamRecordStart>

streamRecordStop

If a matching group stream exists and is being recorded then that recording will be stopped. If no matching stream exists then nothing will be done.

<streamRecordStopmatchingRegex="String" Regular expression that will be used to determin a match.
/>

touchInputCapture

Starts logging touch input of the participant.

<touchInputCapturedataChannel="Integer (optional)"
showControls="String" String
>
<captureStart>
<touchEnd>
</touchInputCapture>

validateStimuliResponses

Validates the current stimulus input that is visible in the presenter based on the validationRegex of each stimulus input if provided. Only when the stimulus input is enabled and visible will its validity be considered. After validation the stimulus response can be accessed via htmlTokenText and similar methods.

<validateStimuliResponses>
<conditionTrue>
<conditionFalse>
</validateStimuliResponses>

withMatchingStimulus



<withMatchingStimuluseventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
matchingRegex="String" Regular expression that will be used to determin a match.
maxStimuli="String (optional)" String
randomise="Boolean (optional)" When true the items will be randomised once before any repeats are calculated, when false the items will not be randomised. If the selected items were 1234, the result of randomise true might be 3214 for example.
repeatCount="Integer (optional)" When greater than zero the list will be repeated the selected items by the number of times specified without changing the order of the items. For example if repeat count was 3 then the result might be 321432143214 for example.
repeatRandomWindow="Integer (optional)" When greater than 0 all items will be randomised again after the repeatCount has been applied. This randomisation is constrained to the designated window of items causing the randomisation to be done in a moving window across all items. When used in conjunction with repeatCount this allows randomisation without adjacency at the boundary of repeats. For example, if a repeatCount of 3 resulted in 321432143214 a repeatRandomWindow of 2 could produce 231342413124 but cannot produce 214331322144. Whereas a repeatRandomWindow of 12 would randomise all items to any location and could produce 214331322144.
>
<hasMoreStimulus>
<endOfStimulus>
</withMatchingStimulus>

zeroStimulusStopwatch

Each stimulus response can have a number of stimulus time periods recorded. At the point when the time period should start the named period should be zeroed. The stopwatch values are recorded in the stimulus response events for each stimulus based on the eventId attribute.

<zeroStimulusStopwatcheventId="Post Name String (optional)" Event identifier.
/>


Group Features

groupChannelScoreLabel



<groupChannelScoreLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

groupMemberCodeLabel



<groupMemberCodeLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

groupMemberLabel



<groupMemberLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

groupMessageLabel



<groupMessageLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

groupResponseFeedback

Compares the current stimulus to the last group response stimulus. If the group response stimulus equals the current group stimulus then it is considered to be correct.

<groupResponseFeedback>
<responseCorrect>
<responseIncorrect>
</groupResponseFeedback>

groupResponseStimulusImage

Displays the stimulus image that the last group message had responded with.

<groupResponseStimulusImageanimate="String (optional)" String
dataChannel="Integer (optional)"
maxHeight="String" String
maxWidth="String" String
percentOfPage="String" String
>
<mediaLoaded>
<mediaLoadFailed>
<mediaPlaybackStarted>
<mediaPlaybackComplete>
</groupResponseStimulusImage>

groupScoreLabel



<groupScoreLabelstyleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
/>

sendGroupMessage

Sends a message to the group members that are in the current member's communication channel. The contents of the message is the last message received in the current users communication channel.

<sendGroupMessageeventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
incrementPhase="Integer" Increments the current group phase and triggers the relevant group activities for all members of the group.
/>

sendGroupMessageButton

Adds a button that will send a message to the group members that are in the current member's communication channel. The message content is the concatenated values of all freetext inputs currently in the presenter. If any freetext input is not valid then the relevant freetext input will show an error and the message will not be sent.

<sendGroupMessageButtondataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
featureText="String" Text that will be visible to the user.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
hotKey="hotKeyType [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, ALT, BACKSPACE, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, TAB, UP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE, SPACE, R1_MA_A, R1_MA_ENTER, R1_MA_BACK, R1_MA_LEFT, R1_MA_RIGHT, R1_MB_A, R1_MB_B, R1_MB_C, R1_MB_D, R1_MB_ENTER, R1_MB_BACK, R1_MC_A, R1_MC_B, R1_MC_C, R1_MC_D, R1_MC_ENTER, R1_MC_BACK, R1_MD_A, R1_MD_B, LP310_UP, LP310_UP_LONG_A, LP310_UP_LONG_B, LP310_DOWN, LP310_DOWN_LONG, LP310_MIDDLE, LP310_MIDDLE_LONG, LP310_MIDDLE_DOUBLE, ] (optional)" Option List
incrementPhase="Integer" Increments the current group phase and triggers the relevant group activities for all members of the group.
repeatIncorrect="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<translationfeatureText="String (optional)" String
locale="String" String
>
</sendGroupMessageButton>

sendGroupStoredMessage

Sends a message to the group members that are in the current member's communication channel. The message is the stored value of groupId for current stimulus. If groupId is not provided 'groupMessage' will be used. If the is no stored value then an empty message will be sent.

<sendGroupStoredMessageeventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
incrementPhase="Integer" Increments the current group phase and triggers the relevant group activities for all members of the group.
/>

sendGroupTokenMessage

Sends a message to the group members that are in the current member's communication channel. The contents of the message is the value of dataLogFormat after any string tokens have been replaced.

<sendGroupTokenMessagedataLogFormat="String" String
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
incrementPhase="Integer" Increments the current group phase and triggers the relevant group activities for all members of the group.
/>

streamGroupCamera

Shares a camera stream to other members of the group based on the stream communication channels. The stream is terminated when the containing region or page is cleared or when the group network ends.

<streamGroupCameradataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
resolution="Width and height (optional)" Width and height separated by x, eg 640x480
streamChannels="Group Channels" List of directional communication channels separated by | for the given streaming media. The members are separated by , in each channel. Only the first member in each channel will transmit into the stream while the remaining members in each channel will receive the stream.
>
<onSuccess>
<onError>
</streamGroupCamera>

streamGroupCanvas

Creates a canvas that is streamed to other members of the group based on the stream communication channels. The stream is terminated when the containing region or page is cleared or when the group network ends.

<streamGroupCanvasdataChannel="Integer (optional)"
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
resolution="Width and height (optional)" Width and height separated by x, eg 640x480
streamChannels="Group Channels" List of directional communication channels separated by | for the given streaming media. The members are separated by , in each channel. Only the first member in each channel will transmit into the stream while the remaining members in each channel will receive the stream.
>
<onSuccess>
<onError>
</streamGroupCanvas>

submitGroupEvent

Submits a record of the current group state from the perspective of the current group member to the admin database.

<submitGroupEvent/>


Other Specialised Features

aboveThreshold



<aboveThreshold>
</aboveThreshold>

addFrameTimeTrigger

Adds a trigger to the containing frame timer. When the timer has a value equal or greater than the specified milliseconds this trigger. Only one trigger per millisecond value can be assigned. If the events is triggered later than the threshold value in milliseconds (20ms is the minimum recommended value) beyond the requested time the onError will be triggered and the framerate timer will stop processing further events.

<addFrameTimeTriggerevaluateMs="String" String
threshold="Integer" Threshold value.
>
<onTime>
<onError>
</addFrameTimeTrigger>

afterStimulus



<afterStimulus>
</afterStimulus>

beforeStimulus



<beforeStimulus>
</beforeStimulus>

captureStart

When the touch input capture has started the contents of this element will be evaluated.

<captureStart>
</captureStart>

conditionFalse



<conditionFalse>
</conditionFalse>

conditionTrue



<conditionTrue>
</conditionTrue>

dataAgreementError



<dataAgreementError>
</dataAgreementError>

eachStimulus



<eachStimulus>
</eachStimulus>

endOfStimulus

Will be triggered if there are zero stimuli loaded or when a nextStimulus/Button event occurs on the last stimulus.

<endOfStimulus>
</endOfStimulus>

groupFindingMembers

When the the connection to the group server is established the second stage is waiting for the other group members.

<groupFindingMembers>
</groupFindingMembers>

groupInitialisationError

When the specified group already has enough members new members cannot be assigned to it or the member code has not been provided the contents of this element will be triggered. It is recommended that the paricipant is instructed here to request a new group which can be assigned in the URL along with the member code. Please note that a group and its members are rememberd on the server by design and reloading the page or clearing the browser storage will have no effect on group status.

<groupInitialisationError>
</groupInitialisationError>

groupMemberActivity

Member activities will be triggered when the member code and the current phase coincide. This is determined by the phase matrix defined in each phaseMembers attribute.

<groupMemberActivityphaseMembers="Group Phases" List of members for each phase. Each phase is separated by : and in each phase the matching members are separated by , when no members match a - is given for that phase.
>
</groupMemberActivity>

groupNetwork

Connects a group of participants so that they can interact in a defined manner during the experiment. For each stimulus there is a number of phases which is determined by phasesPerStimulus.

<groupNetworkgroupCommunicationChannels="Group Channels" List of communication channels separated by | for the group. The members are separated by , in each channel. Only members in the same channel will receive messages and these messages will only be from other members of the same channel.
groupMembers="Group Members" List of members separated by , with preferably only a-Z being used for the member names.
phasesPerStimulus="Integer" The number of phases per round in the group. When current phase reaches this value the next stimulus will be triggered.
>
<groupInitialisationError>
<groupNetworkConnecting>
<groupFindingMembers>
<groupNetworkSynchronising>
<groupPhaseListeners>
</groupNetwork>

groupNetworkConnecting

The first stage in setting up a group is connecting to the group server. The contents of this element will be triggered while this connection is being established.

<groupNetworkConnecting>
</groupNetworkConnecting>

groupNetworkSynchronising

For each stimulus change and phase change the group network needs to be synchronised. The contents of this element will be triggered while this synchronisation is being done.

<groupNetworkSynchronising>
</groupNetworkSynchronising>

groupPhaseListeners

The activities in the phase/participant matrix is defined here. Not all participants will see the same activity at the same time. It is possible for one, many or none to be triggered for any given phase member code combination.

<groupPhaseListeners>
<groupMemberActivity>
</groupPhaseListeners>

hasMoreStimulus



<hasMoreStimulus>
</hasMoreStimulus>

mediaLoadFailed

Will be triggered when the host system reports a failure. The timing of this depends on a few factors. If the network is unreachable it will fail quickly. Otherwise it will wait the timeout and probably some retry iterations. The timeout and retry parameters would differ per browser and probably are user configurable as well.

<mediaLoadFailed>
</mediaLoadFailed>

mediaLoaded



<mediaLoaded>
</mediaLoaded>

mediaPlaybackComplete



<mediaPlaybackComplete>
</mediaPlaybackComplete>

mediaPlaybackStarted



<mediaPlaybackStarted>
</mediaPlaybackStarted>

multipleUsers



<multipleUsers>
</multipleUsers>

onActivate



<onActivate>
</onActivate>

onError



<onError>
</onError>

onKeyDown



<onKeyDown>
</onKeyDown>

onKeyUp



<onKeyUp>
</onKeyUp>

onNetworkError



<onNetworkError>
</onNetworkError>

onSuccess



<onSuccess>
</onSuccess>

onTime



<onTime>
</onTime>

onTimer



<onTimer>
</onTimer>

onValidationError



<onValidationError>
</onValidationError>

ondragover



<ondragover>
</ondragover>

ondragstart



<ondragstart>
</ondragstart>

ondrop



<ondrop>
</ondrop>

responseCorrect



<responseCorrect>
</responseCorrect>

responseIncorrect



<responseIncorrect>
</responseIncorrect>

singleUser



<singleUser>
</singleUser>

svgGroupAction

Sets a button action to the image group as specified in the loaded SVG data.

<svgGroupActiongroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
>
</svgGroupAction>

svgGroupAdd

Appends the named section of the loaded SVG into the presenter.

<svgGroupAddgroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
visible="String" String
/>

svgGroupMatching

Sets the visibility of the matching child elements of the group which must have already been added to the presenter.

<svgGroupMatchingevaluateTokens="String" String
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
visible="String" String
/>

svgGroupShow

Sets the visibility of the section of SVG which must have already been added to the presenter.

<svgGroupShowgroupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
visible="String" String
/>

svgSetLabel

Sets the text value of the SVG text element matching groupId.

<svgSetLabelevaluateTokens="String" String
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
/>

touchEnd

When the touch input capture anywhere on the screen has ended the contents of this element will be evaluated. If msToNext to next is provided then a gap of that ms time is permitted between touches without triggering the touchEnd.

<touchEndmsToNext="Integer" The milliseconds to delay after completion. The resulting delay is approximate and variability should be tested in the intended environment.
>
</touchEnd>

touchInputImageButton

Creates touch input image button for use on tablets/mobile devices which responds to touch input from the participant.

<touchInputImageButtoncodeFormat="String" String
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<onActivate>
</touchInputImageButton>

touchInputLabelButton

Creates touch input label button for use on tablets/mobile devices which responds to touch input from the participant.

<touchInputLabelButtoncodeFormat="String" String
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
</touchInputLabelButton>

touchInputStop

Stops the touch input capture and submits the logged touch input of the participant since touch input capture was started and then stops the input capture. This action is implicit but this feature allows the capture to be terminated early.

<touchInputStop/>

touchInputVideoButton

Creates touch input video button for use on tablets/mobile devices which responds to touch input from the participant.

<touchInputVideoButtonautoPlay="Boolean" When true media will be played as soon as it has loaded. Modern web browsers will prevent media from playing before the user interacts with the page after each time it has loaded. If this is an issue, it can be overcome by always having a begin button, or by having a replay button in the case of an initial failure.
codeFormat="String" String
eventTag="String (optional)" When present this tag will be logged in the timestamps table as close as possible to the moment the event occurs.
groupId="String (optional)" This value is used in multiple ways depending on the context, to set the button group name used to enable and disable button groups, to assign the storage name for stimulus responses and the field name in the JSON data transmitted to the admin server so that multiple responses can be collected for a single stimulus.
loop="Boolean (optional)" When true the media playback will be set to play in a loop. When false the media will be set to play once then stop.
mediaId="String" String
styleName="String (optional)" One or more CSS stylenames to apply to the feature. These can be the built in styles or custom styles defined in the SCSS section.
>
<mediaLoaded>
<mediaLoadFailed>
<onActivate>
</touchInputVideoButton>

withinThreshold



<withinThreshold>
</withinThreshold>


Token Text Features

groupScore

Outputs the current score of the group in a group experiment.

groupScore
Example: evaluateTokens="::groupScore::"
Result: 8

channelScore

Outputs the current score of the current channel in a group experiment.

channelScore
Example: evaluateTokens="::channelLoop::::channelScore::, ::/channelLoop::"
Result: 6, 2,

channelLabel

Outputs the label of the current channel in a group experiment.

channelLabel
Example: evaluateTokens="::channelLoop::::channelLabel::
::/channelLoop::"
Result: A-B
C-D

channelLoop

Loops over the channels in a group experiment.

channelLoop
Example: evaluateTokens="::channelLoop::channel ::channelLabel:: has ::channelScore:: points
::/channelLoop::"
Result: channel A-B has 6 points
channel C-D has 2 points

groupMemberCode

Outputs the member code of the local member in a group experiment.

groupMemberCode
Example: evaluateTokens="::groupMemberCode::"
Result: A

groupRequestedPhase

Outputs the phase that should currently be displayed in a group experiment.

groupRequestedPhase
Example: evaluateTokens="::groupRequestedPhase::"
Result: 1

formatDateTime

Formats the date and time according to the string provided.

formatDateTime
Example: evaluateTokens="::formatDateTime_yyyy MM dd, HH:mm::"
Result: 2023 12 25, 08:30

mediaLength

Outputs the last known length in seconds of the media associated with the mediaId. This value may be less accurate until the media has finished playing or recording.

mediaLength
Example: evaluateTokens="::mediaLength_recording01::"
Result: 12.5

stimulusId

Outputs the current stimulus Id.

stimulusId
Example: evaluateTokens="::stimulusId::"
Result: d1e286

stimulusLabel

Outputs the current stimulus label.

stimulusLabel
Example: evaluateTokens="::stimulusLabel::"
Result: One

stimulusCode

Outputs the current stimulus code.

stimulusCode
Example: evaluateTokens="::stimulusCode::"
Result: code

stimulusCorrectResponses

Outputs the current stimulus correct responses.

stimulusCorrectResponses
Example: evaluateTokens="::stimulusCorrectResponses::"
Result: Correct|Responses

stimulusRatingLabels

Outputs the current stimulus rating labels.

stimulusRatingLabels
Example: evaluateTokens="::stimulusRatingLabels::"
Result: Rating,Labels

stimulusRatingLabel_

Outputs the current stimulus rating label N.

stimulusRatingLabel_
Example: evaluateTokens="::stimulusRatingLabel_1::"
Result: Labels

stimulusAudio

Outputs the current stimulus audio.

stimulusAudio
Example: evaluateTokens="::stimulusAudio::"
Result: Audio

stimulusVideo

Outputs the current stimulus video.

stimulusVideo
Example: evaluateTokens="::stimulusVideo::"
Result: Video

stimulusImage

Outputs the current stimulus image.

stimulusImage
Example: evaluateTokens="::stimulusImage::"
Result: Image

stimulusTags

Outputs the current stimulus tags.

stimulusTags
Example: evaluateTokens="::stimulusTags::"
Result: tag_number,tag_interesting

stimulusPauseMs

Outputs the current stimulus pause ms.

stimulusPauseMs
Example: evaluateTokens="::stimulusPauseMs::"
Result: 0

stimulusResponse

Outputs the stored responses of a specified stimulus Id of the current stimulus when the Id is blank. If a response group is provided that response value will be shown. For example a stimulus with the Id of D123 that has the response of ImageViewed and a group response of ButtonThreeClicked would output the following.

stimulusResponse
Example: evaluateTokens="::stimulusResponse_D123:: and ::stimulusResponse_D123_Step01::"
Result: ImageViewed and ButtonThreeClicked


Token Method Features

addTime

Adds an amount of hours and minutes to the time provided.

addTime
Example: evaluateTokens="Initial time: ::metadataField_notificationWeekendUntilSettings::
After adding 12 hours: addTime('::metadataField_notificationWeekendUntilSettings::',12:00)
After subtracting 1 hour and 45 minutes: addTime('::metadataField_notificationWeekendUntilSettings::',-01:45)"
Result: Initial time: 15:20
After adding 12 hours: 03:20
After subtracting 1 hour and 45 minutes: 13:35

daysBetween

Calculates the days between the dates provided.

daysBetween
Example: evaluateTokens="Difference in days: daysBetween('::metadataField_dateOfBirth::','::currentDateDDMMYYYY::')"
Result: Difference in days: 47

length

Determines the length of the provided text.

length
Example: evaluateTokens="There are length('Donau­dampf­schiffahrts­elektrizitäten­haupt­betriebs­werk­bau­unter­beamten­gesellschaft') letters in the word 'Donau­dampf­schiffahrts­elektrizitäten­haupt­betriebs­werk­bau­unter­beamten­gesellschaft'"
Result: There are 89 letters in the word 'Donau­dampf­schiffahrts­elektrizitäten­haupt­betriebs­werk­bau­unter­beamten­gesellschaft'

random

Generates a random number less than the parameter given.

random
Example: evaluateTokens="random(5)"
Result: Will produce one of 0, 1, 2, 3, 4

getRandomItem

Returns one item from a comma separated list.

getRandomItem
Example: evaluateTokens="getRandomItem('a,b,c,d,e,f')"
Result: Will produce one of a, b, c, d, e, f

replaceAll

Replace all characters that match the regular expression with the second parameter given.

replaceAll
Example: evaluateTokens="metadataField_dateOfBirth: replaceAll('::metadataField_dateOfBirth::', '/', ':')
currentDateDDMMYYYY: replaceAll('::currentDateDDMMYYYY::', '/', ':')"
Result: metadataField_dateOfBirth: 25:01:2020
currentDateDDMMYYYY: 12:03:2020