browser = navigator.appName;
horni_okno = "";
var separator = "$"
var courses = new Array()
var actualCourse = "";
var testURL = "";
var qCount = 0 // celkovy pocet otazek
var results = null // pole s pocty vybranych variant;
var questionSet = new Array();
var test_repeat = false;
var respondents = [];
var questions = [];
var testElements = [
["90d1d6645b5f8084b2f8656053f06da5", "a_a_1"],
["5100740c21f035822e341e43f9e656e5", "a_a_1"],
["27072b6f65e4120834ebd39112950692", "a_a_1"],
["ace7c792602d274db3bf42f677d47507", "a_a_1"],
["a2e4dc63af453f2f6224d076a5a58c88", "a_a_1"],
["0296817cf2e75706c3f1c240503744af", "a_a_1"],
["c4e3879909ba02310d429bc91c1c0736", "a_a_1"],
["61127cb33147a0b649ede8a402a16b85", "a_a_1"],
["05c6fdf255937f476e1ca69accad9222", "a_a_1"]
]
function Result () {
this.type = "";
this.value = ""
this.idmd5 = ""
}
function Respondent(name, uco) {
this.name = name;
this.uco = uco;
this.results = new Array();
this.getResultTable = function () {
var vystup = "
"
vystup += "" + this.name + " | ";
// vystup += "" + this.getBlankCount() + " | ";
for (var i= 0; i < this.results.length; i++) {
var trida = "white";
if (this.results[i] == "") trida = "red";
if (this.results[i] == "-") trida = "blue";
var vysledek = this.results[i];
//vysledek = vysledek.replace(/\./g, ",");
//vysledek = vysledek.replace(/ b/g, "");
vystup += "" + vysledek + " | ";
}
vystup += "
";
return vystup
}
this.getResultsLine = function () {
var vystup = this.name + separator
vystup += this.uco + separator;
vystup += this.prihlaska + separator;
for (var i= 0; i < this.results.length; i++) {
if (i > 0) vystup += separator
vystup += this.results[i]
}
return vystup
}
this.getBlankCount = function() {
var count = 0;
for (var i = 0; i < this.results.length; i++) {
if (this.results[i] == "") count++;
}
return count;
}
this.init = function(pocet) {
this.results = new Array()
for (var i = 0; i < pocet; i++) {
this.results[i] = "";
}
}
}
var xmlDoc = document.implementation.createDocument("", "test2", null);
//xmlDoc.addEventListener("load", readXML, false);
var xmlQdesc = document.implementation.createDocument("", "test", null);
//xmlQdesc.addEventListener("load", readQdesc, false);
function Test() {
this.title = ""
this.url = ""
this.selected = false;
this.sady = new Array()
this.elements = new Array()
this.toString = function () {
var vystup = "adresa: "
vystup += this.url + "\n"
for (var i =0; i < this.sady.length; i++) {
vystup += this.sady[i].toString()
}
return vystup
}
}
function Sada() {
this.url = ""
this.otazky = new Array()
this.poradi = 0;
this.text = "";
this.toString = function () {
var vystup = ""
vystup += "Pocet otazek: " + this.otazky.length + "\n"
vystup += "\n" + this.url + "\n"
//vystup += this.text + "\n"
for (var i =0; i < this.otazky.length; i++) {
if (i > 0 ) vystup += "\n--\n"
vystup += (i+1) + this.otazky[i].toString()
}
return vystup
}
}
function Otazka() {
this.pouziti = 0;
this.idmd5 = "";
this.zadani = "";
this.prvky = new Array();
//this.prvky.push("r_a")
this.spravne = 0;
this.varianty = 0
this.toString = function () {
var vystup = ""
vystup += "\n" + this.idmd5 + "\n"
vystup += this.zadani
vystup += "\n" + this.spravne + "\n"
return vystup
}
this.getItems = function () {
var vystup = ""
for (var i = 0; i < this.prvky.length; i++) {
vystup += this.prvky[i].typ + " " + this.prvky[i].pocet + " " + this.prvky[i].suffix + ";"
}
return vystup
}
}
function Prvek (typ, suffix) {
this.typ = typ
this.pocet = 1;
this.suffix = suffix;
}
var test = new Test()
//inicializace pole s vysledky
var results = new Array()
for (var i = 0; i < qCount; i++) {
results[i] = new Array()
for (var j =0; j < 5; j++) { results[i][j] = 0 }
}
function parse_test() {
document.getElementById("prubeh_title").style.display = "block";
var vystup = "";
questionSet = new Array();
testList = new Array();
testCounter = 0;
respondents = []
results = new Array()
document.getElementById("test_info").innerHTML = ""
document.getElementById("sets_read").innerHTML = ""
document.getElementById("tests_read").innerHTML = ""
document.getElementById("people_read").innerHTML = ""
document.getElementById("display").innerHTML = ""
var vstup2 = document.getElementById("test_url").value.split(/\n/)
for (var ii = 0; ii < vstup2.length; ii++) {
if (vstup2[ii].indexOf("qdesc") > -1 || vstup2[ii].indexOf("qref") > -1 ) testList.push(vstup2[ii])
}
if (testList.length == 0) {
document.getElementById("test_info").innerHTML = "V seznamu nejsou žáné testy."
return;
}
test_url = testList[0];
test = new Test;
test.url = test_url;
if (test_url.toLowerCase().indexOf(".qdesc") > -1) {
loadQdesc(test_url);
}
if (test_url.toLowerCase().indexOf(".qref") > -1) {
loadQref(test_url);
}
}
function loadQref(t_url) {
//alert("nacitam qref: " + t_url)
var req = new XMLHttpRequest();
req.open('GET', t_url + "?noproc=", true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200) {
readQref(req.responseText)
}
else
dump("Error loading odpovednik\n");
}
}
req.send(null);
}
function readQref(retez) {
//var xmlQref = (new DOMParser()).parseFromString(retez, "application/xml");
var adresa = retez.match(/\\s*(\/.+\.qdesc)[\s\<]/)[1];
if (adresa.charAt(0) == "/") adresa = "https://is.muni.cz/auth" + adresa
//trim( retez.substring(retez.indexOf("")+11, retez.indexOf("<\/QDESC_URL>")+1) )
//var adresa = xmlQref.childNodes[0].querySelector("QDESC_URL");
//alert(" qdesc: $" + adresa + "$")
loadQdesc(adresa)
}
function loadQdesc(t_url) {
if (t_url.charAt(0) == "/") t_url = "https://is.muni.cz/auth" + t_url
var req = new XMLHttpRequest();
req.open('GET', t_url, true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200) {
readQdesc(req.responseText)
}
else
dump("Error loading odpovednik\n");
}
}
req.send(null);
}
var setIndex = 0;
function readQdesc(retez) {
xmlQdesc = (new DOMParser()).parseFromString(retez, "application/xml");
var koren = xmlQdesc.childNodes[0];
var vystup = ""
var repeater = koren.getElementsByTagName("SKLADAT_OPAKOVANE");
if (repeater.length > 0) {
if( repeater[0].firstChild.nodeValue == "ano") {
test_repeat = true;
document.getElementById("test_info").innerHTML = "Test s více průchody. Načítám odpovědi ze všech průchodů."
}
if( repeater[0].firstChild.nodeValue == "ano_totez") {
document.getElementById("test_info").innerHTML = "Test s více průchody, aktualizuje se stejný formulář. Načítám odpovědi z posledního uloženého průchodu."
}
if( repeater[0].firstChild.nodeValue == "ne") {
document.getElementById("test_info").innerHTML = "Test s jediným průchodem."
}
}
var sady = koren.getElementsByTagName("SADY_OTAZEK")
for (var i = 0; i < sady.length; i++) {
var sada = new Sada()
sada.url = "https:\/\/is.muni.cz\/auth" + sady[i].getAttribute("URL");
sada.poradi = sady[i].getAttribute("PORADI_SADY");
test.sady.push(sada)
}
testElements = new Array()
setIndex = 0
document.getElementById("sets_read").innerHTML = "Načítám sady otázek"
readNextSet()
}
function readNextSet() {
if (setIndex < test.sady.length) {
var sada = test.sady[setIndex]
var req = new XMLHttpRequest();
req.open('GET', sada.url, true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200) {
sada.text = req.responseText //.replace(/\n/g,"")
var otazky = sada.text.split(/\n--(\s+)?\n/)
for (var i = 0; i < otazky.length; i++) {
if (otazky[i] == undefined || otazky[i] == "" || otazky[i].indexOf("++") == 0) continue;
var otazka = new Otazka();
otazka.idmd5 = hex_md5(otazky[i])
var prvky = otazky[i].match(/ \:[abclmnrtv](\d+[a-z]?(\(\d+x\d+\))?)?/g)
if ( !prvky ) continue;
for (var j = 0; j < prvky.length; j++) {
var casti = prvky[j].match(/ \:([abclmnrtv])(\d*)([a-z]*)/)
var typ = casti[1];
var suffix = casti[3];
//report(otazka.idmd5 + "$" + typ + "$" + suffix + "$")
var previous = false;
for (var k =0; k < otazka.prvky.length; k++) {
if (otazka.prvky[k].typ == typ
&& "rc".indexOf(otazka.prvky[k].typ) > -1
&& otazka.prvky[k].suffix == suffix) {
otazka.prvky[k].pocet++; previous = true;
}
}
if (!previous) { otazka.prvky.push(new Prvek(typ, suffix) ) }
}
//report( "------ " + otazka.idmd5 + " " + otazka.getItems() )
if (otazky[i].indexOf(":") != -1 ) {
sada.otazky.push(otazka)
questions[otazka.idmd5] = otazka;
}
}
qCount += sada.otazky.length;
setIndex++;
document.getElementById("sets_read").innerHTML = "Načítám sady otázek: " + setIndex + "/" + test.sady.length
readNextSet()
}
else dump("Error loading set of questions\n");
}
}
req.send(null);
}
else { // konec nacitani sad otazek, jde se na XML s odpovedmi
if (testList.length > 0) {
loadNextXML()
document.getElementById("tests_read").innerHTML = "Načítám odpovědi z testů: 0/" + testList.length;
}
//document.getElementById("vystup_tabulka").value = test.toString()
}
}
function loadNextXML() {
var shortUrl = testList[testCounter];
var auth = "https://is.muni.cz/auth"
if (shortUrl.indexOf(auth) == 0) shortUrl.substring(auth.length)
//document.getElementById("prvky_sady").value = shortUrl;
var req = new XMLHttpRequest();
req.open('GET', "https://is.muni.cz/auth/elearning/test_odpovedi.pl?testurl=" + escape(shortUrl) + ";nabizrus=0;nabixml=1;xmlqa=all;prehlosob=1", true);
req.onreadystatechange = function (aEvt) {
if (req.readyState == 4) {
if(req.status == 200)
{
parseXML(req.responseText)
}
else
alert("Error loading XML with answers\n");
}
}
req.send(null);
}
function parseXML(retez) {
xmlDoc = (new DOMParser()).parseFromString(retez, "application/xml");
var koren = xmlDoc.childNodes[0];
var vystup = ""
var lide = koren.getElementsByTagName("PROCHAZEJICI")
for (var i = 0; i < lide.length; i++) {
if (lide[i].querySelector("ODP") == null) continue;
var lastActions = [];
var pruchody = lide[i].getElementsByTagName("PRUCHOD");
for (var ii = 0; ii < pruchody.length; ii++) {
var akce = pruchody[ii].getElementsByTagName("AKCE");
// vyhledani posledni ulozene akce
var ulozena = null;
for (var j = 0; j < akce.length; j++) {
if (akce[j].getAttribute("TYP") == "b" || akce[j].getAttribute("TYP") == "c") ulozena = akce[j];
}
if (ulozena != null) lastActions[0] = ulozena//.push(ulozena);
}
var odpoved = ""
// nacteni ulozene odpovedi
var jmeno = lide[i].getAttribute("JMENO");
var uco = lide[i].getAttribute("UCO");
if (jmeno != null) {
if (jmeno.indexOf("(") > -1) jmeno= jmeno.substring(0, jmeno.indexOf("(" ) -1)
}
else jmeno = "unknown"
var respondent = new Respondent(jmeno, uco)
respondents.push(respondent)
/*
if ( !test_repeat && lastActions.length > 1) {
lastActions.splice(0, lastActions.length-1)
}
*/
for (var kk = 0; kk < 1 /*lastActions.length*/; kk++)
{
ulozena = lastActions[kk]
for (var iii= 0; iii < test.sady.length; iii++) {
var sada = test.sady[iii]
for (var jjj = 0; jjj < sada.otazky.length; jjj++) {
var otazka = sada.otazky[jjj];
respondent.results[otazka.idmd5] = new Array()
var counters = { a:0, b:0, c: 0, l:0, m: 0, n:0, r: 0, t: 0, v: 0 }
var poradi = -1
//var ids = lastActions[kk].parentNode.querySelectorAll("IDMD5")
var ids = ulozena.parentNode.querySelectorAll("IDMD5")
for (var oo = 0; oo < ids.length; oo++) {
if (ids[oo].firstChild.nodeValue == otazka.idmd5)
{ poradi = oo + 1; break}
}
for (var kkk = 0; kkk < otazka.prvky.length; kkk++){
var prvek = otazka.prvky[kkk]
var pid = prvek.typ;
counters[prvek.typ]++;
if ("crv".indexOf(prvek.typ) > -1) { pid += "_" + String.fromCharCode(96 + counters[prvek.typ] ) }
if ("antlm".indexOf(prvek.typ) > -1) { pid += "_a_" + counters[prvek.typ] }
if (prvek.typ == "c") {
for (var lll =0; lll < prvek.pocet; lll++) {
//var odp = lastActions[kk].querySelector("ODP[POR='" + poradi +"'][ID='" + pid +"'][HOD='" + (lll+1) +"']");
var odp = ulozena.querySelector("ODP[POR='" + poradi +"'][ID='" + pid +"'][HOD='" + (lll+1) +"']");
if (odp != undefined && odp != null) respondent.results[otazka.idmd5].push(1)
else respondent.results[otazka.idmd5].push("");
}
}
else {
var odp = ulozena.querySelector("ODP[POR='" + poradi +"'][ID='" + pid +"']");
if (odp != undefined && odp != null) respondent.results[otazka.idmd5].push(odp.getAttribute("HOD") )
else respondent.results[otazka.idmd5].push("");
}
} //konec prvku otazky
} //konec otazky
} //konec sady
/* konewc bloku s extrakci odpovedi z akce */
}
}
if (testCounter < testList.length-1) {
testCounter++;
document.getElementById("tests_read").innerHTML = "Načítám odpovědi z testů: " + testCounter + "/" + testList.length
loadNextXML()
}
else {
document.getElementById("tests_read").innerHTML = "Načítám odpovědi z testů: " + testList.length + "/" + testList.length
showFinalResults() }
}
function showFinalResults() {
//scitani a statistika
var sep = "\t"
var qIndex = 0;
var cols = 2;
var vystup = ""
var row1 = " <\/th> | <\/th>"
var row2 = " |
---|
<\/th> | <\/th>"
var vystup_csv = ""
var row1_csv = " " + sep + " " + sep
var row2_csv = " " + sep + " " + sep
var sadaMin = 0 //parseInt(document.getElementById("sada_min").value)
var sadaMax = test.sady.length -1 //parseInt(document.getElementById("sada_max").value)
for (var i =sadaMin; i < sadaMax +1; i++) {
var sada = test.sady[i];
for (var j =0; j < sada.otazky.length /**/; j++) {
var otazka = sada.otazky[j];
row1 += " | " + (j+1) + /*" " + otazka.prvky[0].typ + otazka.prvky[0].pocet+ */ " | "
row1_csv += "" + (j+1) + sep
for (var kk = 0; kk < otazka.prvky.length; kk++) {
if (kk > 0) { row1 += " | "; row1_csv += " " + sep }
if (otazka.prvky[kk].typ == "c" ) {
for (var ll = 0; ll < otazka.prvky[kk].pocet; ll++) {
if (ll > 0) {
row1 += " | "
row1_csv += " " + sep
}
row2 += "" + (ll+1) + " | "
row2_csv += (ll+1) + sep
}
} else {
row2 += " | "
row2_csv = " " + sep
}
}
}
}
row1 += "<\/tr>"
row2 += "<\/tr>"
vystup += "" + row1;
vystup += row2 + "<\/thead>";
vystup += "
"
vystup_csv += row1_csv + "\n" + row2_csv + "\n"
for (var ii = 0; ii < respondents.length; ii++) {
var resp = respondents[ii]
var row = "" + resp.name + "<\/td> | " + resp.uco + "<\/td>"
var row_csv = resp.name + sep + resp.uco + sep
for (var i =sadaMin; i < sadaMax+1; i++) {
var sada = test.sady[i];
for (var j =0; j < sada.otazky.length; j++) {
var otazka = sada.otazky[j];
var results = resp.results[otazka.idmd5];
if (!results) break;
//report(ii + " "+ j+ " " + otazka.idmd5 + ": " + results.join("$"))
var pozice = 0;
for (var k = 0; k < otazka.prvky.length; k++) {
var prvek = otazka.prvky[k]
if (prvek.typ == "c") {
for (var ll = 0; ll < prvek.pocet; ll++) {
row += " | " + results[pozice] + " | "
row_csv += "" + results[pozice] + sep
pozice++;
}
}
else {
row += "" + results[pozice] + " | "
row_csv += "" + results[pozice] + sep
pozice++;
}
} //konec vypisu prvku otazky
} //koenc vypisu cele otazky
} //konec vypisu sady
row += "
"
vystup += row;
vystup_csv += row_csv + "\n"
}
vystup += "<\/tbody>"
vystup += "
";
vystup = "