File:  [LON-CAPA] / rat / client / parameter.html
Revision 1.73: download - view: text, annotated - select for diffs
Sat May 21 16:58:07 2016 UTC (8 years ago) by raeburn
Branches: MAIN
CVS tags: HEAD
- Modal parameter setting window for Client IP/Name Access Control includes
  individual textboxes for each IP or Name, with separate boxes for
  "allow from" and "deny from".

    1: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
    2:     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
    3: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    4: <!--
    5: The LearningOnline Network with CAPA
    6: Parameter Input Window
    7: //
    8: // $Id: parameter.html,v 1.73 2016/05/21 16:58:07 raeburn Exp $
    9: //
   10: // Copyright Michigan State University Board of Trustees
   11: //
   12: // This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   13: //
   14: // LON-CAPA is free software; you can redistribute it and/or modify
   15: // it under the terms of the GNU General Public License as published by
   16: // the Free Software Foundation; either version 2 of the License, or
   17: // (at your option) any later version.
   18: //
   19: // LON-CAPA is distributed in the hope that it will be useful,
   20: // but WITHOUT ANY WARRANTY; without even the implied warranty of
   21: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   22: // GNU General Public License for more details.
   23: //
   24: // You should have received a copy of the GNU General Public License
   25: // along with LON-CAPA; if not, write to the Free Software
   26: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   27: //
   28: // /home/httpd/html/adm/gpl.txt
   29: //
   30: // http://www.lon-capa.org/
   31: //
   32: -->
   33: <head>
   34: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   35: <title>LON-CAPA</title>
   36: 
   37: <script type="text/javascript">
   38: // <![CDATA[
   39: 
   40: var ptype='';
   41: var pvalue='';
   42: var pmodval='';
   43: var pextraval='';
   44: var pextravaltwo='';
   45: var preturn='';
   46: var pcode='';
   47: var pscat='';
   48: var pmarker='';
   49: var pmodal='';
   50: var pname='';
   51: 
   52: var defhour=0;
   53: var defmin=0;
   54: var defsec=0;
   55: 
   56: var svalue;
   57: var stype;
   58: var smarker;
   59: 
   60: var vars=new Array();
   61: 
   62: var cdate=new Date();
   63: 
   64: var csec;
   65: var cmin;
   66: var chour;
   67: var cday;
   68: 
   69: var months=new Array();
   70: 
   71: 
   72: function selwrite(text) {
   73:   this.window.selector.document.write(text);
   74: }
   75: 
   76: function choicestart() {
   77:   this.window.choices.document.open();
   78:   choicewrite('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
   79:   choicewrite('<html xmlns="http://www.w3.org/1999/xhtml">');
   80:   choicewrite('<head>');
   81:   choicewrite('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
   82:   choicewrite('<title>LON-CAPA</title>');
   83:   choicewrite('<style type="text/css">');
   84:   choicewrite('<!--');
   85:   choicewrite('body {');
   86:   choicewrite('font-family: Verdana,Arial,Helvetica,sans-serif;');
   87:   choicewrite('line-height:130%;');
   88:   choicewrite('font-size:0.83em;');
   89:   choicewrite('background: #FFFFFF;');
   90:   choicewrite('}');
   91:   choicewrite('table.LC_parmsel_table {font-size: 90%;}');
   92:   choicewrite('table.LC_parmsel_table tr td { padding: 5px; border: 1px solid #C8C8C8;}');
   93:   choicewrite('-->');
   94:   choicewrite('</style>');
   95:   choicewrite('</head>');
   96:   choicewrite('<body>');
   97: }
   98: 
   99: function choiceend() {
  100:   choicewrite('</body></html>');
  101:   this.window.choices.document.close();
  102: }
  103: 
  104: function choicewrite(text) {
  105:   this.window.choices.document.write(text);
  106: }
  107: 
  108: function tablestart(headtext) {
  109:   choicewrite('<table class="LC_parmsel_table"><tr bgcolor="#C5DB99"><th colspan="3">'+
  110:               headtext+'</th></tr>');
  111: }
  112: 
  113: function valline(text,id1,id2) {
  114:   choicewrite('<tr><td>'+text+
  115:               '</td><td><input type="text" size="4" name="val'+
  116:               id1+'" /></td><td>incl:<input type="checkbox" name="val'+
  117:               id2+'" /></td></tr>');
  118: }
  119: 
  120: function escapeHTML(text) {
  121:   text = text.replace(/&/g, '&amp;');
  122:   text = text.replace(/"/g, '&quot;');
  123:   text = text.replace(/</g, '&lt;');
  124:   text = text.replace(/>/g, '&gt;');
  125:   return text;
  126: }
  127: 
  128: function datecalc() {
  129:     var sform=choices.document.forms.sch;
  130: 
  131:     cdate.setHours(sform.hours.options[sform.hours.selectedIndex].value);
  132:     cdate.setMinutes(sform.minutes.options[sform.minutes.selectedIndex].value);
  133:     cdate.setSeconds(sform.minutes.options[sform.seconds.selectedIndex].value);
  134:     cdate.setDate(sform.date.options[sform.date.selectedIndex].value);
  135:     cdate.setMonth(sform.month.options[sform.month.selectedIndex].value);
  136:     cdate.setFullYear(sform.year.options[sform.year.selectedIndex].value);
  137: 
  138:     draw();
  139: }
  140: 
  141: function hour() {
  142:    var thishour=cdate.getHours();
  143:     var i; var j;
  144:     choicewrite('<select name="hours" onchange="parent.datecalc();">');
  145:     for (i=0;i<=23;i++) {
  146:         choicewrite('<option value="'+i+'"');
  147:         if (i==thishour) {
  148:             choicewrite(' selected="selected"');
  149:         }
  150:         choicewrite('>');
  151:         if (i==12) { choicewrite('noon'); } else {
  152:            if (i==0) { choicewrite('midnight') } else {
  153:               
  154:                  if (i<12) { choicewrite(i+' am'); } else {
  155:                     j=i-12; choicewrite(j+' pm');
  156:                  }
  157:               
  158:            }
  159:         }
  160:         choicewrite('</option>');
  161:     }
  162:     choicewrite('</select>');
  163: }
  164: 
  165: function minute() {
  166:    var thisminutes=cdate.getMinutes();
  167:     var i;
  168:     choicewrite('<select name="minutes" onchange="parent.datecalc();">');
  169:     for (i=0;i<=59;i++) {
  170:         choicewrite('<option value="'+i+'"');
  171:         if (i==thisminutes) {
  172:             choicewrite(' selected="selected"');
  173:         }
  174:         choicewrite('>'+i+'</option>');
  175:     }
  176:     choicewrite('</select>');
  177: } 
  178: 
  179: function second() {
  180:    var thisseconds=cdate.getSeconds();
  181:     var i;
  182:     choicewrite('<select name="seconds" onchange="parent.datecalc();">');
  183:     for (i=0;i<=59;i++) {
  184:         choicewrite('<option value="'+i+'"');
  185:         if (i==thisseconds) {
  186:             choicewrite(' selected="selected"');
  187:         }
  188:         choicewrite('>'+i+'</option>');
  189:     }
  190:     choicewrite('</select>');
  191: } 
  192: 
  193: 
  194: function date() {
  195:    var thisdate=cdate.getDate();
  196:     var i;
  197:     choicewrite('<select name="date" onchange="parent.datecalc();">');
  198:     for (i=1;i<=31;i++) {
  199:         choicewrite('<option value="'+i+'"');
  200:         if (i==thisdate) {
  201:             choicewrite(' selected="selected"');
  202:         }
  203:         choicewrite('>'+i+'</option>');
  204:     }
  205:     choicewrite('</select>');
  206: }
  207: 
  208: function year() {
  209:    var thisyear=cdate.getFullYear();
  210:    var nowdate=new Date();
  211:    var nowyear=nowdate.getFullYear();
  212:    if ( !thisyear ) { thisyear=nowyear; }
  213:    var loweryear=thisyear-2;
  214:    var upperyear=thisyear+5;
  215:    if (thisyear>nowyear) { loweryear=nowyear-2; }
  216:    if (thisyear<nowyear) { upperyear=nowyear+5; } 
  217:     var i;
  218:     choicewrite('<select name="year" onchange="parent.datecalc();">');
  219:     for (i=loweryear;i<=upperyear;i++) {
  220:         choicewrite('<option value="'+i+'"');
  221:         if (i==thisyear) {
  222:             choicewrite(' selected="selected"');
  223:         }
  224:         choicewrite('>'+i+'</option>');
  225:     }
  226:     choicewrite('</select>');
  227: }
  228: 
  229: function month() {
  230:     var thismonth=cdate.getMonth();
  231:     var i;
  232:     choicewrite('<select name="month" onchange="parent.datecalc();">');
  233:     for (i=0;i<=11;i++) {
  234:         choicewrite('<option value="'+i+'"');
  235:         if (i==thismonth) {
  236:             choicewrite(' selected="selected"');
  237:         }
  238:         choicewrite('>'+months[i]+'</option>');
  239:     }
  240:     choicewrite('</select>');
  241: }
  242:     
  243:     
  244: function intminute() {
  245:    var thisminutes=cmins;
  246:     var i;
  247:     var result = '';
  248:     result += '<select name="minutes" onchange="parent.intcalc();">';
  249:     for (i=0;i<=59;i++) {
  250:         result += '<option value="'+i+'"';
  251:         if (i==thisminutes) {
  252:             result += ' selected="selected"';
  253:         }
  254:         result += '>'+i+'</option>';
  255:     }
  256:     result += '</select>';
  257:     return result;
  258: } 
  259: 
  260: function inthour() {
  261:    var thishours=chours;
  262:     var i;
  263:     var result = '';
  264:     result += '<select name="hours" onchange="parent.intcalc();">';
  265:     for (i=0;i<=23;i++) {
  266:         result += '<option value="'+i+'"';
  267:         if (i==thishours) {
  268:             result += ' selected="selected"';
  269:         }
  270:         result += '>'+i+'</option>';
  271:     }
  272:     result += '</select>';
  273:     return result;
  274: }
  275: 
  276: function intsecond() {
  277:     var thisseconds=csecs;
  278:     var i;
  279:     var result = '';
  280:     result += '<select name="seconds" onchange="parent.intcalc();">';
  281:     for (i=0;i<=59;i++) {
  282:         result += '<option value="'+i+'"';
  283:         if (i==thisseconds) {
  284:             result += ' selected="selected"';
  285:         }
  286:         result += '>'+i+'</option>';
  287:     }
  288:     result += '</select>';
  289:     return result;
  290: } 
  291: 
  292: 
  293: function intday() {
  294:    var thisdate=cdays;
  295:     var i;
  296:     var result ='';
  297:     result += '<select name="date" onchange="parent.intcalc();">';
  298:     for (i=0;i<=31;i++) {
  299:         result += '<option value="'+i+'"';
  300:         if (i==thisdate) {
  301:             result += ' selected="selected"';
  302:         }
  303:         result += '>'+i+'</option>';
  304:     }
  305:     result += '</select>';
  306:     return result;
  307: }
  308: 
  309: function intcalc() {
  310:     var sform=choices.document.forms.sch;
  311:     svalue=((sform.date.options[sform.date.selectedIndex].value*24+
  312:              sform.hours.options[sform.hours.selectedIndex].value*1)*60+
  313:              sform.minutes.options[sform.minutes.selectedIndex].value*1)*60+
  314:              sform.seconds.options[sform.seconds.selectedIndex].value*1;
  315:     if ((ptype=='date') && (pscat=='interval')) {
  316:         var newpmodval = '';
  317:         var newpextraval = '';
  318:         var newpextravaltwo = 'Done';
  319:         if (sform.donebutton.length) {
  320:             for (var i=0; i<sform.donebutton.length; i++) {
  321:                 if (sform.donebutton[i].checked) {
  322:                     if (sform.donebutton[i].value == '_done') {
  323:                         newpmodval = sform.donebutton[i].value;
  324:                         newpextravaltwo = sform.donebutton_text.value;
  325:                     } else {
  326:                         if (sform.donebutton[i].value == '_done_proctor') { 
  327:                             newpmodval = sform.donebutton[i].value;
  328:                             newpextraval = sform.donebutton_proctorkey.value;
  329:                             newpextravaltwo = sform.donebutton_text.value;
  330:                             newpextravaltwo = newpextravaltwo.replace(/:/g,'');
  331:                         }
  332:                     }
  333:                 }
  334:             }
  335:         }
  336:         pmodval = newpmodval;
  337:         pextraval = newpextraval;
  338:         pextravaltwo = newpextravaltwo;
  339:         draw();
  340:         if (pmodval) {
  341:             var doneRegExp = /^(_done)(|_proctor)$/;
  342:             var donevals = pmodval.match(doneRegExp);
  343:             if (donevals.length == 3) {
  344:                 svalue += donevals[1];
  345:             }
  346:             if (newpextravaltwo) {
  347:                 if (newpextravaltwo != 'Done') { 
  348:                     svalue += ':'+newpextravaltwo+':';
  349:                 }
  350:             }
  351:             if (donevals[2] != '') {
  352:                 svalue += donevals[2];
  353:                 if (pextraval != '') {
  354:                     svalue += '_'+pextraval;
  355:                 }
  356:             }
  357:         }
  358:     } else {
  359:         draw();
  360:     }
  361: }
  362: 
  363: function toggleSecret() {
  364:     var sform=choices.document.forms.sch;
  365:     if (sform.donebutton.length) {
  366:         for (var i=0; i<sform.donebutton.length; i++) {
  367:             if (sform.donebutton[i].checked) {
  368:                 if (sform.donebutton[i].value == '') {
  369:                     if (document.getElementById('donebuttontextdiv')) {
  370:                         document.getElementById('donebuttontextdiv').style.display='none';
  371:                     }
  372:                 } else {
  373:                     if (document.getElementById('donebuttontextdiv')) {
  374:                         document.getElementById('donebuttontextdiv').style.display='block';
  375:                     }
  376:                 }
  377:                 if (sform.donebutton[i].value == '_done_proctor') {
  378:                     if (document.getElementById('done_proctorkey')) {
  379:                         document.getElementById('done_proctorkey').type='text';
  380:                     }
  381:                 } else {
  382:                     if (document.getElementById('done_proctorkey')) {
  383:                         document.getElementById('done_proctorkey').type='hidden';
  384:                         document.getElementById('done_proctorkey').value='';
  385:                     }
  386:                 }
  387:             }
  388:         }
  389:     }
  390: }
  391: 
  392: function validateInterval() {
  393:     var sform=choices.document.forms.sch;
  394:     if (sform.donebutton.length) {
  395:         for (var i=0; i<sform.donebutton.length; i++) {
  396:             if (sform.donebutton[i].checked) {
  397:                 if (sform.donebutton[i].value == '_done_proctor') {
  398:                     if ((sform.donebutton_proctorkey.value == '') || 
  399:                         (sform.donebutton_proctorkey.value == null)) {
  400:                         alert('Please provide a key for a proctor to enter when a student uses the "Done" button.');
  401:                         return;
  402:                     }
  403:                 }
  404:             }
  405:         }
  406:     }
  407:     intcalc();
  408:     assemble();
  409: }
  410: 
  411: function integereval() {
  412:    svalue=choices.document.forms.sch.intval.value;
  413:    svalue=Math.round(svalue);
  414:    if (pscat=='zeropos') { svalue=Math.abs(svalue); }
  415:    if ((pscat=='pos') && (svalue==0)) {
  416:       svalue='';
  417:    }
  418:    if (pscat.indexOf('inrange')!=-1) {
  419:       var rangeparts=new Array;
  420:       rangeparts=split('_',pscat);
  421:       rangeparts=split(',',rangeparts[1]);
  422:       if (svalue<rangeparts[0]) { svalue=rangeparts[0]; }
  423:       if (svalue>rangeparts[1]) { svalue=rangeparts[1]; }
  424:    }
  425:    draw();
  426: }
  427: 
  428: function floateval() {
  429:    svalue=choices.document.forms.sch.floatval.value;
  430:    svalue=1.0*svalue;
  431:    if (pscat=='pos') { svalue=Math.abs(svalue); }
  432:    if ((pscat=='zeroone') && ((svalue<0) || (svalue>1))) {
  433:       svalue='';
  434:    }
  435:    draw();
  436: }
  437: 
  438: function stringeval() {
  439:    svalue=choices.document.forms.sch.stringval.value;
  440:    draw();
  441: }
  442: 
  443: function ipstringeval() {
  444:     var patternIp = /^([\[\]a-zA-Z\.\d\*\-]+)$/;
  445:     var acctypes = new Array;
  446:     acctypes = ['allow','deny'];
  447:     svalue = '';
  448:     for (var i=0; i<acctypes.length; i++) {
  449:         var items = choices.document.getElementsByName('setip'+acctypes[i]);
  450:         if (items.length) {
  451:             for (var j=0; j<items.length; j++) {
  452:                 if (items[j].type == "text") {
  453:                     var possip = items[j].value
  454:                     possip = possip.replace(/^\s+|\s+$/g,'');
  455:                     if (patternIp.test(possip)) {
  456:                         if (acctypes[i] == 'deny') {
  457:                             possip = '!'+possip;
  458:                         }
  459:                         if (svalue == '') {
  460:                             svalue = possip;
  461:                         } else {
  462:                             svalue += ','+possip;
  463:                         }
  464:                     }
  465:                 }
  466:             }
  467:         }
  468:     }
  469:     draw();
  470: }
  471: 
  472: function addIpRule(iptype) {
  473:     var frame = window.frames["choices"];
  474:     if (frame.document.getElementById('LC_string_ipacc_inner_'+iptype)) {
  475:         var innerDiv = frame.document.getElementById('LC_string_ipacc_inner_'+iptype);
  476:         var count = innerDiv.childNodes.length 
  477:         var ipDiv = frame.document.createElement('div');
  478:         ipDiv.innerHTML = '<input type="text" size="10" name="setip'+iptype+'" onblur="parent.ipstringeval();" />'+
  479:                           '<a href="#" onclick="parent.removeIpRule(\''+iptype+'\',\''+count+'\')">Remove</a>';
  480:         frame.document.getElementById('LC_string_ipacc_inner_'+iptype).appendChild(ipDiv);
  481:     }
  482:     return false;
  483: }
  484: 
  485: function removeIpRule(iptype,num) {
  486:     var frame = window.frames["choices"];
  487:     if (frame.document.getElementById('LC_string_ipacc_inner_'+iptype)) {
  488:         var innerDiv = frame.document.getElementById('LC_string_ipacc_inner_'+iptype);
  489:         for (var i=0; i<innerDiv.childNodes.length; i++) {
  490:             if (i==num) {
  491:                 innerDiv.removeChild(innerDiv.childNodes[i]);
  492:                 ipstringeval();
  493:                 break;
  494:             }
  495:         }
  496:     }
  497: }
  498: 
  499: function radiostringeval(newval) {
  500:    svalue=newval;
  501:    draw();
  502: }
  503: 
  504: function callradiostringeval(newval) {
  505:     return 'onclick="parent.radiostringeval(\''+newval+'\')"';
  506: }
  507: 
  508: function lenienteval(newval) {
  509:     if (newval == 'weighted') {
  510:         if (document.getElementById('lenientweighteddiv')) {
  511:             document.getElementById('lenientweighteddiv').style.display='block';
  512:         }
  513:         var patternRelWeight = /^\-?[\d.]+$/;
  514:         var sform=choices.document.forms.sch; 
  515:         if ((sform.lenientrelwt.length != 'undefined')  && (sform.lenientrelwt.length) != 'null') {
  516:             for (var i=0; i<sform.lenientrelwt.length; i++) {
  517:                 var relweight = sform.lenientrelwt[i].value;
  518:                 relweight = relweight.replace(/^\s+|\s+$/g,'');
  519:                 if (!patternRelWeight.test(relweight)) {
  520:                     if (i<2) {
  521:                         relweight = '1.0';
  522:                     } else {
  523:                         relweight = '0.0';
  524:                     }
  525:                 }
  526:                 sform.lenientrelwt[i].value = relweight;
  527:                 if (i==0) {
  528:                     svalue = relweight;
  529:                 } else {
  530:                     svalue += ','+relweight;
  531:                 }
  532:             }
  533:         }
  534:     } else {
  535:         if (document.getElementById('lenientweighteddiv')) {
  536:             document.getElementById('lenientweighteddiv').style.display='none';
  537:         }
  538:         svalue=newval;
  539:     }
  540:     draw();
  541: }
  542: 
  543: function calllenientradioeval(newval) {
  544:     return 'onclick="parent.lenienteval(\''+newval+'\')"';
  545: }
  546: 
  547: function callintervalpmodval() {
  548:     return 'onclick="parent.intcalc();parent.toggleSecret()"';
  549: } 
  550: 
  551: function intervaldis() {
  552:     csecs=svalue;
  553:     cdays=Math.floor(csecs/86400);
  554:     csecs-=cdays*86400;
  555:     chours=Math.floor(csecs/3600);
  556:     csecs-=chours*3600;
  557:     cmins=Math.floor(csecs/60);
  558:     csecs-=cmins*60;
  559:     return cdays+' days '+chours+' hours '+cmins+' mins '+csecs+' secs';
  560: }
  561: 
  562: function pickcolor(picked) {
  563:   svalue=picked;
  564:   draw();
  565: }
  566: 
  567: function colorfield(ir,ig,ib) {
  568:    var col=new Array;
  569:    col=["00","11","22","44","66","88","AA","CC","DD","EE","FF"];
  570:    var color='#'+col[ir]+col[ig]+col[ib];
  571:    var selection="<font color='"+color+"'>X</font>";
  572:    if (color==svalue) { selection="<font color='#"+col[10-ir]+col[10-ig]+col[10-ib]+"'>X</font>"; }
  573:    choicewrite('<td bgcolor="'+color+'"><a href="javascript:parent.pickcolor('+"'"+
  574:                color+"'"+')">'+selection+'</a></td>');
  575:                
  576: }    
  577: 
  578: function draw() {
  579:    choicestart();
  580:    choicewrite('<form name="sch"');
  581:    if (ptype=='int') {
  582:       choicewrite(' action="javascript:integereval();"');
  583:    }
  584:    if (ptype=='float') {
  585:       choicewrite(' action="javascript:floateval();"');
  586:    }
  587:    if (ptype=='string') {
  588:       if (pscat == 'ip') {
  589:           choicewrite(' action="javascript:ipstringeval();"');
  590:       } else {
  591:           choicewrite(' action="javascript:stringeval();"');
  592:       }
  593:    }
  594:    if (ptype != 'int' && ptype != 'float' && ptype != 'string') {
  595:        choicewrite(' action=""');
  596:    }
  597:    choicewrite('>');
  598:    if (ptype=='tolerance') {
  599: // 0: pscat
  600:       if (pscat=='default') {
  601:          tablestart('Use default value or algorithm of resource');
  602:       }
  603:       if (pscat=='relative_sym') {
  604: // 2: percentage
  605: // 3: open
  606:          tablestart('Percentage error, symmetric around value');
  607:          valline('Percentage',2,3);
  608:          if ((svalue!='') && (typeof(svalue)!="undefined")) {
  609:             choices.document.forms.sch.val2.value=parseInt(svalue);
  610:             if (svalue.indexOf('+')!=-1) {
  611:                choices.document.forms.sch.val3.checked=true;
  612:             }
  613:          }
  614:       }
  615:       if (pscat=='relative') {
  616: // 2: left
  617: // 3: open
  618: // 4: right
  619: // 5: open
  620:          tablestart('Percentage error, asymmetric around value');
  621:          valline('Upper percentage',2,3);
  622:          valline('Lower percentage',4,5);
  623:          var range1=new Array;
  624:          if ((svalue!='') && (typeof(svalue)!="undefined")) {
  625:             range1=svalue.split(',');
  626:             if (typeof(range1[1])=='undefined') { range1[1]=range1[0]; }
  627:             choices.document.forms.sch.val2.value=parseFloat(range1[0]);
  628:             if (range1[0].indexOf('+')!=-1) {
  629:                choices.document.forms.sch.val3.checked=true;
  630:             }
  631:             choices.document.forms.sch.val4.value=parseFloat(range1[1]);
  632:             if (range1[1].indexOf('+')!=-1) {
  633:                choices.document.forms.sch.val5.checked=true;
  634:             }
  635:          }
  636:       }
  637:       if (pscat=='absolute_sym') {
  638:          tablestart('Absolute error, symmetric around value');
  639:          valline('Value',2,3);
  640:          if ((svalue!='') && (typeof(svalue)!="undefined")) {
  641:             choices.document.forms.sch.val2.value=parseFloat(svalue);
  642:             if (svalue.indexOf('+')!=-1) {
  643:                choices.document.forms.sch.val3.checked=true;
  644:             }
  645:          }
  646:       }
  647:       if (pscat=='absolute') {
  648:          tablestart('Absolute error, asymmetric around value');
  649:          valline('Upper value',2,3);
  650:          valline('Lower value',4,5);
  651:          var range2=new Array;
  652:          if ((svalue!='') && (typeof(svalue)!="undefined")) {
  653:             range=svalue.split(',');
  654:             if (typeof(range2[1])=='undefined') { range2[1]=range2[0]; }
  655:             choices.document.forms.sch.val2.value=parseFloat(range2[0]);
  656:             if (range2[0].indexOf('+')!=-1) {
  657:                choices.document.forms.sch.val3.checked=true;
  658:             }
  659:             choices.document.forms.sch.val4.value=parseFloat(range2[1]);
  660:             if (range2[1].indexOf('+')!=-1) {
  661:                choices.document.forms.sch.val5.checked=true;
  662:             }
  663:          }
  664:       }
  665:    }
  666: 
  667:    if (ptype=='date') {
  668:      if (pscat=='default') {
  669:          tablestart('Default value or none');
  670:          choicewrite('</table>');
  671:      } else {
  672:       if (pscat=='start') {
  673:          tablestart('Date and time');
  674:       }
  675:       if (pscat=='end') {
  676:          tablestart('Date and time');
  677:       }
  678:       if (pscat=='interval') {
  679:          var proctorkeytype = 'hidden'; 
  680:          var donebuttontext = 'none';
  681:          if (pmodval == '_done_proctor') {
  682:              proctorkeytype = 'text';
  683:              donebuttontext = 'block';
  684:          }
  685:          if (pmodval == '_done') {
  686:              donebuttontext = 'block';
  687:          }
  688:          tablestart('Time interval');
  689:          choicewrite( [
  690:             '<tr><td colspan="3">'+intervaldis()+'</td></tr>',
  691:             '<tr><td>Time:</td><td colspan="2">',
  692:                 '<span style="white-space:nowrap">'+intday()+' days </span>',
  693:                 '<span style="white-space:nowrap">'+inthour()+' hours</span>',
  694:                 '<span style="white-space:nowrap">'+intminute()+' mins</span>',
  695:                 '<span style="white-space:nowrap">'+intsecond()+' secs</span>',
  696:             '</td></tr>',
  697:             '</table>',
  698:             '<br />',
  699:             ].join("\n"));
  700:          tablestart('Provide a "Done" button to students?');
  701:          choicewrite('<tr><td>Value:</td><td colspan="2">');
  702:          choicewrite('<label><input name="donebutton" value=""'+
  703:                      ' type="radio" '+callintervalpmodval());
  704:          if (pmodval == '') { choicewrite(' checked="checked"'); }
  705:          choicewrite(' /> No</label><br />');
  706:          choicewrite('<label><input name="donebutton" value="_done"'+
  707:                      ' type="radio" '+callintervalpmodval());
  708:          if (pmodval == '_done') { choicewrite(' checked="checked"'); }
  709:          choicewrite(' /> Yes</label><br />');
  710:          choicewrite('<span style="white-space:nowrap">'+
  711:                      '<label><input name="donebutton" value="_done_proctor"'+
  712:                      ' type="radio" '+callintervalpmodval());
  713:          if (pmodval == '_done_proctor') { choicewrite(' checked="checked"'); }
  714:          choicewrite(' /> Yes, with proctor key</label>');
  715:          choicewrite('&nbsp;<input name="donebutton_proctorkey" value='+
  716:                      '"'+escapeHTML(pextraval)+'" type="'+proctorkeytype+
  717:                      '" id="done_proctorkey" size="10"'+
  718:                      ' onblur="parent.intcalc();" /></span><br />'+
  719:                      '<div id="donebuttontextdiv" style="display:'+donebuttontext+'">'+
  720:                      '<br /><span style="white-space:nowrap">'+
  721:                      'Button text:'+
  722:                      '<input name="donebutton_text" value='+
  723:                      '"'+escapeHTML(pextravaltwo)+'" type="text" '+
  724:                      'size="10" onblur="parent.intcalc();" /></span></div>');
  725:          choicewrite('</td></tr></table>');
  726:       } else {
  727:          choicewrite('<tr><td colspan="3">'
  728:          +cdate.toString()+
  729:          '</td></tr><tr><td>Date:</td><td colspan="2">');
  730:          month();date();year();
  731:          choicewrite('</td></tr><tr><td>Time:'
  732:          +'</td><td colspan="2">');hour();choicewrite('h ');minute();
  733:          choicewrite('m ');second();
  734:          choicewrite('s</td></tr></table>');
  735:       }
  736:      }
  737:    }
  738: 
  739:    if (ptype=='int') {
  740:       var pscatparts=new Array;
  741:       pscatparts=pscat.split(',');
  742:       pscat=pscatparts[0];
  743:       if (pscat=='default') {
  744:          tablestart('Default value or none');
  745:          choicewrite('</table>');
  746:       } else {
  747:        if (pscat=='range') {
  748:          tablestart('Integer range');      
  749:          choicewrite('<tr><td>Lower Value:'+
  750:               '</td><td colspan="2"><input type="text" size="4" name="val2'+
  751:               '" /></td></tr>');
  752:          choicewrite('<tr><td>Upper Value:'+
  753:               '</td><td colspan="2"><input type="text" size="4" name="val4'+
  754:               '" /></td></tr></table>');
  755:          var range=new Array;
  756:          if ((svalue!='') && (typeof(svalue)!="undefined")) {
  757:             range=svalue.split(',');
  758:             if (typeof(range[1])=='undefined') { range[1]=range[0]; }
  759:             choices.document.forms.sch.val2.value=parseInt(range[0]);
  760:             choices.document.forms.sch.val4.value=parseInt(range[1]);
  761:          }
  762:        } else {
  763:         if (pscat=='pos') {
  764:            tablestart('Positive (non-zero) integer');
  765:         }
  766:         if (pscat=='zeropos') {
  767:            tablestart('Positive integer or zero');
  768:         }
  769:         if (pscat.indexOf('inrange')!=-1) {
  770:            var rangeparts=new Array;
  771:            rangeparts=split(',',pscat);
  772:            tablestart('Integer in the range ['+rangeparts[1]+']');
  773:         }
  774:         if (pscat=='any') {
  775:            tablestart('Integer');
  776:         }
  777:         choicewrite('<tr><td>Value:</td><td colspan="2">');
  778:         choicewrite('<input name="intval" size="10" value="'+escapeHTML(svalue)+
  779:                     '" onchange="parent.integereval()" />');
  780:         choicewrite('</td></tr></table>');
  781:       }
  782:      }
  783:    }
  784: 
  785:    if (ptype=='float') {
  786:       if (pscat=='default') {
  787:          tablestart('Default value or none');
  788:          choicewrite('</table>');         
  789:       } else {
  790:         if (pscat=='pos') {
  791:            tablestart('Positive floating point number or zero');
  792:         }
  793:         if (pscat=='zeroone') {
  794:            tablestart('Floating point number between zero and one');
  795:         }
  796:         if (pscat=='any') {
  797:            tablestart('Floating point number');
  798:         }
  799:         choicewrite('<tr><td>Value:</td><td colspan="2">');
  800:         choicewrite('<input name="floatval" size="10" value="'+escapeHTML(svalue)+
  801:                     '" onchange="parent.floateval()" />');
  802:         choicewrite('</td></tr></table>');
  803:       }
  804:    }
  805: 
  806:    if (ptype=='string') {
  807:         if ((pscat=='any') || (pscat=='') || (pscat=='default') ||  
  808:             (typeof(pscat)=='undefined')) {
  809:            tablestart('Text');
  810:            choicewrite('<tr><td>Value:</td><td colspan="2">');
  811:            choicewrite('<input name="stringval" size="20" value="'+escapeHTML(svalue)+
  812:                     '" type="text" onchange="parent.stringeval()" />');
  813:         }
  814:         if (pscat=='yesno') {
  815:            tablestart('Yes/No');
  816: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
  817:            choicewrite('<label><input name="stringval" value="yes"'+
  818:                   ' type="radio" '+callradiostringeval('yes'));
  819:            if (svalue=='yes') { choicewrite(' checked="checked"'); }
  820:            choicewrite(' /> Yes</label><br />');
  821:            choicewrite('<label><input name="stringval" value="no"'+
  822:                   ' type="radio" '+callradiostringeval('no'));
  823:            if (svalue=='no') { choicewrite(' checked="checked"'); }
  824:            choicewrite(' /> No</label><br />');
  825:         }
  826:         if (pscat=='problemstatus') {
  827:            tablestart('Problem Status');
  828: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
  829:            choicewrite('<label><input name="stringval" value="yes"'+
  830:                   ' type="radio" '+callradiostringeval('yes'));
  831:            if (svalue=='yes') { choicewrite(' checked="checked"'); }
  832:            choicewrite(' /> Yes</label><br />');
  833:            choicewrite('<label><input name="stringval" value="answer"'+
  834:                   ' type="radio" '+callradiostringeval('answer'));
  835:            if (svalue=='answer') { choicewrite(' checked="checked"'); }
  836:            choicewrite(' /> Yes, and show correct answer if they exceed the maximum number of tries.</label><br />');
  837:            choicewrite('<label><input name="stringval" value="no"'+
  838:                   ' type="radio" '+callradiostringeval('no'));
  839:            if (svalue=='no') { choicewrite(' checked="checked"'); }
  840:            choicewrite(' /> No, don\'t show correct/incorrect feedback.</label><br />');
  841:            choicewrite('<label><input name="stringval" value="no_feedback_ever"'+
  842:                   ' type="radio" '+callradiostringeval('no_feedback_ever'));
  843:            if (svalue=='no_feedback_ever') { choicewrite(' checked="checked"'); }
  844:            choicewrite(' /> No, show no feedback at all.</label><br />');
  845:         }
  846:         if (pscat=='examtype') {
  847:            tablestart('Exam Type');
  848: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
  849:            choicewrite('<label><input name="stringval" value="online"'+
  850:                 ' type="radio" '+callradiostringeval('online'));
  851:            if (svalue=='online') { choicewrite(' checked="checked"'); }
  852:            choicewrite(' /> Online</label><br />');
  853:            choicewrite('<label><input name="stringval" value="checkout"'+
  854:               ' type="radio" '+callradiostringeval('checkout'));
  855:            if (svalue=='checkout') { choicewrite(' checked="checked"'); }
  856:            choicewrite(' /> Check out</label><br />');
  857:        }
  858:         if (pscat=='questiontype') {
  859:            tablestart('Question Type');
  860: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
  861:            choicewrite('<label><input name="stringval" value="problem"'+
  862:                ' type="radio" '+callradiostringeval('problem'));
  863:            if (svalue=='problem') { choicewrite(' checked="checked"'); }
  864:            choicewrite(' /> Standard Problem</label><br />');
  865: //	   choicewrite('<label><input name="stringval" value="quiz"'+
  866: //                ' type="radio" '+callradiostringeval('quiz'));
  867: //         if (svalue=='quiz') { choicewrite(' checked="checked"'); }
  868: //         choicewrite(' /> Quiz</label><br />');
  869:            choicewrite('<label><input name="stringval" value="practice"'+
  870:                   ' type="radio" '+callradiostringeval('practice'));
  871:            if (svalue=='practice') { choicewrite(' checked="checked"'); }
  872:            choicewrite(' /> Practice</label><br />');
  873:            choicewrite('<label><input name="stringval" value="exam"'+
  874:                   ' type="radio" '+callradiostringeval('exam'));
  875:            if (svalue=='exam') { choicewrite(' checked="checked"'); }
  876:            choicewrite(' /> Bubblesheet Exam</label><br />');
  877: //         choicewrite('<label><input name="stringval" value="assess"'+
  878: //              ' type="radio" '+callradiostringeval('assess'));
  879: //         if (svalue=='assess') { choicewrite(' checked="checked"'); }
  880: //         choicewrite(' /> Assessment</label><br />');
  881:            choicewrite('<label><input name="stringval" value="survey"'+
  882:                 ' type="radio" '+callradiostringeval('survey'));
  883:            if (svalue=='survey') { choicewrite(' checked="checked"'); }
  884:            choicewrite(' /> Survey</label><br />');
  885: //         choicewrite('<label><input name="stringval" value="form"'+
  886: //                ' type="radio" '+callradiostringeval('form'));
  887: //         if (svalue=='form') { choicewrite(' checked="checked"'); }
  888: //         choicewrite('> Input Form</label><br />');
  889:            choicewrite('<label><input name="stringval" value="surveycred"'+
  890:                 ' type="radio" '+callradiostringeval('surveycred'));
  891:            if (svalue=='surveycred') { choicewrite(' checked="checked"'); }
  892:            choicewrite('> Survey (credit for submission)</label><br />');
  893:            choicewrite('<label><input name="stringval" value="anonsurvey"'+
  894:                 ' type="radio" '+callradiostringeval('anonsurvey'));
  895:            if (svalue=='anonsurvey') { choicewrite(' checked="checked"'); }
  896:            choicewrite('> Anonymous Survey</label><br />');
  897:            choicewrite('<label><input name="stringval" value="anonsurveycred"'+
  898:                 ' type="radio" '+callradiostringeval('anonsurveycred'));
  899:            if (svalue=='anonsurveycred') { choicewrite(' checked="checked"'); }
  900:            choicewrite('> Anonymous Survey (credit for submission)</label><br />');
  901:            choicewrite('<label><input name="stringval" value="randomizetry"'+
  902:                 ' type="radio" '+callradiostringeval('randomizetry'));
  903:            if (svalue=='randomizetry') { choicewrite(' checked="checked"'); }
  904:            choicewrite('> New Randomization Each N Tries (default N=1)</label><br />');
  905:            choicewrite('<label><input name="stringval" value="library"'+
  906:                ' type="radio" '+callradiostringeval('library'));
  907:            if (svalue=='library') { choicewrite(' checked="checked"'); }
  908:            choicewrite(' /> Library</label><br />');
  909:         }
  910:         if (pscat=='lenient') {
  911:            var patternLenientStd = /^(yes|no|default)$/;
  912:            var patternLenientRel = /^([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)$/;
  913:            var lenientweighted = 'none';
  914:            var relatives = new Array;
  915:            tablestart('Lenient Grading (Partial Credit)');
  916:            choicewrite('<tr><td>Value:</td><td colspan="2">');
  917:            choicewrite('<label><input name="stringval" value="yes"'+
  918:                   ' type="radio" '+calllenientradioeval('yes'));
  919:            if (svalue=='yes') { choicewrite(' checked="checked"'); }
  920:            choicewrite(' /> Yes</label><br />');
  921:            choicewrite('<label><input name="stringval" value="no"'+
  922:                   ' type="radio" '+calllenientradioeval('no'));
  923:            if (svalue=='no') { choicewrite(' checked="checked"'); }
  924:            choicewrite(' /> No</label><br />');
  925:            choicewrite('<label><input name="stringval" value="default"'+
  926:                ' type="radio" '+calllenientradioeval('default'));
  927:            if (svalue=='default') { choicewrite(' checked="checked"'); }
  928:            choicewrite(' /> Default (only bubblesheet grading is lenient)</label><br />');
  929:            choicewrite('<label><input name="stringval" value="weighted"'+
  930:                ' type="radio" '+calllenientradioeval('weighted'));
  931:            if (!patternLenientStd.test(svalue) && svalue != '') {
  932:               choicewrite(' checked="checked"');
  933:               lenientweighted='block';
  934:               var relatives = svalue.match(patternLenientRel);
  935:            }
  936:            choicewrite(' />Yes, weighted (optionresponse in checkbox mode)</label><br /><br />'+
  937:                        '<div id="lenientweighteddiv" style="display:'+lenientweighted+'">'+
  938:                        '<table class="LC_parmsel_table"><tr bgcolor="#C5DB99">'+
  939:                        '<th colspan="2">Foil submission status</th><th>Points</th></tr>');
  940:            var lenienttypes = ['Correct (checked)','Correct (unchecked)','Incorrect (checked)','Incorrect (unchecked)'];
  941:            for (var i=0; i<lenienttypes.length; i++) {
  942:                var j = i+1;
  943:                if (relatives[j] == '') {
  944:                    if (i < 2) {
  945:                        relatives[j] = '1.0';
  946:                    } else {
  947:                        relatives[j] = '0.0';
  948:                    }
  949:                }
  950:                choicewrite('<tr><td colspan="2">'+lenienttypes[i]+'</td>'+
  951:                            '<td><input type="text" name="lenientrelwt" value="'+relatives[j]+'"'+
  952:                            ' size="3" onblur="parent.lenienteval(\'weighted\')" /></td></tr>');
  953:            }
  954:            choicewrite('</table></div>');
  955:         }
  956:         if (pscat=='discussvote') {
  957:            tablestart('Discussion Voting');
  958:            choicewrite('<tr><td>Value:</td><td colspan="2">');
  959:            choicewrite('<label><input name="stringval" value="yes"'+
  960:                   ' type="radio" '+callradiostringeval('yes'));
  961:            if (svalue=='yes') { choicewrite(' checked="checked"'); }
  962:            choicewrite(' /> Yes</label><br />');
  963:            choicewrite('<label><input name="stringval" value="notended"'+
  964:                   ' type="radio" '+callradiostringeval('notended'));
  965:            if (svalue=='notended') { choicewrite(' checked="checked"'); }
  966:            choicewrite(' /> Yes, unless discussion ended</label><br />');
  967:            choicewrite('<label><input name="stringval" value="no"'+
  968:                   ' type="radio" '+callradiostringeval('no'));
  969:            if (svalue=='no') { choicewrite(' checked="checked"'); }
  970:            choicewrite(' /> No</label><br />');
  971:         }
  972:         if (pscat=='ip') {
  973:             var currallow = new Array; 
  974:             var currdeny = new Array;
  975:             if ((svalue != '') && (svalue != null)) {
  976:                 var patternComma = /,/;
  977:                 var patternAllow = /^([\[\]a-zA-Z\.\d\*\-]+)$/;
  978:                 var patternDeny = /^\!([\[\]a-zA-Z\.\d\*\-]+)$/;
  979:                 var current = new Array;
  980:                 if (patternComma.test(svalue)) {  
  981:                     current = svalue.split(',');
  982:                 } else {
  983:                     current = (svalue);
  984:                 }
  985:                 for (var i=0; i<current.length; i++) {
  986:                     if (patternDeny.test(current[i])) {
  987:                         var denied = current[i].replace(/^!/,'');
  988:                         currdeny.push(denied);
  989:                     } else {
  990:                         if (patternAllow.test(current[i])) {
  991:                             currallow.push(current[i]);
  992:                         } 
  993:                     }
  994:                 }
  995:             }
  996:             if (currdeny.length == 0) {
  997:                 currdeny = ('');
  998:             }
  999:             if (currallow.length == 0) {
 1000:                 currallow = ('');
 1001:             }
 1002:             var curripaccess = [currallow,currdeny];
 1003:             tablestart('IP Number/Name');
 1004:             choicewrite('<tr><th>Allow from</th><th>Deny from</th></tr><tr>');
 1005:             var acctypes = ['allow','deny'];
 1006:             for (var i=0; i<acctypes.length; i++) {
 1007:                 choicewrite('<td valign="top">'+
 1008:                             '<div class="LC_string_ipacc_wrap" id="LC_string_ipacc_'+acctypes[i]+'">'+
 1009:                             '<div class="LC_string_ipacc_inner" id="LC_string_ipacc_inner_'+acctypes[i]+'">');
 1010:                 var num=0;
 1011:                 for (var j=0; j<curripaccess[i].length; j++) {
 1012:                     choicewrite('<div><input type="text" size="10" name="setip'+acctypes[i]+'" value="'+curripaccess[i][j]+'" onblur="parent.ipstringeval();" />');
 1013:                     if (num > 0) {
 1014:                         choicewrite('<a href="#" onclick="parent.removeIpRule(\''+acctypes[i]+'\',\''+j+'\')">Remove</a>');
 1015:                     }
 1016:                     choicewrite('</div>');
 1017:                     num ++;
 1018:                 }
 1019:                 choicewrite('</div><button onclick="parent.addIpRule(\''+acctypes[i]+'\');">Add more</button>');
 1020:             }
 1021:             choicewrite('</div></td></tr></table>');
 1022:         }
 1023:         if (pscat=='fileext') {
 1024:             tablestart('Allowed File Extensions');
 1025: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
 1026:            choicewrite('<label><input name="radstringval" value="txt"'+
 1027:                ' type="radio" '+callradiostringeval('txt'));
 1028:            if (svalue=='txt') { choicewrite(' checked="checked"'); }
 1029:            choicewrite(' /> Plain Text</label><br />');
 1030:            choicewrite('<label><input name="radstringval" value="png,jpg,jpeg,gif"'+
 1031:                ' type="radio" '+callradiostringeval('png,jpg,jpeg,gif'));
 1032:            if (svalue=='png,jpg,jpeg,gif') { choicewrite(' checked="checked"'); }
 1033:            choicewrite(' /> Picture File</label><br />');
 1034:            choicewrite('<label><input name="radstringval" value="doc,docx,xls,xlsx,ppt,pptx"'+
 1035:                ' type="radio" '+callradiostringeval('doc,docx,xls,xlsx,ppt,pptx'));
 1036:            if (svalue=='doc,docx,xls,xlsx,ppt,pptx') { choicewrite(' checked="checked"'); }
 1037:            if (svalue=='doc,xls,ppt') { choicewrite(' checked="checked"'); }
 1038:            choicewrite(' /> Office Document</label><br />');
 1039:            choicewrite('<input name="stringval" size="20" value="'+escapeHTML(svalue)+
 1040:                     '" onchange="parent.stringeval()" />');
 1041:        }
 1042:        if (pscat=='useslots') {
 1043:            tablestart('Slots control access');
 1044: 	   choicewrite('<tr><td>Value:</td><td colspan="2">');
 1045:            choicewrite('<label><input name="stringval" value="no"'+
 1046:                   ' type="radio" '+callradiostringeval('no'));
 1047:            if (svalue=='no') { choicewrite(' checked="checked"'); }
 1048:            choicewrite(' /> No</label><br />');
 1049:            choicewrite('<label><input name="stringval" value="resource"'+
 1050:                   ' type="radio" '+callradiostringeval('resource'));
 1051:            if (svalue=='resource') { choicewrite(' checked="checked"'); }
 1052:            choicewrite(' /> Yes, and the scope of student selected slot is a single resource.</label><br />');
 1053:            choicewrite('<label><input name="stringval" value="map"'+
 1054:                   ' type="radio" '+callradiostringeval('map'));
 1055:            if (svalue=='map') { choicewrite(' checked="checked"'); }
 1056:            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 />');
 1057:            choicewrite('<label><input name="stringval" value="map_map"'+
 1058:                   ' type="radio" '+callradiostringeval('map_map'));
 1059:            if (svalue=='map_map') { choicewrite(' checked="checked"'); }
 1060:            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 />');
 1061:         choicewrite('</td></tr></table>');
 1062:       }
 1063:    }
 1064:    
 1065:    if (ptype=='color') {
 1066:       tablestart('Choose a Color');
 1067:       choicewrite('<table>');
 1068:       if (svalue) {
 1069:          choicewrite('<tr><td colspan="9">Current choice:</td><td bgcolor="'+
 1070:                      escapeHTML(svalue)+'" colspan="2">&nbsp;</td></tr>');
 1071:       }
 1072:       for (var ir=0; ir<=10; ir++) {
 1073:           for (var ig=0; ig<=10; ig++) {
 1074:               choicewrite('<tr>');
 1075:               for (var ib=0; ib<=10; ib++) {
 1076:                   colorfield(ir,ig,ib);
 1077: 	      }
 1078:               choicewrite('</tr>');
 1079: 	  }	      
 1080:       }
 1081:       choicewrite('</table></td></table>');
 1082:    }
 1083: 
 1084:    choicewrite('</form>');
 1085:    choiceend();
 1086: }
 1087: 
 1088: function sopt(va,text) {
 1089:    selwrite('<option value="'+va+'"');
 1090:    if (va==pscat) {
 1091:      selwrite(' selected="selected"');
 1092:    }
 1093:    selwrite('>'+text+'</option>');
 1094: }
 1095: 
 1096: function catchange() {
 1097:    var sform=selector.document.forms.fsel.fcat;
 1098:    pscat=sform.options[sform.selectedIndex].value;
 1099:    draw();
 1100: }
 1101: 
 1102: function assemble() {
 1103:     if ((ptype=='date') && (pscat!='interval')) {
 1104:         svalue=Math.floor(cdate.getTime()/1000);
 1105:     }
 1106:     if (ptype=='tolerance') {
 1107:        if (pscat=='relative_sym') {
 1108:           svalue=choices.document.forms.sch.val2.value+'%';
 1109:           if (choices.document.forms.sch.val3.checked) {
 1110:              svalue+='+';
 1111:           }
 1112:        }
 1113:        if (pscat=='absolute_sym') {
 1114:           svalue=choices.document.forms.sch.val2.value;
 1115:           if (choices.document.forms.sch.val3.checked) {
 1116:              svalue+='+';
 1117:           }
 1118:        }
 1119:        if (pscat=='absolute') {
 1120:           svalue=choices.document.forms.sch.val2.value;
 1121:           if (choices.document.forms.sch.val3.checked) {
 1122:              svalue+='+';
 1123:           }
 1124:           svalue+=','+choices.document.forms.sch.val4.value;
 1125:           if (choices.document.forms.sch.val5.checked) {
 1126:              svalue+='+';
 1127:           }
 1128:        }
 1129:        if (pscat=='relative') {
 1130:           svalue=choices.document.forms.sch.val2.value+'%';
 1131:           if (choices.document.forms.sch.val3.checked) {
 1132:              svalue+='+';
 1133:           }
 1134:           svalue+=','+choices.document.forms.sch.val4.value+'%';
 1135:           if (choices.document.forms.sch.val5.checked) {
 1136:              svalue+='+';
 1137:           }
 1138:        }
 1139:     }
 1140:     if ((ptype=='int') && (pscat=='range')) {
 1141:           svalue=choices.document.forms.sch.val2.value+','+
 1142:                  choices.document.forms.sch.val4.value;
 1143:     }
 1144:     if (pscat=='default') { svalue=''; }
 1145:     stype=ptype+'_'+pscat;
 1146: }
 1147: 
 1148: 
 1149: function init() {
 1150:   var i;
 1151:   var subs=new Array();
 1152:   var doneRegExp = /_done(|\:[^\:]+\:)/;
 1153:   var doneproctorRegExp = /_done(|\:[^\:]+\:)_proctor/;
 1154:   var proctorkeyRegExp = /^(\d+)_(.+)$/;
 1155:   var donetextRegExp = /\:([^\:]+)\:/;
 1156:   var namevalue=this.window.location.search.split('&');
 1157:   namevalue[0]=namevalue[0].substr(1,namevalue[0].length-1);
 1158: 
 1159:   for (i=0;i<namevalue.length;i++) {
 1160:      var pair=namevalue[i].split('=');
 1161:      pair[1]=unescape(pair[1]);
 1162:      if (pair[0]=='value') { pvalue=pair[1]; }
 1163:      if (pair[0]=='type') { subs=pair[1].split('_');
 1164:                             ptype=subs[0];
 1165:                             pscat=subs[1];
 1166:                             if (typeof(subs[2])!="undefined") { 
 1167:                                pscat+='_'+subs[2]; 
 1168:                             }
 1169:                             if ((pscat=='') || (typeof(pscat)=="undefined")) { 
 1170:                                pscat='default';
 1171:                             }
 1172:                            }
 1173:      if (pair[0]=='return') { preturn=pair[1]; }
 1174:      if (pair[0]=='call') { pcode=pair[1]; }
 1175:      if (pair[0]=='marker') { pmarker=pair[1]; }
 1176:      if (pair[0]=='name') { pname=pair[1]; }
 1177:      if (pair[0]=='modal') { pmodal=pair[1]; }
 1178:      if (pair[0]=='defhour' && pair[1] >= 0 && pair[1] < 24 ) {
 1179:          defhour=pair[1];
 1180:      }
 1181:      if (pair[0]=='defmin' && pair[1] >= 0 && pair[1] < 60) { defmin=pair[1]; }
 1182:      if (pair[0]=='defsec' && pair[1] >= 0 && pair[1] < 60) { defsec=pair[1]; }
 1183:   }
 1184: 
 1185:   if (ptype=='date' && pscat == 'interval') {
 1186:       if (doneproctorRegExp.test(pvalue)) {
 1187:           var current = pvalue.match(doneproctorRegExp);
 1188:           if (current.length == 2) {
 1189:               var textstr = current[1];
 1190:               if (textstr != '') {
 1191:                   var textvals = textstr.match(donetextRegExp);
 1192:                   if (textvals.length == 2) {
 1193:                       pextravaltwo = textvals[1];
 1194:                   }
 1195:               }
 1196:           }
 1197:           var intervalwithkey = pvalue.replace(doneproctorRegExp,'');
 1198:           if (proctorkeyRegExp.test(intervalwithkey)) {
 1199:               var currvals = intervalwithkey.match(proctorkeyRegExp);
 1200:               if (currvals.length == 3) {
 1201:                   pvalue = currvals[1];
 1202:                   pextraval = currvals[2];
 1203:                   pmodval = '_done_proctor';
 1204:               } else {
 1205:                   pmodval = '';
 1206:               }
 1207:           }
 1208:       } else {
 1209:           if (doneRegExp.test(pvalue)) {
 1210:               var current = pvalue.match(doneRegExp); 
 1211:               if (current.length == 2) {
 1212:                   var textstr = current[1];
 1213:                   if (textstr != '') {
 1214:                       var textvals = textstr.match(donetextRegExp);
 1215:                       if (textvals.length == 2) {
 1216:                           pextravaltwo = textvals[1];
 1217:                       }
 1218:                   }
 1219:               }
 1220:               var pnumval = pvalue.replace(doneRegExp,'');
 1221:               pmodval = '_done';
 1222:               pvalue = pnumval;
 1223:           }
 1224:       }
 1225:   }
 1226:   svalue=pvalue;
 1227:   if (((ptype=='float') || (ptype=='string') || (ptype=='int')) &&
 1228:       (pscat=='default') && 
 1229:       (typeof(svalue)!="undefined") && 
 1230:       (svalue!=0) && (svalue!='')) { pscat='any'; }
 1231: 
 1232:   if (ptype=='tolerance') {
 1233:      var tperc=0;
 1234:      var trange=0;
 1235:      if (typeof(svalue)!='undefined') {
 1236:         if (svalue.indexOf('%')!=-1) { tperc=1;  }
 1237:         if (svalue.indexOf(',')!=-1) { trange=1; }
 1238:         if (trange) {
 1239:            if (tperc) { pscat='relative'; } else { pscat='absolute'; }
 1240:         } else {
 1241:            if (tperc) { pscat='relative_sym'; } else { pscat='absolute_sym'; }
 1242:         }
 1243:      }
 1244:   }
 1245: 
 1246:   this.window.selector.document.open();
 1247:   selwrite('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
 1248:   selwrite('<html xmlns="http://www.w3.org/1999/xhtml">');
 1249:   selwrite('<head>');
 1250:   selwrite('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />');
 1251:   selwrite('<title>LON-CAPA</title>');
 1252:   selwrite('<style type="text/css">');
 1253:   selwrite('<!--');
 1254:   selwrite('body {');
 1255:   selwrite('font-family: Verdana,Arial,Helvetica,sans-serif;');
 1256:   selwrite('line-height:130%;');
 1257:   selwrite('font-size:0.83em;');
 1258:   selwrite('background: #FFFFFF;');
 1259:   selwrite('}');
 1260:   selwrite('-->');
 1261:   selwrite('</style>');
 1262:   selwrite('</head>');
 1263:   selwrite('<body>');
 1264:   selwrite('<form name="fsel" action=""><b>'+pname+'</b><br />');
 1265:   selwrite('Format of Value(s): <select name="fcat" onchange="parent.catchange();">');
 1266: 
 1267:   if (ptype=='tolerance') {
 1268:      sopt('default','Default');
 1269:      sopt('relative_sym','Relative Tolerance, Symmetric (percent)');
 1270:      sopt('relative','Relative Tolerance (percentages)');
 1271:      sopt('absolute_sym','Absolute Tolerance, Symmetric (value)');
 1272:      sopt('absolute','Absolute Tolerance (values)');
 1273:   }
 1274: 
 1275:   if (ptype=='date') {
 1276:      if (pscat != 'interval') {
 1277:          sopt('default','Default');
 1278: 	 sopt('start','Starting Date');
 1279: 	 sopt('end','Ending Date');
 1280:      } else {
 1281:          sopt('interval','Time Interval');
 1282:      }
 1283: 
 1284:      if ((pvalue!='') && (typeof(pvalue)!="undefined")) {
 1285:         cdate.setTime(pvalue*1000);
 1286:      } else {        
 1287:         cdate.setSeconds(defsec);
 1288:         cdate.setMinutes(defmin);
 1289:         cdate.setHours(defhour);
 1290:      }
 1291:  
 1292:      months[0]='January';
 1293:      months[1]='February';
 1294:      months[2]='March';
 1295:      months[3]='April';
 1296:      months[4]='May';
 1297:      months[5]='June';
 1298:      months[6]='July';
 1299:      months[7]='August';
 1300:      months[8]='September';
 1301:      months[9]='October';
 1302:      months[10]='November';
 1303:      months[11]='December';
 1304:   }
 1305:    
 1306:   if (ptype=='int') {
 1307:      sopt('default','Default');
 1308:      sopt('pos','Positive Integer, Not Zero');
 1309:      sopt('zeropos','Positive Integer or Zero');
 1310:      sopt('inrange','Integer in Range');
 1311:      sopt('range','Range of Integers');
 1312:      sopt('any','Integer');
 1313:   }
 1314: 
 1315:   if (ptype=='float') {
 1316:      sopt('default','Default');
 1317:      sopt('zeroone','Floating Point between 0 and 1');
 1318:      sopt('pos','Positive Floating Point');
 1319:      sopt('any','Floating Point');
 1320: 
 1321:   }
 1322: 
 1323:   if (ptype=='string') {
 1324:      //sopt('default','Default');
 1325:      if (pscat == 'yesno')        { sopt('yesno','Yes/No'); }
 1326:      else if (pscat == 'problemstatus'){ sopt('problemstatus','Problem Status'); }
 1327:      else if (pscat == 'examtype')     { sopt('examtype','Exam Type'); }
 1328:      else if (pscat == 'questiontype') { sopt('questiontype','Question Type'); }
 1329:      else if (pscat == 'lenient')      { sopt('lenient','Lenient Grading (Partial Credit)'); }
 1330:      else if (pscat == 'discussvote')  { sopt('discussvote','Discussion Voting'); }
 1331:      else if (pscat == 'ip')           { sopt('ip','IP Number/Name'); }
 1332:      else if (pscat == 'fileext')      { sopt('fileext','File Extension'); }
 1333:      else if (pscat == 'useslots')     { sopt('useslots','Slots control access'); }
 1334:      else { pscat = 'any'; }
 1335:      sopt('any','String Value');
 1336:   }
 1337: 
 1338:   if (ptype=='color') {
 1339:      sopt('default','Use Default Color');
 1340:      sopt('custom','Use Custom Color');
 1341:   }
 1342: 
 1343:   selwrite('</select></form>');
 1344:   var targ='parent.opener';
 1345:   if (pmodal==1) {
 1346:      targ='parent.parent';
 1347:   }
 1348:   if ((ptype=='date') && (pscat=='interval')) {
 1349:       selwrite('<a href="javascript:parent.validateInterval();');
 1350:   } else {
 1351:       selwrite('<a href="javascript:parent.assemble();');
 1352:   }
 1353:   if (preturn!='') {
 1354:      selwrite(targ+'.document.'+preturn+'_value.value=parent.window.svalue;');
 1355:      selwrite(targ+'.document.'+preturn+'_type.value=parent.window.stype;');
 1356:   }
 1357:   if (pmarker!='') {
 1358:      selwrite(targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;');
 1359:   }
 1360:   if (pcode!='') {
 1361:      selwrite(targ+'.'+pcode+'();');
 1362:   }
 1363:   selwrite('">Save</a>&nbsp;&nbsp;');
 1364: 
 1365:   selwrite('<a href="javascript:');
 1366:   selwrite(targ+'.document.'+preturn+'_value.value='+"'';");
 1367:   if (pmarker!='') {
 1368:      selwrite(
 1369:      targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;');
 1370:   }
 1371:   if (pcode!='') {
 1372:      selwrite(targ+'.'+pcode+'();');
 1373:   }
 1374:   selwrite('">Delete</a>&nbsp;&nbsp;');
 1375:  
 1376:   selwrite('</body></html>');
 1377:   this.window.selector.document.close();
 1378:   draw();
 1379:   
 1380: }
 1381: 
 1382: // ]]>
 1383: </script>
 1384: </head>
 1385: 
 1386: <frameset rows="120,*" onload="init();">
 1387: <frame name="selector" src="empty.html" />
 1388: <frame name="choices" src="empty.html" />
 1389: </frameset>
 1390: 
 1391: 
 1392: 
 1393: </html>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>