UNPKG

quizzer

Version:

Quizzer is a webserver for collaborative writing lab support. Based on a _fail early, fail often? approach to written language, the tool is particularly suited to second-language learners. The workflow (essay - error - quiz - exam) treats mistakes as an o

224 lines (210 loc) 8.07 kB
var languages; function getLanguages () { var adminID = getParameterByName('admin'); languages = apiRequest( '/?admin=' + adminID + '&page=students' + '&cmd=getlanguages' ); if (false === languages) return; }; function showStudents () { var studentList = document.getElementById('student-list'); studentList.style.display = 'block'; var mainDisplayButton = document.getElementById('main-display-button'); mainDisplayButton.style.display = 'none'; var addButton = document.getElementById('add-student-button'); addButton.style.display = 'inline'; }; function addStudent(node) { var bubbleOpen = document.getElementsByClassName('bubble-edit'); if (!bubbleOpen || bubbleOpen.length === 0) { var addButton = document.getElementById('add-student-button'); var saveButton = document.getElementById('save-student-button'); var studentBoxes = document.getElementById('student-boxes'); var languageNode = document.getElementById('student-language'); languageNode.innerHTML = getLanguageOptions(); addButton.style.display = 'none'; saveButton.style.display = 'inline'; studentBoxes.style.display = 'inline'; } } function editStudent(node) { var studentBoxes = document.getElementById('student-boxes'); var bubbleName = document.getElementById('bubble-name'); if (studentBoxes.style.display === 'inline' || bubbleName) { return; } var editDiv = document.createElement('div'); var name = node.textContent; var emailAndLang = node.getAttribute('alt'); var email = emailAndLang.replace(/^(?:[a-z]{2}(?:-[A-Z]{2})*:)/,''); var langtag = emailAndLang.replace(/^([a-z]{2}(?:-[A-Z]{2})*):.*/,'$1'); var id = node.getAttribute('id'); var status = false; if (node.className && node.className.match(/private/)) { var status = 'private'; }; var checked = ''; if (status) { checked = 'checked="true"'; } var options = getLanguageOptions(langtag); editDiv.setAttribute('id',id); editDiv.setAttribute('class','bubble-edit'); editDiv.innerHTML = '<b class="i18n" name="content-name-label">Name:</b><input id="bubble-name" type="text" size="15" value="' + name + '"/> ' + '<b class="i18n" name="content-email-label">Email:</b><input id="bubble-email" type="text" size="18" value="' + email + '"/> ' + '<b class="i18n" name="content-external-label">External:</b>' + '<input id="bubble-privacy" type="checkbox" ' + checked +'/> ' + '<b class="i18n" name="content-language-label">Language:</b>' + '<select id="bubble-language">' + options + '</select> ' + '<input class="i18n" name="value-cancel" type="button" value="Cancel" onclick="saveEditStudent(this.parentNode,true)"/>' + '<input class="i18n" name~"value-save" type="button" value="Save" onclick="saveEditStudent(this.parentNode)"/>' node.parentNode.replaceChild(editDiv,node); i18n(editDiv); } function getLanguageOptions(langtag) { var options = ''; for (var i=0,ilen=languages.length;i<ilen;i+=1) { var lang = languages[i]; var selected = ''; if (lang.lang === langtag) { selected=' selected="true"'; } options += '<option value="' + lang.lang + '"' + selected +'/>' + lang.langName + '</option>'; } return options; } function saveAddStudent(node) { // Need to add student ID, for edits var addButton = document.getElementById('add-student-button'); var saveButton = document.getElementById('save-student-button'); var studentBoxes = document.getElementById('student-boxes'); var studentName = document.getElementById('student-name'); var studentEmail = document.getElementById('student-email'); var studentStatus = document.getElementById('student-status'); var studentID = document.getElementById('student-id'); // Values var name = studentName.value; var email = studentEmail.value; var status = studentStatus.checked; name = name ? name.replace(/^\s+/,'').replace(/\s+$/,'') : ''; email = email ? email.replace(/^\s+/,'').replace(/\s+$/,'') : ''; var id = studentID.value; var result = saveStudent(name,email,status,'en',id); if (result === 'empty' || result === 'done') { studentName.value = null; studentEmail.value = null; studentID.value = null; studentStatus.checked = false; // Redecorate addButton.style.display = 'inline'; saveButton.style.display = 'none'; studentBoxes.style.display = 'none'; } } function saveEditStudent(node,cancel){ var name = document.getElementById('bubble-name').value; var email = document.getElementById('bubble-email').value; var id = node.id; var privacy = document.getElementById('bubble-privacy').checked; var lang = document.getElementById('bubble-language').value; var result = 'done'; if (!cancel) { result = saveStudent(name,email,privacy,lang,id); } if (result === 'done') { var newNode = castStudentNode([name,email,id,privacy,lang]); node.parentNode.replaceChild(newNode,node); } else { var adminID = getParameterByName('admin'); var obj = apiRequest( '/?admin=' + adminID + '&page=students' + '&cmd=readonestudent' , { studentid:id }); if (false === obj) return; document.getElementById('bubble-name').value = obj.name; document.getElementById('bubble-email').value = obj.email; } } function saveStudent(name,email,status,language,id) { name = name ? name.replace(/^\s+/,'').replace(/\s+$/,'') : ''; email = email ? email.replace(/^\s+/,'').replace(/\s+$/,'') : ''; if (name && email) { // Save var adminID = getParameterByName('admin'); apiRequest( '/?admin=' + adminID + '&page=students' + '&cmd=addstudent' , { email:email, name:name, studentid:id, lang:language, privacy:status }); buildStudentList(); return 'done'; } else if (!name && !email && !id) { return 'empty'; } else { alert('Both name and email are required'); return 'partial'; } } function buildStudentList (rows) { if (!rows) { // if rows is nil, call the server. var adminID = getParameterByName('admin'); var rows = apiRequest( '/?admin=' + adminID + '&page=students' + '&cmd=readstudents'); if (false === rows) return; } rows.sort(function (a,b) { // Sort by ??? return a[0].localeCompare(b[0]); }); // Delete children from container var container = document.getElementById('student-list'); for (var i=0,ilen=container.childNodes.length;i<ilen;i+=1) { container.removeChild(container.childNodes[0]); } // Rebuild container content for (var i=0,ilen=rows.length;i<ilen;i+=1) { var newNode = castStudentNode(rows[i]); container.appendChild(newNode); var space = document.createTextNode(' '); container.appendChild(space); } } function castStudentNode (row) { // Row is: // 0:name // 1:email // 2:id // 3:privacy // 4:lang var nameSpan = document.createElement('span'); nameSpan.innerHTML = row[0]; nameSpan.setAttribute('title',row[4] + ':' + row[1]); nameSpan.setAttribute('alt',row[4] + ':' + row[1]); nameSpan.setAttribute('id',row[2]); if (row[3]) { nameSpan.setAttribute('class','bubble private'); } else { nameSpan.setAttribute('class','bubble'); } nameSpan.setAttribute('onclick', 'editStudent(this)'); return nameSpan; }