/**
  * fix_js_ShowMessage
  *
  * @param xxx $str (passed by reference)
  * @param xxx $start
  * @param xxx $length
  * @return xxx
  */
 function fix_js_ShowMessage(&$str, $start, $length)
 {
     $substr = substr($str, $start, $length);
     // do standard fix for this function
     parent::fix_js_ShowMessage($substr, 0, strlen($substr));
     // add extra argument, QNum, to this function
     $substr = preg_replace($this->searchShowMessage, $this->replaceShowMessage, $substr, 1);
     if ($pos = strpos($substr, '{')) {
         $insert = "\n" . "\tif (typeof(QNum)!='undefined' && State[QNum] && State[QNum][0]>=0) {\n" . "\t\t// this question is finished\n" . "\t\tStopSound(CurrQNum);\n" . "\t\tif (ShowingAllQuestions) {\n" . "\t\t\tCurrQNum = QNum;\n" . "\t\t} else {\n" . "\t\t\t// move to next question, if there is one\n" . "\t\t\tvar i_max = QArray.length;\n" . "\t\t\tfor (var i=1; i<i_max; i++) {\n" . "\t\t\t\t// calculate the next index for QArray\n" . "\t\t\t\tvar next_i = (i + CurrQNum) % i_max;\n" . "\t\t\t\tif (QArray[next_i] && QArray[next_i].id) {\n" . "\t\t\t\t\tvar matches = QArray[next_i].id.match(new RegExp('\\\\d+\$'));\n" . "\t\t\t\t\tif (matches) {\n" . "\t\t\t\t\t\tvar next_q = parseInt(matches[0]);\n" . "\t\t\t\t\t\tif (State[next_q] && State[next_q][0]<0) {\n" . "\t\t\t\t\t\t\t// change to unanswered question\n" . "\t\t\t\t\t\t\tChangeQ(next_i - CurrQNum);\n" . "\t\t\t\t\t\t\tbreak;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t}\n" . "\t\t\t\t}\n" . "\t\t\t}\n" . "\t\t}\n" . "\t}\n" . "\t// only show feedback if quiz is finished\n" . "\tif (! Finished) return false;";
         $substr = substr_replace($substr, $insert, $pos + 1, 0);
     }
     $str = substr_replace($str, $substr, $start, $length);
 }
 /**
  * fix_js_ShowMessage
  *
  * @param xxx $str (passed by reference)
  * @param xxx $start
  * @param xxx $length
  * @return xxx
  */
 function fix_js_ShowMessage(&$str, $start, $length)
 {
     $substr = substr($str, $start, $length);
     // do standard fix for this function
     parent::fix_js_ShowMessage($substr, 0, strlen($substr));
     // add extra argument, QNum, to this function
     $substr = preg_replace('/(?<=ShowMessage)\\(' . '(.*)' . '\\)/', '(\\1, QNum)', $substr, 1);
     if ($this->expand_UserDefined2()) {
         $StopSound = "\t\t\t" . 'StopSound(CurrQNum);' . "\n";
     } else {
         $StopSound = '';
     }
     if ($pos = strpos($substr, '{')) {
         $insert = "\n" . "\tif (typeof(QNum)!='undefined' && State[QNum] && State[QNum][0]>=0) {\n" . "\t\t// this question is finished\n" . "\t\tif (ShowingAllQuestions) {\n" . "\t\t\tCurrQNum = QNum;\n" . "\t\t} else {\n" . "\t\t\t// move to next question, if there is one\n" . "\t\t\tvar i_max = QArray.length;\n" . "\t\t\tfor (var i=1; i<i_max; i++) {\n" . "\t\t\t\t// calculate the next index for QArray\n" . "\t\t\t\tvar next_i = (i + CurrQNum) % i_max;\n" . "\t\t\t\tif (QArray[next_i] && QArray[next_i].id) {\n" . "\t\t\t\t\tvar matches = QArray[next_i].id.match(new RegExp('\\\\d+\$'));\n" . "\t\t\t\t\tif (matches) {\n" . "\t\t\t\t\t\tvar next_q = parseInt(matches[0]);\n" . "\t\t\t\t\t\tif (State[next_q] && State[next_q][0]<0) {\n" . "\t\t\t\t\t\t\t// change to unanswered question\n" . "\t\t\t\t\t\t\tChangeQ(next_i - CurrQNum);\n" . "\t\t\t\t\t\t\tbreak;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t}\n" . "\t\t\t\t}\n" . "\t\t\t}\n" . "\t\t}\n" . "\t\tvar q = AA_JQuiz_GetQ(CurrQNum);\n" . "\t\tif (q==QNum) {\n" . "\t\t\t// this was the last question\n" . "\t\t\tAA_SetProgressDot(q, q);\n" . "\t\t}\n" . "\t}\n" . "\t// clear and hide feedback, if necessary\n" . "\tif (! Feedback) {\n" . "\t\tvar obj = document.getElementById('FeedbackContent')\n" . "\t\tif (obj) {\n" . "\t\t\tobj.innerHTML = '';\n" . "\t\t}\n" . "\t\tvar obj = document.getElementById('FeedbackDiv')\n" . "\t\tif (obj) {\n" . "\t\t\tobj.style.display = 'none';\n" . "\t\t}\n" . "\t\tobj = null;\n" . "\t\treturn false;\n" . "\t}";
         $substr = substr_replace($substr, $insert, $pos + 1, 0);
     }
     $str = substr_replace($str, $substr, $start, $length);
 }