File:  [LON-CAPA] / rat / client / parameter.html
Revision 1.71.2.2: download - view: text, annotated - select for diffs
Sat Mar 2 16:25:56 2019 UTC (5 years, 2 months ago) by raeburn
Branches: version_2_11_2_uiuc
Diff to branchpoint 1.71: preferred, colored
- For 2.11.2 (modified)
  Use 2.12 feature: deny from specified IPs/Hosts as well as existing allow
  from for (a) slots with IP access control, (b) Client IP/Name (acc) param.

  Domain's configuration must be set to prohibit hosting of sessions for
  for user's domains outside own domain, and modification must be in place
  on all nodes in domain.

  lonparmset.pm: 1.548 (part), 1.549 (part), 1.551, 1.589, 1.590, 1.591
  loncommon.pm: 1.1219 (part)
  parameter.html: 1.73, 1.74, 1.75
  newslot.helper 1.34

<!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.71.2.2 2019/03/02 16:25:56 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 pmarker='';
var pmodal='';
var pname='';

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 provide a key for a proctor to enter when a student uses the "Done" button.');
                        return;
                    }
                }
            }
        }
    }
    intcalc();
    assemble();
}

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 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(' /> Exam</label><br />');
//         choicewrite('<label><input name="stringval" value="assess"'+
//              ' type="radio" '+callradiostringeval('assess'));
//         if (svalue=='assess') { choicewrite(' checked="checked"'); }
//         choicewrite(' /> Assessment</label><br />');
           choicewrite('<label><input name="stringval" value="survey"'+
                ' type="radio" '+callradiostringeval('survey'));
           if (svalue=='survey') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Survey</label><br />');
//         choicewrite('<label><input name="stringval" value="form"'+
//                ' type="radio" '+callradiostringeval('form'));
//         if (svalue=='form') { choicewrite(' checked="checked"'); }
//         choicewrite('> Input Form</label><br />');
           choicewrite('<label><input name="stringval" value="surveycred"'+
                ' type="radio" '+callradiostringeval('surveycred'));
           if (svalue=='surveycred') { choicewrite(' checked="checked"'); }
           choicewrite('> Survey (credit for submission)</label><br />');
           choicewrite('<label><input name="stringval" value="anonsurvey"'+
                ' type="radio" '+callradiostringeval('anonsurvey'));
           if (svalue=='anonsurvey') { choicewrite(' checked="checked"'); }
           choicewrite('> Anonymous Survey</label><br />');
           choicewrite('<label><input name="stringval" value="anonsurveycred"'+
                ' type="radio" '+callradiostringeval('anonsurveycred'));
           if (svalue=='anonsurveycred') { choicewrite(' checked="checked"'); }
           choicewrite('> Anonymous Survey (credit for submission)</label><br />');
           choicewrite('<label><input name="stringval" value="randomizetry"'+
                ' type="radio" '+callradiostringeval('randomizetry'));
           if (svalue=='randomizetry') { choicewrite(' checked="checked"'); }
           choicewrite('> New Randomization Each N Tries (default N=1)</label><br />');
           choicewrite('<label><input name="stringval" value="library"'+
               ' type="radio" '+callradiostringeval('library'));
           if (svalue=='library') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Library</label><br />');
        }
        if (pscat=='lenient') {
           tablestart('Lenient Grading (Partial Credit)');
           choicewrite('<tr><td>Value:</td><td colspan="2">');
           choicewrite('<label><input name="stringval" value="yes"'+
                  ' type="radio" '+callradiostringeval('yes'));
           if (svalue=='yes') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes</label><br />');
           choicewrite('<label><input name="stringval" value="no"'+
                  ' type="radio" '+callradiostringeval('no'));
           if (svalue=='no') { choicewrite(' checked="checked"'); }
           choicewrite(' /> No</label><br />');
           choicewrite('<label><input name="stringval" value="default"'+
               ' type="radio" '+callradiostringeval('default'));
           if (svalue=='default') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Default (only bubblesheet grading is lenient)</label><br />');
        }
        if (pscat=='discussvote') {
           tablestart('Discussion Voting');
           choicewrite('<tr><td>Value:</td><td colspan="2">');
           choicewrite('<label><input name="stringval" value="yes"'+
                  ' type="radio" '+callradiostringeval('yes'));
           if (svalue=='yes') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes</label><br />');
           choicewrite('<label><input name="stringval" value="notended"'+
                  ' type="radio" '+callradiostringeval('notended'));
           if (svalue=='notended') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes, unless discussion ended</label><br />');
           choicewrite('<label><input name="stringval" value="no"'+
                  ' type="radio" '+callradiostringeval('no'));
           if (svalue=='no') { choicewrite(' checked="checked"'); }
           choicewrite(' /> No</label><br />');
        }
        if (pscat=='ip') {
            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 student selected slot is a single resource.</label><br />');
           choicewrite('<label><input name="stringval" value="map"'+
                  ' type="radio" '+callradiostringeval('map'));
           if (svalue=='map') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes, and the scope of student selected slot is the enclosing map/folder. When checking in, it applies to only one resource.</label><br />');
           choicewrite('<label><input name="stringval" value="map_map"'+
                  ' type="radio" '+callradiostringeval('map_map'));
           if (svalue=='map_map') { choicewrite(' checked="checked"'); }
           choicewrite(' /> Yes, and the scope of student selected slot is the enclosing map/folder. When checking in, all resources in the map/folder are checked in.</label><br />');
        choicewrite('</td></tr></table>');
      }
   }
   
   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 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 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 (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 { pscat = 'any'; }
     sopt('any','String Value');
  }

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

  selwrite('</select></form>');
  var targ='parent.opener';
  if (pmodal==1) {
     targ='parent.parent';
  }
  if ((ptype=='date') && (pscat=='interval')) {
      selwrite('<a href="javascript:parent.validateInterval();');
  } else {
      selwrite('<a href="javascript:parent.assemble();');
  }
  if (preturn!='') {
     selwrite(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();
  draw();
  
}

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

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



</html>

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