/**
* Created by AKlimenko on 21.09.2016.
* There are a lot of magic and crutches. But you can touch it.
*/
;(function () {
'use strict';
var currentStep = 1;
var _stepsStorage;
var _taskStorage;
var _elem;
var _section;
var wordInterval;
var $wordBox;
var $words;
var $testWords;
var $wordsBox;
function stepsStorageFactory(updater, totlSteps, currStep) {
var totalSteps = totlSteps || 1;
var storageUpdater = updater || {};
return {
get currentStep() {
return currentStep
},
get totalSteps() {
return totalSteps
},
get updater() {
return updater
},
backStep: function () {
if (currentStep === 1)
return;//console.log('this is the first step!');
currentStep--;
storageUpdater.trigger()
},
nextStep: function () {
if (currentStep === totalSteps)
return;//console.log('this is the last step!')
currentStep++;
storageUpdater.trigger();
},
changeStep: function (step) {
currentStep = step;
storageUpdater.trigger()
}
}
}
function taskStorageFactory(updater, wrds) {
var words = wrds || [];
var userRecalled = [];
var userPresented = [];
var userNotPresented = [];
var storageUpdater = updater || {};
return {
get userRecalled() {
return userRecalled
},
get words() {
return words
},
get updater() {
return updater
},
get userPresented() {
return userPresented
},
get userNotPresented() {
return userNotPresented
},
userAnswer: function (answer) {
//answer example: 'foo bar baz bax'
userRecalled = answer.split(' ')
.filter(function (word) {
return word !== ''
})
.filter(function (word, i, arr) {
return arr.indexOf(word) === i
});
updater.trigger()
},
clearRecognition: function () {
userPresented = [];
userNotPresented = []
},
addPresented: function (word) {
userPresented.push(word);
storageUpdater.trigger()
},
addNotPresented: function (word) {
userNotPresented.push(word);
storageUpdater.trigger()
}
}
}
function storageUpdater() {
var storageHandlers = [];
return {
addStorageHandler: function (callback) {
storageHandlers.push(callback)
},
trigger: function () {
storageHandlers.forEach(function (handler) {
handler()
})
}
}
}
function slideInitHandler(section) {
console.log('slideInitHandler');
//section config
_section = section;
section.points_possible = 1;
section.points_earned = 0;
section.section_completed = false;
_elem = section.jq;
_elem.addClass('practice-1');
_elem.addClass('practice-steps');
//add Accessibility elements
var ariaLabel = section.title + '. '; //+ section.instructions
var ariaReader = $('
');
ariaReader.addClass('hidden_element');
ariaReader.attr('aria-label', ariaLabel);
ariaReader.attr('tabindex', '-1');
_elem.prepend(ariaReader)
$wordBox = _elem.find('.word-box__list');
$words = _elem.find('.word-box__word').hide().clone();
}
function update() {
//update step view
_elem.find('.practice-steps__step').hide();
var $currentStep = _elem.find('.practice-steps__step').eq(_stepsStorage.currentStep - 1);
var $stepInstruction = $currentStep.find('.practice-steps__instruction').first();
$('.footer').first().empty()
.append($stepInstruction.clone().show());
$stepInstruction.hide();
$currentStep.show();
$('#digfir_section_1 .recall-test__area').focus();
//update counter
$('.practice-steps__counter').html(_stepsStorage.currentStep + '/' + _stepsStorage.totalSteps);
switch (_stepsStorage.currentStep) {
case 1:
initSlide1();
break;
case 2:
initSlide2();
break;
case 3:
initSlide3();
break;
default:
console.log('no such step:', _stepsStorage.currentStep)
}
_elem.find('[data-type="rawhtml"]').focus()
}
function updateTask() {
// console.log('updateTask');
// console.log('_taskStorage: words', _taskStorage.words);
// console.log('_taskStorage: userRecalled', _taskStorage.userRecalled);
// console.log('_taskStorage: userPresented', _taskStorage.userPresented);
// console.log('_taskStorage: userNotPresented', _taskStorage.userNotPresented);
}
function slideShowHandler(section) {
// console.log('slideShowHandler', section);
currentStep = 1;
//set section storage
var totalSteps = _elem.find('.practice-steps__step').length;
_stepsStorage = stepsStorageFactory(storageUpdater(), totalSteps);
_stepsStorage.updater.addStorageHandler(update);
//task--------------------------------------------------------
//words-memory-task
var words = _elem.find('.word-box__word').toArray().map(function (e) {
return e.innerHTML
});
_taskStorage = taskStorageFactory(storageUpdater(), words);
_taskStorage.updater.addStorageHandler(updateTask);
_stepsStorage.updater.trigger();
_taskStorage.updater.trigger()
}
function initSlide1() {
console.log('--------initSlide1--------> word-box__');
var $beginBtn = _elem.find('.word-box__begin');
var $continueBtn = _elem.find('.word-box__continue').hide();
var $feedback = _elem.find('.word-box__feedback');
var $feedbackMessage = $feedback.contents().clone();
$wordBox.empty();
$wordBox.hide()
.fadeIn(700);
$beginBtn.hide()
.delay(700)
.fadeIn(400);
$feedback.empty().hide();
//$continueBtn
// .unbind('click')
// .bind('click', _stepsStorage.nextStep)
$beginBtn
.unbind('click')
.bind('click', function () {
var currWord = 0;
var dt = $wordBox.attr('data-delay') || 2000;
$wordBox.empty()
.append($words.eq(currWord).clone().show())
.focus();
setTimeout(function(){
$wordBox.empty()
}, dt/2);
$beginBtn.hide();
currWord++;
wordInterval = setInterval(function () {
if (currWord === $words.length) {
clearInterval(wordInterval);
// $wordBox.fadeOut()
$feedback
.append($feedbackMessage)
.delay(400)
.fadeIn();
$wordBox.empty().append($words);
$wordBox
.attr('disabled',true);
//$continueBtn.fadeIn().focus()
_stepsStorage.nextStep();
return
}
$wordBox.empty()
.append($words.eq(currWord).clone().show())
.focus();
setTimeout(function(){
$wordBox.empty()
}, dt/2);
currWord++
}, dt)
})
}
function initSlide2() {
// console.log('--------initSlide2--------> recall-test__');
_elem.find('.practice-steps__description').first()
.append(_elem.find('.recall-test__description').first());
var $submit = _elem.find('.recall-test__finish')
.unbind('click')
.hide()
.attr('aria-hidden', true)
.bind('click', _stepsStorage.nextStep);
var $area = _elem.find('.recall-test__area')
.unbind('input')
.hide()
.attr('disabled', false)
.attr('aria-hidden', false)
.fadeIn(700);
var $feedback = _elem.find('.recall-test__feedback');
var $feedbackMessage = $feedback.contents().clone();
$feedback.empty().hide();
$('.footer>p').text('When you have typed all the words you can remember, select the FINISHED button.');
//clear old answer
$area.val('');
$area.bind('input', function () {
_taskStorage.userAnswer($area.val());
if (_taskStorage.userRecalled.length) {
$submit.fadeIn()
.attr('aria-hidden', false)
} else {
$submit.hide()
}
})
}
function initSlide3() {
// console.log('--------initSlide3--------> recognition-test__');
_elem.find('.practice-steps__description').first()
.append(_elem.find('.recognition-test__description').first());
_taskStorage.clearRecognition();
var $feedback = _elem.find('.recognition-test__feedback');
var $feedbackMessage = _elem.find('.recognition-test__feedback').contents().clone();
var $presentedBtn = _elem.find('.recognition-test__presented-btn');
var $notPresentedBtn = _elem.find('.recognition-test__not-presented-btn');
$testWords = _elem.find('.recognition-test__word').hide().clone();
$wordsBox = _elem.find('.recognition-test__list');
$wordsBox.empty().hide().fadeIn(700);
$presentedBtn.unbind('click').hide().delay(700).fadeIn(700).removeAttr('disabled');
$notPresentedBtn.unbind('click').hide().delay(700).fadeIn(700).removeAttr('disabled');
$feedback.empty();
var currentWordIndex = 0;
showWord(currentWordIndex);
function showWord(wordNum) {
$presentedBtn.attr('aria-label', '');
$notPresentedBtn.attr('aria-label', '');
// console.log('wordNum',wordNum)
// console.log('$testWords',$testWords.length)
if (wordNum < $testWords.length) {
$wordsBox.empty().append($testWords.eq(wordNum).clone().fadeIn());
$presentedBtn.attr('aria-label', 'Word '+ $testWords.eq(wordNum).text()+'. ' + $presentedBtn.text());
$notPresentedBtn.attr('aria-label', 'Word '+ $testWords.eq(wordNum).text()+'. ' + $notPresentedBtn.text())
} else {
$wordsBox.empty().append($testWords.hide());
// $feedback
// .append($feedbackMessage)
// .delay(400)
// .fadeIn()
$presentedBtn.attr('disabled', true);
$notPresentedBtn.attr('disabled', true);
finishTask()
}
}
$presentedBtn.bind('click', function () {
_taskStorage.addPresented($testWords.eq(currentWordIndex).text());
currentWordIndex++;
showWord(currentWordIndex)
});
$notPresentedBtn.bind('click', function () {
_taskStorage.addNotPresented($testWords.eq(currentWordIndex).text());
currentWordIndex++;
showWord(currentWordIndex)
})
}
function finishTask(){
// console.log('--------finishTask--------> ');
window.mheContpract['practice-1'].storage = _taskStorage;
_section.points_earned = 1;
_section.section_completed = true;
player.activity.grade_activity();
player.update_section_status();
//#########################
var $feedback = _elem.find('.practice-1__feedback').hide();
document.querySelector('.navigation_button.next_button').focus();
Standard_Dialog.open($feedback.text(), {
title: 'Practice 1 completed!'
});
}
function slideHideHandler(section) {
// console.log('slideHideHandler', section)
//add navigation
clearInterval(wordInterval);
if (currentStep == 1) {
$wordBox.empty();
$wordBox.append($words);
}
if (currentStep == 3) {
$wordsBox.empty();
$wordsBox.append($testWords);
}
_taskStorage = {};
_stepsStorage = {}
}
window.mheContpract = window.mheContpract || {};
window.mheContpract['practice-1'] = {
initialize: slideInitHandler,
show: slideShowHandler,
hide: slideHideHandler
};
})();
(function () {
'use strict';
function slideInitHandler(section) {
//console.log('slideInitHandler');
section.points_possible = 1;
section.points_earned = 0;
section.section_completed = false;
var _elem = section.jq;
_elem.addClass('practice-2')
.addClass('practice-steps');
//add Accessibility elements
var ariaLabel = section.title + '. ' + section.instructions;
var ariaReader = $('
');
ariaReader.addClass('hidden_element');
ariaReader.attr('aria-label', ariaLabel);
ariaReader.attr('tabindex', '-1');
_elem.prepend(ariaReader)
}
function slideShowHandler(section) {
//console.log('slideShowHandler', section);
var _elem = section.jq;
var _taskStorage = window.mheContpract['practice-1'].storage;
_elem.find('.practice-steps__step').show();
section.points_earned = 1;
section.section_completed = true;
player.activity.grade_activity();
player.update_section_status();
// document.querySelector('.navigation_button.next_button').focus();
var $recallScore =
_elem.find('.memory-reliable__recall-test-result')
.find('.memory-reliable__score')
.empty();
var $recognitionScore =
_elem.find('.memory-reliable__recognition-test-result')
.find('.memory-reliable__score')
.empty();
var $wordsPresented =
_elem.find('.memory-reliable__words-presented')
.find('.memory-reliable__col-wrapper')
.empty();
var $wordsRecalledInList =
_elem.find('.memory-reliable__words-recalled')
.find('.memory-reliable__words-in-list')
.empty();
var $wordsRecalledNotInList =
_elem.find('.memory-reliable__words-recalled')
.find('.memory-reliable__words-not-in-list')
.empty();
var $wordsRecognizedInList =
_elem.find('.memory-reliable__words-recognized')
.find('.memory-reliable__words-in-list')
.empty();
var $wordsRecognizedNotInList =
_elem.find('.memory-reliable__words-recognized')
.find('.memory-reliable__words-not-in-list')
.empty();
var userRecallResult =
Math.max(_taskStorage.userRecalled
.reduce(function (sum, word) {
if (_taskStorage.words.indexOf(word) !== -1)
return sum += (100 / _taskStorage.words.length)
else
return sum //-= (100/_taskStorage.words.length)
}, 0), 0)
var userRecognitionResult =
Math.max(_taskStorage.userPresented
.reduce(function (sum, word) {
if (_taskStorage.words.indexOf(word) !== -1)
return sum += (100 / _taskStorage.words.length)
else
return sum //-= (100/_taskStorage.words.length)
}, 0), 0)
$recallScore.append(Math.round(userRecallResult) + '% correct.');
$recognitionScore.append(Math.round(userRecognitionResult) + '% correct.');
function getWordElem(word) {
return $('
').addClass('memory-reliable__word').html(word)
}
function defaultOrderReducer(tmpArr, item) {
var wordIndex = _taskStorage.words.indexOf(item);
if (wordIndex === -1)
tmpArr.push(item);
else
tmpArr[wordIndex] = item;
return tmpArr
}
_taskStorage.words
.forEach(function (word) {
$wordsPresented.append(getWordElem(word))
});
//sort user recalls in right order
var sortedUserRecalled =
_taskStorage.userRecalled
.reduce(
defaultOrderReducer,
new Array(_taskStorage.words.length)
);
_taskStorage.words
.forEach(function (word) {
if (sortedUserRecalled.indexOf(word) !== -1)
$wordsRecalledInList.append(getWordElem(word));
else
$wordsRecalledInList.append(getWordElem('---'))
});
_taskStorage.userRecalled
.filter(function (word) {
return _taskStorage.words.indexOf(word) === -1
})
.forEach(function (word) {
$wordsRecalledNotInList.append(getWordElem(word))
});
//sort user recognitions in right order
var sortedUserRecognized =
_taskStorage.userPresented
.concat(_taskStorage.userNotPresented)
.reduce(
defaultOrderReducer,
new Array(_taskStorage.words.length)
);
sortedUserRecognized.forEach(function (word) {
if (_taskStorage.userPresented.indexOf(word) !== -1) {
var wordP = word + ' - P';
if (_taskStorage.words.indexOf(word) !== -1)
$wordsRecognizedInList.append(getWordElem(wordP));
else
$wordsRecognizedNotInList.append(getWordElem(wordP))
} else {
var wordN = word + ' - N';
if (_taskStorage.words.indexOf(word) !== -1)
$wordsRecognizedInList.append(getWordElem(wordN));
else
$wordsRecognizedNotInList.append(getWordElem(wordN))
}
})
}
function slideHideHandler(section) {
//console.log('slideHideHandler', section)
//add navigation
}
window.mheContpract = window.mheContpract || {};
window.mheContpract['practice-2'] = {
initialize: slideInitHandler,
show: slideShowHandler,
hide: slideHideHandler
};
})();