Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2011
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         It's learning test filler
  3. // @namespace    http://tyilo.com/
  4. // @version      0.1
  5. // @description  enter something useful
  6. // @include      https://aarhustech.itslearning.com/Ntt/TestTool/TakeTest.aspx*
  7. // @include      https://aarhustech.itslearning.com/Ntt/EditTool/ViewTest.aspx*
  8. // @run-at       document-end
  9. // @copyright    2011+, Asger Drewsen
  10. // ==/UserScript==
  11. /*  Globals  */
  12.  
  13. var save, testID, currentQuestionID, loading, NOID = 'noID';
  14.  
  15. /* Settings  */
  16.  
  17. var fast = true;
  18.  
  19. /*NodeList.prototype.toArray = function()
  20. {
  21. var array = [];
  22. for(var i = 0; i < this.length; i++)
  23. {
  24. array.push(this[i]);
  25. }
  26. return array;
  27. };*/
  28. function insertAnswers()
  29. {
  30.     if(!save[testID]['questions'][currentQuestionID])
  31.     {
  32.         return;
  33.     }
  34.     var question = save[testID]['questions'][currentQuestionID];
  35.     var inputs = document.getElementById('qti-choiceinteraction-container').getElementsByTagName('input');
  36.     for(var k = 0; k < inputs.length; k++)
  37.     {
  38.         inputs[k].value = question['answers'][k];
  39.         inputs[k].style.backgroundColor = ((question['correct'] == 2)? 'lime': ((question['correct'] == 1)? 'silver': 'red'));
  40.     }
  41. }
  42. function parseResults(evt)
  43. {
  44.     var resultDOM = evt.target.contentWindow.document;
  45.     var answersContainers = resultDOM.getElementsByClassName('NTT_studentReport_RegularRow');
  46.     for(var i = 0; i < answersContainers.length; i++)
  47.     {
  48.         var spans = resultDOM.getElementById('ctl30_' + (i + 1) + '_ctl01_ctl00_fullTextContent').getElementsByTagName('span');
  49.         var questionID;
  50.         if(spans.length == 2)
  51.         {
  52.             questionID = NOID;
  53.         }
  54.         else
  55.         {
  56.             questionID = spans[0].id;
  57.         }
  58.         if(!save[testID]['questions'][questionID])
  59.         {
  60.             save[testID]['questions'][questionID] = {'correct': 0, 'answers': []};
  61.         }
  62.         var correct = (answersContainers[i].getElementsByClassName('NTT_correctAnswer').length? 2: (answersContainers[i].getElementsByClassName('NTT_partlyCorrectAnswer').length? 1: 0));
  63.         if(save[testID]['questions'][questionID]['correct'] > correct)
  64.         {
  65.             continue;
  66.         }
  67.         save[testID]['questions'][questionID]['correct'] = correct;
  68.         if(save[testID]['questions'][questionID]['answers'].length)
  69.         {
  70.             save[testID]['questions'][questionID]['answers'] = [];
  71.         }
  72.         var answers = answersContainers[i].getElementsByClassName('qti-simple-blank');
  73.         for(var j = 0; j < answers.length; j++)
  74.         {
  75.             save[testID]['questions'][questionID]['answers'].push(answers[j].innerText);
  76.         }
  77.         if(currentQuestionID == questionID)
  78.         {
  79.             insertAnswers();
  80.         }
  81.     }
  82.     GM_setValue('save', save);
  83. }
  84. function loadIframes(urls, callback)
  85. {
  86.     if(typeof urls == 'string')
  87.     {
  88.         urls = [urls];
  89.     }
  90.     if(fast)
  91.     {
  92.         urls = [urls.pop()];
  93.     }
  94.     for(var i = 0; i < urls.length; i++)
  95.     {
  96.         var resultIframe = document.createElement('iframe');
  97.         resultIframe.src = urls[i];
  98.         //resultIframe.style.display = 'none';
  99.         resultIframe.onload = callback;
  100.         document.body.appendChild(resultIframe);
  101.     }
  102. }
  103. function parseAttempts(attempts)
  104. {
  105.     var urls = [];
  106.     for(var i = 0; i < attempts.length; i++)
  107.     {
  108.         var match = /TestResultId=([^&]*)/.exec(attempts[i].onclick);
  109.         if(match)
  110.         {
  111.             var testResultID = match[1];
  112.             urls.push('https://aarhustech.itslearning.com/Ntt/EditTool/ShowResult.aspx?TestResultId=' + testResultID);
  113.         }
  114.     }
  115.     return urls;
  116. }
  117. function parseTestOverview(DOM)
  118. {
  119.     console.log(save);
  120.     save[testID]['lastCheck'] = Date.now();
  121.     var attempts = DOM.getElementsByClassName('answered');
  122.     if(attempts.length == 0)
  123.     {
  124.         save[testID]['attempts'] = undefined;
  125.         save[testID]['lastAttempt'] = undefined;
  126.         save[testID]['lastAttempts'] = undefined;
  127.         save[testID]['updated'] = false;
  128.     }
  129.     else if(save['lastAttempts'] || save['lastAttempts'] < attempts.length)
  130.     {
  131.         save[testID]['attempts'] = parseAttempts(attempts);
  132.         var dateString = attempts[attempts.length - 1].innerText
  133.             var dateTime = dateString.split(' ');
  134.         var date = dateTime[0].split('-');
  135.         var time = dateTime[1].split(':');
  136.         save[testID]['lastAttempt'] = (new Date(date[2], date[1] - 1, date[0], time[0], time[1])).getTime();
  137.         save[testID]['lastAttempts'] = attempts.length;
  138.         save[testID]['updated'] = false;
  139.     }
  140.     else
  141.     {
  142.         save[testID]['updated'] = true;
  143.     }
  144.     GM_setValue('save', save);
  145.     console.log(save);
  146.     return attempts;
  147. }
  148. function update()
  149. {
  150.    
  151.     loadIframes('https://aarhustech.itslearning.com/Ntt/EditTool/ViewTest.aspx?TestID=' + testID, function(evt)
  152.     {
  153.         var resultsDOM = evt.target.contentWindow.document;
  154.         var attempts = parseTestOverview(resultsDOM);
  155.         loadIframes(parseAttempts(attempts), parseResults);
  156.     });
  157. }
  158. var match = /\/([^\/]*)\.aspx\?.*TestID=([^&]*)/.exec(window.location.href);
  159. if(match)
  160. {
  161.     save = GM_getValue('save', {});
  162. /*
  163. Save format:
  164.  
  165. + Object save
  166. | + Object   <testID>
  167. | | - Number   lastCheck
  168. | | - Number   lastAttempt
  169. | | - Number   lastAttempts
  170. | | - Boolean  updated
  171. | | - Array    attempts
  172. | | + Object   questions
  173. | | | + Object   <questionID>
  174. | | | | - Number   correct
  175. | | | | - Array    answers
  176. | | | |_______________________
  177. | | |___________________________
  178. | |_______________________________
  179. |___________________________________
  180.  
  181. */
  182.     testID = match[2];
  183.     if(!save[testID])
  184.     {
  185.         save[testID] = {};
  186.     }
  187.     if(!save[testID]['questions'])
  188.     {
  189.         save[testID]['questions'] = {};
  190.     }
  191.     switch(match[1])
  192.     {
  193.         case 'ViewTest':
  194.             if(window.top.location.href.indexOf('TakeTest.aspx') == -1)
  195.             {
  196.                 parseTestOverview(document);
  197.             }
  198.             break;
  199.         case 'TakeTest':
  200.             var spans = document.getElementsByClassName('qti-wrapper')[0].getElementsByTagName('span');
  201.             if(spans.length == 1)
  202.             {
  203.                 currentQuestionID = NOID;
  204.             }
  205.             else
  206.             {
  207.                 currentQuestionID = spans[1].id;
  208.             }
  209.             if(!(save[testID]['updated']))  // || Date.now() - save[testID]['lastCheck'] > 24 * 60 * 60 * 1000
  210.             {
  211.                 loading = document.createElement('div');
  212.                 loading = true;
  213.                 if(!save[testID]['attempts'])
  214.                 {
  215.                     update(); // Full update
  216.                 }
  217.                 else
  218.                 {
  219.                     loadIframes(save[testID]['attempts'], parseResults); // Cache update
  220.                 }
  221.             }
  222.             else
  223.             {
  224.                 insertAnswers(); // No update
  225.             }
  226.         break;
  227.     }
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement