/* iHano'i http://www.usp.br/line Uso: localhost/ihanoi/index.html?n=3&lang=pt @TODO ainda nao implementado multi-lingua Leo^nidas de Oliveira Branda~o v0.5: 2020/11/22 (getiLMContent(): se 'iLMparameters.iLM_PARAM_Assignment' vazio, nem tenta carregar arquivo do iHanoi (IHN)) v0.4: 2020/08/03 v0.1: 2020/07/31 v0: 2020/07/28 */ console.log("integration-functions.js: inicio"); // Variaveis externas // nDiscos = numero de disco definido na funcao principal iHanoi // contador = contador de numero de movimentos realizados // topoHasteA, topoHasteB, topoHasteC = indice na haste do maior disco nela const NOTA_MINIMO_B = 0.8; // alvo nao era haste B, descontar const ESPERA = 0; // retardo para permitir ver movimentos qdo carga automatica // Funcao para ler parametros informados pelo iTarefa via URL // Apesar de nao ser obrigatorio, sera muito útil para capturar os parametros function getParameterByName (name) { var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : null; } // Criando um vetor com os parametros informados pelo iTarefa // Observe que para cada parametro, e realizada a chamada do metodo getParameterByName, implementado acima var iLMparameters = { // Exemplo de como seria a URL via iTarefa/Moodle: http://.../moodle/mod/iassign/ilm_manager.php?from=iassign&id=2&action=update&ilmid=53&dirid=41800&fileid=282593 iLM_PARAM_Authoring: getParameterByName("iLM_PARAM_Authoring"), // if defined, then is teacher, allow edit iLM_PARAM_ServerToGetAnswerURL: getParameterByName("iLM_PARAM_ServerToGetAnswerURL"), iLM_PARAM_SendAnswer: getParameterByName("iLM_PARAM_SendAnswer"), iLM_PARAM_AssignmentURL: getParameterByName("iLM_PARAM_AssignmentURL"), iLM_PARAM_Assignment: getParameterByName("iLM_PARAM_Assignment"), iLM_PARAM_TeacherAutoEval: getParameterByName("iLM_PARAM_TeacherAutoEval"), lang: getParameterByName("lang") }; // Funcao chamada pelo iTarefa quando o professor finaliza a criacao da atividade // ou quando o aluno finaliza a resolucao do exercicio // O retorno e um JSON com os dados do exercicio ou da resolucao // Esse retorno sera armazenado no banco de dados do Moodle, pelo iTarefa function getAnswer () { // Se o parametro "iLM_PARAM_SendAnswer" for false, // entao trata-se de resolucao de atividade if (iLMparameters.iLM_PARAM_SendAnswer == 'false') { // Montar o retorno da resposta do aluno var studentAnswer = "Numero de discos: " + nDiscos + " \nQuantidade de Movimentos: " + contador + " \nMovimentos:"; for (var i = 0; i < vetorMovimentos.length; i++) { studentAnswer += "\n" + vetorMovimentos[i]; // vetorMovimentos[]: global definida em 'ihanoi.js' } // alert(studentAnswer); return studentAnswer; // teacherReturn; } else { //se for o professor acessando, mostra a pagina de elaboracao return "Número de Discos: " + nDiscos; } } function potencia2 (n) { var pot = 1, i; for (i=0; i0) { itens = linhas[0].split(":"); nDiscos = eval(itens[1]); nDiscos0 = nDiscos; if (iLMparameters.iLM_PARAM_Authoring == 'true') setExercise(true); // global definidas em 'ihanoi.js': indica tratar-se de exercicio else setExercise(false); // global definidas em 'ihanoi.js': indica tratar-se de exercicio //D alert("decodificaArquivo: iLM_PARAM_Authoring=" + iLMparameters.iLM_PARAM_Authoring); // nDiscos = 0; reiniciar(); // Funcao externa: reinicia iHanoi if (nlinhas>1) { itens = linhas[1].split(":"); nmov = itens[1]; // numero de movimentos do aluno contador = nmov; } if (nlinhas>2) { contador = 0; // global definidas em 'ihanoi.js': conta numero de movimentos for (i=3; i NAO esta' definida 'parent.getAutoEvalOriginalData()' // alert("integration-functions.js: actual exercise=" + data); teacherAutoEval(data); console.log("integration-functions.js: getiLMContent(): final (apos ler arquivo IHN)"); return; } txtFile = new XMLHttpRequest(); // preparar coneccao HTTP para requisitar um arquivo IHN console.log("integration-functions.js: getiLMContent(): tenta pegar arquivo de " + pagina); // window.location : href = a URL inteira; pathname = ; hostname = apenas o nome do servidor txtFile.open("GET", pagina, true); // true=>asincrono - mas ambos estao resultando (arq. IHN nao passar teste XML...): XML Parsing Error: syntax error txtFile.send(); // so' pode fechar apos 3o passo txtFile.responseType="text"; // Evita advertencia: XML Parsing Error: syntax error txtFile.onreadystatechange = function () { if (txtFile.readyState === 4) { // Makes sure the document is ready to parse. if (txtFile.status === 200) { // Makes sure the file exists. // 3o passo: por ultimo chega aqui! var nDiscos0; nDiscos0 = nDiscos; allText = txtFile.responseText; texto = allText; // define global 'texto' // processar conteudo de INH decodificaArquivo(allText); } //else alert("Erro 2"); // 2o passo: passa depois aqui } //else alert("Erro 1"); // 1o passo: passa primeiro aqui } console.log("integration-functions.js: getiLMContent(): final"); } // function getiLMContent() // Adicionamos a diretiva .ready(), para que quando a pagina HTML estiver carregada, // seja verificado qual a visualizacao deve ser apresentada: se a area de construcao // de atividade ou de resolucao. E no caso de ser resolucao, os dados da atividade // precisam ser consultados, pelo metodo implementado acima, o getiLMContent() // Pegar conteudo da ativida iMA getiLMContent(); function sleep (milliseconds) { var startSleep = new Date().getTime(); for (var i = 0; i < 1e7; i++) { if ((new Date().getTime() - startSleep) > milliseconds) { break; } } } // To be used with re-evaluation function teacherAutoEval (data) { var nDiscos0; nDiscos0 = nDiscos; alert("integration-functions.js: teacherAutoEval(.): " + data); // processar conteudo de INH decodificaArquivo(data); } console.log("integration-functions.js: final");