(function( $ ) {
jsPsych.ballistic_match = (function(){
var plugin = {};
plugin.create = function(params) {
stims = params["stimuli"];
trials = new Array(stims.length);
for(var i = 0; i < trials.length; i++)
{
trials[i] = {};
trials[i]["type"] = "ballistic_match";
trials[i]["target_idx"] = params["target_idx"][i];
trials[i]["start_idx"] = params["start_idx"][i];
trials[i]["stimuli"] = params["stimuli"][i];
trials[i]["timing"] = params["timing"];
trials[i]["key_dec"] = params["key_dec"];
trials[i]["key_inc"] = params["key_inc"];
trials[i]["animate_frame_time"] = params["animate_frame_time"] || 100;
if(params["prompt"] != undefined){
trials[i]["prompt"] = params["prompt"];
}
if(params["data"]!=undefined){
trials[i]["data"] = params["data"][i];
}
}
return trials;
}
var change = 0; // which direction they indicated the stim should move.
var start_time;
var end_time;
plugin.trial = function(display_element, block, trial, part)
{
switch(part){
case 1:
// starting new trial
start_time = (new Date()).getTime();
change = 0;
// show manipulate image
display_element.append($('', {
"src": trial.stimuli[trial.start_idx],
"class": 'bm_img',
"id": 'bm_manipulate'
}));
// show target image
display_element.append($('
', {
"src": trial.stimuli[trial.target_idx],
"class": 'bm_img',
"id": 'bm_target'
}));
if(trial.prompt)
{
display_element.append(trial.prompt);
}
// categorize the image.
var resp_func = function(e) {
var valid_response = false;
if(e.which == trial.key_dec)
{
change = -1;
valid_response = true;
} else if (e.which == trial.key_inc)
{
change = 1;
valid_response = true;
}
if(valid_response){
end_time = (new Date()).getTime();
plugin.trial(display_element,block,trial,part+1);
$(document).unbind('keyup', resp_func);
}
}
$(document).keyup(resp_func);
break;
case 2:
// clear everything
display_element.html('');
setTimeout(function(){plugin.trial(display_element, block, trial, part + 1);}, trial.timing[1]);
break;
case 3:
// draw trajectory
draw_trajectory(display_element,
trial.stimuli[trial.target_idx],
trial.stimuli[trial.start_idx],
trial.target_idx/(trial.stimuli.length-1),
trial.start_idx/(trial.stimuli.length-1));
display_element.append($('
You said increase.
'); } else { $("#bm_feedback").html('You said decrease.
'); } setTimeout(function(){plugin.trial(display_element, block, trial, part + 1);}, trial.timing[1]*3); break; case 4: var curr_loc = trial.start_idx animate_interval = setInterval(function(){ // clear everything display_element.html(''); // draw trajectory draw_trajectory(display_element, trial.stimuli[trial.target_idx], trial.stimuli[curr_loc], trial.target_idx/(trial.stimuli.length-1), curr_loc/(trial.stimuli.length-1)); curr_loc += change; if(curr_loc - change == trial.target_idx || curr_loc < 0 || curr_loc == trial.stimuli.length) { clearInterval(animate_interval); var correct = false; if(change > 0 && trial.start_idx < trial.target_idx) { correct = true; } if(change < 0 && trial.start_idx > trial.target_idx) { correct = true; } display_element.append($('Correct!
'); } else { $("#bm_feedback").html('Wrong.
'); } setTimeout(function(){plugin.trial(display_element, block, trial, part + 1);}, trial.timing[1]*3); } }, trial.animate_frame_time); break; case 5: display_element.html(''); var correct = false; if(change > 0 && trial.start_idx < trial.target_idx) { correct = true; } if(change < 0 && trial.start_idx > trial.target_idx) { correct = true; } var trial_data = {"start_idx":trial.start_idx, "target_idx": trial.target_idx, "correct": correct, "rt": (end_time-start_time)}; block.data[block.trial_idx] = $.extend({},trial_data,trial.data); setTimeout(function(){block.next();}, trial.timing[0]); break; } } function draw_trajectory(display_element,target_img, moving_img, target_loc_percent, marker_loc_percent) { // display the image as it morphs display_element.append($('Target Cell
"); $("#trajectory").append($('Above Cell
"); // label the trajectory line $("#trajectory").append($('', { "id": "left_label"})); $("#trajectory").append($('', { "id": "right_label"})); $("#left_label").html("Less Chemical X"); $("#right_label").html("More Chemical X"); // set the location of the flags on the line var dot_width = parseInt($("#marker_dot").css('width')); var line_width = parseInt($("#line").css('width')); var target_flag_left = (line_width- dot_width) * target_loc_percent; var marker_flag_left = (line_width- dot_width) * marker_loc_percent; $("#marker_flag").css('left', marker_flag_left); $("#target_flag").css('left', target_flag_left); } return plugin; })(); })(jQuery);