diff --git a/static/js/jspsych/poldrack_plugins/jspsych-reading.js b/static/js/jspsych/poldrack_plugins/jspsych-reading.js
new file mode 100644
index 0000000..2364667
--- /dev/null
+++ b/static/js/jspsych/poldrack_plugins/jspsych-reading.js
@@ -0,0 +1,173 @@
+/* Based on jspsych-text.js
+ *
+ * Display HTML text with navigation and timeout.
+ *
+ */
+
+jsPsych.plugins.reading = (function() {
+
+ var plugin = {};
+
+ plugin.trial = function(display_element, trial) {
+
+ trial.key_forward = trial.key_forward || 'rightarrow';
+ trial.key_backward = trial.key_backward || 'leftarrow';
+ trial.allow_backward = (typeof trial.allow_backward === 'undefined') ? true : trial.allow_backward;
+ trial.allow_keys = (typeof trial.allow_keys === 'undefined') ? true : trial.allow_keys;
+ trial.show_clickable_nav = (typeof trial.show_clickable_nav === 'undefined') ? false : trial.show_clickable_nav;
+
+ // if any trial variables are functions
+ // this evaluates the function and replaces
+ // it with the output of the function
+ trial = jsPsych.pluginAPI.evaluateFunctionParameters(trial);
+
+ var current_page = 0;
+ var furthest_page = current_page;
+
+ var view_history = [];
+
+ var start_time = (new Date()).getTime();
+
+ var last_page_update_time = start_time;
+
+ function show_current_page() {
+ display_element.html(trial.pages[current_page]);
+
+ if (trial.show_clickable_nav) {
+
+ var nav_html = "
";
+ if (current_page != 0 && trial.allow_backward) {
+ nav_html += "";
+ }
+ nav_html += "
"
+
+ nav_html += ""
+
+ display_element.append(nav_html);
+
+ if (current_page != 0 && trial.allow_backward) {
+ $('#jspsych-reading-back').on('click', function() {
+ clear_button_handlers();
+ back();
+ });
+ }
+
+ $('#jspsych-reading-next').on('click', function() {
+ clear_button_handlers();
+ next();
+ });
+ }
+ }
+
+ function clear_button_handlers() {
+ $('#jspsych-reading-next').off('click');
+ $('#jspsych-reading-back').off('click');
+ }
+
+ function next() {
+ // FIXME: page count :)
+
+ add_current_page_to_view_history()
+
+ current_page++;
+
+
+ // if done, finish up...
+ if (current_page >= trial.pages.length) {
+ end_trial();
+ } else {
+ furthest_page = current_page;
+ show_current_page();
+ }
+
+ }
+
+ function back() {
+
+ add_current_page_to_view_history()
+
+ current_page--;
+
+ show_current_page();
+ }
+
+ function add_current_page_to_view_history() {
+
+ var current_time = (new Date()).getTime();
+
+ var page_view_time = current_time - last_page_update_time;
+
+ view_history.push({
+ page_index: current_page,
+ viewing_time: page_view_time
+ });
+
+ last_page_update_time = current_time;
+ }
+
+ var after_response = function(info) {
+
+ // have to reinitialize this instead of letting it persist to prevent accidental skips of pages by holding down keys too long
+ keyboard_listener = jsPsych.pluginAPI.getKeyboardResponse({
+ callback_function: after_response,
+ valid_responses: [trial.key_forward, trial.key_backward],
+ rt_method: 'date',
+ persist: false,
+ allow_held_key: false
+ });
+ // check if key is forwards or backwards and update page
+ if (info.key === trial.key_backward || info.key === jsPsych.pluginAPI.convertKeyCharacterToKeyCode(trial.key_backward)) {
+ if (current_page !== 0 && trial.allow_backward) {
+ back();
+ }
+ }
+
+ if (info.key === trial.key_forward || info.key === jsPsych.pluginAPI.convertKeyCharacterToKeyCode(trial.key_forward)) {
+ next();
+ }
+ };
+
+ function end_trial() {
+ clearTimeout(t1);
+ display_element.html(''); // clear the display
+
+ if (trial.allow_keys) {
+ jsPsych.pluginAPI.cancelKeyboardResponse(keyboard_listener);
+ }
+
+ // FIXME: this is always the maximum (rather than actual) duration
+ var block_duration = trial.timing_response
+
+ var trialdata = {
+ "text": trial.text,
+ "rt": (new Date()).getTime() - start_time,
+ "block_duration": block_duration,
+ "timing_post_trial": trial.timing_post_trial,
+ "furthest_page": furthest_page,
+ "view_history": JSON.stringify(view_history)
+ }
+
+ jsPsych.finishTrial(trialdata);
+ };
+
+ show_current_page();
+
+ if (trial.allow_keys) {
+ var keyboard_listener = jsPsych.pluginAPI.getKeyboardResponse({
+ callback_function: after_response,
+ valid_responses: [trial.key_forward, trial.key_backward],
+ rt_method: 'date',
+ persist: false
+ });
+ }
+
+ // end trial if time limit is set
+ if (trial.timing_response > 0) {
+ var t1 = setTimeout(function() {
+ end_trial();
+ }, trial.timing_response);
+ }
+ };
+
+ return plugin;
+})();
\ No newline at end of file