--- rat/client/parameter.html 2004/05/27 06:26:19 1.28 +++ rat/client/parameter.html 2020/01/14 17:44:27 1.71.6.1 @@ -1,9 +1,11 @@ -<html> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <!-- The LearningOnline Network with CAPA Parameter Input Window // -// $Id: parameter.html,v 1.28 2004/05/27 06:26:19 albertel Exp $ +// $Id: parameter.html,v 1.71.6.1 2020/01/14 17:44:27 raeburn Exp $ // // Copyright Michigan State University Board of Trustees // @@ -27,24 +29,30 @@ Parameter Input Window // // http://www.lon-capa.org/ // -06/16/00,06/17,11/17,11/18,11/23,11/27,11/28,12/15,12/16, -03/21/01,03/24,06/26 Gerd Kortemeyer -08/08 Gerd Kortemeyer --> <head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>LON-CAPA</title> -</head> -<script> +<script type="text/javascript"> +// <![CDATA[ var ptype=''; var pvalue=''; +var pmodval=''; +var pextraval=''; +var pextravaltwo=''; var preturn=''; var pcode=''; var pscat=''; var pmarker=''; +var pmodal=''; var pname=''; +var defhour=0; +var defmin=0; +var defsec=0; + var svalue; var stype; var smarker; @@ -66,8 +74,26 @@ function selwrite(text) { } function choicestart() { - this.window.choices.document.clear(); - choicewrite('<html><body bgcolor="#FFFFFF">'); + this.window.choices.document.open(); + choicewrite('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'); + choicewrite('<html xmlns="http://www.w3.org/1999/xhtml">'); + choicewrite('<head>'); + choicewrite('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'); + choicewrite('<title>LON-CAPA</title>'); + choicewrite('<style type="text/css">'); + choicewrite('<!--'); + choicewrite('body {'); + choicewrite('font-family: Verdana,Arial,Helvetica,sans-serif;'); + choicewrite('line-height:130%;'); + choicewrite('font-size:0.83em;'); + choicewrite('background: #FFFFFF;'); + choicewrite('}'); + choicewrite('table.LC_parmsel_table {font-size: 90%;}'); + choicewrite('table.LC_parmsel_table tr td { padding: 5px; border: 1px solid #C8C8C8;}'); + choicewrite('-->'); + choicewrite('</style>'); + choicewrite('</head>'); + choicewrite('<body>'); } function choiceend() { @@ -80,15 +106,23 @@ function choicewrite(text) { } function tablestart(headtext) { - choicewrite('<table><tr bgcolor="#AAFFAA"><th colspan=3>'+ + choicewrite('<table class="LC_parmsel_table"><tr bgcolor="#C5DB99"><th colspan="3">'+ headtext+'</th></tr>'); } function valline(text,id1,id2) { - choicewrite('<tr bgcolor="#AAFFAA"><td>'+text+ - '</td><td><input type=text size=4 name=val'+ - id1+'></td><td>incl:<input type=checkbox name=val'+ - id2+'></td></tr>'); + choicewrite('<tr><td>'+text+ + '</td><td><input type="text" size="4" name="val'+ + id1+'" /></td><td>incl:<input type="checkbox" name="val'+ + id2+'" /></td></tr>'); +} + +function escapeHTML(text) { + text = text.replace(/&/g, '&'); + text = text.replace(/"/g, '"'); + text = text.replace(/</g, '<'); + text = text.replace(/>/g, '>'); + return text; } function datecalc() { @@ -107,11 +141,11 @@ function datecalc() { function hour() { var thishour=cdate.getHours(); var i; var j; - choicewrite('<select name=hours onChange="parent.datecalc();">'); + choicewrite('<select name="hours" onchange="parent.datecalc();">'); for (i=0;i<=23;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thishour) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'); if (i==12) { choicewrite('noon'); } else { @@ -131,11 +165,11 @@ function hour() { function minute() { var thisminutes=cdate.getMinutes(); var i; - choicewrite('<select name=minutes onChange="parent.datecalc();">'); + choicewrite('<select name="minutes" onchange="parent.datecalc();">'); for (i=0;i<=59;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thisminutes) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'+i+'</option>'); } @@ -145,11 +179,11 @@ function minute() { function second() { var thisseconds=cdate.getSeconds(); var i; - choicewrite('<select name=seconds onChange="parent.datecalc();">'); + choicewrite('<select name="seconds" onchange="parent.datecalc();">'); for (i=0;i<=59;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thisseconds) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'+i+'</option>'); } @@ -160,11 +194,11 @@ function second() { function date() { var thisdate=cdate.getDate(); var i; - choicewrite('<select name=date onChange="parent.datecalc();">'); + choicewrite('<select name="date" onchange="parent.datecalc();">'); for (i=1;i<=31;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thisdate) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'+i+'</option>'); } @@ -175,16 +209,17 @@ function year() { var thisyear=cdate.getFullYear(); var nowdate=new Date(); var nowyear=nowdate.getFullYear(); + if ( !thisyear ) { thisyear=nowyear; } var loweryear=thisyear-2; var upperyear=thisyear+5; if (thisyear>nowyear) { loweryear=nowyear-2; } if (thisyear<nowyear) { upperyear=nowyear+5; } var i; - choicewrite('<select name=year onChange="parent.datecalc();">'); + choicewrite('<select name="year" onchange="parent.datecalc();">'); for (i=loweryear;i<=upperyear;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thisyear) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'+i+'</option>'); } @@ -194,11 +229,11 @@ function year() { function month() { var thismonth=cdate.getMonth(); var i; - choicewrite('<select name=month onChange="parent.datecalc();">'); + choicewrite('<select name="month" onchange="parent.datecalc();">'); for (i=0;i<=11;i++) { - choicewrite('<option value='+i); + choicewrite('<option value="'+i+'"'); if (i==thismonth) { - choicewrite(' selected'); + choicewrite(' selected="selected"'); } choicewrite('>'+months[i]+'</option>'); } @@ -209,58 +244,66 @@ function month() { function intminute() { var thisminutes=cmins; var i; - choicewrite('<select name=minutes onChange="parent.intcalc();">'); + var result = ''; + result += '<select name="minutes" onchange="parent.intcalc();">'; for (i=0;i<=59;i++) { - choicewrite('<option value='+i); + result += '<option value="'+i+'"'; if (i==thisminutes) { - choicewrite(' selected'); + result += ' selected="selected"'; } - choicewrite('>'+i+'</option>'); + result += '>'+i+'</option>'; } - choicewrite('</select>'); + result += '</select>'; + return result; } function inthour() { var thishours=chours; var i; - choicewrite('<select name=hours onChange="parent.intcalc();">'); + var result = ''; + result += '<select name="hours" onchange="parent.intcalc();">'; for (i=0;i<=23;i++) { - choicewrite('<option value='+i); + result += '<option value="'+i+'"'; if (i==thishours) { - choicewrite(' selected'); + result += ' selected="selected"'; } - choicewrite('>'+i+'</option>'); + result += '>'+i+'</option>'; } - choicewrite('</select>'); -} + result += '</select>'; + return result; +} function intsecond() { - var thisseconds=csecs; + var thisseconds=csecs; var i; - choicewrite('<select name=seconds onChange="parent.intcalc();">'); + var result = ''; + result += '<select name="seconds" onchange="parent.intcalc();">'; for (i=0;i<=59;i++) { - choicewrite('<option value='+i); + result += '<option value="'+i+'"'; if (i==thisseconds) { - choicewrite(' selected'); + result += ' selected="selected"'; } - choicewrite('>'+i+'</option>'); + result += '>'+i+'</option>'; } - choicewrite('</select>'); + result += '</select>'; + return result; } function intday() { var thisdate=cdays; var i; - choicewrite('<select name=date onChange="parent.intcalc();">'); + var result =''; + result += '<select name="date" onchange="parent.intcalc();">'; for (i=0;i<=31;i++) { - choicewrite('<option value='+i); + result += '<option value="'+i+'"'; if (i==thisdate) { - choicewrite(' selected'); + result += ' selected="selected"'; } - choicewrite('>'+i+'</option>'); + result += '>'+i+'</option>'; } - choicewrite('</select>'); + result += '</select>'; + return result; } function intcalc() { @@ -269,7 +312,100 @@ function intcalc() { sform.hours.options[sform.hours.selectedIndex].value*1)*60+ sform.minutes.options[sform.minutes.selectedIndex].value*1)*60+ sform.seconds.options[sform.seconds.selectedIndex].value*1; - draw(); + if ((ptype=='date') && (pscat=='interval')) { + var newpmodval = ''; + var newpextraval = ''; + var newpextravaltwo = 'Done'; + if (sform.donebutton.length) { + for (var i=0; i<sform.donebutton.length; i++) { + if (sform.donebutton[i].checked) { + if (sform.donebutton[i].value == '_done') { + newpmodval = sform.donebutton[i].value; + newpextravaltwo = sform.donebutton_text.value; + } else { + if (sform.donebutton[i].value == '_done_proctor') { + newpmodval = sform.donebutton[i].value; + newpextraval = sform.donebutton_proctorkey.value; + newpextravaltwo = sform.donebutton_text.value; + newpextravaltwo = newpextravaltwo.replace(/:/g,''); + } + } + } + } + } + pmodval = newpmodval; + pextraval = newpextraval; + pextravaltwo = newpextravaltwo; + draw(); + if (pmodval) { + var doneRegExp = /^(_done)(|_proctor)$/; + var donevals = pmodval.match(doneRegExp); + if (donevals.length == 3) { + svalue += donevals[1]; + } + if (newpextravaltwo) { + if (newpextravaltwo != 'Done') { + svalue += ':'+newpextravaltwo+':'; + } + } + if (donevals[2] != '') { + svalue += donevals[2]; + if (pextraval != '') { + svalue += '_'+pextraval; + } + } + } + } else { + draw(); + } +} + +function toggleSecret() { + var sform=choices.document.forms.sch; + if (sform.donebutton.length) { + for (var i=0; i<sform.donebutton.length; i++) { + if (sform.donebutton[i].checked) { + if (sform.donebutton[i].value == '') { + if (document.getElementById('donebuttontextdiv')) { + document.getElementById('donebuttontextdiv').style.display='none'; + } + } else { + if (document.getElementById('donebuttontextdiv')) { + document.getElementById('donebuttontextdiv').style.display='block'; + } + } + if (sform.donebutton[i].value == '_done_proctor') { + if (document.getElementById('done_proctorkey')) { + document.getElementById('done_proctorkey').type='text'; + } + } else { + if (document.getElementById('done_proctorkey')) { + document.getElementById('done_proctorkey').type='hidden'; + document.getElementById('done_proctorkey').value=''; + } + } + } + } + } +} + +function validateInterval() { + var sform=choices.document.forms.sch; + if (sform.donebutton.length) { + for (var i=0; i<sform.donebutton.length; i++) { + if (sform.donebutton[i].checked) { + if (sform.donebutton[i].value == '_done_proctor') { + if ((sform.donebutton_proctorkey.value == '') || + (sform.donebutton_proctorkey.value == null)) { + alert('Please provide a key for a proctor to enter when a student uses the "Done" button.'); + return; + } + } + } + } + } + intcalc(); + assemble(); } function integereval() { @@ -304,11 +440,74 @@ function stringeval() { draw(); } +function ipstringeval() { + var patternIp = /^([\[\]a-zA-Z\.\d\*\-]+)$/; + var acctypes = new Array; + acctypes = ['allow','deny']; + svalue = ''; + for (var i=0; i<acctypes.length; i++) { + var items = choices.document.getElementsByName('setip'+acctypes[i]); + if (items.length > 0) { + for (var j=0; j<items.length; j++) { + if (items[j].type == "text") { + var possip = items[j].value; + possip = possip.replace(/^\s+|\s+$/g,''); + if (patternIp.test(possip)) { + if (acctypes[i] == 'deny') { + possip = '!'+possip; + } + if (svalue == '') { + svalue = possip; + } else { + svalue += ','+possip; + } + } + } + } + } + } +} + +function addIpRule(iptype) { + var frame = window.frames["choices"]; + if (frame.document.getElementById('LC_string_ipacc_inner_'+iptype)) { + var innerDiv = frame.document.getElementById('LC_string_ipacc_inner_'+iptype); + var count = innerDiv.childNodes.length + var ipDiv = frame.document.createElement('div'); + ipDiv.innerHTML = '<input type="text" size="10" name="setip'+iptype+'" onblur="parent.ipstringeval();" />'+ + '<a href="#" onclick="parent.removeIpRule(\''+iptype+'\',\''+count+'\')">Remove</a>'; + frame.document.getElementById('LC_string_ipacc_inner_'+iptype).appendChild(ipDiv); + } + return false; +} + +function removeIpRule(iptype,num) { + var frame = window.frames["choices"]; + if (frame.document.getElementById('LC_string_ipacc_inner_'+iptype)) { + var innerDiv = frame.document.getElementById('LC_string_ipacc_inner_'+iptype); + for (var i=0; i<innerDiv.childNodes.length; i++) { + if (i==num) { + innerDiv.removeChild(innerDiv.childNodes[i]); + ipstringeval(); + break; + } + } + } +} + function radiostringeval(newval) { svalue=newval; draw(); } +function callradiostringeval(newval) { + return 'onclick="parent.radiostringeval(\''+newval+'\')"'; +} + +function callintervalpmodval() { + return 'onclick="parent.intcalc();parent.toggleSecret()"'; +} + function intervaldis() { csecs=svalue; cdays=Math.floor(csecs/86400); @@ -317,8 +516,7 @@ function intervaldis() { csecs-=chours*3600; cmins=Math.floor(csecs/60); csecs-=cmins*60; - choicewrite(cdays+' days '+chours+' hours ' - +cmins+' mins '+csecs+' secs'); + return cdays+' days '+chours+' hours '+cmins+' mins '+csecs+' secs'; } function pickcolor(picked) { @@ -339,7 +537,7 @@ function colorfield(ir,ig,ib) { function draw() { choicestart(); - choicewrite('<form name=sch'); + choicewrite('<form name="sch"'); if (ptype=='int') { choicewrite(' action="javascript:integereval();"'); } @@ -347,7 +545,14 @@ function draw() { choicewrite(' action="javascript:floateval();"'); } if (ptype=='string') { - choicewrite(' action="javascript:stringeval();"'); + if (pscat == 'ip') { + choicewrite(' action="javascript:ipstringeval();"'); + } else { + choicewrite(' action="javascript:stringeval();"'); + } + } + if (ptype != 'int' && ptype != 'float' && ptype != 'string') { + choicewrite(' action=""'); } choicewrite('>'); if (ptype=='tolerance') { @@ -431,22 +636,60 @@ function draw() { tablestart('Date and time'); } if (pscat=='interval') { + var proctorkeytype = 'hidden'; + var donebuttontext = 'none'; + if (pmodval == '_done_proctor') { + proctorkeytype = 'text'; + donebuttontext = 'block'; + } + if (pmodval == '_done') { + donebuttontext = 'block'; + } tablestart('Time interval'); - choicewrite('<tr bgcolor="#AAFFAA"><td colspan=3>'); - intervaldis(); - choicewrite('</td></tr><tr bgcolor="#AAFFAA"><td>Time:' - +'</td><td colspan=2>'); - intday();choicewrite('days '); - inthour();choicewrite('hours '); - intminute(); choicewrite('mins '); intsecond(); - choicewrite('secs</td></tr></table>'); - } else { - choicewrite('<tr bgcolor="#AAFFAA"><td colspan=3>' + choicewrite( [ + '<tr><td colspan="3">'+intervaldis()+'</td></tr>', + '<tr><td>Time:</td><td colspan="2">', + '<span style="white-space:nowrap">'+intday()+' days </span>', + '<span style="white-space:nowrap">'+inthour()+' hours</span>', + '<span style="white-space:nowrap">'+intminute()+' mins</span>', + '<span style="white-space:nowrap">'+intsecond()+' secs</span>', + '</td></tr>', + '</table>', + '<br />', + ].join("\n")); + tablestart('Provide a "Done" button to students?'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="donebutton" value=""'+ + ' type="radio" '+callintervalpmodval()); + if (pmodval == '') { choicewrite(' checked="checked"'); } + choicewrite(' /> No</label><br />'); + choicewrite('<label><input name="donebutton" value="_done"'+ + ' type="radio" '+callintervalpmodval()); + if (pmodval == '_done') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes</label><br />'); + choicewrite('<span style="white-space:nowrap">'+ + '<label><input name="donebutton" value="_done_proctor"'+ + ' type="radio" '+callintervalpmodval()); + if (pmodval == '_done_proctor') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, with proctor key</label>'); + choicewrite(' <input name="donebutton_proctorkey" value='+ + '"'+escapeHTML(pextraval)+'" type="'+proctorkeytype+ + '" id="done_proctorkey" size="10"'+ + ' onblur="parent.intcalc();" /></span><br />'+ + '<div id="donebuttontextdiv" style="display:'+donebuttontext+'">'+ + '<br /><span style="white-space:nowrap">'+ + 'Button text:'+ + '<input name="donebutton_text" value='+ + '"'+escapeHTML(pextravaltwo)+'" type="text" '+ + 'size="10" onblur="parent.intcalc();" /></span></div>'); + choicewrite('</td></tr></table>'); + } else { + choicewrite('<tr><td colspan="3">' +cdate.toString()+ - '</td></tr><tr bgcolor="#AAFFAA"><td>Date:</td><td colspan=2>'); + '</td></tr><tr><td>Date:</td><td colspan="2">'); month();date();year(); - choicewrite('</td></tr><tr bgcolor="#AAFFAA"><td>Time:' - +'</td><td colspan=2>');hour();choicewrite('h ');minute(); + choicewrite('</td></tr><tr><td>Time:' + +'</td><td colspan="2">');hour();choicewrite('h ');minute(); choicewrite('m ');second(); choicewrite('s</td></tr></table>'); } @@ -463,12 +706,12 @@ function draw() { } else { if (pscat=='range') { tablestart('Integer range'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Lower Value:'+ - '</td><td colspan=2><input type=text size=4 name=val2'+ - '></td></tr>'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Upper Value:'+ - '</td><td colspan=2><input type=text size=4 name=val4'+ - '></td></tr></table>'); + choicewrite('<tr><td>Lower Value:'+ + '</td><td colspan="2"><input type="text" size="4" name="val2'+ + '" /></td></tr>'); + choicewrite('<tr><td>Upper Value:'+ + '</td><td colspan="2"><input type="text" size="4" name="val4'+ + '" /></td></tr></table>'); var range=new Array; if ((svalue!='') && (typeof(svalue)!="undefined")) { range=svalue.split(','); @@ -491,10 +734,10 @@ function draw() { if (pscat=='any') { tablestart('Integer'); } - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name=intval size=10 value="'+svalue+ - '" name=intval onChange="parent.integereval()">'); - choicewrite('</td></table>'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<input name="intval" size="10" value="'+escapeHTML(svalue)+ + '" onchange="parent.integereval()" />'); + choicewrite('</td></tr></table>'); } } } @@ -513,105 +756,235 @@ function draw() { if (pscat=='any') { tablestart('Floating point number'); } - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name=floatval size=10 value="'+svalue+ - '" name=floatval onChange="parent.floateval()">'); - choicewrite('</td></table>'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<input name="floatval" size="10" value="'+escapeHTML(svalue)+ + '" onchange="parent.floateval()" />'); + choicewrite('</td></tr></table>'); } } if (ptype=='string') { - if (pscat=='default') { - tablestart('Default value or none'); - choicewrite('</table>'); - } else { - if ((pscat=='any') || (pscat=='') || (typeof(pscat)=='undefined')) { + if ((pscat=='any') || (pscat=='') || (pscat=='default') || + (typeof(pscat)=='undefined')) { tablestart('Text'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="stringval" size="20" value="'+svalue+ - '" type="text" onChange="parent.stringeval()">'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<input name="stringval" size="20" value="'+escapeHTML(svalue)+ + '" type="text" onchange="parent.stringeval()" />'); } if (pscat=='yesno') { tablestart('Yes/No'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="stringval" value="yes"'+ - ' type="radio" onChange="parent.radiostringeval(\'yes\')"'); - if (svalue=='yes') { choicewrite(' checked'); } - choicewrite('> Yes<br />'); - choicewrite('<input name="stringval" value="no"'+ - ' type="radio" onChange="parent.radiostringeval(\'no\')"'); - if (svalue=='no') { choicewrite(' checked'); } - choicewrite('> No<br />'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="yes"'+ + ' type="radio" '+callradiostringeval('yes')); + if (svalue=='yes') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes</label><br />'); + choicewrite('<label><input name="stringval" value="no"'+ + ' type="radio" '+callradiostringeval('no')); + if (svalue=='no') { choicewrite(' checked="checked"'); } + choicewrite(' /> No</label><br />'); + } + if (pscat=='problemstatus') { + tablestart('Problem Status'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="yes"'+ + ' type="radio" '+callradiostringeval('yes')); + if (svalue=='yes') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes</label><br />'); + choicewrite('<label><input name="stringval" value="answer"'+ + ' type="radio" '+callradiostringeval('answer')); + if (svalue=='answer') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, and show correct answer if they exceed the maximum number of tries.</label><br />'); + choicewrite('<label><input name="stringval" value="no"'+ + ' type="radio" '+callradiostringeval('no')); + if (svalue=='no') { choicewrite(' checked="checked"'); } + choicewrite(' /> No, don\'t show correct/incorrect feedback.</label><br />'); + choicewrite('<label><input name="stringval" value="no_feedback_ever"'+ + ' type="radio" '+callradiostringeval('no_feedback_ever')); + if (svalue=='no_feedback_ever') { choicewrite(' checked="checked"'); } + choicewrite(' /> No, show no feedback at all.</label><br />'); } if (pscat=='examtype') { tablestart('Exam Type'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="stringval" value="online"'+ - ' type="radio" onChange="parent.radiostringeval(\'online\')"'); - if (svalue=='online') { choicewrite(' checked'); } - choicewrite('> Online<br />'); - choicewrite('<input name="stringval" value="checkout"'+ - ' type="radio" onChange="parent.radiostringeval(\'checkout\')"'); - if (svalue=='checkout') { choicewrite(' checked'); } - choicewrite('> Check out<br />'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="online"'+ + ' type="radio" '+callradiostringeval('online')); + if (svalue=='online') { choicewrite(' checked="checked"'); } + choicewrite(' /> Online</label><br />'); + choicewrite('<label><input name="stringval" value="checkout"'+ + ' type="radio" '+callradiostringeval('checkout')); + if (svalue=='checkout') { choicewrite(' checked="checked"'); } + choicewrite(' /> Check out</label><br />'); } if (pscat=='questiontype') { tablestart('Question Type'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="stringval" value="problem"'+ - ' type="radio" onChange="parent.radiostringeval(\'problem\')"'); - if (svalue=='problem') { choicewrite(' checked'); } - choicewrite('> Standard Problem<br />'); - choicewrite('<input name="stringval" value="quiz"'+ - ' type="radio" onChange="parent.radiostringeval(\'quiz\')"'); - if (svalue=='quiz') { choicewrite(' checked'); } - choicewrite('> Quiz<br />'); - choicewrite('<input name="stringval" value="exam"'+ - ' type="radio" onChange="parent.radiostringeval(\'exam\')"'); - if (svalue=='exam') { choicewrite(' checked'); } - choicewrite('> Exam<br />'); - choicewrite('<input name="stringval" value="assess"'+ - ' type="radio" onChange="parent.radiostringeval(\'assess\')"'); - if (svalue=='assess') { choicewrite(' checked'); } - choicewrite('> Assessment<br />'); - choicewrite('<input name="stringval" value="survey"'+ - ' type="radio" onChange="parent.radiostringeval(\'survey\')"'); - if (svalue=='survey') { choicewrite(' checked'); } - choicewrite('> Survey<br />'); - choicewrite('<input name="stringval" value="form"'+ - ' type="radio" onChange="parent.radiostringeval(\'form\')"'); - if (svalue=='form') { choicewrite(' checked'); } - choicewrite('> Input Form<br />'); - choicewrite('<input name="stringval" value="library"'+ - ' type="radio" onChange="parent.radiostringeval(\'library\')"'); - if (svalue=='library') { choicewrite(' checked'); } - choicewrite('> Library<br />'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="problem"'+ + ' type="radio" '+callradiostringeval('problem')); + if (svalue=='problem') { choicewrite(' checked="checked"'); } + choicewrite(' /> Standard Problem</label><br />'); +// choicewrite('<label><input name="stringval" value="quiz"'+ +// ' type="radio" '+callradiostringeval('quiz')); +// if (svalue=='quiz') { choicewrite(' checked="checked"'); } +// choicewrite(' /> Quiz</label><br />'); + choicewrite('<label><input name="stringval" value="practice"'+ + ' type="radio" '+callradiostringeval('practice')); + if (svalue=='practice') { choicewrite(' checked="checked"'); } + choicewrite(' /> Practice</label><br />'); + choicewrite('<label><input name="stringval" value="exam"'+ + ' type="radio" '+callradiostringeval('exam')); + if (svalue=='exam') { choicewrite(' checked="checked"'); } + choicewrite(' /> Exam</label><br />'); +// choicewrite('<label><input name="stringval" value="assess"'+ +// ' type="radio" '+callradiostringeval('assess')); +// if (svalue=='assess') { choicewrite(' checked="checked"'); } +// choicewrite(' /> Assessment</label><br />'); + choicewrite('<label><input name="stringval" value="survey"'+ + ' type="radio" '+callradiostringeval('survey')); + if (svalue=='survey') { choicewrite(' checked="checked"'); } + choicewrite(' /> Survey</label><br />'); +// choicewrite('<label><input name="stringval" value="form"'+ +// ' type="radio" '+callradiostringeval('form')); +// if (svalue=='form') { choicewrite(' checked="checked"'); } +// choicewrite('> Input Form</label><br />'); + choicewrite('<label><input name="stringval" value="surveycred"'+ + ' type="radio" '+callradiostringeval('surveycred')); + if (svalue=='surveycred') { choicewrite(' checked="checked"'); } + choicewrite('> Survey (credit for submission)</label><br />'); + choicewrite('<label><input name="stringval" value="anonsurvey"'+ + ' type="radio" '+callradiostringeval('anonsurvey')); + if (svalue=='anonsurvey') { choicewrite(' checked="checked"'); } + choicewrite('> Anonymous Survey</label><br />'); + choicewrite('<label><input name="stringval" value="anonsurveycred"'+ + ' type="radio" '+callradiostringeval('anonsurveycred')); + if (svalue=='anonsurveycred') { choicewrite(' checked="checked"'); } + choicewrite('> Anonymous Survey (credit for submission)</label><br />'); + choicewrite('<label><input name="stringval" value="randomizetry"'+ + ' type="radio" '+callradiostringeval('randomizetry')); + if (svalue=='randomizetry') { choicewrite(' checked="checked"'); } + choicewrite('> New Randomization Each N Tries (default N=1)</label><br />'); + choicewrite('<label><input name="stringval" value="library"'+ + ' type="radio" '+callradiostringeval('library')); + if (svalue=='library') { choicewrite(' checked="checked"'); } + choicewrite(' /> Library</label><br />'); + } + if (pscat=='lenient') { + tablestart('Lenient Grading (Partial Credit)'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="yes"'+ + ' type="radio" '+callradiostringeval('yes')); + if (svalue=='yes') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes</label><br />'); + choicewrite('<label><input name="stringval" value="no"'+ + ' type="radio" '+callradiostringeval('no')); + if (svalue=='no') { choicewrite(' checked="checked"'); } + choicewrite(' /> No</label><br />'); + choicewrite('<label><input name="stringval" value="default"'+ + ' type="radio" '+callradiostringeval('default')); + if (svalue=='default') { choicewrite(' checked="checked"'); } + choicewrite(' /> Default (only bubblesheet grading is lenient)</label><br />'); + } + if (pscat=='discussvote') { + tablestart('Discussion Voting'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="yes"'+ + ' type="radio" '+callradiostringeval('yes')); + if (svalue=='yes') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes</label><br />'); + choicewrite('<label><input name="stringval" value="notended"'+ + ' type="radio" '+callradiostringeval('notended')); + if (svalue=='notended') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, unless discussion ended</label><br />'); + choicewrite('<label><input name="stringval" value="no"'+ + ' type="radio" '+callradiostringeval('no')); + if (svalue=='no') { choicewrite(' checked="checked"'); } + choicewrite(' /> No</label><br />'); } if (pscat=='ip') { - tablestart('IP Number/Name'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="stringval" size="20" value="'+svalue+ - '" onChange="parent.stringeval()">'); + var currallow = new Array; + var currdeny = new Array; + if ((svalue != '') && (svalue != null)) { + var patternComma = /,/; + var patternAllow = /^([\[\]a-zA-Z\.\d\*\-]+)$/; + var patternDeny = /^\!([\[\]a-zA-Z\.\d\*\-]+)$/; + var current = new Array; + if (patternComma.test(svalue)) { + current = svalue.split(','); + } else { + current = [svalue]; + } + for (var i=0; i<current.length; i++) { + if (patternDeny.test(current[i])) { + var denied = current[i].replace(/^!/,''); + currdeny.push(denied); + } else { + if (patternAllow.test(current[i])) { + currallow.push(current[i]); + } + } + } + } + if (currdeny.length == 0) { + currdeny = (''); + } + if (currallow.length == 0) { + currallow = (''); + } + var curripaccess = [currallow,currdeny]; + tablestart('IP Number/Name'); + choicewrite('<tr><th>Allow from</th><th>Deny from</th></tr><tr>'); + var acctypes = ['allow','deny']; + for (var i=0; i<acctypes.length; i++) { + choicewrite('<td valign="top">'+ + '<div class="LC_string_ipacc_wrap" id="LC_string_ipacc_'+acctypes[i]+'">'+ + '<div class="LC_string_ipacc_inner" id="LC_string_ipacc_inner_'+acctypes[i]+'">'); + for (var j=0; j<curripaccess[i].length; j++) { + choicewrite('<div><input type="text" size="10" name="setip'+acctypes[i]+'" value="'+curripaccess[i][j]+'" onblur="parent.ipstringeval();" />'); + choicewrite('<a href="#" onclick="parent.removeIpRule(\''+acctypes[i]+'\',\''+j+'\')">Remove</a>'); + choicewrite('</div>'); + } + choicewrite('</div><button onclick="parent.addIpRule(\''+acctypes[i]+'\');">Add item</button>'); + } + choicewrite('</div></td></tr></table>'); } if (pscat=='fileext') { tablestart('Allowed File Extensions'); - choicewrite('<tr bgcolor="#AAFFAA"><td>Value:</td><td colspan=2>'); - choicewrite('<input name="radstringval" value="txt"'+ - ' type="radio" onChange="parent.radiostringeval(\'txt\')"'); - if (svalue=='txt') { choicewrite(' checked'); } - choicewrite('> Plain Text<br />'); - choicewrite('<input name="radstringval" value="png,jpg,jpeg,gif"'+ - ' type="radio" onChange="parent.radiostringeval(\'png,jpg,jpeg,gif\')"'); - if (svalue=='png,jpg,jpeg,gif') { choicewrite(' checked'); } - choicewrite('> Picture File<br />'); - choicewrite('<input name="radstringval" value="doc,xls,ppt"'+ - ' type="radio" onChange="parent.radiostringeval(\'doc,xls,ppt\')"'); - if (svalue=='doc,xls,ppt') { choicewrite(' checked'); } - choicewrite('> Office Document<br />'); - choicewrite('<input name="stringval" size="20" value="'+svalue+ - '" onChange="parent.stringeval()">'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="radstringval" value="txt"'+ + ' type="radio" '+callradiostringeval('txt')); + if (svalue=='txt') { choicewrite(' checked="checked"'); } + choicewrite(' /> Plain Text</label><br />'); + choicewrite('<label><input name="radstringval" value="png,jpg,jpeg,gif"'+ + ' type="radio" '+callradiostringeval('png,jpg,jpeg,gif')); + if (svalue=='png,jpg,jpeg,gif') { choicewrite(' checked="checked"'); } + choicewrite(' /> Picture File</label><br />'); + choicewrite('<label><input name="radstringval" value="doc,docx,xls,xlsx,ppt,pptx"'+ + ' type="radio" '+callradiostringeval('doc,docx,xls,xlsx,ppt,pptx')); + if (svalue=='doc,docx,xls,xlsx,ppt,pptx') { choicewrite(' checked="checked"'); } + if (svalue=='doc,xls,ppt') { choicewrite(' checked="checked"'); } + choicewrite(' /> Office Document</label><br />'); + choicewrite('<input name="stringval" size="20" value="'+escapeHTML(svalue)+ + '" onchange="parent.stringeval()" />'); } - choicewrite('</td></table>'); + if (pscat=='useslots') { + tablestart('Slots control access'); + choicewrite('<tr><td>Value:</td><td colspan="2">'); + choicewrite('<label><input name="stringval" value="no"'+ + ' type="radio" '+callradiostringeval('no')); + if (svalue=='no') { choicewrite(' checked="checked"'); } + choicewrite(' /> No</label><br />'); + choicewrite('<label><input name="stringval" value="resource"'+ + ' type="radio" '+callradiostringeval('resource')); + if (svalue=='resource') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, and the scope of student selected slot is a single resource.</label><br />'); + choicewrite('<label><input name="stringval" value="map"'+ + ' type="radio" '+callradiostringeval('map')); + if (svalue=='map') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, and the scope of student selected slot is the enclosing map/folder. When checking in, it applies to only one resource.</label><br />'); + choicewrite('<label><input name="stringval" value="map_map"'+ + ' type="radio" '+callradiostringeval('map_map')); + if (svalue=='map_map') { choicewrite(' checked="checked"'); } + choicewrite(' /> Yes, and the scope of student selected slot is the enclosing map/folder. When checking in, all resources in the map/folder are checked in.</label><br />'); + choicewrite('</td></tr></table>'); } } @@ -620,7 +993,7 @@ function draw() { choicewrite('<table>'); if (svalue) { choicewrite('<tr><td colspan="9">Current choice:</td><td bgcolor="'+ - svalue+'" colspan="2"> </td></tr>'); + escapeHTML(svalue)+'" colspan="2"> </td></tr>'); } for (var ir=0; ir<=10; ir++) { for (var ig=0; ig<=10; ig++) { @@ -634,14 +1007,14 @@ function draw() { choicewrite('</table></td></table>'); } - choicewrite('</table></form>'); + choicewrite('</form>'); choiceend(); } function sopt(va,text) { selwrite('<option value="'+va+'"'); if (va==pscat) { - selwrite(' selected'); + selwrite(' selected="selected"'); } selwrite('>'+text+'</option>'); } @@ -654,7 +1027,7 @@ function catchange() { function assemble() { if ((ptype=='date') && (pscat!='interval')) { - svalue=Math.round(cdate.getTime()/1000); + svalue=Math.floor(cdate.getTime()/1000); } if (ptype=='tolerance') { if (pscat=='relative_sym') { @@ -702,6 +1075,10 @@ function assemble() { function init() { var i; var subs=new Array(); + var doneRegExp = /_done(|\:[^\:]+\:)/; + var doneproctorRegExp = /_done(|\:[^\:]+\:)_proctor/; + var proctorkeyRegExp = /^(\d+)_(.+)$/; + var donetextRegExp = /\:([^\:]+)\:/; var namevalue=this.window.location.search.split('&'); namevalue[0]=namevalue[0].substr(1,namevalue[0].length-1); @@ -723,8 +1100,55 @@ function init() { if (pair[0]=='call') { pcode=pair[1]; } if (pair[0]=='marker') { pmarker=pair[1]; } if (pair[0]=='name') { pname=pair[1]; } + if (pair[0]=='modal') { pmodal=pair[1]; } + if (pair[0]=='defhour' && pair[1] >= 0 && pair[1] < 24 ) { + defhour=pair[1]; + } + if (pair[0]=='defmin' && pair[1] >= 0 && pair[1] < 60) { defmin=pair[1]; } + if (pair[0]=='defsec' && pair[1] >= 0 && pair[1] < 60) { defsec=pair[1]; } } + if (ptype=='date' && pscat == 'interval') { + if (doneproctorRegExp.test(pvalue)) { + var current = pvalue.match(doneproctorRegExp); + if (current.length == 2) { + var textstr = current[1]; + if (textstr != '') { + var textvals = textstr.match(donetextRegExp); + if (textvals.length == 2) { + pextravaltwo = textvals[1]; + } + } + } + var intervalwithkey = pvalue.replace(doneproctorRegExp,''); + if (proctorkeyRegExp.test(intervalwithkey)) { + var currvals = intervalwithkey.match(proctorkeyRegExp); + if (currvals.length == 3) { + pvalue = currvals[1]; + pextraval = currvals[2]; + pmodval = '_done_proctor'; + } else { + pmodval = ''; + } + } + } else { + if (doneRegExp.test(pvalue)) { + var current = pvalue.match(doneRegExp); + if (current.length == 2) { + var textstr = current[1]; + if (textstr != '') { + var textvals = textstr.match(donetextRegExp); + if (textvals.length == 2) { + pextravaltwo = textvals[1]; + } + } + } + var pnumval = pvalue.replace(doneRegExp,''); + pmodval = '_done'; + pvalue = pnumval; + } + } + } svalue=pvalue; if (((ptype=='float') || (ptype=='string') || (ptype=='int')) && (pscat=='default') && @@ -745,11 +1169,26 @@ function init() { } } - this.window.selector.document.clear(); - selwrite('<html><body bgcolor="#FFFFFF">'); - - selwrite('<form name="fsel"><b>'+pname+'</b><br>'); - selwrite('<select name="fcat" onChange="parent.catchange();">'); + this.window.selector.document.open(); + selwrite('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'); + selwrite('<html xmlns="http://www.w3.org/1999/xhtml">'); + selwrite('<head>'); + selwrite('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'); + selwrite('<title>LON-CAPA</title>'); + selwrite('<style type="text/css">'); + selwrite('<!--'); + selwrite('body {'); + selwrite('font-family: Verdana,Arial,Helvetica,sans-serif;'); + selwrite('line-height:130%;'); + selwrite('font-size:0.83em;'); + selwrite('background: #FFFFFF;'); + selwrite('}'); + selwrite('-->'); + selwrite('</style>'); + selwrite('</head>'); + selwrite('<body>'); + selwrite('<form name="fsel" action=""><b>'+pname+'</b><br />'); + selwrite('Format of Value(s): <select name="fcat" onchange="parent.catchange();">'); if (ptype=='tolerance') { sopt('default','Default'); @@ -760,13 +1199,20 @@ function init() { } if (ptype=='date') { - sopt('default','Default'); - sopt('start','Starting Date'); - sopt('end','Ending Date'); - sopt('interval','Time Interval'); - + if (pscat != 'interval') { + sopt('default','Default'); + sopt('start','Starting Date'); + sopt('end','Ending Date'); + } else { + sopt('interval','Time Interval'); + } + if ((pvalue!='') && (typeof(pvalue)!="undefined")) { cdate.setTime(pvalue*1000); + } else { + cdate.setSeconds(defsec); + cdate.setMinutes(defmin); + cdate.setHours(defhour); } months[0]='January'; @@ -801,7 +1247,17 @@ function init() { } if (ptype=='string') { - sopt('default','Default'); + //sopt('default','Default'); + if (pscat == 'yesno') { sopt('yesno','Yes/No'); } + else if (pscat == 'problemstatus'){ sopt('problemstatus','Problem Status'); } + else if (pscat == 'examtype') { sopt('examtype','Exam Type'); } + else if (pscat == 'questiontype') { sopt('questiontype','Question Type'); } + else if (pscat == 'lenient') { sopt('lenient','Lenient Grading (Partial Credit)'); } + else if (pscat == 'discussvote') { sopt('discussvote','Discussion Voting'); } + else if (pscat == 'ip') { sopt('ip','IP Number/Name'); } + else if (pscat == 'fileext') { sopt('fileext','File Extension'); } + else if (pscat == 'useslots') { sopt('useslots','Slots control access'); } + else { pscat = 'any'; } sopt('any','String Value'); } @@ -811,67 +1267,51 @@ function init() { } selwrite('</select></form>'); - - selwrite('<a href="javascript:parent.assemble();'); + var targ='parent.opener'; + if (pmodal==1) { + targ='parent.parent'; + } + if ((ptype=='date') && (pscat=='interval')) { + selwrite('<a href="javascript:parent.validateInterval();'); + } else { + selwrite('<a href="javascript:parent.assemble();'); + } if (preturn!='') { - selwrite( - 'parent.opener.document.'+preturn+'_value.value=parent.window.svalue;'); - selwrite( - 'parent.opener.document.'+preturn+'_type.value=parent.window.stype;'); + selwrite(targ+'.document.'+preturn+'_value.value=parent.window.svalue;'); + selwrite(targ+'.document.'+preturn+'_type.value=parent.window.stype;'); } if (pmarker!='') { - selwrite( - 'parent.opener.document.'+preturn+'_marker.value=parent.window.pmarker;'); + selwrite(targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;'); } if (pcode!='') { - selwrite('parent.opener.'+pcode+'();'); + selwrite(targ+'.'+pcode+'();'); } - selwrite('">Store</a> '); + selwrite('">Save</a> '); selwrite('<a href="javascript:'); - selwrite( - 'parent.opener.document.'+preturn+'_value.value='+"'';"); + selwrite(targ+'.document.'+preturn+'_value.value='+"'';"); if (pmarker!='') { selwrite( - 'parent.opener.document.'+preturn+'_marker.value=parent.window.pmarker;'); + targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;'); } if (pcode!='') { - selwrite('parent.opener.'+pcode+'();'); + selwrite(targ+'.'+pcode+'();'); } selwrite('">Delete</a> '); - selwrite('<a href="javascript:'); -// Old code : -//---------------------------------------------------------------------- -// if (preturn!='') { -// selwrite('parent.opener.document.'+preturn+'_value.value='+"'';"); -// selwrite('parent.opener.document.'+preturn+'_type.value='+"'';"); -// } -// if (pmarker!='') { -// selwrite('parent.opener.document.'+preturn+'_marker.value='+"'';"); -// } -// if (pcode!='') { -// selwrite('parent.opener.'+pcode+'();'); -// } -//---------------------------------------------------------------------- -// Just close the window to 'cancel' the operation. There are javascript -// errors in the above commented out code that I have not been able to -// track down. I think they reside in 'parent.opener.'+pcode+'();' -// - selwrite('this.parent.close();'); - selwrite('">Cancel</a>'); - selwrite('</body></html>'); this.window.selector.document.close(); draw(); } +// ]]> </script> +</head> -<frameset rows="120,*" onLoad="init();"> -<frame name=selector src="empty.html"> -<frame name=choices src="empty.html"> +<frameset rows="120,*" onload="init();"> +<frame name="selector" src="empty.html" /> +<frame name="choices" src="empty.html" /> </frameset>