Annotation of loncom/homework/task_grading.js, revision 1.1
1.1 ! albertel 1: // JavaScript Document
! 2:
! 3: if (! Node) {
! 4: //If the node Type constants are not set, set the ones I need
! 5: var Node = new Object;
! 6: Node.TEXT_NODE = 3;
! 7: }
! 8:
! 9: //Detect IE
! 10: var isIE = (navigator.appName.indexOf("Explorer") > -1);
! 11:
! 12: //Attach to the onLoad event
! 13: window.onload = setEvents;
! 14: if (window.captureEvents) {
! 15: window.captureEvents(Event.LOAD);
! 16: }
! 17:
! 18: /*
! 19: * Utilitity Functions
! 20: */
! 21: //Generic tool for getting all tags of a specific type and class
! 22: //tagName - Name of tag to search for
! 23: //withClass - Name of Class to search for
! 24: //expCnt - OPTIONAL max number of elements to find
! 25: function myGetElementsByClass(tagName, withClass, expCnt) {
! 26: var tags = document.getElementsByTagName(tagName);
! 27: var rtn = new Array();
! 28: expCnt = expCnt || false; //Default value for expCnt
! 29:
! 30: //Find only the ones with the right class
! 31: for(var i=0; i < tags.length; i++) {
! 32: if (tags[i].className == withClass) {
! 33: rtn.push(tags[i]);
! 34: if (expCnt > 0 && rtn.length > expCnt) { break; }
! 35: }
! 36: }
! 37: return rtn;
! 38: }
! 39:
! 40: //Find the first text Node under current node
! 41: //Returns the node itself, not the text
! 42: //NOTE: Do not call this on a node that may have multiple text Nodes
! 43: // as children
! 44: function getTextNode(node) {
! 45: if (node.nodeType == Node.TEXT_NODE) {
! 46: return node;
! 47: }
! 48:
! 49: for(var i=0; i < node.childNodes.length; i++) {
! 50: var rtn = getTextNode(node.childNodes[i]);
! 51: if (rtn) { return rtn; }
! 52: }
! 53: return false;
! 54: }
! 55:
! 56: //Get object that raised event
! 57: function getEventObject(e) {
! 58: //Make sure I have the event
! 59: if (!e) { e = window.event; }
! 60:
! 61: //Get the object that raised the event
! 62: if (e.target) {
! 63: return e.target;
! 64: } else if (e.srcElement) {
! 65: return e.srcElement;
! 66: }
! 67: return false;
! 68: }
! 69:
! 70: //Attach an onClick event handler to a node
! 71: function attachClickEvent(node, func) {
! 72: node.onclick = func; //Add event
! 73:
! 74: if (!isIE) {
! 75: //Allow me to raise events
! 76: node.addEventListener("onclick", func, true); //false to get it in bubble not capture
! 77: }
! 78: if (node.captureEvents) { node.captureEvents(Event.CLICK); }
! 79: }
! 80:
! 81: //Fire an event on a given node
! 82: function dispatchEvent(node, eventName) {
! 83: if (document.createEvent) {
! 84: var evt = document.createEvent("Events"); //Simple event object
! 85: evt.initEvent(eventName, true, true); //true for can bubble, true for cancelable
! 86: node.dispatchEvent(evt);
! 87: } else {
! 88: //IE version
! 89: var evt = document.createEventObject();
! 90: node.fireEvent(eventName,evt);
! 91: evt.cancelBubble = true;
! 92: }
! 93: }
! 94:
! 95: /*
! 96: * Setup Functions
! 97: */
! 98: //Master setup function
! 99: function setEvents() {
! 100: setupHandin();
! 101: setupGrading();
! 102: setupButtons();
! 103: }
! 104:
! 105: //Setup the File handin list
! 106: function setupHandin() {
! 107: var handin;
! 108:
! 109: //Create the 'Collapse' button
! 110: var li = document.createElement('li');
! 111: var a = document.createElement('a');
! 112: var txt = document.createTextNode('Collapse');
! 113: a.setAttribute('href', '#');
! 114: attachClickEvent(a, onSlideDrawer);
! 115: a.appendChild(txt);
! 116: li.appendChild(a);
! 117:
! 118: //Find the handin list
! 119: var lists = myGetElementsByClass('ul', 'LC_GRADING_handininfo', 1);
! 120: if (lists.length > 0) {
! 121: handin = lists[0];
! 122: } else {
! 123: return false;
! 124: }
! 125:
! 126: //Trim the displayed file paths
! 127: for(var i=0; i < handin.childNodes.length; i++) {
! 128: var txt = getTextNode(handin.childNodes[i]);
! 129: if (txt) {
! 130: var j = txt.nodeValue.indexOf('portfolio/');
! 131: if (j > 0) {
! 132: txt.nodeValue = txt.nodeValue.substr(j + 'portfolio/'.length);
! 133: }
! 134: }
! 135: }
! 136:
! 137: //Add the button
! 138: handin.insertBefore(li, handin.firstChild);
! 139:
! 140: //Adjust height of the list
! 141: var item_cnt = handin.getElementsByTagName('li').length * 1.3; //Lines take about 1.3em ea.
! 142: handin.style.height = item_cnt + 'em';
! 143: }
! 144:
! 145: //Add events to all grading radio buttons
! 146: function setupGrading() {
! 147: var inputs = document.getElementsByTagName('input');
! 148:
! 149: for (var i = 0; i < inputs.length; i++) {
! 150: if (inputs[i].type == "radio") {
! 151: var val = inputs[i].value;
! 152: if (val == "pass" || val == "fail" || val == "review") {
! 153: attachClickEvent(inputs[i], onSetGrade); //Add event
! 154: }
! 155: if (inputs[i].checked) {
! 156: dispatchEvent(inputs[i], 'onclick');
! 157: }
! 158: }
! 159: }
! 160: }
! 161:
! 162: //Adjust the Done/Stop/Fail All button set
! 163: function setupButtons() {
! 164: //Create Fail All button
! 165: var btn = document.createElement('input');
! 166: btn.setAttribute('type', 'button');
! 167: btn.setAttribute('value', 'Fail Rest');
! 168: attachClickEvent(btn, onFailRest);
! 169:
! 170: //Add the button in
! 171: var div = myGetElementsByClass('div','LC_GRADING_maincontrols', 1);
! 172: if (div.length > 0) { div[0].appendChild(btn); }
! 173: }
! 174:
! 175: /*
! 176: * Events
! 177: */
! 178: //Slide the Handin list up and down like a drawer
! 179: function onSlideDrawer(e) {
! 180: var obj = getEventObject(e);
! 181: var txt = getTextNode(obj);
! 182: txt.nodeValue = (txt.nodeValue == 'Collapse') ? 'Expand':'Collapse';
! 183:
! 184: var list = obj.parentNode.parentNode;
! 185: var item_cnt = (txt.nodeValue == 'Collapse') ? list.getElementsByTagName('li').length : 1;
! 186: list.style.height = (item_cnt*1.3) + 'em'; //Lines take about 1.3em ea.
! 187: return false;
! 188: }
! 189:
! 190: //Fail all ungraded criteria
! 191: function onFailRest(e) {
! 192: var obj = getEventObject(e);
! 193: var inputs = document.getElementsByTagName('input');
! 194:
! 195: var graded = false;
! 196: for (var i = 0; i < inputs.length; i++) {
! 197: if (inputs[i].type == "radio") {
! 198: var val = inputs[i].value;
! 199: if (val == "ungraded" ) {
! 200: //Flag whether this criteria is graded or not
! 201: //I depend on 'ungraded' being the first radio button in each set
! 202: graded = ! inputs[i].checked;
! 203: } else if (val == "fail" && !graded) {
! 204: inputs[i].checked = true;
! 205:
! 206: //Fire the onclick event to get colors
! 207: dispatchEvent(inputs[i], 'onclick');
! 208: }
! 209: }
! 210: }
! 211: }
! 212:
! 213: //Set bacground for grade chosen
! 214: function onSetGrade( e ) {
! 215: var obj = getEventObject(e);
! 216: var grade;
! 217: var gradediv;
! 218:
! 219: //Find the Radio button and get it's value
! 220: if (obj.tagName == 'INPUT') {
! 221: grade = obj.value;
! 222: } else {
! 223: rdo = obj.getElementsByTagName('INPUT');
! 224: if (rdo.length > 0) { grade = rdo[0].value; }
! 225: }
! 226:
! 227: //Search for parent DIV
! 228: gradediv = obj;
! 229: while (gradediv.tagName != 'DIV') {
! 230: gradediv = gradediv.parentNode;
! 231: }
! 232:
! 233: gradediv.className = "LC_GRADING_grade LC_GRADING_" + grade;
! 234: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>