// Função para ler parâmetros informados pelo iTarefa via URL // Apesar de não ser obrigatório, será muito útil para capturar os parâmetros function getParameterByName (name, defaultReturn = null) { var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : defaultReturn; } // Criando um object com os parâmetros informados pelo iTarefa // Observe que para cada parâmetro, é realizada a chamada do método getParameterByName, implementado acima var iLMparameters = { 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", "pt") }; // Set the lang parameter to the localStorage for easy access // and no dependency to the global scope, avoind future 'strict mode' problems //localStorage.setItem('ivprog.lang', iLMparameters.lang); // Função chamada pelo iTarefa quando o professor finaliza a criação da atividade // ou quando o aluno finaliza a resolução do exercício // O retorno é um JSON com os dados do exercício ou da resolução // Esse retorno será armazenado no banco de dados do Moodle, pelo iTarefa function getAnswer () { // Se o parâmetro "iLM_PARAM_SendAnswer" for false, // então trata-se de resolução de atividade if (iLMparameters.iLM_PARAM_SendAnswer == 'false') { // Montar o retorno com a resposta do aluno var contentToSend = previousContent.split("\n::algorithm::")[0]; contentToSend += '\n::algorithm::'; if (settingsProgrammingTypes == "textual") { contentToSend += ivprogCore.CodeEditor.getCode(); } else { contentToSend += JSON.stringify(window.program_obj, function(key, value) { if (key == 'dom_object') { return; } return value; }); } contentToSend += '\n::logs::'; contentToSend += getTrackingLogs(); return contentToSend; } else { // Montar o retorno com a criação da atividade do professor var ret = ' { ' + prepareTestCases() + ',\n"settings_programming_type": \n' + JSON.stringify($('form[name="settings_programming_type"]').serializeArray()) + ',\n"settings_data_types": \n' + JSON.stringify($('form[name="settings_data_types"]').serializeArray()) + ',\n"settings_commands": \n' + JSON.stringify($('form[name="settings_commands"]').serializeArray()) + ',\n"settings_functions": \n' + JSON.stringify($('form[name="settings_functions"]').serializeArray()) + ' } '; if ($("input[name='include_algo']").is(':checked')) { ret += '\n::algorithm::'; ret += JSON.stringify(window.program_obj, function(key, value) { if (key == 'dom_object') { return; } return value; }); } return ret; } } function prepareTestCases () { var ret = ' \n "testcases" : [ ' var test_cases_array = $('form[name="test_cases"]').serializeArray(); console.log(test_cases_array); for (var i = 0; i < test_cases_array.length; i = i + 2) { ret += '\n{ '; ret += '\n "input": ['; var inps = test_cases_array[i].value.match(/[^\r\n]+/g); if (inps) { for (var j = 0; j < inps.length; j++) { ret += '"' + inps[j].trim() + '"'; if ((j + 1) < inps.length) { ret += ', '; } } } ret += '], \n "output": ['; var outs = test_cases_array[i+1].value.match(/[^\r\n]+/g); if (outs) { for (var j = 0; j < outs.length; j++) { ret += '"' + outs[j].trim() + '"'; if ((j + 1) < outs.length) { ret += ', '; } } } ret += ']'; ret += '\n}' if ((i + 2) < test_cases_array.length) { ret += ','; } } ret += '\n] '; return ret; } // Função chamada pelo iTarefa para receber a nota do aluno na atividade // O retorno é um valor entre 0.0 e 1.0 function getEvaluation () { if (iLMparameters.iLM_PARAM_SendAnswer == 'false') { // A chamada do método abaixo é obrigatória! // Observe que a chamada parte do iLM para o iTarefa //parent.getEvaluationCallback(window.studentGrade); runCodeAssessment(); } } //var testCases = null var settingsDataTypes = null; var settingsCommands = null; var settingsFunctions = null; var settingsProgrammingTypes = null; var algorithm_in_ilm = null; var previousContent = null; // Função para que o iMA leia os dados da atividade fornecidos pelo iTarefa function getiLMContent () { // O parâmetro "iLM_PARAM_Assignment" fornece o URL do endereço que deve ser // requisitado via AJAX para a captura dos dados da atividade $.get(iLMparameters.iLM_PARAM_Assignment, function (data) { //professor invocou a avaliação automática dos exercícios do bloco if (iLMparameters.iLM_PARAM_TeacherAutoEval != null) { teacherAutoEval(data); //não deve exibir nenhuma interface... return; } else if (iLMparameters.iLM_PARAM_SendAnswer == 'false') { // Aluno está trabalhando em alguma atividade: previousContent = data; prepareActivityToStudent(data); } else { // Professor está editando uma atividade: previousContent = data; prepareActivityToEdit(data); } window.block_render = false; renderAlgorithm(); }); } function prepareActivityToEdit (ilm_cont) { //var content = JSON.parse(ilm_cont.split('\n::algorithm::')[0]); // Ver arquivo js/util/iassignHelpers.js var content = ivprogCore.prepareActivityToStudentHelper(ilm_cont); var testCases = ivprogCore.getTestCases(); settingsProgrammingTypes = content.settingsProgrammingType; settingsDataTypes = content.settingsDataTypes; settingsCommands = content.settingsCommands; settingsFunctions = content.settingsFunctions; for (var i = 0; i < testCases.length; i++) { addTestCase(testCases[i]); } if (content.algorithmInIlm != null) { algorithm_in_ilm = content.algorithmInIlm; $("input[name='include_algo']").prop('checked', true); includePreviousAlgorithm(); renderAlgorithm(); } ivprogTextualOrVisual(); } function parsePreviousAlgorithm () { window.program_obj.functions = JSON.parse(algorithm_in_ilm).functions; window.program_obj.globals = JSON.parse(algorithm_in_ilm).globals; } function includePreviousAlgorithm () { if (settingsProgrammingTypes == "textual") { return; } parsePreviousAlgorithm(); window.watchW.watch(window.program_obj.globals, function(){ if (window.insertContext) { setTimeout(function(){ renderAlgorithm(); }, 300); window.insertContext = false; } else { renderAlgorithm(); } }, 1); for (var i = 0; i < window.program_obj.functions.length; i ++) { window.watchW.watch(window.program_obj.functions[i].parameters_list, function(){ if (window.insertContext) { setTimeout(function(){ renderAlgorithm(); }, 300); window.insertContext = false; } else { renderAlgorithm(); } }, 1); window.watchW.watch(window.program_obj.functions[i].variables_list, function(){ if (window.insertContext) { setTimeout(function(){ renderAlgorithm(); }, 300); window.insertContext = false; } else { renderAlgorithm(); } }, 1); if (window.program_obj.functions[i].is_main) { window.program_obj.functions[i].name = LocalizedStrings.getUI("start"); } } window.watchW.watch(window.program_obj.functions, function(){ if (window.insertContext) { setTimeout(function(){ renderAlgorithm(); }, 300); window.insertContext = false; } else { renderAlgorithm(); } }, 1); } function prepareActivityToStudent (ilm_cont) { // Ver arquivo js/util/iassignHelpers.js var content = ivprogCore.prepareActivityToStudentHelper(ilm_cont); // Casos de testes agora são delegados ao tratamento apropriado pela função acima // var testCases = content.testcases; settingsProgrammingTypes = content.settingsProgrammingType; settingsDataTypes = content.settingsDataTypes; settingsCommands = content.settingsCommands; settingsFunctions = content.settingsFunctions; if (content.algorithmInIlm != null) { algorithm_in_ilm = content.algorithmInIlm; includePreviousAlgorithm(); } $('.assessment_button').removeClass('disabled'); renderAlgorithm(); ivprogTextualOrVisual(); } // Função para organizar se para criação, visualização ou resolução de atividade function prepareEnvironment () { $('.div_to_body').click(function(e) { // trackingMatrix.push(adCoords(e, 1)); ivprogCore.registerClick(e.pageX, e.pageY, e.target.classList['value']); }); // Se iLM_PARAM_SendAnswer for false, então trata-se de resolução de atividade, // portanto, a "DIV" de resolução é liberada if (iLMparameters.iLM_PARAM_SendAnswer == 'false') { //$('.resolucao').css("display","block"); getiLMContent(); // $('.div_to_body').mousemove(function(e) { // trackingMatrix.push(adCoords(e, 0)); // }); // $('.div_to_body').click(function(e) { // // trackingMatrix.push(adCoords(e, 1)); // ivprogCore.registerClick(e.pageX, e.pageY, e.target.classList['value']); // }); } else if (iLMparameters.iLM_PARAM_Assignment) { // Caso não esteja em modo de resolução de atividade, a visualização no momento // é para a elaboração de atividade: //$('.elaboracao').css("display","block"); // Se possuir o parâmetro iLMparameters.iLM_PARAM_Assignment, o professor // está editando uma atividade: getiLMContent(); } else { renderAlgorithm(); } if ((iLMparameters.iLM_PARAM_AssignmentURL == "true") && (iLMparameters.iLM_PARAM_SendAnswer == "true")) { prepareActivityCreation(); } } function ivprogTextualOrVisual () { if (settingsProgrammingTypes) { if (settingsProgrammingTypes == "textual") { $('.ivprog_visual_panel').css('display', 'none'); $('.ivprog_textual_panel').css('display', 'block'); $('.ivprog_textual_panel').removeClass('loading'); $('.visual_coding_button').removeClass('active'); $('.textual_coding_button').addClass('active'); $('.visual_coding_button').addClass('disabled'); ivprogCore.CodeEditor.setCode(algorithm_in_ilm); ivprogCore.CodeEditor.disable(false); } if (settingsProgrammingTypes == "visual") { } } } function iassingIntegration () { // Disable by default... $('.assessment_button').addClass('disabled'); prepareEnvironment(); if (inIframe()) { orderIcons(); orderWidth(); } } // Função para preparar a interface para o professor criar atividade: function prepareActivityCreation () { $('.add_accordion').addClass('accordion'); $('.default_visual_title').toggle(); $('.default_visual_title').append(''+LocalizedStrings.getUI('text_teacher_algorithm')+''); $('.height_100').removeClass('height_100'); $('.main_title').remove(); $('.ui.accordion').addClass('styled'); $('
').insertBefore($('.add_accordion').find('.content').find('.div_to_body')); $('').insertAfter('.content_margin'); var cases_test_div = $('