jspsych 6.3.1 → 7.1.2

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 (401) 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 +3171 -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 +3165 -0
  10. package/dist/index.cjs.map +1 -0
  11. package/dist/index.d.ts +11 -0
  12. package/dist/index.js +3159 -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 +136 -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 +165 -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 -719
  59. package/docs/core_library/jspsych-data.md +0 -587
  60. package/docs/core_library/jspsych-pluginAPI.md +0 -624
  61. package/docs/core_library/jspsych-randomization.md +0 -389
  62. package/docs/core_library/jspsych-turk.md +0 -98
  63. package/docs/extensions/extensions.md +0 -83
  64. package/docs/extensions/jspsych-ext-webgazer.md +0 -137
  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 -180
  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 -271
  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 -61
  145. package/docs/plugins/jspsych-webgazer-init-camera.md +0 -30
  146. package/docs/plugins/jspsych-webgazer-validate.md +0 -44
  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/ridgeWorker.mjs +0 -135
  216. package/examples/js/webgazer/webgazer.js +0 -88909
  217. package/examples/js/webgazer/worker_scripts/mat.js +0 -306
  218. package/examples/js/webgazer/worker_scripts/util.js +0 -398
  219. package/examples/jspsych-RDK.html +0 -58
  220. package/examples/jspsych-animation.html +0 -39
  221. package/examples/jspsych-audio-button-response.html +0 -58
  222. package/examples/jspsych-audio-keyboard-response.html +0 -68
  223. package/examples/jspsych-audio-slider-response.html +0 -61
  224. package/examples/jspsych-call-function.html +0 -32
  225. package/examples/jspsych-canvas-button-response.html +0 -95
  226. package/examples/jspsych-canvas-keyboard-response.html +0 -78
  227. package/examples/jspsych-canvas-slider-response.html +0 -67
  228. package/examples/jspsych-categorize-animation.html +0 -49
  229. package/examples/jspsych-categorize-html.html +0 -33
  230. package/examples/jspsych-categorize-image.html +0 -44
  231. package/examples/jspsych-cloze.html +0 -37
  232. package/examples/jspsych-free-sort.html +0 -109
  233. package/examples/jspsych-fullscreen.html +0 -45
  234. package/examples/jspsych-html-button-response.html +0 -43
  235. package/examples/jspsych-html-keyboard-response.html +0 -42
  236. package/examples/jspsych-html-slider-response.html +0 -53
  237. package/examples/jspsych-iat.html +0 -520
  238. package/examples/jspsych-image-button-response.html +0 -91
  239. package/examples/jspsych-image-keyboard-response.html +0 -85
  240. package/examples/jspsych-image-slider-response.html +0 -85
  241. package/examples/jspsych-instructions.html +0 -37
  242. package/examples/jspsych-maxdiff.html +0 -33
  243. package/examples/jspsych-preload.html +0 -140
  244. package/examples/jspsych-reconstruction.html +0 -43
  245. package/examples/jspsych-resize.html +0 -34
  246. package/examples/jspsych-same-different-html.html +0 -28
  247. package/examples/jspsych-same-different-image.html +0 -39
  248. package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
  249. package/examples/jspsych-serial-reaction-time.html +0 -54
  250. package/examples/jspsych-survey-html-form.html +0 -33
  251. package/examples/jspsych-survey-likert.html +0 -42
  252. package/examples/jspsych-survey-multi-choice.html +0 -40
  253. package/examples/jspsych-survey-multi-select.html +0 -42
  254. package/examples/jspsych-survey-text.html +0 -34
  255. package/examples/jspsych-video-button-response.html +0 -65
  256. package/examples/jspsych-video-keyboard-response.html +0 -61
  257. package/examples/jspsych-video-slider-response.html +0 -63
  258. package/examples/jspsych-virtual-chinrest.html +0 -69
  259. package/examples/jspsych-visual-search-circle.html +0 -64
  260. package/examples/jspsych-vsl-animate-occlusion.html +0 -35
  261. package/examples/jspsych-vsl-grid-scene.html +0 -47
  262. package/examples/lexical-decision.html +0 -134
  263. package/examples/manual-preloading.html +0 -59
  264. package/examples/pause-unpause.html +0 -33
  265. package/examples/progress-bar.html +0 -68
  266. package/examples/save-trial-parameters.html +0 -98
  267. package/examples/sound/hammer.mp3 +0 -0
  268. package/examples/sound/sound.mp3 +0 -0
  269. package/examples/sound/speech_blue.mp3 +0 -0
  270. package/examples/sound/speech_green.mp3 +0 -0
  271. package/examples/sound/speech_joke.mp3 +0 -0
  272. package/examples/sound/speech_red.mp3 +0 -0
  273. package/examples/sound/tone.mp3 +0 -0
  274. package/examples/timeline-variables-sampling.html +0 -50
  275. package/examples/timeline-variables.html +0 -64
  276. package/examples/video/sample_video.mp4 +0 -0
  277. package/examples/webgazer.html +0 -174
  278. package/examples/webgazer_audio.html +0 -90
  279. package/examples/webgazer_image.html +0 -60
  280. package/extensions/jspsych-ext-webgazer.js +0 -265
  281. package/jspsych.js +0 -3023
  282. package/license.txt +0 -21
  283. package/mkdocs.yml +0 -118
  284. package/plugins/jspsych-animation.js +0 -189
  285. package/plugins/jspsych-audio-button-response.js +0 -269
  286. package/plugins/jspsych-audio-keyboard-response.js +0 -209
  287. package/plugins/jspsych-audio-slider-response.js +0 -278
  288. package/plugins/jspsych-call-function.js +0 -58
  289. package/plugins/jspsych-canvas-button-response.js +0 -199
  290. package/plugins/jspsych-canvas-keyboard-response.js +0 -155
  291. package/plugins/jspsych-canvas-slider-response.js +0 -207
  292. package/plugins/jspsych-categorize-animation.js +0 -266
  293. package/plugins/jspsych-categorize-html.js +0 -220
  294. package/plugins/jspsych-categorize-image.js +0 -222
  295. package/plugins/jspsych-cloze.js +0 -112
  296. package/plugins/jspsych-external-html.js +0 -112
  297. package/plugins/jspsych-free-sort.js +0 -478
  298. package/plugins/jspsych-fullscreen.js +0 -106
  299. package/plugins/jspsych-html-button-response.js +0 -188
  300. package/plugins/jspsych-html-keyboard-response.js +0 -149
  301. package/plugins/jspsych-html-slider-response.js +0 -202
  302. package/plugins/jspsych-iat-html.js +0 -284
  303. package/plugins/jspsych-iat-image.js +0 -286
  304. package/plugins/jspsych-image-button-response.js +0 -327
  305. package/plugins/jspsych-image-keyboard-response.js +0 -263
  306. package/plugins/jspsych-image-slider-response.js +0 -369
  307. package/plugins/jspsych-instructions.js +0 -237
  308. package/plugins/jspsych-maxdiff.js +0 -173
  309. package/plugins/jspsych-preload.js +0 -345
  310. package/plugins/jspsych-rdk.js +0 -1373
  311. package/plugins/jspsych-reconstruction.js +0 -134
  312. package/plugins/jspsych-resize.js +0 -166
  313. package/plugins/jspsych-same-different-html.js +0 -168
  314. package/plugins/jspsych-same-different-image.js +0 -169
  315. package/plugins/jspsych-serial-reaction-time-mouse.js +0 -212
  316. package/plugins/jspsych-serial-reaction-time.js +0 -247
  317. package/plugins/jspsych-survey-html-form.js +0 -171
  318. package/plugins/jspsych-survey-likert.js +0 -195
  319. package/plugins/jspsych-survey-multi-choice.js +0 -208
  320. package/plugins/jspsych-survey-multi-select.js +0 -232
  321. package/plugins/jspsych-survey-text.js +0 -185
  322. package/plugins/jspsych-video-button-response.js +0 -335
  323. package/plugins/jspsych-video-keyboard-response.js +0 -279
  324. package/plugins/jspsych-video-slider-response.js +0 -351
  325. package/plugins/jspsych-virtual-chinrest.js +0 -471
  326. package/plugins/jspsych-visual-search-circle.js +0 -259
  327. package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
  328. package/plugins/jspsych-vsl-grid-scene.js +0 -103
  329. package/plugins/jspsych-webgazer-calibrate.js +0 -161
  330. package/plugins/jspsych-webgazer-init-camera.js +0 -139
  331. package/plugins/jspsych-webgazer-validate.js +0 -314
  332. package/plugins/template/jspsych-plugin-template.js +0 -35
  333. package/tests/README.md +0 -7
  334. package/tests/jsPsych/case-sensitive-responses.test.js +0 -53
  335. package/tests/jsPsych/css-classes-parameter.test.js +0 -107
  336. package/tests/jsPsych/default-iti.test.js +0 -51
  337. package/tests/jsPsych/default-parameters.test.js +0 -58
  338. package/tests/jsPsych/endexperiment.test.js +0 -49
  339. package/tests/jsPsych/events.test.js +0 -606
  340. package/tests/jsPsych/functions-as-parameters.test.js +0 -210
  341. package/tests/jsPsych/init.test.js +0 -48
  342. package/tests/jsPsych/loads.test.js +0 -7
  343. package/tests/jsPsych/min-rt.test.js +0 -58
  344. package/tests/jsPsych/progressbar.test.js +0 -202
  345. package/tests/jsPsych/timeline-variables.test.js +0 -531
  346. package/tests/jsPsych/timelines.test.js +0 -569
  347. package/tests/jsPsych.data/data-csv-conversion.test.js +0 -85
  348. package/tests/jsPsych.data/data-json-conversion.test.js +0 -120
  349. package/tests/jsPsych.data/datacollection.test.js +0 -117
  350. package/tests/jsPsych.data/datacolumn.test.js +0 -50
  351. package/tests/jsPsych.data/datamodule.test.js +0 -152
  352. package/tests/jsPsych.data/dataparameter.test.js +0 -251
  353. package/tests/jsPsych.data/interactions.test.js +0 -109
  354. package/tests/jsPsych.data/trialparameters.test.js +0 -175
  355. package/tests/jsPsych.extensions/extensions.test.js +0 -207
  356. package/tests/jsPsych.extensions/test-extension.js +0 -42
  357. package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -365
  358. package/tests/jsPsych.pluginAPI/preloads.test.js +0 -43
  359. package/tests/jsPsych.randomization/randomziation.test.js +0 -27
  360. package/tests/jsPsych.utils/utils.test.js +0 -58
  361. package/tests/plugins/plugin-animation.test.js +0 -34
  362. package/tests/plugins/plugin-audio-button-response.test.js +0 -15
  363. package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
  364. package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
  365. package/tests/plugins/plugin-call-function.test.js +0 -49
  366. package/tests/plugins/plugin-categorize-animation.test.js +0 -263
  367. package/tests/plugins/plugin-categorize-html.test.js +0 -17
  368. package/tests/plugins/plugin-categorize-image.test.js +0 -17
  369. package/tests/plugins/plugin-cloze.test.js +0 -157
  370. package/tests/plugins/plugin-free-sort.test.js +0 -106
  371. package/tests/plugins/plugin-fullscreen.test.js +0 -41
  372. package/tests/plugins/plugin-html-button-response.test.js +0 -161
  373. package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
  374. package/tests/plugins/plugin-html-slider-response.test.js +0 -155
  375. package/tests/plugins/plugin-iat-html.test.js +0 -299
  376. package/tests/plugins/plugin-iat-image.test.js +0 -298
  377. package/tests/plugins/plugin-image-button-response.test.js +0 -174
  378. package/tests/plugins/plugin-image-keyboard-response.test.js +0 -147
  379. package/tests/plugins/plugin-image-slider-response.test.js +0 -174
  380. package/tests/plugins/plugin-instructions.test.js +0 -85
  381. package/tests/plugins/plugin-maxdiff.test.js +0 -39
  382. package/tests/plugins/plugin-preload.test.js +0 -916
  383. package/tests/plugins/plugin-rdk.test.js +0 -61
  384. package/tests/plugins/plugin-reconstruction.test.js +0 -16
  385. package/tests/plugins/plugin-resize.test.js +0 -16
  386. package/tests/plugins/plugin-same-different-html.test.js +0 -17
  387. package/tests/plugins/plugin-same-different-image.test.js +0 -17
  388. package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
  389. package/tests/plugins/plugin-serial-reaction-time.test.js +0 -109
  390. package/tests/plugins/plugin-survey-html-form.test.js +0 -44
  391. package/tests/plugins/plugin-survey-likert.test.js +0 -48
  392. package/tests/plugins/plugin-survey-multi-choice.test.js +0 -47
  393. package/tests/plugins/plugin-survey-multi-select.test.js +0 -71
  394. package/tests/plugins/plugin-survey-text.test.js +0 -115
  395. package/tests/plugins/plugin-video-button-response.test.js +0 -32
  396. package/tests/plugins/plugin-video-keyboard-response.test.js +0 -32
  397. package/tests/plugins/plugin-video-slider-response.test.js +0 -31
  398. package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
  399. package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
  400. package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
  401. 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
- })();