File:  [LON-CAPA] / rat / client / parameter.html
Revision 1.85: download - view: text, annotated - select for diffs
Wed Dec 23 21:20:36 2020 UTC (3 years, 4 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
- Bug 6907
  Initial values for rows in selector frame either 100 or 60 instead of the
  default 125, depending on whether level is for folder or not, when deeplink
  parameter set via popup (to accommodate size of table in choices frame).

<!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.85 2020/12/23 21:20:36 raeburn Exp $
//
// Copyright Michigan State University Board of Trustees
//
// This file is part of the LearningOnline Network with CAPA (LON-CAPA).
//
// LON-CAPA is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// LON-CAPA is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LON-CAPA; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// /home/httpd/html/adm/gpl.txt
//
// http://www.lon-capa.org/
//
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>LON-CAPA</title>

<script type="text/javascript">
// <![CDATA[

var ptype='';
var pvalue='';
var pmodval='';
var pextraval='';
var pextravaltwo='';
var preturn='';
var pcode='';
var pscat='';
var psmap='';
var pmarker='';
var pmodal='';
var pname='';
var precursive='';
var pnonreccol='';
var pmarkerst='';
var pparm='';
var pextra='';

var defhour=0;
var defmin=0;
var defsec=0;

var svalue;
var stype;
var smarker;

var vars=new Array();

var cdate=new Date();

var csec;
var cmin;
var chour;
var cday;

var months=new Array();


function selwrite(text) {
  this.window.selector.document.write(text);
}

function choicestart() {
  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() {
  choicewrite('</body></html>');
  this.window.choices.document.close();
}

function choicewrite(text) {
  this.window.choices.document.write(text);
}

function tablestart(headtext) {
  choicewrite('<table class="LC_parmsel_table"><tr bgcolor="#C5DB99"><th colspan="3">'+
              headtext+'</th></tr>');
}

function valline(text,id1,id2) {
  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, '&amp;');
  text = text.replace(/"/g, '&quot;');
  text = text.replace(/</g, '&lt;');
  text = text.replace(/>/g, '&gt;');
  return text;
}

function datecalc() {
    var sform=choices.document.forms.sch;

    cdate.setHours(sform.hours.options[sform.hours.selectedIndex].value);
    cdate.setMinutes(sform.minutes.options[sform.minutes.selectedIndex].value);
    cdate.setSeconds(sform.minutes.options[sform.seconds.selectedIndex].value);
    cdate.setDate(sform.date.options[sform.date.selectedIndex].value);
    cdate.setMonth(sform.month.options[sform.month.selectedIndex].value);
    cdate.setFullYear(sform.year.options[sform.year.selectedIndex].value);

    draw();
}

function hour() {
   var thishour=cdate.getHours();
    var i; var j;
    choicewrite('<select name="hours" onchange="parent.datecalc();">');
    for (i=0;i<=23;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thishour) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>');
        if (i==12) { choicewrite('noon'); } else {
           if (i==0) { choicewrite('midnight') } else {
              
                 if (i<12) { choicewrite(i+' am'); } else {
                    j=i-12; choicewrite(j+' pm');
                 }
              
           }
        }
        choicewrite('</option>');
    }
    choicewrite('</select>');
}

function minute() {
   var thisminutes=cdate.getMinutes();
    var i;
    choicewrite('<select name="minutes" onchange="parent.datecalc();">');
    for (i=0;i<=59;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thisminutes) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>'+i+'</option>');
    }
    choicewrite('</select>');
} 

function second() {
   var thisseconds=cdate.getSeconds();
    var i;
    choicewrite('<select name="seconds" onchange="parent.datecalc();">');
    for (i=0;i<=59;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thisseconds) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>'+i+'</option>');
    }
    choicewrite('</select>');
}


function date() {
   var thisdate=cdate.getDate();
    var i;
    choicewrite('<select name="date" onchange="parent.datecalc();">');
    for (i=1;i<=31;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thisdate) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>'+i+'</option>');
    }
    choicewrite('</select>');
}

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();">');
    for (i=loweryear;i<=upperyear;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thisyear) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>'+i+'</option>');
    }
    choicewrite('</select>');
}

function month() {
    var thismonth=cdate.getMonth();
    var i;
    choicewrite('<select name="month" onchange="parent.datecalc();">');
    for (i=0;i<=11;i++) {
        choicewrite('<option value="'+i+'"');
        if (i==thismonth) {
            choicewrite(' selected="selected"');
        }
        choicewrite('>'+months[i]+'</option>');
    }
    choicewrite('</select>');
}


function intminute() {
   var thisminutes=cmins;
    var i;
    var result = '';
    result += '<select name="minutes" onchange="parent.intcalc();">';
    for (i=0;i<=59;i++) {
        result += '<option value="'+i+'"';
        if (i==thisminutes) {
            result += ' selected="selected"';
        }
        result += '>'+i+'</option>';
    }
    result += '</select>';
    return result;
} 

function inthour() {
   var thishours=chours;
    var i;
    var result = '';
    result += '<select name="hours" onchange="parent.intcalc();">';
    for (i=0;i<=23;i++) {
        result += '<option value="'+i+'"';
        if (i==thishours) {
            result += ' selected="selected"';
        }
        result += '>'+i+'</option>';
    }
    result += '</select>';
    return result;
}

function intsecond() {
    var thisseconds=csecs;
    var i;
    var result = '';
    result += '<select name="seconds" onchange="parent.intcalc();">';
    for (i=0;i<=59;i++) {
        result += '<option value="'+i+'"';
        if (i==thisseconds) {
            result += ' selected="selected"';
        }
        result += '>'+i+'</option>';
    }
    result += '</select>';
    return result;
} 


function intday() {
   var thisdate=cdays;
    var i;
    var result ='';
    result += '<select name="date" onchange="parent.intcalc();">';
    for (i=0;i<=31;i++) {
        result += '<option value="'+i+'"';
        if (i==thisdate) {
            result += ' selected="selected"';
        }
        result += '>'+i+'</option>';
    }
    result += '</select>';
    return result;
}

function intcalc() {
    var sform=choices.document.forms.sch;
    svalue=((sform.date.options[sform.date.selectedIndex].value*24+
             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;
    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 enter a key for a proctor to enter when a student uses the "Done" button.');
                        return;
                    }
                }
            }
        }
    }
    intcalc();
    assemble();
}

function validateDeepLink() {
    var sform=choices.document.forms.sch;
    svalue = sform.deeplinklisted.options[sform.deeplinklisted.selectedIndex].value+',';
    svalue += sform.deeplinkacc.options[sform.deeplinkacc.selectedIndex].value+',';
    var keyRegExp = /^[a-zA-Z\d_.!@#$%^&*()+=-]+$/;
    var numRegExp = /^\d+$/;
    if (sform.deeplinktypes.length) {
        for (var i=0; i<sform.deeplinktypes.length; i++) {
            if (sform.deeplinktypes[i].checked) {
                svalue += sform.deeplinktypes[i].value;
                if (sform.deeplinktypes[i].value == 'key') {
                    var posskey = sform.deeplinkkey.value;
                    posskey = posskey.replace(/^\s+|\s+$/g,'');
                    if (keyRegExp.test(posskey)) {
                        svalue += ':'+posskey;
                    } else {
                        alert('Please enter a value for the key containing one or more of: a-zA-Z0-9_.!@#$%^&*()+=-\n'+
                              'or choose a different supported link type.');
                        return; 
                    }
                } else if (sform.deeplinktypes[i].value == 'lti') {
                    var posslti = sform.linkposslti.options[sform.linkposslti.selectedIndex].value;
                    if ((numRegExp.test(posslti)) && (posslti > 0)) {
                        svalue += ':'+posslti;
                    } else {
                        alert('Please select an LTI launcher, or choose a different supported link type.');
                        return;
                    }
                }
                break;
            }
        }
    }
    svalue += ',';
    if (sform.deeplinkmenus.length) {
        for (var i=0; i<sform.deeplinkmenus.length; i++) {
            if (sform.deeplinkmenus[i].checked) {
                if (sform.deeplinkmenus[i].value == 'std') {
                    svalue += '0';
                } else if (sform.deeplinkmenus[i].value == 'collnum') {
                    var posscoll = sform.linkpossmenu.options[sform.linkpossmenu.selectedIndex].value;
                    if ((numRegExp.test(posscoll)) && (posscoll > 0)) { 
                        svalue += posscoll;
                    } else {
                        alert("Please select either a numbered collection or check 'Standard (all menus)'.");
                        return;
                    }
                }
                break;
            }
        }
    }
    assemble();
}

function toggleDeepLink(caller) {
    var sform=choices.document.forms.sch;
    if ((caller == 'types') && (sform.deeplinktypes.length)) {
        var frame = window.frames["choices"];
        for (var i=0; i<sform.deeplinktypes.length; i++) {
            if (sform.deeplinktypes[i].checked) {
                if (sform.deeplinktypes[i].value == 'key') {
                    if (frame.document.getElementById('deeplinkkey')) {
                        frame.document.getElementById('deeplinkkey').type='text';
                    }
                    if (frame.document.getElementById('deeplinkltidiv')) {
                        frame.document.getElementById('deeplinkltidiv').style.display='none';
                    }
                } else {
                    if (frame.document.getElementById('deeplinkkey')) {
                        frame.document.getElementById('deeplinkkey').type='hidden';
                    }
                    if (frame.document.getElementById('deeplinkltidiv')) {
                        if (sform.deeplinktypes[i].value == 'lti') {
                            frame.document.getElementById('deeplinkltidiv').style.display='block';
                        } else {
                            frame.document.getElementById('deeplinkltidiv').style.display='none';
                        }
                    }
                }
                break;
            }
        }
    }
    if ((caller == 'menus') && (sform.deeplinkmenus.length)) {
        var frame = window.frames["choices"];
        for (var i=0; i<sform.deeplinkmenus.length; i++) {
            if (sform.deeplinkmenus[i].checked) {
                if (frame.document.getElementById('deeplinkmenusdiv')) {
                    if (sform.deeplinkmenus[i].value == 'collnum') {
                        frame.document.getElementById('deeplinkmenusdiv').style.display='inline-block';
                    } else {
                        frame.document.getElementById('deeplinkmenusdiv').style.display='none';
                    }
                }
                break;
            }
        }
    }
}

function calldeeplink(caller) {
    return 'onclick="parent.toggleDeepLink(\''+caller+'\')"';
}

function integereval() {
   svalue=choices.document.forms.sch.intval.value;
   svalue=Math.round(svalue);
   if (pscat=='zeropos') { svalue=Math.abs(svalue); }
   if ((pscat=='pos') && (svalue==0)) {
      svalue='';
   }
   if (pscat.indexOf('inrange')!=-1) {
      var rangeparts=new Array;
      rangeparts=split('_',pscat);
      rangeparts=split(',',rangeparts[1]);
      if (svalue<rangeparts[0]) { svalue=rangeparts[0]; }
      if (svalue>rangeparts[1]) { svalue=rangeparts[1]; }
   }
   draw();
}

function floateval() {
   svalue=choices.document.forms.sch.floatval.value;
   svalue=1.0*svalue;
   if (pscat=='pos') { svalue=Math.abs(svalue); }
   if ((pscat=='zeroone') && ((svalue<0) || (svalue>1))) {
      svalue='';
   }
   draw();
}

function stringeval() {
   svalue=choices.document.forms.sch.stringval.value;
   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 lenienteval(newval) {
    if (newval == 'weighted') {
        if (document.getElementById('lenientweighteddiv')) {
            document.getElementById('lenientweighteddiv').style.display='block';
        }
        var patternRelWeight = /^\-?[\d.]+$/;
        var sform=choices.document.forms.sch;
        if ((sform.lenientrelwt.length != 'undefined')  && (sform.lenientrelwt.length) != 'null') {
            for (var i=0; i<sform.lenientrelwt.length; i++) {
                var relweight = sform.lenientrelwt[i].value;
                relweight = relweight.replace(/^\s+|\s+$/g,'');
                if (!patternRelWeight.test(relweight)) {
                    if (i<2) {
                        relweight = '1.0';
                    } else {
                        relweight = '0.0';
                    }
                }
                sform.lenientrelwt[i].value = relweight;
                if (i==0) {
                    svalue = relweight;
                } else {
                    svalue += ','+relweight;
                }
            }
        }
    } else {
        if (document.getElementById('lenientweighteddiv')) {
            document.getElementById('lenientweighteddiv').style.display='none';
        }
        svalue=newval;
    }
    draw();
}

function calllenientradioeval(newval) {
    return 'onclick="parent.lenienteval(\''+newval+'\')"';
}

function callintervalpmodval() {
    return 'onclick="parent.intcalc();parent.toggleSecret()"';
}

function intervaldis() {
    csecs=svalue;
    cdays=Math.floor(csecs/86400);
    csecs-=cdays*86400;
    chours=Math.floor(csecs/3600);
    csecs-=chours*3600;
    cmins=Math.floor(csecs/60);
    csecs-=cmins*60;
    return cdays+' days '+chours+' hours '+cmins+' mins '+csecs+' secs';
}

function pickcolor(picked) {
  svalue=picked;
  draw();
}

function colorfield(ir,ig,ib) {
   var col=new Array;
   col=["00","11","22","44","66","88","AA","CC","DD","EE","FF"];
   var color='#'+col[ir]+col[ig]+col[ib];
   var selection="<font color='"+color+"'>X</font>";
   if (color==svalue) { selection="<font color='#"+col[10-ir]+col[10-ig]+col[10-ib]+"'>X</font>"; }
   choicewrite('<td bgcolor="'+color+'"><a href="javascript:parent.pickcolor('+"'"+
               color+"'"+')">'+selection+'</a></td>');
}

function draw() {
   choicestart();
   choicewrite('<form name="sch"');
   if (ptype=='int') {
      choicewrite(' action="javascript:integereval();"');
   }
   if (ptype=='float') {
      choicewrite(' action="javascript:floateval();"');
   }
   if (ptype=='string') {
      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') {
// 0: pscat
      if (pscat=='default') {
         tablestart('Use default value or algorithm of resource');
      }
      if (pscat=='relative_sym') {
// 2: percentage
// 3: open
         tablestart('Percentage error, symmetric around value');
         valline('Percentage',2,3);
         if ((svalue!='') && (typeof(svalue)!="undefined")) {
            choices.document.forms.sch.val2.value=parseInt(svalue);
            if (svalue.indexOf('+')!=-1) {
               choices.document.forms.sch.val3.checked=true;
            }
         }
      }
      if (pscat=='relative') {
// 2: left
// 3: open
// 4: right
// 5: open
         tablestart('Percentage error, asymmetric around value');
         valline('Upper percentage',2,3);
         valline('Lower percentage',4,5);
         var range1=new Array;
         if ((svalue!='') && (typeof(svalue)!="undefined")) {
            range1=svalue.split(',');
            if (typeof(range1[1])=='undefined') { range1[1]=range1[0]; }
            choices.document.forms.sch.val2.value=parseFloat(range1[0]);
            if (range1[0].indexOf('+')!=-1) {
               choices.document.forms.sch.val3.checked=true;
            }
            choices.document.forms.sch.val4.value=parseFloat(range1[1]);
            if (range1[1].indexOf('+')!=-1) {
               choices.document.forms.sch.val5.checked=true;
            }
         }
      }
      if (pscat=='absolute_sym') {
         tablestart('Absolute error, symmetric around value');
         valline('Value',2,3);
         if ((svalue!='') && (typeof(svalue)!="undefined")) {
            choices.document.forms.sch.val2.value=parseFloat(svalue);
            if (svalue.indexOf('+')!=-1) {
               choices.document.forms.sch.val3.checked=true;
            }
         }
      }
      if (pscat=='absolute') {
         tablestart('Absolute error, asymmetric around value');
         valline('Upper value',2,3);
         valline('Lower value',4,5);
         var range2=new Array;
         if ((svalue!='') && (typeof(svalue)!="undefined")) {
            range=svalue.split(',');
            if (typeof(range2[1])=='undefined') { range2[1]=range2[0]; }
            choices.document.forms.sch.val2.value=parseFloat(range2[0]);
            if (range2[0].indexOf('+')!=-1) {
               choices.document.forms.sch.val3.checked=true;
            }
            choices.document.forms.sch.val4.value=parseFloat(range2[1]);
            if (range2[1].indexOf('+')!=-1) {
               choices.document.forms.sch.val5.checked=true;
            }
         }
      }
   }

   if (ptype=='date') {
     if (pscat=='default') {
         tablestart('Default value or none');
         choicewrite('</table>');
     } else {
      if (pscat=='start') {
         tablestart('Date and time');
      }
      if (pscat=='end') {
         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><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('&nbsp;<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><td>Date:</td><td colspan="2">');
         month();date();year();
         choicewrite('</td></tr><tr><td>Time:'
         +'</td><td colspan="2">');hour();choicewrite('h ');minute();
         choicewrite('m ');second();
         choicewrite('s</td></tr></table>');
      }
     }
   }

   if (ptype=='int') {
      var pscatparts=new Array;
      pscatparts=pscat.split(',');
      pscat=pscatparts[0];
      if (pscat=='default') {
         tablestart('Default value or none');
         choicewrite('</table>');
      } else {
       if (pscat=='range') {
         tablestart('Integer range');      
         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(',');
            if (typeof(range[1])=='undefined') { range[1]=range[0]; }
            choices.document.forms.sch.val2.value=parseInt(range[0]);
            choices.document.forms.sch.val4.value=parseInt(range[1]);
         }
       } else {
        if (pscat=='pos') {
           tablestart('Positive (non-zero) integer');
        }
        if (pscat=='zeropos') {
           tablestart('Positive integer or zero');
        }
        if (pscat.indexOf('inrange')!=-1) {
           var rangeparts=new Array;
           rangeparts=split(',',pscat);
           tablestart('Integer in the range ['+rangeparts[1]+']');
        }
        if (pscat=='any') {
           tablestart('Integer');
        }
        choicewrite('<tr><td>Value:</td><td colspan="2">');
        choicewrite('<input name="intval" size="10" value="'+escapeHTML(svalue)+
                    '" onchange="parent.integereval()" />');
        choicewrite('</td></tr></table>');
      }
     }
   }

   if (ptype=='float') {
      if (pscat=='default') {
         tablestart('Default value or none');
         choicewrite('</table>');
      } else {
        if (pscat=='pos') {
           tablestart('Positive floating point number or zero');
        }
        if (pscat=='zeroone') {
           tablestart('Floating point number between zero and one');
        }
        if (pscat=='any') {
           tablestart('Floating point number');
        }
        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=='any') || (pscat=='') || (pscat=='default') || 
            (typeof(pscat)=='undefined')) {
           tablestart('Text');
           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><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><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><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(' /> Bubblesheet 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') {
           var patternLenientStd = /^(yes|no|default)$/;
           var patternLenientRel = /^([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)\,([\-\d\.]+)$/;
           var lenientweighted = 'none';
           var relatives = new Array;
           tablestart('Lenient Grading (Partial Credit)');
           choicewrite('<tr><td>Value:</td><td colspan="2">');
           choicewrite('<label><input name="stringval" value="yes"'+
                  ' type="radio" '+calllenientradioeval('yes'));
           if (svalue=='yes') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes</label><br />');
           choicewrite('<label><input name="stringval" value="no"'+
                  ' type="radio" '+calllenientradioeval('no'));
           if (svalue=='no') { choicewrite(' checked="checked"'); }
           choicewrite(' /> No</label><br />');
           choicewrite('<label><input name="stringval" value="default"'+
               ' type="radio" '+calllenientradioeval('default'));
           if (svalue=='default') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Default (only bubblesheet grading is lenient)</label><br />');
           choicewrite('<label><input name="stringval" value="weighted"'+
               ' type="radio" '+calllenientradioeval('weighted'));
           if (!patternLenientStd.test(svalue) && svalue != '') {
              choicewrite(' checked="checked"');
              lenientweighted='block';
              var relatives = svalue.match(patternLenientRel);
           }
           choicewrite(' />Yes, weighted (optionresponse in checkbox mode)</label><br /><br />'+
                       '<div id="lenientweighteddiv" style="display:'+lenientweighted+'">'+
                       '<table class="LC_parmsel_table"><tr bgcolor="#C5DB99">'+
                       '<th colspan="2">Foil submission status</th><th>Points</th></tr>');
           var lenienttypes = ['Correct (checked)','Correct (unchecked)','Incorrect (checked)','Incorrect (unchecked)'];
           for (var i=0; i<lenienttypes.length; i++) {
               var j = i+1;
               if (relatives[j] == '') {
                   if (i < 2) {
                       relatives[j] = '1.0';
                   } else {
                       relatives[j] = '0.0';
                   }
               }
               choicewrite('<tr><td colspan="2">'+lenienttypes[i]+'</td>'+
                           '<td><input type="text" name="lenientrelwt" value="'+relatives[j]+'"'+
                           ' size="3" onblur="parent.lenienteval(\'weighted\')" /></td></tr>');
           }
           choicewrite('</table></div>');
        }
        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') {
            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><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()" />');
       }
       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 the 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 the 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 the slot is the enclosing map/folder. When checking in, all resources in the map/folder are checked in.</label><br />');
           choicewrite('</td></tr></table>');
       }
       if (pscat=='deeplink') {
           var deeplinkvals = new Array();
           var linktypeparts = new Array();
           var ltikeyRegExp = /^(lti|key):(\w+)$/;
           var dlinkkeysty = 'hidden';
           var dlinkkeyval = '';
           var dlinkltidivsty = 'none';
           var dlinkmenusdivsty = 'none';
           if ((svalue != '') && (svalue != null)) {
               deeplinkvals = svalue.split(',');
               if (ltikeyRegExp.test(deeplinkvals[2])) {
                   linktypeparts = deeplinkvals[2].split(':');
                   deeplinkvals[2] = linktypeparts[0];
                   if (linktypeparts[0] == 'key') {
                       dlinkkeysty = 'text';
                       dlinkkeyval = linktypeparts[1];
                   } else if (linktypeparts[0] == 'lti') {
                       dlinkltidivsty = 'block';
                   }
               }
               if (deeplinkvals[3] >= 1) {
                   dlinkmenusdivsty = 'inline-block';
               }
           } else {
               deeplinkvals = ['full','res','any','0'];
           }
           var deeplinklisting = new Array();
           deeplinklisting = ['full','absent','grades','details','datestatus'];
           var deeplinklisttxt = new Array();
           deeplinklisttxt = ['Listed (linked) in both','Not listed','Listed in grades only','Listed (unlinked) in both','Listed (unlinked) inc. status in both'];
           var deeplinkscopes = new Array();
           deeplinkscopes = ['res','map','rec'];
           var deeplinkscopetxt = new Array();
           deeplinkscopetxt = ['resource only','enclosing map/folder','recursive map/folder'];
           var deeplinkurls = new Array();
           deeplinkurls = ['any','only','key','lti'];
           tablestart('Deep-linked items');
           choicewrite('<tr><td>In Contents + Gradebook?</td><td>');
           choicewrite('<select name="deeplinklisted">');
           for (var i=0; i<deeplinklisting.length; i++) {
               choicewrite('<option value="'+deeplinklisting[i]+'"');
               if (deeplinkvals[0] == deeplinklisting[i]) {
                   choicewrite(' selected="selected"');
               }
               choicewrite('>'+deeplinklisttxt[i]+'</option>');
           }
           choicewrite('</select></td></tr>');
           choicewrite('<tr><td>Access scope via deep-link</td><td>');
           choicewrite('<select name="deeplinkacc">');
           for (var i=0; i<deeplinkscopes.length; i++) {
               choicewrite('<option value="'+deeplinkscopes[i]+'"');
               if (deeplinkvals[1] == deeplinkscopes[i]) {
                   choicewrite(' selected="selected"');
               }
               choicewrite('>'+deeplinkscopetxt[i]+'</option>');
           }
           choicewrite('</select></td></tr>');
           choicewrite('<tr><td>Supported Link Types</td><td>');
           choicewrite('<span style="white-space: nowrap;"><label>');
           choicewrite('<input name="deeplinktypes" value="any"'+
                  ' type="radio" '+calldeeplink('types'));
           if (deeplinkvals[2]=='any') { choicewrite(' checked="checked"'); }
           choicewrite(' /> regular + deep</label></span><br />');
           choicewrite('<span style="white-space: nowrap;"><label>');
           choicewrite('<input name="deeplinktypes" value="only"'+
                  ' type="radio" '+calldeeplink('types'));
           if (deeplinkvals[2]=='only') { choicewrite(' checked="checked"'); }
           choicewrite(' /> deep only</label></span><br />');
           choicewrite('<span style="white-space: nowrap;"><label>');
           choicewrite('<input name="deeplinktypes" value="key"'+
                  ' type="radio" '+calldeeplink('types'));
           if (deeplinkvals[2]=='key') { choicewrite(' checked="checked"'); }
           choicewrite(' /> deep with key</label>');
           choicewrite('<input type="'+dlinkkeysty+'" name="deeplinkkey" id="deeplinkkey" value="'+dlinkkeyval+'" size="10" />');
           choicewrite('</span><br />');

           var possmenus = new Array();
           if ((pextra != '') && (pextra != null)) {
               var ltiRegExp = /^lti_/;
               var menusRegExp = /^menus_/;
               var extras = pextra.split('&');
               for (var i=0; i<extras.length; i++) {
                   if (ltiRegExp.test(extras[i])) {
                       extras[i] = extras[i].replace(ltiRegExp,'');
                       var posslti = extras[i].split(',');
                       if (posslti.length >= 1) {
                           var ltinums = new Array();
                           var ltititles = new Array();
                           for (var j=0; j<posslti.length; j++) {
                               var entries = posslti[j].split(':');
                               ltinums[j] = entries[0];
                               ltititles[j] = decodeURIComponent(entries[1]);
                           }
                           if (ltinums.length) {
                               choicewrite('<span style="white-space: nowrap;"><label>');
                               choicewrite('<input name="deeplinktypes" value="lti"'+
                                           ' type="radio" '+calldeeplink('types'));
                               if (deeplinkvals[2]=='lti') { choicewrite(' checked="checked"'); }
                               choicewrite(' /> deep with LTI launch</label>');
                               choicewrite('<div id="deeplinkltidiv" style="display:'+dlinkltidivsty+'">');
                               choicewrite('<select name="linkposslti">');
                               var sel='';
                               if (deeplinkvals[2]!='lti') {
                                   sel = ' selected="selected"';
                               }
                               if (ltinums.length > 1) {
                                   choicewrite('<option value=""'+sel+'>Select</option>');
                               }
                               for (var j=0; j<ltinums.length; j++) {
                                   sel = '';
                                   if (deeplinkvals[2]=='lti') {
                                       if (linktypeparts.length) {
                                           if (ltinums[j] == linktypeparts[1]) {
                                               sel = ' selected="selected"';
                                           }
                                       }
                                   }
                                   choicewrite('<option value="'+ltinums[j]+'"'+sel+'>'+ltititles[j]+'</option>');
                               }
                               choicewrite('</select></div></span><br />');
                           }
                       }
                   } else if (menusRegExp.test(extras[i])) {
                       extras[i] = extras[i].replace(menusRegExp,'');
                       possmenus = extras[i].split(',');
                   }
               }
           }
           choicewrite('<tr><td>Menu Items Displayed</td><td>');
           choicewrite('<span style="white-space: nowrap;"><label>');
           choicewrite('<input name="deeplinkmenus" value="std"'+
                       ' type="radio" '+calldeeplink('menus'));
           if (deeplinkvals[3] == 0) {
               choicewrite(' checked="checked"');
           }
           choicewrite(' /> Standard (all menus)</label></span><br />');
           if (possmenus.length >= 1) {  
               choicewrite('<span style="white-space: nowrap;"><label>');
               choicewrite('<input name="deeplinkmenus" value="collnum"'+
                           ' type="radio" '+calldeeplink('menus'));
               if (deeplinkvals[3] > 0) { choicewrite(' checked="checked"'); }
               choicewrite(' /> Numbered collection</label>');
               choicewrite('<div id="deeplinkmenusdiv" style="display:'+dlinkmenusdivsty+'">');
               choicewrite('<select name="linkpossmenu">');
               var sel='';
               if (deeplinkvals[3] == 0) {
                   sel = ' selected="selected"';
               }
               if (possmenus.length > 1) {
                   choicewrite('<option value=""'+sel+'>Select</option>');
               }
               for (var i=0; i<possmenus.length; i++) {
                   sel = '';
                   if (deeplinkvals[3] == possmenus[i]) {
                       sel = ' selected="selected"';
                   }
                   choicewrite('<option value="'+possmenus[i]+'"'+sel+'>'+possmenus[i]+'</option>');
               }
               choicewrite('</select></div></span><br />');
           }
           choicewrite('</td></tr></table>');
       }
   }

   if (ptype=='color') {
      tablestart('Choose a Color');
      choicewrite('<table>');
      if (svalue) {
         choicewrite('<tr><td colspan="9">Current choice:</td><td bgcolor="'+
                     escapeHTML(svalue)+'" colspan="2">&nbsp;</td></tr>');
      }
      for (var ir=0; ir<=10; ir++) {
          for (var ig=0; ig<=10; ig++) {
              choicewrite('<tr>');
              for (var ib=0; ib<=10; ib++) {
                  colorfield(ir,ig,ib);
	      }
              choicewrite('</tr>');
	  }
      }
      choicewrite('</table></td></table>');
   }

   choicewrite('</form>');
   choiceend();
}

function sopt(va,text) {
   selwrite('<option value="'+va+'"');
   if (va==pscat) {
     selwrite(' selected="selected"');
   }
   selwrite('>'+text+'</option>');
}

function catchange() {
   var sform=selector.document.forms.fsel.fcat;
   pscat=sform.options[sform.selectedIndex].value;
   draw();
}

function recursechange() {
   var rform=selector.document.forms.frec;
   var count = rform.recurse.length;
   if (count > 0) {
       for (var i=0; i<count; i++) {
           if (rform.recurse[i].checked) {
               var colnum = pnonreccol;
               if (rform.recurse[i].value == 1) {
                   colnum++;
               }
               pmarker = pmarkerst+'_'+pparm+'&'+colnum;
           }
       }
   }
}

function assemble() {
    if ((ptype=='date') && (pscat!='interval')) {
        svalue=Math.floor(cdate.getTime()/1000);
    }
    if (ptype=='tolerance') {
       if (pscat=='relative_sym') {
          svalue=choices.document.forms.sch.val2.value+'%';
          if (choices.document.forms.sch.val3.checked) {
             svalue+='+';
          }
       }
       if (pscat=='absolute_sym') {
          svalue=choices.document.forms.sch.val2.value;
          if (choices.document.forms.sch.val3.checked) {
             svalue+='+';
          }
       }
       if (pscat=='absolute') {
          svalue=choices.document.forms.sch.val2.value;
          if (choices.document.forms.sch.val3.checked) {
             svalue+='+';
          }
          svalue+=','+choices.document.forms.sch.val4.value;
          if (choices.document.forms.sch.val5.checked) {
             svalue+='+';
          }
       }
       if (pscat=='relative') {
          svalue=choices.document.forms.sch.val2.value+'%';
          if (choices.document.forms.sch.val3.checked) {
             svalue+='+';
          }
          svalue+=','+choices.document.forms.sch.val4.value+'%';
          if (choices.document.forms.sch.val5.checked) {
             svalue+='+';
          }
       }
    }
    if ((ptype=='int') && (pscat=='range')) {
          svalue=choices.document.forms.sch.val2.value+','+
                 choices.document.forms.sch.val4.value;
    }
    if (pscat=='default') { svalue=''; }
    stype=ptype+'_'+pscat;
}


function init() {
  var i;
  var subs=new Array();
  var doneRegExp = /_done(|\:[^\:]+\:)/;
  var doneproctorRegExp = /_done(|\:[^\:]+\:)_proctor/;
  var proctorkeyRegExp = /^(\d+)_(.+)$/;
  var donetextRegExp = /\:([^\:]+)\:/;
  var markerRegExp = /^(.+)_([A-Za-z0-9]+)\&(\d+)$/;
  var namevalue=this.window.location.search.split('&');
  namevalue[0]=namevalue[0].substr(1,namevalue[0].length-1);

  for (i=0;i<namevalue.length;i++) {
     var pair=namevalue[i].split('=');
     pair[1]=unescape(pair[1]);
     if (pair[0]=='value') { pvalue=pair[1]; }
     if (pair[0]=='type') { subs=pair[1].split('_');
                            ptype=subs[0];
                            pscat=subs[1];
                            if (typeof(subs[2])!="undefined") {
                               pscat+='_'+subs[2];
                            }
                            if ((pscat=='') || (typeof(pscat)=="undefined")) {
                               pscat='default';
                            }
                           }
     if (pair[0]=='return') { preturn=pair[1]; }
     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 (pair[0]=='extra') { pextra=pair[1]; }
  }

  var tablecol = '';
  var ismap = '';
  if (markerRegExp.test(pmarker)) {
      var markerinfo = pmarker.match(markerRegExp);
      if (markerinfo.length == 4) {
          pmarkerst = markerinfo[1];
          pparm = markerinfo[2];
          tablecol = markerinfo[3];
          if (tablecol == 17 || tablecol == 16) {
              ismap = 1;
              if (tablecol == 17) {
                  precursive = 1;
              }
              pnonreccol = 16;
          } else if (tablecol == 11 || tablecol == 10) {
              ismap = 1;
              if (tablecol == 11) {
                  precursive = 1;
              }
              pnonreccol = 10;
          } else if (tablecol == 7 || tablecol == 6) {
              ismap = 1;
              if (tablecol == 7) {
                  precursive = 1;
              }
              pnonreccol = 6;
          } else if (tablecol == 3 || tablecol == 2) {
              ismap = 1;
              if (tablecol == 3) {
                  precursive = 1;
              }
              pnonreccol = 2;
          }
      }
  }
  psmap = ismap;


  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') &&
      (typeof(svalue)!="undefined") &&
      (svalue!=0) && (svalue!='')) { pscat='any'; }

  if (ptype=='tolerance') {
     var tperc=0;
     var trange=0;
     if (typeof(svalue)!='undefined') {
        if (svalue.indexOf('%')!=-1) { tperc=1;  }
        if (svalue.indexOf(',')!=-1) { trange=1; }
        if (trange) {
           if (tperc) { pscat='relative'; } else { pscat='absolute'; }
        } else {
           if (tperc) { pscat='relative_sym'; } else { pscat='absolute_sym'; }
        }
     }
  }

  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');
     sopt('relative_sym','Relative Tolerance, Symmetric (percent)');
     sopt('relative','Relative Tolerance (percentages)');
     sopt('absolute_sym','Absolute Tolerance, Symmetric (value)');
     sopt('absolute','Absolute Tolerance (values)');
  }

  if (ptype=='date') {
     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';
     months[1]='February';
     months[2]='March';
     months[3]='April';
     months[4]='May';
     months[5]='June';
     months[6]='July';
     months[7]='August';
     months[8]='September';
     months[9]='October';
     months[10]='November';
     months[11]='December';
  }

  if (ptype=='int') {
     sopt('default','Default');
     sopt('pos','Positive Integer, Not Zero');
     sopt('zeropos','Positive Integer or Zero');
     sopt('inrange','Integer in Range');
     sopt('range','Range of Integers');
     sopt('any','Integer');
  }

  if (ptype=='float') {
     sopt('default','Default');
     sopt('zeroone','Floating Point between 0 and 1');
     sopt('pos','Positive Floating Point');
     sopt('any','Floating Point');

  }

  if (ptype=='string') {
     //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 if (pscat == 'deeplink')     { sopt('deeplink','Deep-linked items'); }
     else { pscat = 'any'; }
     if (pscat != 'deeplink') { sopt('any','String Value'); }
  }

  if (ptype=='color') {
     sopt('default','Use Default Color');
     sopt('custom','Use Custom Color');
  }

  selwrite('</select></form>');
  if (ismap == 1) {
      if ((pparm != 'hiddenresource') && (pparm != 'encrypturl')) {
          selwrite('<form name="frec" action="">');
          selwrite('Recursive: <label><input type="radio" name="recurse" value="1" ');
          if (precursive == 1) {
              selwrite('checked="checked" ');
          }
          selwrite('onclick="parent.recursechange();" />Yes</label>&nbsp;&nbsp;');
          selwrite('<label><input type="radio" name="recurse" value="0" ');
          if (precursive != 1) {
              selwrite('checked="checked" ');
          }
          selwrite('onclick="parent.recursechange();" />No</label>');
          selwrite('</form><br />');
      }
  }
  var targ='parent.opener';
  if (pmodal==1) {
     targ='parent.parent';
  }
  if ((ptype=='date') && (pscat=='interval')) {
      selwrite('<a href="javascript:parent.validateInterval();');
  } else if ((ptype=='string') && (pscat=='deeplink')) {
      selwrite('<a href="javascript:parent.validateDeepLink();');
  } else {
      selwrite('<a href="javascript:parent.assemble();');
  }
  if (preturn!='') {
     selwrite(targ+'.document.'+preturn+'_value.value=parent.window.svalue;');
     selwrite(targ+'.document.'+preturn+'_type.value=parent.window.stype;');
  }
  if (pmarker!='') {
     selwrite(targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;');
  }
  if (pcode!='') {
     selwrite(targ+'.'+pcode+'();');
  }
  selwrite('">Save</a>&nbsp;&nbsp;');

  selwrite('<a href="javascript:');
  selwrite(targ+'.document.'+preturn+'_value.value='+"'';");
  if (pmarker!='') {
     selwrite(
     targ+'.document.'+preturn+'_marker.value=parent.window.pmarker;');
  }
  if (pcode!='') {
     selwrite(targ+'.'+pcode+'();');
  }
  selwrite('">Delete</a>&nbsp;&nbsp;');
 
  selwrite('</body></html>');
  this.window.selector.document.close();
  if (pscat == 'deeplink') {
      if (psmap==1) {
          document.getElementById("LCparampopup").rows="100,*";
      } else {  
          document.getElementById("LCparampopup").rows="60,*";
      }
  }
  draw();
 
}

// ]]>
</script>
</head>

<frameset id="LCparampopup" rows="125,*" onload="init();">
<frame name="selector" src="empty.html" />
<frame name="choices" src="empty.html" />
</frameset>



</html>

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