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>