File:  [LON-CAPA] / modules / gci / londocsgci.pm
Revision 1.5: download - view: text, annotated - select for diffs
Sun Dec 20 04:32:03 2009 UTC (14 years, 10 months ago) by gci
Branches: MAIN
CVS tags: HEAD
- Different bins into separate block elements (can toggle show/hide).
- @bins is array of arrays which includes items in bins A through K.
- @mandprobs contans mandatory problems (items in separate block element).
- @optional contains questions without bin (items in separate block element).
- Random pick of two items from development items (numbered 100, 101 and 102 for now      awaiting real pilot questions to be uploaded.
- Show problem titles instead of GCI internal numbers.
- Problems numbered 1 to N in student view.
- Ability to display/edit current course-wide opendate and duedate settings.
- Don't allow editing of contents of Concept Test if there are student submissions.
- Client-side validation of test via (mimimum one item from each bin).

# The LearningOnline Network
# Custom Edit Course Routines for Assembly of Valid Concept Tests from
# Geoscience Concept Inventory. 
#
# $Id: londocsgci.pm,v 1.5 2009/12/20 04:32:03 gci 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/
#


package Apache::londocsgci;

use strict;

use Apache::lonnet;
use Apache::loncommon;
use LONCAPA::map();
use Apache::lonindexer;
use Apache::lonlocal;
use LONCAPA qw(:DEFAULT :match);

{  #scope variables 
 
my $path;
my $version;
my $reqnum;
my @categories;
my @allprobs;
my %probcat;
my %prereqs;
my @defchosen;
my @chosen;
my @mandprobs;
my @bins;
my @optional;
my %mandatory;
my @development;
my %developmentitems;

sub setdefaults {
   $path='/res/gci/gci';
   $version='GCIv2-1-1';
   $reqnum=15;
   @allprobs=('01','02','37','2004_73','03','04','05','06','07',
              '08','10',
              '09',
              '11','12','13','14','15','16','17',
              '18','69',
              '19','20',
              '21','22','23','24','25','26','27','28','29','30',
              '31','32','33','34','35','36','38',
              '39A','39B',
              '40',
              '41','42','43','44','45','46','47','48','49','50',
              '51',
              '52','57',
              '53','54','55','56','58',
              '60',
              '61','62','63','64','65','66','67','68','70',
              '71');
    @bins = ( ['03','04','06'],
              ['07','08','09'],
              ['10','12','13','14','15','16','17'],
              ['18','19','20','21','22','23','24','25'],
              ['26','27','28','30'],
              ['32','33','34','35','36'],
              ['38','39A','39B','40','41','42','43','44','45','46'],
              ['47','48','49','50','51','52','53'],
              ['54','55','56','57','58','60','61','62'],
              ['63','64','65'],
              ['66','67','68','69','70','71']);
    @optional = ('05','11','29','31');

   @categories=('M1','M2','M3','M4',
                'A','B','C','D','E','F','G','H','I','J','K');
   %probcat =('01' => 'M1' ,'02' => 'M2' ,'37' => 'M3' ,'2004_73' => 'M4' ,
              '03' => 'A' ,'04' => 'A','05' => ''  ,'06' => 'A' ,'07' => 'B' ,
              '08' => 'B' ,'09' => 'B' ,'10' => 'C' ,'11' => ''  ,'12' => 'C' ,
              '13' => 'C' ,'14' => 'C' ,'15' => 'C' ,'16' => 'C' ,'17' => 'C' ,'18' => 'D' ,'19' => 'D' ,'20' => 'D' ,
              '21' => 'D' ,'22' => 'D' ,'23' => 'D' ,'24' => 'D' ,'25' => 'D' ,'26' => 'E' ,'27' => 'E' ,'28' => 'E' ,'29' => ''  ,'30' => 'E' ,
              '31' => ''  ,'32' => 'F' ,'33' => 'F' ,'34' => 'F' ,'35' => 'F' ,'36' => 'F' ,'38' => 'G' ,
              '39A'=> 'G' ,'39B'=> 'G' ,
              '40' => 'G' ,
              '41' => 'G' ,'42' => 'G' ,'43' => 'G' ,'44' => 'G' ,'45' => 'G' ,'46' => 'G' ,'47' => 'H' ,'48' => 'H' ,'49' => 'H' ,'50' => 'H' ,
              '51' => 'H' ,'52' => 'H' ,'53' => 'H' ,'54' => 'I' ,'55' => 'I' ,'56' => 'I' ,'57' => 'I' ,'58' => 'I' ,
              '60' => 'I' ,
              '61' => 'I' ,'62' => 'I' ,'63' => 'J' ,'64' => 'J' ,'65' => 'J' ,'66' => 'K' ,'67' => 'K' ,'68' => 'K' ,'69' => 'K' ,'70' => 'K' ,
              '71' => 'K');
   %mandatory=('01' => 1 ,'02' => 1,'37' => 1, '2004_73' => 1);
   @mandprobs = ('01','02','37','2004_73');
   %prereqs=('10' => '08', '57' => '52', '69' => '18');
   @defchosen=('01','02','03','07','12','18','26','32','37','38','47','54','63','66','2004_73');
   @development = ('100','101','102');
   %developmentitems = ('100' => 1, '101' => '1', '102' => '1');
}

sub checkvalid {
   my %covered=();
   my %chosenproblems=();
   my @errors=();
   my $num=$#chosen+1;
   if ($num<$reqnum) {
      push(@errors,&mt('Test requires at least [_1] items, but has only [_2].',$reqnum,$num)); 
   }
   foreach my $item (@chosen) {
      $chosenproblems{$item}=1;
      $covered{$probcat{$item}}=1;
   }
   foreach my $cat (@categories) {
      unless ($covered{$cat}) {
         push(@errors,&mt('Bin [_1] not covered.',$cat));
      }
   }
   foreach my $item (@chosen) {
       if ($prereqs{$item}) {
          unless ($chosenproblems{$prereqs{$item}}) {
             push(@errors,&mt('Problem [_1] requires problem [_2].',$item,$prereqs{$item}));
          }
       }
   }
   return @errors;
}

sub fullurl {
   my ($item)=@_;
   unless ($item=~/\_/) { $item='_'.$item; }
   return $path.'/'.$version.'/GCI'.$item.'.problem';
}

sub validcheck {
   my ($r)=@_;
   my @errors=&checkvalid();
   if ($#errors>-1) {
      $r->print('<span class="LC_error">'.&mt('Your test is not yet valid.').'</span><p>'.&mt('The following issues must be addressed before you can use the test:').'<ul>');
      foreach my $message (@errors) {
         $r->print('<li>'.$message.'</li>');
      }
      $r->print('</ul></p>');
      return 0;
   }
   return 1;
}

sub listresources {
   my ($r,$context,$cdom,$cnum)=@_;
   my $numchosen = scalar(@chosen);
   unless ($numchosen > 0) {
      $r->print('<h3>'.&mt('Create a Concept Test').'</h3>'.
                '<p>'.&mt('Choose how the test should be built:').'<br />'.
                '<form name="choices" method="post" action="/adm/coursedocs" onsubmit="javascript:setDocsPhase();">'.
                '<label><input type="radio" name="concepttest" value="defchosen" />'.&mt('Have a valid test built automatically by the WebCenter.').'</label><br />'.
                '<label><input type="radio" name="concepttest" value="editmyown" checked="checked" />'.&mt('Make your own selection of questions from the Geoscience Concept Inventory.').'</label><br /><br />'.
                '<input type="hidden" name="phase" value="" />'.
                '<input type="submit" name="choosetest" value="'.&mt('Next').'"></p>');
       return;
   }
   if ((!&validcheck($r)) || ($env{'form.concepttest'} eq 'editmyown')) {
      &editor($r,$context,$cdom,$cnum);
   } else {
      my $numsub = &get_submissions_count($cdom,$cnum);
      unless ($env{'form.phase'} eq 'storemap') {
          $r->print('<p>'.&mt('This course contains a valid concept test which includes [quant,_1,question].',$numchosen).'&nbsp;<a href="/adm/navmaps" target="_coursecontents">'.&mt('Display Contents').'</a><br />');
      }
      if ($numsub > 0) {
          $r->print(&mt('As there are existing student submissions, modification of the [_1]contents[_2] of the Concept Test will result in loss of student performance data, and is [_3]not[_4] permitted.','<i>','</i>','<b>','</b>').'<br />'.&mt('Modification of open and close dates [_1]is[_2] permitted.','<b>','</b>').'</p>');
      } else {
          $r->print('<fieldset><legend>'.&mt('Modify Test').'</legend>'.
                    &mt('Currently no student submissions have been recorded, so you may modify the contents of the Concept Test.').
                    '<br /><form name="changetest" method="post" action="/adm/coursedocs">'.
                    '<input type="hidden" name="concepttest" value="editmyown" />'.
                    '<input type="submit" name="modifytest" value="'.&mt('Edit Concept Test').'" /></form></fieldset></p>');
      }
      my ($crsparms,$ineffect,$parmlev) = &current_parms($cdom,$cnum);
      my $formname = 'datesform';
      my $datebutton = &mt('Save');
      my $startform =
          &Apache::lonhtmlcommon::date_setter($formname,'opendate',
                                              $crsparms->{'opendate'});
      my $endform =
          &Apache::lonhtmlcommon::date_setter($formname,'duedate',
                                                           $crsparms->{'duedate'});
      $r->print('<p><fieldset><legend>'.&mt('Test Availability').'</legend>'.
                &mt('Open and close dates for test items for the concept test are currently set as follows:').
                '<br />'.
                '<form name="'.$formname.'" method="post" '.
                'action="/adm/coursedocs">'.
                &Apache::lonhtmlcommon::start_pick_box().
                &Apache::lonhtmlcommon::row_title(&mt('Open date')).
                $startform.
                &Apache::lonhtmlcommon::row_closure().
                &Apache::lonhtmlcommon::row_title(&mt('Close date')).
                $endform.
                 &Apache::lonhtmlcommon::end_pick_box().'<br />'. 
                '<input type="hidden" name="phase" value="storeparms" />'.
                '<input type="submit" value="'.$datebutton.'" />'.
                '</form></fieldset></p>');
   }
}

sub editor {
    my ($r,$context,$cdom,$cnum)=@_;
    my %chosenitems=();
    my $havedev = 0;
    foreach my $item (@chosen) {
        $chosenitems{$item}=1;
    }
    my @devitems = &get_development_questions($cdom,$cnum);
    &Apache::lonnet::appenv({'request.gcicontext' => 'buildtest'});
    $r->print('<form name="selecteditems" method="post" action="/adm/coursedocs"
              onsubmit="return validTestCheck()">');
    $r->print(&mt('Select test items from the numbered bins below and then press [_1]"Store Problem Selection"[_2] at the bottom of the page.','<i>','</i>').'<br />');
    $r->print('<ul>'.
              '<li>'.&mt('Tests will contain a minimum of [_1] questions from the GCI 2 Inventory.',"<b>$reqnum</b>").'</li>'.
              '<li>'.&mt('Tests must contain [_1]four[_2] mandatory questions and at least one item from each of [_1]eleven[_2] other bins.','<b>','</b>').'</li>'.
              '<li>'.&mt('All tests conclude with [_1]two[_2] questions selected by the system (at random) from a pool of development questions being piloted by the GCI team.','<b>','</b>').'</li>'.
              '</ul>');
    my $mandleg = &mt('Mandatory Questions');
    $r->print(&display_questions(\@mandprobs,'mandatory',$mandleg,\%chosenitems));
    for (my $i=0; $i<@bins; $i++) {
        my $num = $i+1;
        my $legend = &mt('Bin [_1]',$num);
        my $catname = 'bin'.$i;
        $r->print(&display_questions($bins[$i],$catname,$legend,\%chosenitems));
    }
    my $optleg = &mt('Optional Questions');
    $r->print(&display_questions(\@optional,'optional',$optleg,\%chosenitems));
    my $devleg = &mt('Development Questions');
    $r->print(&display_questions(\@devitems,'development',$devleg,\%chosenitems));
    $r->print('<input type="hidden" name="phase" value="storemap" />'.
              '<input type="hidden" name="context" value="'.$context.'" />'.
              '<input type="submit" value="'.&mt('Store Problem Selection').'" />'.
              '</form>');
    &Apache::lonnet::delenv('request.gcicontext');
}

sub display_questions {
    my ($questions,$catname,$catlegend,$chosenitems) = @_;
    return unless((ref($questions) eq 'ARRAY') && (ref($chosenitems) eq 'HASH'));
    my $total = 0;
    foreach my $item (@{$questions}) {
        if ($chosenitems->{$item}) {
            $total ++;
        }
    }
    my $fieldid = 'GCI_'.$catname.'_q';
    my $titleid = 'GCI_'.$catname.'_t';
    my $countid = 'GCI_'.$catname.'_count';
    my $output = '<fieldset>';
    my %fixed = (
        mandatory   => 4,
        development => 2, 
    );
    if (($catname eq 'mandatory') || ($catname eq 'development')) {
        $output .= '<legend>'.&mt('[_1] [_2] selected automatically',$catlegend,
                   '<input type="text" name="'.$countid.'" size="1" '.
                   'value="'.$fixed{$catname}.'" readonly="readonly" />').'</legend>';
    } else {
        $output .= '<legend>'.&mt('[_1]: currently [_2] selected',$catlegend,
                   '<input type="text" name="'.$countid.'" size="1" value="'.
                   $total.'" readonly="readonly" />').'</legend>';
    }
    $output .= '<span id="'.$titleid.'">'.
              '<a href="javascript:showQuestions('."'$fieldid','$titleid'".')">'.
              &mt('Show').'</a> ...</span><br />'.
              '<div id="'.$fieldid.'">'.
              &Apache::loncommon::start_data_table().
              &Apache::loncommon::start_data_table_header_row();
    unless (($catname eq 'development') || ($catname eq 'mandatory')) {
        $output .= '<th>'.&mt('Select').'</th>';
    }
    $output .= '<th>'.&mt('Problem').
               '</th><th>'.&mt('Preview').'</th>'.
               &Apache::loncommon::end_data_table_header_row();
    foreach my $item (@{$questions}) {
        my $url = &fullurl($item);
        my $title = &Apache::lonnet::metadata($url,'title');
        $output .= &Apache::loncommon::start_data_table_row().'<td>';
        if (($catname eq 'mandatory') || ($catname eq 'development')) {
            $output .= '<input type="hidden" name="item'.$item.'" value="checked" />';
        } else {
            $output .= '<input type="checkbox" name="item'.$item.'"';
            if ($chosenitems->{$item}) { $output .= ' checked="checked"'; }
            $output .= 'onclick="javascript:countChecked('."'$catname'".');" />'.
                       '<input type="hidden" name="container'.$item.'" value="'.
                       $catname.'"></td><td>';
        }
        $output .= '<b>'.$title.'</b></td>';
        my $content=&Apache::lonindexer::showpreview($url);
        $output .= '<td> '.($content eq '' ? '&nbsp;':$content).' </td>'."\n".
                   &Apache::loncommon::end_data_table_row();
    }
    $output .= &Apache::loncommon::end_data_table().
               '</div></fieldset><br />';
    return $output;
}

sub get_development_questions {
    my ($cdom,$cnum) = @_;
    my $cid = $cdom.'_'.$cnum;
    my %courseenv = &Apache::lonnet::userenvironment($cdom,$cnum,
                        ('internal.courseowner'));
    my $seed = $courseenv{'internal.courseowner'};
    my $rndseed=&Apache::lonnet::rndseed($seed,$cid,$cdom,$cnum);
    &Apache::lonnet::setup_random_from_rndseed($rndseed);
    my @devitems = &Math::Random::random_permutation(@development);
    return ($devitems[0],$devitems[1]); 
}

sub evaluate {
   if ($env{'form.phase'} eq 'storemap') {
      @chosen=();
      foreach my $item (@allprobs) {
         if ($env{'form.item'.$item}) {
            push(@chosen,$item);
         }
      }
   }
}

sub mapread_gci {
    my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
    my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
    return
      &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/default_1261144274.sequence');
}

sub storemap_gci {
    my ($coursedom,$coursenum) = @_;
    if (($coursedom !~ /^$match_domain$/) || ($coursenum !~ /^$match_courseid$/)) { 
        $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
        $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
    }
    return ('unauthorized',2) if (($coursedom eq '') || ($coursedom eq '') ||
                   (!&Apache::lonnet::allowed('mdc',$coursedom.'_'.$coursenum)));
    my ($outtext,$errtext)=
        &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/default_1261144274.sequence',1);
    if ($errtext) { return ($errtext,2); }
    return ($errtext,0);
}

sub chosen_to_map {
   my %chosenproblems=();
   foreach my $item (@chosen) {
      $chosenproblems{$item}=1;
   }
   @LONCAPA::map::order=();
   @LONCAPA::map::resources=();
   my $counter = 0;
   for (my $idx=0;$idx<=$#allprobs;$idx++) {
       my $residx=$idx+1;
       if ($chosenproblems{$allprobs[$idx]}) {
          push(@LONCAPA::map::order,$residx);
          $counter ++;
          my $url  = &LONCAPA::map::qtunescape(&fullurl($allprobs[$idx]));
	  my $name = &LONCAPA::map::qtunescape('Problem '.$counter);
	  $LONCAPA::map::resources[$residx]=join(':', ($name, $url, 'false', 'normal', 'res'));
       }
    }
}

sub map_to_chosen {
    @chosen=();
    foreach my $idx (@LONCAPA::map::order) {
       my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
       unless ($url eq '') {
           push(@chosen,$allprobs[$idx-1]);
       }
    }
    if (($env{'form.concepttest'} eq 'defchosen') || 
        ((@chosen == 0) && ($env{'form.concepttest'} eq 'editmyown'))) {
        @chosen = @defchosen;
    }
}

sub store {
   my ($caller,$cdom,$cnum)=@_;
   if ($env{'form.concepttest'} eq 'defchosen') {
       @chosen = @defchosen;
   }
   my @errors=&checkvalid();
   if (@errors > 0) {
       if (($caller eq 'requestcrs') && ($env{'form.concepttest'} eq 'defchosen')) {
           return 'Invalid concept test.';
       } else {
           return;
       }
   }
   &chosen_to_map();
   my ($err,$errnum) = &storemap_gci($cdom,$cnum);
   if ($caller eq 'requestcrs') {
       if ($errnum == 0) {
           return; 
       } else {
           return 'An error occurred when storing the concept test';
       }
   }
   if ($env{'form.phase'} eq 'storemap') {
      if ($errnum == 0) {
         &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
         return '<p>'.&mt('You have successfully assembled a valid test.').'</p>'.
                '<p><a href="/adm/navmaps">'.&mt('Display Table of Contents').
                '</a>'.('&nbsp;' x4).'<a href="/adm/menu">'.&mt('Return to Main Menu').'</a></p>';
      } else {
          return '<div class="LC_error">'.&mt('An error occurred when storing your concept test: [_1].',$err).'</div>';
      }
   }
   return;
}

sub load {
   &mapread_gci();
   &map_to_chosen();
   if (@chosen > 0) {
       my @errors=&checkvalid();
       if ($#errors>1) { @chosen=@defchosen; }
   }
}

sub current_parms {
    my ($cdom,$cnum) = @_;
    my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
    my (%crsparms,%ineffect,%parmlev);
    foreach my $item ('opendate','duedate') {
        $crsparms{$item} = $courseopt->{$env{'request.course.id'}.'.0.'.$item};
        my ($result,@outpar) =
            &Apache::lonparmset::parmval('0.'.$item,'0.0',undef,undef,
                                         $cdom,undef,undef,$courseopt);
        if ($result) {
            $ineffect{$item} = $outpar[$result];
            $parmlev{$item} = $result;
        }
    }
    return (\%crsparms,\%ineffect,\%parmlev);
}

sub store_dates_parms {
    my ($cdom,$cnum) = @_;
    my $topsymb = '___0___uploaded/'.$cdom.'/'.$cnum.'/default.sequence';
    my ($opendate,$duedate) = 
        &Apache::lonuserutils::get_dates_from_form('opendate','duedate');
    my %dates = (
                  opendate => {
                               value => $opendate,
                               type  => 'date_start',
                              },
                  duedate => {
                               value => $duedate,
                               type  => 'date_end',
                             },
                );
    my %parmresult;
    foreach my $date (keys(%dates)) {
        $parmresult{$date} =
            &Apache::lonparmset::storeparm_by_symb($topsymb,
                                   '0_'.$date,14,$dates{$date}{'value'},
                                   $dates{$date}{'type'},undef,$cdom);
    }
    my $output = &mt('Open and Close dates set for test items').'<ul>'.
                 '<li>'.&mt('Concept Test Questions open:').' '.
                        &Apache::lonlocal::locallocaltime($opendate).'</li>'.
                 '<li>'.&mt('Concept Test Questions close:').' '.
                        &Apache::lonlocal::locallocaltime($duedate).'</li>'.
                 '</ul>';
    return $output;
}

sub get_submissions_count {
    my ($cdom,$cnum) = @_;
    my $navmap = Apache::lonnavmaps::navmap->new();
    if (!defined($navmap)) {
        my $itemserror = '<span class="LC_warning">'.&mt('An error occurred retrieving information about the course.').'<br />'.&mt('It is recommended that you [_1]re-select the course[_2].','<a href="/adm/roles">','</a>').'</span>';
        return $itemserror;
    }
    my @allres=$navmap->retrieveResources('/uploaded/'.$cdom.'/'.$cnum.'/default_1261144274.sequence',sub {if ($_[0]->is_problem) { $_[0]->parts();} return 1;});
    my (%resourcetracker,$submissioncount);
    my %resourcetracker =  &Apache::lonnet::dump('nohist_resourcetracker',
                                                 $cdom,$cnum);
    foreach my $resource (@allres) {
        my $symb = $resource->symb();
        my @parts = @{$resource->parts()};
        foreach my $part (@parts) {
            if ($resource->handgrade($part) eq 'yes') {
                next;
            }
            if ($resource->is_survey($part)) {
                next;
            }
            if (exists($resourcetracker{$symb."\0".$part."\0users"})) {
                $submissioncount += $resourcetracker{$symb."\0".$part."\0users"};
            }
        }
    }
    return $submissioncount;
}

sub builder_javascript {
    my %lt = &Apache::lonlocal::texthash(
                                          show => 'Show',
                                          hide => 'Hide',
                                        );
    return <<ENDJS;
function showQuestions(content,title) {
    document.getElementById(content).style.display = "";
    document.getElementById(title).innerHTML='<a href="javascript:hideQuestions('+"'"+content+"','"+title+"'"+');">$lt{'hide'}</a> ...';
    return;
}

function hideQuestions(content,title) {
    document.getElementById(content).style.display = "none";
    document.getElementById(title).innerHTML='<a href="javascript:showQuestions('+"'"+content+"','"+title+"'"+')">$lt{'show'}</a> ...';
    return;
}

function setInitialVisibility() {
    if (document.getElementById('GCI_mandatory_q') == null) {
        return;
    }
    document.getElementById('GCI_mandatory_q').style.display = "none";
    document.getElementById('GCI_bin0_q').style.display = "none";
    document.getElementById('GCI_bin1_q').style.display = "none";
    document.getElementById('GCI_bin2_q').style.display = "none";
    document.getElementById('GCI_bin3_q').style.display = "none";
    document.getElementById('GCI_bin4_q').style.display = "none";
    document.getElementById('GCI_bin5_q').style.display = "none";
    document.getElementById('GCI_bin6_q').style.display = "none";
    document.getElementById('GCI_bin7_q').style.display = "none";
    document.getElementById('GCI_bin8_q').style.display = "none";
    document.getElementById('GCI_bin9_q').style.display = "none";
    document.getElementById('GCI_bin10_q').style.display = "none";
    document.getElementById('GCI_optional_q').style.display = "none";
    document.getElementById('GCI_development_q').style.display = "none";
}

function countChecked(binname) {
    var count = 0;
    for (var i=0; i<document.selecteditems.elements.length; i++) {
        if (document.selecteditems.elements[i].type == "hidden") {
            if (document.selecteditems.elements[i].value == binname) {
                var itemname = document.selecteditems.elements[i].name;
                var itemnum = itemname.substr(9);
                if (document.selecteditems.elements['item'+itemnum].checked) {
                    count ++;
                }
            }
        }
    }
    document.selecteditems.elements['GCI_'+binname+'_count'].value = count;
}

function validTestCheck() {
    var empty = '';
    for (var i=0; i<11; i++) {
        var binname = 'GCI_bin'+i+'_count';
        var j = i+1;
        if (document.selecteditems.elements[binname].value < 1) {
            empty = empty +' '+j;
        }
    }
    if (empty != "") {
        alert("Current test invalid - select at least one item from the following bin(s): "+empty);
        return false;
    }
    return true;
}

function setDocsPhase() {
    if (document.choices.concepttest.length) {
        for (var i=0; i<document.choices.concepttest.length; i++) {
            if (document.choices.concepttest[i].checked) {
                if (document.choices.concepttest[i].value == 'defchosen') {
                    document.choices.phase.value = 'storemap';
                    alert("Setting value for phase to "+document.choices.phase.value);

                }
            }
        }
    }
    return;
}

ENDJS

}

} #end scope variables

1;
__END__


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