jspsych 6.3.0 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +36 -37
  2. package/css/jspsych.css +39 -39
  3. package/dist/JsPsych.d.ts +112 -0
  4. package/dist/TimelineNode.d.ts +34 -0
  5. package/dist/index.browser.js +3164 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.browser.min.js +2 -0
  8. package/dist/index.browser.min.js.map +1 -0
  9. package/dist/index.cjs +3158 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.ts +11 -0
  12. package/dist/index.js +3152 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/migration.d.ts +3 -0
  15. package/dist/modules/data/DataCollection.d.ts +45 -0
  16. package/dist/modules/data/DataColumn.d.ts +15 -0
  17. package/dist/modules/data/index.d.ts +25 -0
  18. package/dist/modules/data/utils.d.ts +3 -0
  19. package/dist/modules/extensions.d.ts +22 -0
  20. package/dist/modules/plugin-api/HardwareAPI.d.ts +15 -0
  21. package/dist/modules/plugin-api/KeyboardListenerAPI.d.ts +34 -0
  22. package/dist/modules/plugin-api/MediaAPI.d.ts +27 -0
  23. package/dist/modules/plugin-api/SimulationAPI.d.ts +41 -0
  24. package/dist/modules/plugin-api/TimeoutAPI.d.ts +5 -0
  25. package/dist/modules/plugin-api/index.d.ts +8 -0
  26. package/dist/modules/plugins.d.ts +129 -0
  27. package/dist/modules/randomization.d.ts +35 -0
  28. package/dist/modules/turk.d.ts +40 -0
  29. package/dist/modules/utils.d.ts +7 -0
  30. package/package.json +32 -15
  31. package/src/JsPsych.ts +884 -0
  32. package/src/TimelineNode.ts +536 -0
  33. package/src/index.ts +71 -0
  34. package/src/migration.ts +37 -0
  35. package/src/modules/data/DataCollection.ts +198 -0
  36. package/src/modules/data/DataColumn.ts +86 -0
  37. package/src/modules/data/index.ts +174 -0
  38. package/src/modules/data/utils.ts +75 -0
  39. package/src/modules/extensions.ts +23 -0
  40. package/src/modules/plugin-api/HardwareAPI.ts +32 -0
  41. package/src/modules/plugin-api/KeyboardListenerAPI.ts +165 -0
  42. package/src/modules/plugin-api/MediaAPI.ts +337 -0
  43. package/src/modules/plugin-api/SimulationAPI.ts +181 -0
  44. package/src/modules/plugin-api/TimeoutAPI.ts +16 -0
  45. package/src/modules/plugin-api/index.ts +28 -0
  46. package/src/modules/plugins.ts +158 -0
  47. package/src/modules/randomization.ts +327 -0
  48. package/src/modules/turk.ts +99 -0
  49. package/src/modules/utils.ts +30 -0
  50. package/.github/workflows/jest.yml +0 -20
  51. package/code-of-conduct.md +0 -56
  52. package/contributors.md +0 -61
  53. package/docs/CNAME +0 -1
  54. package/docs/about/about.md +0 -18
  55. package/docs/about/contributing.md +0 -43
  56. package/docs/about/license.md +0 -25
  57. package/docs/about/support.md +0 -7
  58. package/docs/core_library/jspsych-core.md +0 -734
  59. package/docs/core_library/jspsych-data.md +0 -589
  60. package/docs/core_library/jspsych-pluginAPI.md +0 -610
  61. package/docs/core_library/jspsych-randomization.md +0 -397
  62. package/docs/core_library/jspsych-turk.md +0 -102
  63. package/docs/extensions/extensions.md +0 -83
  64. package/docs/extensions/jspsych-ext-webgazer.md +0 -106
  65. package/docs/img/blue.png +0 -0
  66. package/docs/img/devtools-change-css.png +0 -0
  67. package/docs/img/devtools-css-errors.png +0 -0
  68. package/docs/img/devtools-inspect-element.png +0 -0
  69. package/docs/img/folder-setup.png +0 -0
  70. package/docs/img/folder-with-html.png +0 -0
  71. package/docs/img/githubreleases.jpg +0 -0
  72. package/docs/img/jspsych-favicon.png +0 -0
  73. package/docs/img/jspsych-logo-no-text-mono.svg +0 -493
  74. package/docs/img/jspsych-logo.jpg +0 -0
  75. package/docs/img/orange.png +0 -0
  76. package/docs/img/palmer_stim.png +0 -0
  77. package/docs/img/progress_bar.png +0 -0
  78. package/docs/img/prolific-study-completion.png +0 -0
  79. package/docs/img/prolific-study-link.png +0 -0
  80. package/docs/img/visual_search_example.jpg +0 -0
  81. package/docs/index.md +0 -9
  82. package/docs/overview/browser-device-support.md +0 -35
  83. package/docs/overview/callbacks.md +0 -184
  84. package/docs/overview/data.md +0 -281
  85. package/docs/overview/dynamic-parameters.md +0 -147
  86. package/docs/overview/exclude-browser.md +0 -32
  87. package/docs/overview/experiment-options.md +0 -149
  88. package/docs/overview/eye-tracking.md +0 -237
  89. package/docs/overview/fullscreen.md +0 -36
  90. package/docs/overview/media-preloading.md +0 -369
  91. package/docs/overview/mturk.md +0 -77
  92. package/docs/overview/plugins.md +0 -320
  93. package/docs/overview/progress-bar.md +0 -110
  94. package/docs/overview/prolific.md +0 -78
  95. package/docs/overview/record-browser-interactions.md +0 -23
  96. package/docs/overview/running-experiments.md +0 -95
  97. package/docs/overview/style.md +0 -293
  98. package/docs/overview/timeline.md +0 -457
  99. package/docs/plugins/jspsych-animation.md +0 -40
  100. package/docs/plugins/jspsych-audio-button-response.md +0 -60
  101. package/docs/plugins/jspsych-audio-keyboard-response.md +0 -58
  102. package/docs/plugins/jspsych-audio-slider-response.md +0 -53
  103. package/docs/plugins/jspsych-call-function.md +0 -81
  104. package/docs/plugins/jspsych-canvas-button-response.md +0 -66
  105. package/docs/plugins/jspsych-canvas-keyboard-response.md +0 -68
  106. package/docs/plugins/jspsych-canvas-slider-response.md +0 -89
  107. package/docs/plugins/jspsych-categorize-animation.md +0 -60
  108. package/docs/plugins/jspsych-categorize-html.md +0 -53
  109. package/docs/plugins/jspsych-categorize-image.md +0 -53
  110. package/docs/plugins/jspsych-cloze.md +0 -45
  111. package/docs/plugins/jspsych-external-html.md +0 -70
  112. package/docs/plugins/jspsych-free-sort.md +0 -56
  113. package/docs/plugins/jspsych-fullscreen.md +0 -57
  114. package/docs/plugins/jspsych-html-button-response.md +0 -42
  115. package/docs/plugins/jspsych-html-keyboard-response.md +0 -51
  116. package/docs/plugins/jspsych-html-slider-response.md +0 -45
  117. package/docs/plugins/jspsych-iat-html.md +0 -64
  118. package/docs/plugins/jspsych-iat-image.md +0 -64
  119. package/docs/plugins/jspsych-image-button-response.md +0 -48
  120. package/docs/plugins/jspsych-image-keyboard-response.md +0 -58
  121. package/docs/plugins/jspsych-image-slider-response.md +0 -54
  122. package/docs/plugins/jspsych-instructions.md +0 -58
  123. package/docs/plugins/jspsych-maxdiff.md +0 -41
  124. package/docs/plugins/jspsych-preload.md +0 -128
  125. package/docs/plugins/jspsych-rdk.md +0 -119
  126. package/docs/plugins/jspsych-reconstruction.md +0 -48
  127. package/docs/plugins/jspsych-resize.md +0 -39
  128. package/docs/plugins/jspsych-same-different-html.md +0 -53
  129. package/docs/plugins/jspsych-same-different-image.md +0 -66
  130. package/docs/plugins/jspsych-serial-reaction-time-mouse.md +0 -52
  131. package/docs/plugins/jspsych-serial-reaction-time.md +0 -57
  132. package/docs/plugins/jspsych-survey-html-form.md +0 -50
  133. package/docs/plugins/jspsych-survey-likert.md +0 -70
  134. package/docs/plugins/jspsych-survey-multi-choice.md +0 -48
  135. package/docs/plugins/jspsych-survey-multi-select.md +0 -53
  136. package/docs/plugins/jspsych-survey-text.md +0 -63
  137. package/docs/plugins/jspsych-video-button-response.md +0 -54
  138. package/docs/plugins/jspsych-video-keyboard-response.md +0 -50
  139. package/docs/plugins/jspsych-video-slider-response.md +0 -60
  140. package/docs/plugins/jspsych-virtual-chinrest.md +0 -105
  141. package/docs/plugins/jspsych-visual-search-circle.md +0 -52
  142. package/docs/plugins/jspsych-vsl-animate-occlusion.md +0 -55
  143. package/docs/plugins/jspsych-vsl-grid-scene.md +0 -62
  144. package/docs/plugins/jspsych-webgazer-calibrate.md +0 -60
  145. package/docs/plugins/jspsych-webgazer-init-camera.md +0 -31
  146. package/docs/plugins/jspsych-webgazer-validate.md +0 -43
  147. package/docs/plugins/list-of-plugins.md +0 -54
  148. package/docs/tutorials/hello-world.md +0 -162
  149. package/docs/tutorials/rt-task.md +0 -1334
  150. package/docs/tutorials/video-tutorials.md +0 -11
  151. package/examples/add-to-end-of-timeline.html +0 -38
  152. package/examples/case-sensitive-responses.html +0 -45
  153. package/examples/conditional-and-loop-functions.html +0 -64
  154. package/examples/css/jquery-ui.css +0 -1225
  155. package/examples/css-classes-parameter.html +0 -145
  156. package/examples/data-add-properties.html +0 -44
  157. package/examples/data-as-function.html +0 -39
  158. package/examples/data-from-timeline.html +0 -52
  159. package/examples/data-from-url.html +0 -21
  160. package/examples/demo-flanker.html +0 -117
  161. package/examples/demo-simple-rt-task.html +0 -120
  162. package/examples/demos/demo_1.html +0 -35
  163. package/examples/demos/demo_2.html +0 -50
  164. package/examples/demos/demo_3.html +0 -63
  165. package/examples/display-element-to-embed-experiment.html +0 -79
  166. package/examples/end-active-node.html +0 -52
  167. package/examples/end-experiment.html +0 -45
  168. package/examples/exclusions.html +0 -32
  169. package/examples/external_html/simple_consent.html +0 -4
  170. package/examples/img/1.gif +0 -0
  171. package/examples/img/10.gif +0 -0
  172. package/examples/img/11.gif +0 -0
  173. package/examples/img/12.gif +0 -0
  174. package/examples/img/2.gif +0 -0
  175. package/examples/img/3.gif +0 -0
  176. package/examples/img/4.gif +0 -0
  177. package/examples/img/5.gif +0 -0
  178. package/examples/img/6.gif +0 -0
  179. package/examples/img/7.gif +0 -0
  180. package/examples/img/8.gif +0 -0
  181. package/examples/img/9.gif +0 -0
  182. package/examples/img/age/of1.jpg +0 -0
  183. package/examples/img/age/of2.jpg +0 -0
  184. package/examples/img/age/of3.jpg +0 -0
  185. package/examples/img/age/om1.jpg +0 -0
  186. package/examples/img/age/om2.jpg +0 -0
  187. package/examples/img/age/om3.jpg +0 -0
  188. package/examples/img/age/yf1.jpg +0 -0
  189. package/examples/img/age/yf4.jpg +0 -0
  190. package/examples/img/age/yf5.jpg +0 -0
  191. package/examples/img/age/ym2.jpg +0 -0
  192. package/examples/img/age/ym3.jpg +0 -0
  193. package/examples/img/age/ym5.jpg +0 -0
  194. package/examples/img/backwardN.gif +0 -0
  195. package/examples/img/blue.png +0 -0
  196. package/examples/img/card.png +0 -0
  197. package/examples/img/con1.png +0 -0
  198. package/examples/img/con2.png +0 -0
  199. package/examples/img/fixation.gif +0 -0
  200. package/examples/img/happy_face_1.jpg +0 -0
  201. package/examples/img/happy_face_2.jpg +0 -0
  202. package/examples/img/happy_face_3.jpg +0 -0
  203. package/examples/img/happy_face_4.jpg +0 -0
  204. package/examples/img/inc1.png +0 -0
  205. package/examples/img/inc2.png +0 -0
  206. package/examples/img/normalN.gif +0 -0
  207. package/examples/img/orange.png +0 -0
  208. package/examples/img/redX.png +0 -0
  209. package/examples/img/ribbon.jpg +0 -0
  210. package/examples/img/sad_face_1.jpg +0 -0
  211. package/examples/img/sad_face_2.jpg +0 -0
  212. package/examples/img/sad_face_3.jpg +0 -0
  213. package/examples/img/sad_face_4.jpg +0 -0
  214. package/examples/js/snap.svg-min.js +0 -21
  215. package/examples/js/webgazer.js +0 -88886
  216. package/examples/jspsych-RDK.html +0 -58
  217. package/examples/jspsych-animation.html +0 -39
  218. package/examples/jspsych-audio-button-response.html +0 -58
  219. package/examples/jspsych-audio-keyboard-response.html +0 -68
  220. package/examples/jspsych-audio-slider-response.html +0 -61
  221. package/examples/jspsych-call-function.html +0 -32
  222. package/examples/jspsych-canvas-button-response.html +0 -95
  223. package/examples/jspsych-canvas-keyboard-response.html +0 -78
  224. package/examples/jspsych-canvas-slider-response.html +0 -67
  225. package/examples/jspsych-categorize-animation.html +0 -49
  226. package/examples/jspsych-categorize-html.html +0 -33
  227. package/examples/jspsych-categorize-image.html +0 -44
  228. package/examples/jspsych-cloze.html +0 -37
  229. package/examples/jspsych-free-sort.html +0 -109
  230. package/examples/jspsych-fullscreen.html +0 -45
  231. package/examples/jspsych-html-button-response.html +0 -43
  232. package/examples/jspsych-html-keyboard-response.html +0 -42
  233. package/examples/jspsych-html-slider-response.html +0 -53
  234. package/examples/jspsych-iat.html +0 -520
  235. package/examples/jspsych-image-button-response.html +0 -91
  236. package/examples/jspsych-image-keyboard-response.html +0 -85
  237. package/examples/jspsych-image-slider-response.html +0 -85
  238. package/examples/jspsych-instructions.html +0 -37
  239. package/examples/jspsych-maxdiff.html +0 -33
  240. package/examples/jspsych-preload.html +0 -140
  241. package/examples/jspsych-reconstruction.html +0 -43
  242. package/examples/jspsych-resize.html +0 -34
  243. package/examples/jspsych-same-different-html.html +0 -28
  244. package/examples/jspsych-same-different-image.html +0 -39
  245. package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
  246. package/examples/jspsych-serial-reaction-time.html +0 -54
  247. package/examples/jspsych-survey-html-form.html +0 -33
  248. package/examples/jspsych-survey-likert.html +0 -42
  249. package/examples/jspsych-survey-multi-choice.html +0 -40
  250. package/examples/jspsych-survey-multi-select.html +0 -42
  251. package/examples/jspsych-survey-text.html +0 -34
  252. package/examples/jspsych-video-button-response.html +0 -65
  253. package/examples/jspsych-video-keyboard-response.html +0 -61
  254. package/examples/jspsych-video-slider-response.html +0 -63
  255. package/examples/jspsych-virtual-chinrest.html +0 -69
  256. package/examples/jspsych-visual-search-circle.html +0 -64
  257. package/examples/jspsych-vsl-animate-occlusion.html +0 -35
  258. package/examples/jspsych-vsl-grid-scene.html +0 -47
  259. package/examples/lexical-decision.html +0 -134
  260. package/examples/manual-preloading.html +0 -59
  261. package/examples/pause-unpause.html +0 -33
  262. package/examples/progress-bar.html +0 -68
  263. package/examples/save-trial-parameters.html +0 -98
  264. package/examples/sound/hammer.mp3 +0 -0
  265. package/examples/sound/sound.mp3 +0 -0
  266. package/examples/sound/speech_blue.mp3 +0 -0
  267. package/examples/sound/speech_green.mp3 +0 -0
  268. package/examples/sound/speech_joke.mp3 +0 -0
  269. package/examples/sound/speech_red.mp3 +0 -0
  270. package/examples/sound/tone.mp3 +0 -0
  271. package/examples/timeline-variables-sampling.html +0 -50
  272. package/examples/timeline-variables.html +0 -64
  273. package/examples/video/sample_video.mp4 +0 -0
  274. package/examples/webgazer.html +0 -162
  275. package/examples/webgazer_image.html +0 -60
  276. package/extensions/jspsych-ext-webgazer.js +0 -185
  277. package/jspsych.js +0 -3015
  278. package/license.txt +0 -21
  279. package/mkdocs.yml +0 -118
  280. package/plugins/jspsych-animation.js +0 -189
  281. package/plugins/jspsych-audio-button-response.js +0 -269
  282. package/plugins/jspsych-audio-keyboard-response.js +0 -212
  283. package/plugins/jspsych-audio-slider-response.js +0 -278
  284. package/plugins/jspsych-call-function.js +0 -58
  285. package/plugins/jspsych-canvas-button-response.js +0 -199
  286. package/plugins/jspsych-canvas-keyboard-response.js +0 -155
  287. package/plugins/jspsych-canvas-slider-response.js +0 -207
  288. package/plugins/jspsych-categorize-animation.js +0 -266
  289. package/plugins/jspsych-categorize-html.js +0 -220
  290. package/plugins/jspsych-categorize-image.js +0 -222
  291. package/plugins/jspsych-cloze.js +0 -112
  292. package/plugins/jspsych-external-html.js +0 -112
  293. package/plugins/jspsych-free-sort.js +0 -478
  294. package/plugins/jspsych-fullscreen.js +0 -106
  295. package/plugins/jspsych-html-button-response.js +0 -188
  296. package/plugins/jspsych-html-keyboard-response.js +0 -149
  297. package/plugins/jspsych-html-slider-response.js +0 -202
  298. package/plugins/jspsych-iat-html.js +0 -284
  299. package/plugins/jspsych-iat-image.js +0 -286
  300. package/plugins/jspsych-image-button-response.js +0 -327
  301. package/plugins/jspsych-image-keyboard-response.js +0 -263
  302. package/plugins/jspsych-image-slider-response.js +0 -369
  303. package/plugins/jspsych-instructions.js +0 -237
  304. package/plugins/jspsych-maxdiff.js +0 -173
  305. package/plugins/jspsych-preload.js +0 -345
  306. package/plugins/jspsych-rdk.js +0 -1373
  307. package/plugins/jspsych-reconstruction.js +0 -134
  308. package/plugins/jspsych-resize.js +0 -166
  309. package/plugins/jspsych-same-different-html.js +0 -168
  310. package/plugins/jspsych-same-different-image.js +0 -169
  311. package/plugins/jspsych-serial-reaction-time-mouse.js +0 -212
  312. package/plugins/jspsych-serial-reaction-time.js +0 -247
  313. package/plugins/jspsych-survey-html-form.js +0 -171
  314. package/plugins/jspsych-survey-likert.js +0 -195
  315. package/plugins/jspsych-survey-multi-choice.js +0 -208
  316. package/plugins/jspsych-survey-multi-select.js +0 -232
  317. package/plugins/jspsych-survey-text.js +0 -185
  318. package/plugins/jspsych-video-button-response.js +0 -335
  319. package/plugins/jspsych-video-keyboard-response.js +0 -279
  320. package/plugins/jspsych-video-slider-response.js +0 -351
  321. package/plugins/jspsych-virtual-chinrest.js +0 -471
  322. package/plugins/jspsych-visual-search-circle.js +0 -259
  323. package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
  324. package/plugins/jspsych-vsl-grid-scene.js +0 -103
  325. package/plugins/jspsych-webgazer-calibrate.js +0 -166
  326. package/plugins/jspsych-webgazer-init-camera.js +0 -95
  327. package/plugins/jspsych-webgazer-validate.js +0 -304
  328. package/plugins/template/jspsych-plugin-template.js +0 -35
  329. package/tests/README.md +0 -7
  330. package/tests/jsPsych/case-sensitive-responses.test.js +0 -53
  331. package/tests/jsPsych/css-classes-parameter.test.js +0 -107
  332. package/tests/jsPsych/default-iti.test.js +0 -51
  333. package/tests/jsPsych/default-parameters.test.js +0 -58
  334. package/tests/jsPsych/endexperiment.test.js +0 -49
  335. package/tests/jsPsych/events.test.js +0 -606
  336. package/tests/jsPsych/functions-as-parameters.test.js +0 -210
  337. package/tests/jsPsych/init.test.js +0 -48
  338. package/tests/jsPsych/loads.test.js +0 -7
  339. package/tests/jsPsych/min-rt.test.js +0 -58
  340. package/tests/jsPsych/progressbar.test.js +0 -202
  341. package/tests/jsPsych/timeline-variables.test.js +0 -531
  342. package/tests/jsPsych/timelines.test.js +0 -569
  343. package/tests/jsPsych.data/data-csv-conversion.test.js +0 -85
  344. package/tests/jsPsych.data/data-json-conversion.test.js +0 -120
  345. package/tests/jsPsych.data/datacollection.test.js +0 -117
  346. package/tests/jsPsych.data/datacolumn.test.js +0 -50
  347. package/tests/jsPsych.data/datamodule.test.js +0 -152
  348. package/tests/jsPsych.data/dataparameter.test.js +0 -251
  349. package/tests/jsPsych.data/interactions.test.js +0 -109
  350. package/tests/jsPsych.data/trialparameters.test.js +0 -175
  351. package/tests/jsPsych.extensions/extensions.test.js +0 -207
  352. package/tests/jsPsych.extensions/test-extension.js +0 -42
  353. package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -341
  354. package/tests/jsPsych.pluginAPI/preloads.test.js +0 -43
  355. package/tests/jsPsych.randomization/randomziation.test.js +0 -27
  356. package/tests/jsPsych.utils/utils.test.js +0 -58
  357. package/tests/plugins/plugin-animation.test.js +0 -34
  358. package/tests/plugins/plugin-audio-button-response.test.js +0 -15
  359. package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
  360. package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
  361. package/tests/plugins/plugin-call-function.test.js +0 -49
  362. package/tests/plugins/plugin-categorize-animation.test.js +0 -263
  363. package/tests/plugins/plugin-categorize-html.test.js +0 -17
  364. package/tests/plugins/plugin-categorize-image.test.js +0 -17
  365. package/tests/plugins/plugin-cloze.test.js +0 -157
  366. package/tests/plugins/plugin-free-sort.test.js +0 -106
  367. package/tests/plugins/plugin-fullscreen.test.js +0 -41
  368. package/tests/plugins/plugin-html-button-response.test.js +0 -161
  369. package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
  370. package/tests/plugins/plugin-html-slider-response.test.js +0 -155
  371. package/tests/plugins/plugin-iat-html.test.js +0 -299
  372. package/tests/plugins/plugin-iat-image.test.js +0 -298
  373. package/tests/plugins/plugin-image-button-response.test.js +0 -174
  374. package/tests/plugins/plugin-image-keyboard-response.test.js +0 -147
  375. package/tests/plugins/plugin-image-slider-response.test.js +0 -174
  376. package/tests/plugins/plugin-instructions.test.js +0 -85
  377. package/tests/plugins/plugin-maxdiff.test.js +0 -39
  378. package/tests/plugins/plugin-preload.test.js +0 -916
  379. package/tests/plugins/plugin-rdk.test.js +0 -61
  380. package/tests/plugins/plugin-reconstruction.test.js +0 -16
  381. package/tests/plugins/plugin-resize.test.js +0 -16
  382. package/tests/plugins/plugin-same-different-html.test.js +0 -17
  383. package/tests/plugins/plugin-same-different-image.test.js +0 -17
  384. package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
  385. package/tests/plugins/plugin-serial-reaction-time.test.js +0 -109
  386. package/tests/plugins/plugin-survey-html-form.test.js +0 -44
  387. package/tests/plugins/plugin-survey-likert.test.js +0 -48
  388. package/tests/plugins/plugin-survey-multi-choice.test.js +0 -47
  389. package/tests/plugins/plugin-survey-multi-select.test.js +0 -71
  390. package/tests/plugins/plugin-survey-text.test.js +0 -115
  391. package/tests/plugins/plugin-video-button-response.test.js +0 -32
  392. package/tests/plugins/plugin-video-keyboard-response.test.js +0 -32
  393. package/tests/plugins/plugin-video-slider-response.test.js +0 -31
  394. package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
  395. package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
  396. package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
  397. package/tests/testing-utils.js +0 -13
@@ -1,112 +0,0 @@
1
- /**
2
- * jspsych-cloze
3
- * Philipp Sprengholz
4
- *
5
- * Plugin for displaying a cloze test and checking participants answers against a correct solution.
6
- *
7
- * documentation: docs.jspsych.org
8
- **/
9
-
10
- jsPsych.plugins['cloze'] = (function () {
11
-
12
- var plugin = {};
13
-
14
- plugin.info = {
15
- name: 'cloze',
16
- description: '',
17
- parameters: {
18
- text: {
19
- type: jsPsych.plugins.parameterType.STRING,
20
- pretty_name: 'Cloze text',
21
- default: undefined,
22
- description: 'The cloze text to be displayed. Blanks are indicated by %% signs and automatically replaced by input fields. If there is a correct answer you want the system to check against, it must be typed between the two percentage signs (i.e. %solution%).'
23
- },
24
- button_text: {
25
- type: jsPsych.plugins.parameterType.STRING,
26
- pretty_name: 'Button text',
27
- default: 'OK',
28
- description: 'Text of the button participants have to press for finishing the cloze test.'
29
- },
30
- check_answers: {
31
- type: jsPsych.plugins.parameterType.BOOL,
32
- pretty_name: 'Check answers',
33
- default: false,
34
- description: 'Boolean value indicating if the answers given by participants should be compared against a correct solution given in the text (between % signs) after the button was clicked.'
35
- },
36
- mistake_fn: {
37
- type: jsPsych.plugins.parameterType.FUNCTION,
38
- pretty_name: 'Mistake function',
39
- default: function () {},
40
- description: 'Function called if check_answers is set to TRUE and there is a difference between the participants answers and the correct solution provided in the text.'
41
- }
42
- }
43
- };
44
-
45
- plugin.trial = function (display_element, trial) {
46
-
47
- var html = '<div class="cloze">';
48
- var elements = trial.text.split('%');
49
- var solutions = [];
50
-
51
- for (var i=0; i<elements.length; i++)
52
- {
53
- if (i%2 === 0)
54
- {
55
- html += elements[i];
56
- }
57
- else
58
- {
59
- solutions.push(elements[i].trim());
60
- html += '<input type="text" id="input'+(solutions.length-1)+'" value="">';
61
- }
62
- }
63
- html += '</div>';
64
-
65
- display_element.innerHTML = html;
66
-
67
- var check = function() {
68
-
69
- var answers = [];
70
- var answers_correct = true;
71
-
72
- for (var i=0; i<solutions.length; i++)
73
- {
74
- var field = document.getElementById('input'+i);
75
- answers.push(field.value.trim());
76
-
77
- if (trial.check_answers)
78
- {
79
- if (answers[i] !== solutions[i])
80
- {
81
- field.style.color = 'red';
82
- answers_correct = false;
83
- }
84
- else
85
- {
86
- field.style.color = 'black';
87
- }
88
- }
89
- }
90
-
91
- if (!trial.check_answers || (trial.check_answers && answers_correct))
92
- {
93
- var trial_data = {
94
- response: answers
95
- };
96
-
97
- display_element.innerHTML = '';
98
- jsPsych.finishTrial(trial_data);
99
- }
100
- else
101
- {
102
- trial.mistake_fn();
103
- }
104
-
105
- };
106
-
107
- display_element.innerHTML += '<br><button class="jspsych-html-button-response-button" type="button" id="finish_cloze_button">'+trial.button_text+'</button>';
108
- display_element.querySelector('#finish_cloze_button').addEventListener('click', check);
109
- };
110
-
111
- return plugin;
112
- })();
@@ -1,112 +0,0 @@
1
- /** (July 2012, Erik Weitnauer)
2
- The html-plugin will load and display an external html pages. To proceed to the next, the
3
- user might either press a button on the page or a specific key. Afterwards, the page get hidden and
4
- the plugin will wait of a specified time before it proceeds.
5
-
6
- documentation: docs.jspsych.org
7
- */
8
-
9
- jsPsych.plugins['external-html'] = (function() {
10
-
11
- var plugin = {};
12
-
13
- plugin.info = {
14
- name: 'external-html',
15
- description: '',
16
- parameters: {
17
- url: {
18
- type: jsPsych.plugins.parameterType.STRING,
19
- pretty_name: 'URL',
20
- default: undefined,
21
- description: 'The url of the external html page'
22
- },
23
- cont_key: {
24
- type: jsPsych.plugins.parameterType.KEY,
25
- pretty_name: 'Continue key',
26
- default: null,
27
- description: 'The key to continue to the next page.'
28
- },
29
- cont_btn: {
30
- type: jsPsych.plugins.parameterType.STRING,
31
- pretty_name: 'Continue button',
32
- default: null,
33
- description: 'The button to continue to the next page.'
34
- },
35
- check_fn: {
36
- type: jsPsych.plugins.parameterType.FUNCTION,
37
- pretty_name: 'Check function',
38
- default: function() { return true; },
39
- description: ''
40
- },
41
- force_refresh: {
42
- type: jsPsych.plugins.parameterType.BOOL,
43
- pretty_name: 'Force refresh',
44
- default: false,
45
- description: 'Refresh page.'
46
- },
47
- // if execute_Script == true, then all javascript code on the external page
48
- // will be executed in the plugin site within your jsPsych test
49
- execute_script: {
50
- type: jsPsych.plugins.parameterType.BOOL,
51
- pretty_name: 'Execute scripts',
52
- default: false,
53
- description: 'If true, JS scripts on the external html file will be executed.'
54
- }
55
- }
56
- }
57
-
58
- plugin.trial = function(display_element, trial) {
59
-
60
- var url = trial.url;
61
- if (trial.force_refresh) {
62
- url = trial.url + "?t=" + performance.now();
63
- }
64
-
65
- load(display_element, url, function() {
66
- var t0 = performance.now();
67
- var finish = function() {
68
- if (trial.check_fn && !trial.check_fn(display_element)) { return };
69
- if (trial.cont_key) { display_element.removeEventListener('keydown', key_listener); }
70
- var trial_data = {
71
- rt: performance.now() - t0,
72
- url: trial.url
73
- };
74
- display_element.innerHTML = '';
75
- jsPsych.finishTrial(trial_data);
76
- };
77
-
78
- // by default, scripts on the external page are not executed with XMLHttpRequest().
79
- // To activate their content through DOM manipulation, we need to relocate all script tags
80
- if (trial.execute_script) {
81
- for (const scriptElement of display_element.getElementsByTagName("script")) {
82
- const relocatedScript = document.createElement("script");
83
- relocatedScript.text = scriptElement.text;
84
- scriptElement.parentNode.replaceChild(relocatedScript, scriptElement);
85
- };
86
- }
87
-
88
- if (trial.cont_btn) { display_element.querySelector('#'+trial.cont_btn).addEventListener('click', finish); }
89
- if (trial.cont_key) {
90
- var key_listener = function(e) {
91
- if (jsPsych.pluginAPI.compareKeys(e.key,trial.cont_key)) finish();
92
- };
93
- display_element.addEventListener('keydown', key_listener);
94
- }
95
- });
96
- };
97
-
98
- // helper to load via XMLHttpRequest
99
- function load(element, file, callback){
100
- var xmlhttp = new XMLHttpRequest();
101
- xmlhttp.open("GET", file, true);
102
- xmlhttp.onload = function(){
103
- if(xmlhttp.status == 200 || xmlhttp.status == 0){ //Check if loaded
104
- element.innerHTML = xmlhttp.responseText;
105
- callback();
106
- }
107
- }
108
- xmlhttp.send();
109
- }
110
-
111
- return plugin;
112
- })();
@@ -1,478 +0,0 @@
1
- /**
2
- * jspsych-free-sort
3
- * plugin for drag-and-drop sorting of a collection of images
4
- * Josh de Leeuw
5
- *
6
- * documentation: docs.jspsych.org
7
- */
8
-
9
-
10
- jsPsych.plugins['free-sort'] = (function() {
11
-
12
- var plugin = {};
13
-
14
- jsPsych.pluginAPI.registerPreload('free-sort', 'stimuli', 'image');
15
-
16
- plugin.info = {
17
- name: 'free-sort',
18
- description: '',
19
- parameters: {
20
- stimuli: {
21
- type: jsPsych.plugins.parameterType.STRING,
22
- pretty_name: 'Stimuli',
23
- default: undefined,
24
- array: true,
25
- description: 'items to be displayed.'
26
- },
27
- stim_height: {
28
- type: jsPsych.plugins.parameterType.INT,
29
- pretty_name: 'Stimulus height',
30
- default: 100,
31
- description: 'Height of items in pixels.'
32
- },
33
- stim_width: {
34
- type: jsPsych.plugins.parameterType.INT,
35
- pretty_name: 'Stimulus width',
36
- default: 100,
37
- description: 'Width of items in pixels'
38
- },
39
- scale_factor: {
40
- type: jsPsych.plugins.parameterType.FLOAT,
41
- pretty_name: 'Stimulus scaling factor',
42
- default: 1.5,
43
- description: 'How much larger to make the stimulus while moving (1 = no scaling)'
44
- },
45
- sort_area_height: {
46
- type: jsPsych.plugins.parameterType.INT,
47
- pretty_name: 'Sort area height',
48
- default: 700,
49
- description: 'The height in pixels of the container that subjects can move the stimuli in.'
50
- },
51
- sort_area_width: {
52
- type: jsPsych.plugins.parameterType.INT,
53
- pretty_name: 'Sort area width',
54
- default: 700,
55
- description: 'The width in pixels of the container that subjects can move the stimuli in.'
56
- },
57
- sort_area_shape: {
58
- type: jsPsych.plugins.parameterType.STRING,
59
- pretty_name: 'Sort area shape',
60
- options: ['square','ellipse'],
61
- default: 'ellipse',
62
- description: 'The shape of the sorting area'
63
- },
64
- prompt: {
65
- type: jsPsych.plugins.parameterType.STRING,
66
- pretty_name: 'Prompt',
67
- default: '',
68
- description: 'It can be used to provide a reminder about the action the subject is supposed to take.'
69
- },
70
- prompt_location: {
71
- type: jsPsych.plugins.parameterType.SELECT,
72
- pretty_name: 'Prompt location',
73
- options: ['above','below'],
74
- default: 'above',
75
- description: 'Indicates whether to show prompt "above" or "below" the sorting area.'
76
- },
77
- button_label: {
78
- type: jsPsych.plugins.parameterType.STRING,
79
- pretty_name: 'Button label',
80
- default: 'Continue',
81
- description: 'The text that appears on the button to continue to the next trial.'
82
- },
83
- change_border_background_color: {
84
- type: jsPsych.plugins.parameterType.BOOL,
85
- pretty_name: 'Change border background color',
86
- default: true,
87
- description: 'If true, the sort area border color will change while items are being moved in and out of '+
88
- 'the sort area, and the background color will change once all items have been moved into the '+
89
- 'sort area. If false, the border will remain black and the background will remain white throughout the trial.'
90
- },
91
- border_color_in: {
92
- type: jsPsych.plugins.parameterType.STRING,
93
- pretty_name: 'Border color - in',
94
- default: '#a1d99b',
95
- description: 'If change_border_background_color is true, the sort area border will change to this color '+
96
- 'when an item is being moved into the sort area, and the background will change to this color '+
97
- 'when all of the items have been moved into the sort area.'
98
- },
99
- border_color_out: {
100
- type: jsPsych.plugins.parameterType.STRING,
101
- pretty_name: 'Border color - out',
102
- default: '#fc9272',
103
- description: 'If change_border_background_color is true, this will be the color of the sort area border '+
104
- 'when there are one or more items that still need to be moved into the sort area.'
105
- },
106
- border_width: {
107
- type: jsPsych.plugins.parameterType.INT,
108
- pretty_name: 'Border width',
109
- default: null,
110
- description: 'The width in pixels of the border around the sort area. If null, the border width '+
111
- 'defaults to 3% of the sort area height.'
112
- },
113
- counter_text_unfinished: {
114
- type: jsPsych.plugins.parameterType.STRING,
115
- pretty_name: 'Counter text unfinished',
116
- default: 'You still need to place %n% item%s% inside the sort area.',
117
- description: 'Text to display when there are one or more items that still need to be placed in the sort area. '+
118
- 'If "%n%" is included in the string, it will be replaced with the number of items that still need to be moved inside. '+
119
- 'If "%s%" is included in the string, a "s" will be included when the number of items remaining is greater than one.'
120
- },
121
- counter_text_finished: {
122
- type: jsPsych.plugins.parameterType.STRING,
123
- pretty_name: 'Counter text finished',
124
- default: 'All items placed. Feel free to reposition items if necessary.',
125
- description: 'Text that will take the place of the counter_text_unfinished text when all items have been moved inside the sort area.'
126
- },
127
- stim_starts_inside: {
128
- type: jsPsych.plugins.parameterType.BOOL,
129
- pretty_name: 'Stim starts inside',
130
- default: false,
131
- description: 'If false, the images will be positioned to the left and right of the sort area when the trial loads. '+
132
- 'If true, the images will be positioned at random locations inside the sort area when the trial loads.'
133
- },
134
- column_spread_factor: {
135
- type: jsPsych.plugins.parameterType.FLOAT,
136
- pretty_name: 'column spread factor',
137
- default: 1,
138
- description: 'When the images appear outside the sort area, this determines the x-axis spread of the image columns. '+
139
- 'Default value is 1. Values less than 1 will compress the image columns along the x-axis, and values greater than 1 will spread them farther apart.'
140
- },
141
- }
142
- }
143
-
144
- plugin.trial = function(display_element, trial) {
145
-
146
- var start_time = performance.now();
147
-
148
- if (trial.change_border_background_color == false) {
149
- trial.border_color_out = "#000000";
150
- }
151
-
152
- if (trial.border_width == null) {
153
- trial.border_width = trial.sort_area_height*.03;
154
- }
155
-
156
- let html =
157
- '<div '+
158
- 'id="jspsych-free-sort-arena" '+
159
- 'class="jspsych-free-sort-arena" '+
160
- 'style="position: relative; width:'+trial.sort_area_width+'px; height:'+trial.sort_area_height+'px; margin: auto;"</div>';
161
-
162
- // another div for border
163
- html += '<div '+
164
- 'id="jspsych-free-sort-border" '+
165
- 'class="jspsych-free-sort-border" '+
166
- 'style="position: relative; width:'+trial.sort_area_width*.94+'px; height:'+trial.sort_area_height*.94+'px; '+
167
- 'border:'+trial.border_width+'px solid '+trial.border_color_out+'; margin: auto; line-height: 0em; ';
168
-
169
- if ( trial.sort_area_shape == "ellipse") {
170
- html += 'webkit-border-radius: 50%; moz-border-radius: 50%; border-radius: 50%"></div>'
171
- } else {
172
- html += 'webkit-border-radius: 0%; moz-border-radius: 0%; border-radius: 0%"></div>'
173
- }
174
-
175
- // variable that has the prompt text and counter
176
- const html_text = '<div style="line-height: 1.0em;">' + trial.prompt +
177
- '<p id="jspsych-free-sort-counter" style="display: inline-block;">'+get_counter_text(trial.stimuli.length)+'</p></div>';
178
-
179
- // position prompt above or below
180
- if (trial.prompt_location == "below") {
181
- html += html_text
182
- } else {
183
- html = html_text + html
184
- }
185
- // add button
186
- html += '<div><button id="jspsych-free-sort-done-btn" class="jspsych-btn" '+
187
- 'style="margin-top: 5px; margin-bottom: 15px; visibility: hidden;">' +
188
- trial.button_label+'</button></div>';
189
-
190
- display_element.innerHTML = html;
191
-
192
- // store initial location data
193
- let init_locations = [];
194
-
195
- if (!trial.stim_starts_inside) {
196
- // determine number of rows and colums, must be a even number
197
- let num_rows = Math.ceil(Math.sqrt(trial.stimuli.length))
198
- if ( num_rows % 2 != 0) {
199
- num_rows = num_rows + 1
200
- }
201
-
202
- // compute coords for left and right side of arena
203
- var r_coords = [];
204
- var l_coords = [];
205
- for (const x of make_arr(0, trial.sort_area_width - trial.stim_width, num_rows) ) {
206
- for (const y of make_arr(0, trial.sort_area_height - trial.stim_height, num_rows) ) {
207
- if ( x > ( (trial.sort_area_width - trial.stim_width) * .5 ) ) {
208
- //r_coords.push({ x:x, y:y } )
209
- r_coords.push({ x:x + (trial.sort_area_width) * (.5*trial.column_spread_factor) , y:y });
210
- } else {
211
- l_coords.push({ x:x - (trial.sort_area_width) * (.5*trial.column_spread_factor) , y:y });
212
- //l_coords.push({ x:x, y:y } )
213
- }
214
- }
215
- }
216
-
217
- // repeat coordinates until you have enough coords (may be obsolete)
218
- while ( ( r_coords.length + l_coords.length ) < trial.stimuli.length ) {
219
- r_coords = r_coords.concat(r_coords)
220
- l_coords = l_coords.concat(l_coords)
221
- }
222
- // reverse left coords, so that coords closest to arena is used first
223
- l_coords = l_coords.reverse()
224
-
225
- // shuffle stimuli, so that starting positions are random
226
- trial.stimuli = shuffle(trial.stimuli);
227
- }
228
-
229
- let inside = []
230
- for (let i = 0; i < trial.stimuli.length; i++) {
231
- var coords;
232
- if (trial.stim_starts_inside) {
233
- coords = random_coordinate(trial.sort_area_width - trial.stim_width, trial.sort_area_height - trial.stim_height);
234
- } else {
235
- if ( (i % 2) == 0 ) {
236
- coords = r_coords[Math.floor(i * .5)];
237
- } else {
238
- coords = l_coords[Math.floor(i * .5)];
239
- }
240
- }
241
-
242
- display_element.querySelector("#jspsych-free-sort-arena").innerHTML += '<img '+
243
- 'src="'+trial.stimuli[i]+'" '+
244
- 'data-src="'+trial.stimuli[i]+'" '+
245
- 'class="jspsych-free-sort-draggable" '+
246
- 'draggable="false" '+
247
- 'id="jspsych-free-sort-draggable-'+i+'" '+
248
- 'style="position: absolute; cursor: move; width:'+trial.stim_width+'px; height:'+trial.stim_height+'px; top:'+coords.y+'px; left:'+coords.x+'px;">'+
249
- '</img>';
250
-
251
- init_locations.push({
252
- src: trial.stimuli[i],
253
- x: coords.x,
254
- y: coords.y
255
- });
256
- if (trial.stim_starts_inside) {
257
- inside.push(true);
258
- } else {
259
- inside.push(false);
260
- }
261
- }
262
-
263
- // moves within a trial
264
- let moves = [];
265
-
266
- // are objects currently inside
267
- let cur_in = false
268
-
269
- // draggable items
270
- const draggables = display_element.querySelectorAll('.jspsych-free-sort-draggable');
271
-
272
- // button (will show when all items are inside) and border (will change color)
273
- const border = display_element.querySelector("#jspsych-free-sort-border")
274
- const button = display_element.querySelector('#jspsych-free-sort-done-btn')
275
-
276
- // when trial starts, modify text and border/background if all items are inside (stim_starts_inside: true)
277
- if (inside.some(Boolean) && trial.change_border_background_color) {
278
- border.style.borderColor = trial.border_color_in;
279
- }
280
- if (inside.every(Boolean)) {
281
- if (trial.change_border_background_color) {
282
- border.style.background = trial.border_color_in;
283
- }
284
- button.style.visibility = "visible";
285
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
286
- }
287
-
288
- let start_event_name = 'mousedown';
289
- let move_event_name = 'mousemove';
290
- let end_event_name = 'mouseup';
291
- if (typeof document.ontouchend !== 'undefined'){ // for touch devices
292
- start_event_name = 'touchstart'
293
- move_event_name = 'touchmove'
294
- end_event_name = 'touchend'
295
- }
296
-
297
- for(let i=0; i<draggables.length; i++){
298
- draggables[i].addEventListener(start_event_name, function(event){
299
- let pageX = event.pageX;
300
- let pageY = event.pageY;
301
- if (typeof document.ontouchend !== 'undefined'){ // for touch devices
302
- event.preventDefault();
303
- const touchObject = event.changedTouches[0]
304
- pageX = touchObject.pageX
305
- pageY = touchObject.pageY
306
- }
307
-
308
- let x = pageX - event.currentTarget.offsetLeft;
309
- let y = pageY - event.currentTarget.offsetTop - window.scrollY;
310
- let elem = event.currentTarget;
311
- elem.style.transform = "scale(" + trial.scale_factor + "," + trial.scale_factor + ")";
312
-
313
- let move_event = function(e){
314
- let clientX = e.clientX;
315
- let clientY = e.clientY;
316
- if (typeof document.ontouchend !== 'undefined'){ // for touch devices
317
- const touchObject = e.changedTouches[0]
318
- clientX = touchObject.clientX
319
- clientY = touchObject.clientY
320
- }
321
-
322
- cur_in = inside_ellipse(clientX - x, clientY - y,
323
- trial.sort_area_width*.5 - trial.stim_width*.5, trial.sort_area_height*.5 - trial.stim_height*.5,
324
- trial.sort_area_width*.5, trial.sort_area_height*.5,
325
- trial.sort_area_shape == "square");
326
- elem.style.top = Math.min(trial.sort_area_height - trial.stim_height*.5, Math.max(- trial.stim_height*.5, (clientY - y))) + 'px';
327
- elem.style.left = Math.min(trial.sort_area_width*1.5 - trial.stim_width, Math.max(-trial.sort_area_width*.5, (clientX - x)))+ 'px';
328
-
329
- // modify border while items is being moved
330
- if (trial.change_border_background_color) {
331
- if (cur_in) {
332
- border.style.borderColor = trial.border_color_in;
333
- border.style.background = "None";
334
- } else {
335
- border.style.borderColor = trial.border_color_out;
336
- border.style.background = "None";
337
- }
338
- }
339
-
340
- // replace in overall array, grab index from item id
341
- var elem_number = elem.id.split("jspsych-free-sort-draggable-")[1];
342
- inside.splice(elem_number, true, cur_in)
343
-
344
- // modify text and background if all items are inside
345
- if (inside.every(Boolean)) {
346
- if (trial.change_border_background_color) {
347
- border.style.background = trial.border_color_in;
348
- }
349
- button.style.visibility = "visible";
350
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
351
- } else {
352
- border.style.background = "none";
353
- button.style.visibility = "hidden";
354
- display_element.querySelector("#jspsych-free-sort-counter").innerHTML = get_counter_text(inside.length - inside.filter(Boolean).length);
355
- }
356
- }
357
- document.addEventListener(move_event_name, move_event);
358
-
359
- var end_event = function(e){
360
- document.removeEventListener(move_event_name, move_event);
361
- elem.style.transform = "scale(1, 1)";
362
- if (trial.change_border_background_color) {
363
- if (inside.every(Boolean)) {
364
- border.style.background = trial.border_color_in;
365
- border.style.borderColor = trial.border_color_in;
366
- } else {
367
- border.style.background = "none";
368
- border.style.borderColor = trial.border_color_out;
369
- }
370
- }
371
- moves.push({
372
- src: elem.dataset.src,
373
- x: elem.offsetLeft,
374
- y: elem.offsetTop
375
- });
376
- document.removeEventListener(end_event_name, end_event);
377
- }
378
- document.addEventListener(end_event_name, end_event);
379
- });
380
- }
381
-
382
- display_element.querySelector('#jspsych-free-sort-done-btn').addEventListener('click', function(){
383
- if (inside.every(Boolean)) {
384
- const end_time = performance.now();
385
- const rt = end_time - start_time;
386
- // gather data
387
- const items = display_element.querySelectorAll('.jspsych-free-sort-draggable');
388
- // get final position of all items
389
- let final_locations = [];
390
- for(let i=0; i<items.length; i++){
391
- final_locations.push({
392
- src: items[i].dataset.src,
393
- x: parseInt(items[i].style.left),
394
- y: parseInt(items[i].style.top)
395
- });
396
- }
397
-
398
- const trial_data = {
399
- init_locations: init_locations,
400
- moves: moves,
401
- final_locations: final_locations,
402
- rt: rt
403
- };
404
-
405
- // advance to next part
406
- display_element.innerHTML = '';
407
- jsPsych.finishTrial(trial_data);
408
- }
409
- });
410
-
411
- function get_counter_text(n) {
412
- var text_out = '';
413
- var text_bits = trial.counter_text_unfinished.split("%");
414
- for (var i=0; i<text_bits.length; i++) {
415
- if (i%2 === 0) {
416
- text_out += text_bits[i];
417
- } else {
418
- if (text_bits[i] == "n") {
419
- text_out += n.toString();
420
- } else if (text_bits[i] == "s" && n > 1) {
421
- text_out += "s";
422
- }
423
- }
424
- }
425
- return text_out;
426
- }
427
- };
428
-
429
- // helper functions
430
-
431
- function shuffle(array) {
432
- // define three variables
433
- let cur_idx = array.length, tmp_val, rand_idx;
434
-
435
- // While there remain elements to shuffle...
436
- while (0 !== cur_idx) {
437
- // Pick a remaining element...
438
- rand_idx = Math.floor(Math.random() * cur_idx);
439
- cur_idx -= 1;
440
-
441
- // And swap it with the current element.
442
- tmp_val = array[cur_idx];
443
- array[cur_idx] = array[rand_idx];
444
- array[rand_idx] = tmp_val;
445
- }
446
- return array;
447
- }
448
-
449
- function make_arr(startValue, stopValue, cardinality) {
450
- const step = (stopValue - startValue) / (cardinality - 1);
451
- let arr = [];
452
- for (let i = 0; i < cardinality; i++) {
453
- arr.push(startValue + (step * i));
454
- }
455
- return arr;
456
- }
457
-
458
- function inside_ellipse(x, y, x0, y0, rx, ry, square=false) {
459
- const results = [];
460
- if (square) {
461
- result = ( Math.abs(x - x0) <= rx ) && ( Math.abs(y - y0) <= ry )
462
- } else {
463
- result = (( x - x0 ) * ( x - x0 )) * (ry * ry) + ((y - y0) * ( y - y0 )) * ( rx * rx ) <= ( (rx * rx) * (ry * ry) )
464
- }
465
- return result
466
- }
467
-
468
- function random_coordinate(max_width, max_height) {
469
- const rnd_x = Math.floor(Math.random() * (max_width - 1));
470
- const rnd_y = Math.floor(Math.random() * (max_height - 1));
471
- return {
472
- x: rnd_x,
473
- y: rnd_y
474
- };
475
- }
476
-
477
- return plugin;
478
- })();