Hm actually, I figured it might be easier to replace the Math.random() function with a seeded random function and then use the survey number as a seed. That way it should stay constant for a user.
Code:
<script type="text/javascript" data-author="BBSR-SR5 & Tony Partner">
$(document).on('ready pjax:scriptcomplete',function(){
//Define Seeded Random function
function splitmix32(a) {
return function() {
a |= 0;
a = a + 0x9e3779b9 | 0;
let t = a ^ a >>> 16;
t = Math.imul(t, 0x21f0aaad);
t = t ^ t >>> 15;
t = Math.imul(t, 0x735a2d97);
return ((t = t ^ t >>> 15) >>> 0) / 4294967296;
};
}
function shuffleArray(array) {
const seed = Date.now();
const random = splitmix32(seed);
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
// Merge function
function mergeArrays(array1, array2) {
var mergedArray = [];
var maxLength = Math.max(array1.length, array2.length);
for (var i = 0; i < maxLength; i++) {
if (i < array2.length) {
mergedArray.push(array2[i]);
}
if (i < array1.length) {
mergedArray.push(array1[i]);
}
}
return mergedArray;
}
//Identify this question
var thisQuestion = $('#question{QID}');
var thisAnswerList = $('tr.answers-list:eq(0)', thisQuestion).parent();
var thisTable = $('table.subquestion-list:eq(0)', thisQuestion);
// Special codes appear after
var afterCode = 4;
//Array for K Codes
var array_k = ["b","d","g","h","i","j","l"];
//Array for N Codes
var array_n = ["c","e","f","k","m","n"];
//Array for Special K Codes
var array_sk = [];
//Array for Special N codes
var array_sn = ["a"];
//Array for super special codes
var array_ss = ["o"];
// Shuffle order of "normal" arrays
shuffleArray(array_k);
shuffleArray(array_n);
// Slice "normal" arrays and merge second part to special codes
array_sk = array_sk.concat(array_k.slice(afterCode));
array_sn = array_sn.concat(array_n.slice(afterCode));
// Save only first part of "normal" arrays
array_k = array_k.slice(0, afterCode);
array_n = array_n.slice(0, afterCode);
// Shuffle special arrays
shuffleArray(array_sk);
shuffleArray(array_sn);
shuffleArray(array_ss);
// Combine normal and special arrays
array_k = array_k.concat(array_sk);
array_n = array_n.concat(array_sn);
// Merge arrays in order n,k,n,k...
var array_res = mergeArrays(array_k, array_n);
//Add super special array to end of result array
array_res = array_res.concat(array_ss);
// Loop through the answer codes
$.each(array_res, function(i, val) {
// Move the answer item
$(thisAnswerList).append($('tr.answers-list[id$="X{QID}'+val+'"]', thisQuestion));
});
// Fix up the row background colours
$('tr.answers-list', thisQuestion). each (function(i){
$(this).removeClass('ls-even ls-odd');
if(i % 2 == 0) {
$(this).addClass('ls-even');
}
else {
$(this).addClass('ls-odd');
}
});
//alert(array_res);
//console.log(array_res);
});
</script>