--- loncom/interface/londocs.pm 2011/09/10 19:00:07 1.460 +++ loncom/interface/londocs.pm 2012/05/09 19:46:30 1.485 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.460 2011/09/10 19:00:07 raeburn Exp $ +# $Id: londocs.pm,v 1.485 2012/05/09 19:46:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,8 +26,6 @@ # http://www.lon-capa.org/ # - - package Apache::londocs; use strict; @@ -41,6 +39,7 @@ use Apache::lonratedt(); use Apache::lonxml; use Apache::lonclonecourse; use Apache::lonnavmaps; +use Apache::lonnavdisplay(); use HTML::Entities; use GDBM_File; use Apache::lonlocal; @@ -101,12 +100,17 @@ sub authorhosts { my $allowed=0; my $myhome=&Apache::lonnet::homeserver($ca,$cd); my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } } + foreach my $id (@ids) { + if ($id eq $myhome) { + $allowed=1; + last; + } + } if ($allowed) { $home++; - $outhash{'home_'.$ca.'@'.$cd}=1; + $outhash{'home_'.$ca.':'.$cd}=1; } else { - $outhash{'otherhome_'.$ca.'@'.$cd}=$myhome; + $outhash{'otherhome_'.$ca.':'.$cd}=$myhome; $other++; } } @@ -115,27 +119,6 @@ sub authorhosts { } -sub dumpbutton { - my ($home,$other,%outhash)=&authorhosts(); - my $crstype = &Apache::loncommon::course_type(); - if ($home+$other==0) { return ''; } - if ($home) { - my $link = - "" - .&mt('Dump '.$crstype.' Documents to Construction Space') - .''; - return - $link.' ' - .&Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs') - .'
'; - } else { - return - &mt('Dump '.$crstype.' Documents to Construction Space: available on other servers'); - } -} - sub clean { my ($title)=@_; $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs; @@ -147,16 +130,22 @@ sub clean { sub dumpcourse { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Documents to Construction Space'). - '
'); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Documents to Construction Space')); + $r->print(&Apache::loncommon::start_page('Dump '.$crstype.' Content to Authoring Space')."\n". + &Apache::lonhtmlcommon::breadcrumbs('Dump '.$crstype.' Content to Authoring Space')."\n"); + $r->print(&startContentScreen('tools')); my ($home,$other,%outhash)=&authorhosts(); - unless ($home) { return ''; } + unless ($home) { + $r->print(&endContentScreen()); + return ''; + } my $origcrsid=$env{'request.course.id'}; my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid); if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) { # Do the dumping - unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; } + unless ($outhash{'home_'.$env{'form.authorspace'}}) { + $r->print(&endContentScreen()); + return ''; + } my ($ca,$cd)=split(/\@/,$env{'form.authorspace'}); $r->print('

'.&mt('Copying Files').'

'); my $title=$env{'form.authorfolder'}; @@ -176,7 +165,7 @@ sub dumpcourse { $newfilename=&clean($newfilename); $newfilename.='.'.$ext; my @dirs=split(/\//,$newfilename); - my $path='/home/'.$ca.'/public_html'; + my $path=$r->dir_config('lonDocRoot')."/priv/$cd/$ca"; my $makepath=$path; my $fail=0; for (my $i=0;$i<$#dirs;$i++) { @@ -207,10 +196,15 @@ sub dumpcourse { } } } else { + $r->print(&mt('Searching ...').'
'); + $r->rflush(); # Input form + $r->print(''."\n"); unless ($home==1) { - $r->print( - '

'.&mt('Select the Construction Space').'

'); } foreach my $key (sort(keys(%outhash))) { if ($key=~/^home_(.+)$/) { @@ -219,20 +213,23 @@ sub dumpcourse { ''); } else { $r->print(''); + &Apache::loncommon::plainname(split(/\:/,$1)).''); } } } unless ($home==1) { - $r->print(''); + $r->print(''."\n"); } my $title=$origcrsdata{'description'}; $title=~s/[\/\s]+/\_/gs; $title=&clean($title); - $r->print('

'.&mt('Folder in Construction Space').'

' - .'
'); + $r->print('
'. + '
'.&mt('Folder in Authoring Space').''. + ''. + '

'."\n"); &tiehash(); - $r->print('

'.&mt('Filenames in Construction Space').'

' + $r->print('

'.&mt('Filenames in Authoring Space').'

' .&Apache::loncommon::start_data_table() .&Apache::loncommon::start_data_table_header_row() .''.&mt('Internal Filename').'' @@ -260,813 +257,11 @@ sub dumpcourse { $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '

'); - } -} - - - -sub exportbutton { - my $crstype = &Apache::loncommon::course_type(); - return "".&mt('IMS Export')."". - &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'
'; -} - - - -sub exportcourse { - my $r=shift; - my $crstype = &Apache::loncommon::course_type(); - my %discussiontime = &Apache::lonnet::dump('discussiontimes', - $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); - my $numdisc = keys(%discussiontime); - my $numprobs = 0; - my $navmap = Apache::lonnavmaps::navmap->new(); - if (!defined($navmap)) { - $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package'). - '

'.&mt('IMS Export Failed').'

'. - '
'); - if ($crstype eq 'Community') { - $r->print(&mt('Unable to retrieve information about community contents')); - } else { - $r->print(&mt('Unable to retrieve information about course contents')); - } - $r->print('
'); - if ($crstype eq 'Community') { - $r->print(&mt('Return to Community Editor')); - } else { - $r->print(&mt('Return to Course Editor')); - } - $r->print(''); - &Apache::lonnet::logthis('IMS export failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); - return; - } - my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef); - my $curRes; - my $outcome; - - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['finishexport']); - if ($env{'form.finishexport'}) { - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['archive','discussion']); - - my $format = $env{'form.format'}; - my @exportitems = &Apache::loncommon::get_env_multiple('form.archive'); - my @discussions = &Apache::loncommon::get_env_multiple('form.discussion'); - if (@exportitems == 0 && @discussions == 0) { - $outcome = - '

' - .&mt('As you did not select any content items or discussions' - .' for export, an IMS package has not been created.') - .'

' - .'

' - .&mt('Please [_1]go back[_2] to select either content items' - .' or discussions for export.' - ,'' - ,'') - .'

'; - } else { - my $now = time; - my %symbs; - my $manifestok = 0; - my $imsresources; - my $tempexport; - my $copyresult; - my $testbank; - my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport,$format,\$testbank); - if ($manifestok) { - &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest,$format,$testbank); - close($ims_manifest); - -#Create zip file in prtspool - my $imszipfile = '/prtspool/'. - $env{'user.name'}.'_'.$env{'user.domain'}.'_'. - time.'_'.rand(1000000000).'.zip'; - my $cwd = &Cwd::getcwd(); - my $imszip = '/home/httpd/'.$imszipfile; - chdir $tempexport; - open(OUTPUT, "zip -r $imszip * 2> /dev/null |"); - close(OUTPUT); - chdir $cwd; - $outcome .= '

' - .&mt('[_1]Your IMS package[_2] is ready for download.' - ,'','') - .'

'; - if ($copyresult) { - $outcome .= '

' - .&mt('The following errors occurred during export - [_1]' - ,$copyresult) - .'

'; - } - } else { - $outcome = '

' - .&mt('Unfortunately you will not be able to retrieve' - .' an IMS archive of your course at this time,' - .' because there was a problem creating a' - .' manifest file.') - .'

' - .'

' - .&mt('Go Back') - .'

'; - } - } - $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); - $r->print($outcome); - $r->print(&Apache::loncommon::end_page()); - } else { - my $display='
'."\n". - '

'. - &mt('Choose which items you wish to export from your '.$crstype.'.'). - '

'. - '
'. - ''.&mt('Content items').''. - ''. - '  
'; - if ($numdisc > 0) { - $display .= '
'. - ''.&mt('Discussion posts').''. - ''. - '  '. - '
'; - } - $display .= '
'; - my $curRes; - my $depth = 0; - my $count = 0; - my $boards = 0; - my $startcount = 5; - my %parent = (); - my %children = (); - my $lastcontainer = $startcount; - $display .= &Apache::loncommon::start_data_table() - .&Apache::loncommon::start_data_table_header_row() - .''.&mt('Export content item?').''; - if ($numdisc > 0) { - $display .= ''.&mt('Export discussion posts?').''; - } - $display .= &Apache::loncommon::end_data_table_header_row(); - while ($curRes = $it->next()) { - if (ref($curRes)) { - $count ++; - } - if ($curRes == $it->BEGIN_MAP()) { - $depth++; - $parent{$depth} = $lastcontainer; - } - if ($curRes == $it->END_MAP()) { - $depth--; - $lastcontainer = $parent{$depth}; - } - if (ref($curRes)) { - my $symb = $curRes->symb(); - my $ressymb = $symb; - if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) { - unless ($ressymb =~ m|adm/wrapper/adm|) { - $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard'; - } - } - my $currelem = $count+$boards+$startcount; - $display .= &Apache::loncommon::start_data_table_row() - .''."\n" - .'is_sequence()) || ($curRes->is_page())) { - $lastcontainer = $currelem; - $display .= 'onclick="javascript:propagateCheck('."'$currelem'".')"'; - } elsif ($curRes->is_problem()) { - $numprobs ++; - } - $display .= ' />'."\n"; - for (my $i=0; $i<$depth; $i++) { - $display .= ('' x2)."\n"; - } - if ($curRes->is_sequence()) { - $display .= ' '."\n"; - } elsif ($curRes->is_page()) { - $display .= ' '."\n"; - } - $children{$parent{$depth}} .= $currelem.':'; - $display .= ' '.$curRes->title().''."\n"; - - # Existing discussion posts? - if ($discussiontime{$ressymb} > 0) { - $boards ++; - $display .= '' - .'' - .''."\n"; - } elsif ($numdisc > 0) { - $display .= ' '."\n"; - } - $display .= &Apache::loncommon::end_data_table_row(); - } - } - $display .= &Apache::loncommon::end_data_table(); - my $scripttag = qq| - - |; - $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package', - $scripttag)); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); - if ($numprobs > 0) { - $display .= '

'. - &mt('Export format for LON-CAPA problems:'). - ''.(' ' x3). - ''.(' ' x3). - '

'; - } - $r->print($display. - '

'. - '

'); - } -} - -sub create_ims_store { - my ($now,$manifestok,$outcome,$tempexport,$format,$testbank) = @_; - $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports'; - my $ims_manifest; - if (!-e $$tempexport) { - mkdir($$tempexport,0700); - } - $$tempexport .= '/'.$now; - if (!-e $$tempexport) { - mkdir($$tempexport,0700); - } - $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'}; - if (!-e $$tempexport) { - mkdir($$tempexport,0700); - } - if (!-e "$$tempexport/resources") { - mkdir("$$tempexport/resources",0700); - } -# open manifest file - my $manifest = '/imsmanifest.xml'; - my $manifestfilename = $$tempexport.$manifest; - if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) { - $$manifestok=1; - print $ims_manifest -''."\n". -''."\n". -' - - - - '.$env{'request.course.id'}.' - - '.$env{'course.'.$env{'request.course.id'}.'.description'}.' - - - - '."\n". -' '."\n". -' '."\n". -' '.$env{'course.'.$env{'request.course.id'}.'.description'}.''; - if ($format eq 'plaintext') { - my $testbankfilename = $$tempexport.'/testbank.txt'; - $$testbank = Apache::File->new('>'.$testbankfilename); - } - } else { - $$outcome .= 'An error occurred opening the IMS manifest file.
' -; - } - return $ims_manifest; -} - -sub build_package { - my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult, - $ims_manifest,$format,$testbank) = @_; -# first iterator to look for dependencies - my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef); - my $curRes; - my $count = 0; - my $depth = 0; - my $lastcontainer = 0; - my %parent = (); - my @dependencies = (); - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - while ($curRes = $it->next()) { - if (ref($curRes)) { - $count ++; - } - if ($curRes == $it->BEGIN_MAP()) { - $depth++; - $parent{$depth} = $lastcontainer; - } - if ($curRes == $it->END_MAP()) { - $depth--; - $lastcontainer = $parent{$depth}; - } - if (ref($curRes)) { - if ($curRes->is_sequence() || $curRes->is_page()) { - $lastcontainer = $count; - } - if (grep(/^$count$/,@$exportitems)) { - &get_dependencies($exportitems,\%parent,$depth,\@dependencies); - } - } - } -# second iterator to build manifest and store resources - $it = $navmap->getIterator(undef,undef,undef,1,undef,undef); - $depth = 0; - my $prevdepth; - $count = 0; - my $imsresources; - my $pkgdepth; - my $currdirpath = 'Top'; - while ($curRes = $it->next()) { - if ($curRes == $it->BEGIN_MAP()) { - $prevdepth = $depth; - $depth++; - } - if ($curRes == $it->END_MAP()) { - $prevdepth = $depth; - $depth--; - } - - if (ref($curRes)) { - $count ++; - if ((grep(/^$count$/,@$exportitems)) || (grep(/^$count$/,@dependencies))) { - my $symb = $curRes->symb(); - my $isvisible = 'true'; - my $resourceref; - if ($curRes->randomout()) { - $isvisible = 'false'; - } - unless ($curRes->is_sequence()) { - $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"'; - } - my $step = $prevdepth - $depth; - if (($step >= 0) && ($count > 1)) { - while ($step >= 0) { - print $ims_manifest "\n".' '."\n"; - $step --; - } - } - $prevdepth = $depth; - - my $itementry = - ''. - ''.$curRes->title().''; - print $ims_manifest "\n".$itementry; - - if ($curRes->is_sequence()) { - $currdirpath = 'Top'; - my $pcslist = $curRes->map_hierarchy(); - if ($pcslist ne '') { - foreach my $pc (split(/,/,$pcslist),$curRes->map_pc()) { - next if ($pc <= 1); - my $res = $navmap->getByMapPc($pc); - if (ref($res)) { - my $encloser = $res->title(); - if ($encloser) { - if ($currdirpath) { - $currdirpath .= ' -> '; - } - $currdirpath .= $encloser; - } - } - } - } - } else { - my $content_file; - my @hrefs = (); - &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport,$format,$currdirpath,$testbank); - if ($content_file) { - $imsresources .= "\n". - ' '."\n". - ' '."\n"; - foreach my $item (@hrefs) { - $imsresources .= - ' '."\n"; - } - if (grep(/^$count$/,@$discussions)) { - my $ressymb = $symb; - my $mode; - if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) { - unless ($ressymb =~ m|adm/wrapper/adm|) { - $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard'; - } - $mode = 'board'; - } - my %extras = ( - caller => 'imsexport', - tempexport => $tempexport.'/resources', - count => $count - ); - my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras); - } - $imsresources .= ' '."\n"; - } - } - $pkgdepth = $depth; - } - } - } - while ($pkgdepth > 0) { - print $ims_manifest " \n"; - $pkgdepth --; - } - my $resource_text = qq| -
-
- - $imsresources - -
- |; - print $ims_manifest $resource_text; -} - -sub get_dependencies { - my ($exportitems,$parent,$depth,$dependencies) = @_; - if ($depth > 1) { - if ((!grep(/^$$parent{$depth}$/,@$exportitems)) && (!grep(/^$$parent{$depth}$/,@$dependencies))) { - push(@{$dependencies},$$parent{$depth}); - if ($depth > 2) { - &get_dependencies($exportitems,$parent,$depth-1,$dependencies); - } - } - } -} - -sub process_content { - my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport,$format,$currdirpath,$testbank) = @_; - my $content_type; - my $message; - my @uploads = (); - if ($curRes->is_sequence()) { - $content_type = 'sequence'; - } elsif ($curRes->is_page()) { - $content_type = 'page'; # need to handle individual items in pages. - } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) { - $content_type = 'syllabus'; - my $contents = &Apache::imsexport::templatedpage($content_type); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-\.sequence___\d+___ext-) { - $content_type = 'external'; - my $title = $curRes->title; - my $contents = &Apache::imsexport::external($symb,$title); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-adm/navmaps$-) { - $content_type = 'navmap'; - } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) { - $content_type = 'simplepage'; - my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) { - $content_type = 'simpleproblem'; - my $contents = &Apache::imsexport::simpleproblem($symb); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-lib/templates/examupload\.problem$-) { - $content_type = 'examupload'; - } elsif ($symb =~ m-adm/($match_domain)/($match_username)/(\d+)/bulletinboard$-) { - $content_type = 'bulletinboard'; - my $contents = &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) { - $content_type = 'aboutme'; - my $contents = &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2); - if ($contents) { - $$content_file = &store_template($contents,$tempexport,$count,$content_type); - } - } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) { - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); - } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) { - my $canedit = 0; - if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'}) { - $canedit= 1; - } -# only include problem code where current user is author - if (($format eq 'html') || ($format eq 'plaintext')) { - my $title = $curRes->title; - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,$format,$currdirpath,$title,$testbank); - } elsif ($format eq 'xml') { - if ($canedit) { - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); - } else { - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit'); - } - } - } elsif ($symb =~ m-uploaded/$cdom/$cnum-) { - $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); - } - if (@uploads > 0) { - foreach my $item (@uploads) { - my $uploadmsg = ''; - &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload'); - if ($uploadmsg) { - $$copyresult .= $uploadmsg."\n"; - } - } - } - if ($message) { - $$copyresult .= $message."\n"; + '

'); } + $r->print(&endContentScreen()); } -sub replicate_content { - my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller,$currdirpath, - $title,$testbank) = @_; - my ($map,$ind,$url); - if ($caller eq 'templateupload') { - $url = $symb; - $url =~ s#//#/#g; - } else { - ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); - } - my $content; - my $filename; - my $repstatus; - my $content_name; - if ($url =~ m-/([^/]+)$-) { - $filename = $1; - if (!-e $tempexport.'/resources') { - mkdir($tempexport.'/resources',0700); - } - if (!-e $tempexport.'/resources/'.$count) { - mkdir($tempexport.'/resources/'.$count,0700); - } - my $destination = $tempexport.'/resources/'.$count.'/'.$filename; - my $copiedfile; - if ($copiedfile = Apache::File->new('>'.$destination)) { - my $content; - if ($caller eq 'resource') { - my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res'; - my $filepath = &Apache::lonnet::filelocation($respath,$url); - $content = &Apache::lonnet::getfile($filepath); - if ($content eq -1) { - $$message = 'Could not copy file '.$filename; - } else { - &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource'); - $repstatus = 'ok'; - } - } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') { - my $rtncode; - $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode); - if ($repstatus eq 'ok') { - if ($url =~ /\.html?$/i) { - &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded'); - } - } else { - $$message = 'Could not render '.$url.' server message - '.$rtncode."
\n"; - } - } elsif (($caller eq 'noedit') || ($caller eq 'html') || - ($caller eq 'plaintext')) { -# Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. - my %form = ( - grade_symb => $symb, - grade_courseid => $cdom.'_'.$cnum, - grade_domain => $env{'user.domain'}, - grade_username => $env{'user.name'}, - grade_imsexport => 1, - instructor_comments => 'hide', - ); - my $feedurl=&Apache::lonnet::clutter($url); - my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form); - if (ref($response)) { - if ($response->is_success) { - $content = $userview; - $content =~ s/\Qonchange="javascript:setSubmittedPart('\E[^\']+\Q');"\E//g; - $content =~ s/^\s*[\n\r]+$//; - if ($caller eq 'plaintext') { - my @lines = split(/[\n\r]+/,$content); - my @tosave; - my $foilcounter = 0; - my @alphabet = ('a'..'z'); - my $mc_answer; - foreach my $line (@lines) { - next if ($line =~ /^\s*$/); - if ($line =~ m{(|\Q<\label>\E)\Q
Incorrect:\E)\Q
Correct:\E(|\Q\E)\Q
\E}) { - $line =~ s/^(\s+|\s+)$//g; - $line =~ s{^\Q\E([^<]+)\Q\E$}{1}; - $tosave[$foilcounter] .= $line.' '; - } - $content = join("\t",@tosave); - if ($mc_answer) { - $content .= "\t".$mc_answer."\n"; - } - } - if (@tosave) { - my $qtype; - if ($mc_answer) { - $qtype = 'MC'; - } - $content = $currdirpath."\t".$title."\t$qtype\t".join("\t",@tosave); - if ($mc_answer) { - $content .= "\t".$mc_answer; - } - $content .= "\n"; - } - } else { - $content = ''.$content.''; - } - if (($caller eq 'plaintext') && ($testbank)) { - print $testbank $content; - } - } else { - $content = 'Not the owner of this resource'; - } - } else { - $content = 'Not the owner of this resource'; - } - $repstatus = 'ok'; - } - if ($repstatus eq 'ok') { - print $copiedfile $content; - } - close($copiedfile); - } else { - $$message = 'Could not open destination file for '.$filename."
\n"; - } - } else { - $$message = 'Could not determine name of file for '.$symb."
\n"; - } - if ($repstatus eq 'ok') { - $content_name = 'resources/'.$count.'/'.$filename; - } - return $content_name; -} - -sub extract_media { - my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_; - my ($dirpath,$container); - my %allfiles = (); - my %codebase = (); - if ($url =~ m-(.*/)([^/]+)$-) { - $dirpath = $1; - $container = $2; - } else { - $dirpath = $url; - $container = ''; - } - &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,$content); - foreach my $embed_file (keys(%allfiles)) { - my $filename; - if ($embed_file =~ m#([^/]+)$#) { - $filename = $1; - } else { - $filename = $embed_file; - } - my $newname = 'res/'.$filename; - my ($rtncode,$embed_content,$repstatus); - my $embed_url; - if ($embed_file =~ m-^/-) { - $embed_url = $embed_file; # points to absolute path - } else { - if ($embed_file =~ m-https?://-) { - next; # points to url - } else { - $embed_url = $dirpath.$embed_file; # points to relative path - } - } - if ($caller eq 'resource') { - my $respath = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res'; - my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); - $embed_content = &Apache::lonnet::getfile($embed_path); - unless ($embed_content eq -1) { - $repstatus = 'ok'; - } - } elsif ($caller eq 'uploaded') { - $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode); - } - if ($repstatus eq 'ok') { - my $destination = $tempexport.'/resources/'.$count.'/res'; - if (!-e "$destination") { - mkdir($destination,0755); - } - $destination .= '/'.$filename; - my $copiedfile; - if ($copiedfile = Apache::File->new('>'.$destination)) { - print $copiedfile $embed_content; - push(@{$href},'resources/'.$count.'/res/'.$filename); - my $attrib_regexp = ''; - if (@{$allfiles{$embed_file}} > 1) { - $attrib_regexp = join('|',@{$allfiles{$embed_file}}); - } else { - $attrib_regexp = $allfiles{$embed_file}[0]; - } - $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi; - if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) { - $$content =~ s#\Q$embed_file\E#$newname#gi; - } - } - } else { - $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."
\n"; - } - } - return; -} - -sub store_template { - my ($contents,$tempexport,$count,$content_type) = @_; - if ($contents) { - if ($tempexport) { - if (!-e $tempexport.'/resources') { - mkdir($tempexport.'/resources',0700); - } - if (!-e $tempexport.'/resources/'.$count) { - mkdir($tempexport.'/resources/'.$count,0700); - } - my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml'; - my $storetemplate; - if ($storetemplate = Apache::File->new('>'.$destination)) { - print $storetemplate $contents; - close($storetemplate); - } - if ($content_type eq 'external') { - return 'resources/'.$count.'/'.$content_type.'.html'; - } else { - return 'resources/'.$count.'/'.$content_type.'.xml'; - } - } - } -} - - sub group_import { my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_; @@ -1127,37 +322,33 @@ sub breadcrumbs { my $isencrypted=0; my $ishidden=0; my $is_random_order=0; - if (!$allowed) { - my $description = $env{'course.'.$env{'request.course.id'}.'.description'}; - &Apache::lonhtmlcommon::add_breadcrumb( - {'href' => '/adm/menu', - 'title'=> 'Go to main menu', - 'text' => $description, - }); - $plain .= $description.' >'; - } while (@folders) { my $folder=shift(@folders); my $foldername=shift(@folders); if ($folderpath) {$folderpath.='&';} $folderpath.=$folder.'&'.$foldername; - my $url='/adm/coursedocs?folderpath='. - &escape($folderpath); - my $name=&unescape($foldername); + my $url; + if ($allowed) { + $url = '/adm/coursedocs?folderpath='; + } else { + $url = '/adm/supplemental?folderpath='; + } + $url .= &escape($folderpath); + my $name=&unescape($foldername); # randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername - $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//; - if ($1 ne '') { - $randompick=$1; - } else { - $randompick=-1; - } - if ($2) { $ishidden=1; } - if ($3) { $isencrypted=1; } - if ($4 ne '') { $is_random_order = 1; } - if ($folder eq 'supplemental') { - $name = &mt('Supplemental '.$crstype.' Documents'); - } - &Apache::lonhtmlcommon::add_breadcrumb( + $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//; + if ($1 ne '') { + $randompick=$1; + } else { + $randompick=-1; + } + if ($2) { $ishidden=1; } + if ($3) { $isencrypted=1; } + if ($4 ne '') { $is_random_order = 1; } + if ($folder eq 'supplemental') { + $name = &mt('Supplemental '.$crstype.' Content'); + } + &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, 'title'=>$name, 'text'=>$name, @@ -1167,7 +358,8 @@ sub breadcrumbs { } $plain=~s/\>\;\s*$//; return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', - undef, undef, 1 ),$randompick,$ishidden,$isencrypted,$plain,$is_random_order); + undef, undef, 1 ),$randompick,$ishidden, + $isencrypted,$plain,$is_random_order); } sub log_docs { @@ -1231,24 +423,46 @@ sub log_docs { } } - - - - sub docs_change_log { - my ($r)=@_; - my $folder=$env{'form.folder'}; - $r->print(&Apache::loncommon::start_page('Course Document Change Log')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log')); + my ($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath)=@_; + my $js = ''."\n"; + $r->print(&Apache::loncommon::start_page('Content Change Log',$js)); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Change Log')); + $r->print(&startContentScreen('docs')); + my %orderhash; + my $container='sequence'; + my $pathitem; + if ($env{'form.pagepath'}) { + $container='page'; + $pathitem = ''; + } else { + my $folderpath=$env{'form.folderpath'}; + if ($folderpath eq '') { + $folderpath = 'default&'.&escape(&mt('Main '.$crstype.' Documents')); + } + $pathitem = ''; + } + my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; + my $jumpto = $readfile; + $jumpto =~ s{^/}{}; + my $tid = 1; + my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); + $r->print($breadcrumbtrail. + &generate_edit_table($tid,\%orderhash,undef,$iconpath,$jumpto, + $readfile)); my %docslog=&Apache::lonnet::dump('nohist_docslog', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); } - $r->print('
'. - ''); - my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('docs_log', \%saveable_parameters); @@ -1262,9 +476,14 @@ sub docs_change_log { 'randomorder' => 'Randomly ordered', 'set' => 'set to', 'del' => 'deleted'); - $r->print(&Apache::loncommon::display_filter(). - ''. - '
'); + my $filter = &Apache::loncommon::display_filter('docslog')."\n". + $pathitem."\n". + ''. + (' 'x2).''; + $r->print('
'. + '
'.&mt('Display of Content Changes').''."\n". + &makedocslogform($filter,1). + '

'); $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). ''.&mt('Time').''.&mt('User').''.&mt('Folder').''.&mt('Before').''. &mt('After').''. @@ -1359,7 +578,10 @@ sub docs_change_log { if (!($env{'form.show'} eq &mt('all') || $shown<=$env{'form.show'})) { last; } } - $r->print(&Apache::loncommon::end_data_table()); + $r->print(&Apache::loncommon::end_data_table()."\n". + &makesimpleeditform($pathitem)."\n". + ''); + $r->print(&endContentScreen()); } sub update_paste_buffer { @@ -1569,7 +791,6 @@ sub update_parameter { sub handle_edit_cmd { my ($coursenum,$coursedom) =@_; - my ($cmd,$idx)=split('_',$env{'form.cmd'}); my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; @@ -1577,7 +798,7 @@ sub handle_edit_cmd { if ($cmd eq 'del') { if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) { + ($url!~/$LONCAPA::assess_page_seq_re/)) { &Apache::lonnet::removeuploadedurl($url); } else { &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); @@ -1614,10 +835,20 @@ sub handle_edit_cmd { sub editor { my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype, - $supplementalflag,$orderhash)=@_; + $supplementalflag,$orderhash,$iconpath)=@_; my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = + &breadcrumbs($allowed,$crstype); + $r->print($breadcrumbtrail); + + my $jumpto = "uploaded/$coursedom/$coursenum/$folder.$container"; + + unless ($allowed) { + $randompick = -1; + } + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, $folder.'.'.$container); return $errtext if ($fatal); @@ -1629,14 +860,6 @@ sub editor { $LONCAPA::map::resources[$idx]=''; } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = - &breadcrumbs($allowed,$crstype); - $r->print($breadcrumbtrail); - - unless ($allowed) { - $randompick = -1; - } - # ------------------------------------------------------------ Process commands # ---------------- if they are for this folder and user allowed to make changes @@ -1788,9 +1011,24 @@ sub editor { $tid = 2; } if ($allowed) { - $r->print(&generate_edit_table($tid,$orderhash,$to_show)); + my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; + $r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, + $readfile)); &print_paste_buffer($r,$container); } else { + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + #Function Box for Supplemental Content for users with mdc priv. + my $funcname = &mt('Folder Editor'); + $r->print( + &Apache::loncommon::head_subbox( + &Apache::lonhtmlcommon::start_funclist(). + &Apache::lonhtmlcommon::add_item_funclist( + ''. + ''.$funcname.''. + ''.$funcname.''). + &Apache::lonhtmlcommon::end_funclist())); + } $r->print($to_show); } return; @@ -1894,12 +1132,59 @@ sub process_file_upload { $$upload_output .= &mt('No embedded items identified').'
'; } $$upload_output = '
'.$$upload_output.'
'; + } elsif (&Apache::loncommon::is_archive_file($mimetype)) { + $nextphase = 'decompress_uploaded'; + my $position = scalar(@LONCAPA::map::order)-1; + my $noextract = &return_to_editor(); + my $archiveurl = &HTML::Entities::encode($url,'<>&"'); + my %archiveitems = ( + folderpath => $env{'form.folderpath'}, + pagepath => $env{'form.pagepath'}, + cmd => $nextphase, + newidx => $newidx, + position => $position, + phase => $nextphase, + comment => $comment, + ); + my ($destination,$dir_root) = &embedded_destination($coursenum,$coursedom); + my @current = &get_dir_list($url,$coursenum,$coursedom,$newidx); + $$upload_output = $showupload. + &Apache::loncommon::decompress_form($mimetype, + $archiveurl,'/adm/coursedocs',$noextract, + \%archiveitems,\@current); } } } return $nextphase; } +sub get_dir_list { + my ($url,$coursenum,$coursedom,$newidx) = @_; + my ($destination,$dir_root) = &embedded_destination(); + my ($dirlistref,$listerror) = + &Apache::lonnet::dirlist("$dir_root/$destination/$newidx",$coursedom,$coursenum,1); + my @dir_lines; + my $dirptr=16384; + if (ref($dirlistref) eq 'ARRAY') { + foreach my $dir_line (sort + { + my ($afile)=split('&',$a,2); + my ($bfile)=split('&',$b,2); + return (lc($afile) cmp lc($bfile)); + } (@{$dirlistref})) { + my ($filename,$dom,undef,$testdir,undef,undef,undef,undef,$size,undef,$mtime,undef,undef,undef,$obs,undef)=split(/\&/,$dir_line,16); + $filename =~ s/\s+$//; + next if ($filename =~ /^\.\.?$/); + my $isdir = 0; + if ($dirptr&$testdir) { + $isdir = 1; + } + push(@dir_lines, [$filename,$dom,$isdir,$size,$mtime,$obs]); + } + } + return @dir_lines; +} + sub is_supplemental_title { my ($title) = @_; return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/); @@ -1950,7 +1235,7 @@ sub entryline { $renametitle=~s/\"\;/\\\"/g; $renametitle=~s/ /%20/g; my $line=&Apache::loncommon::start_data_table_row(); - my ($form_start,$form_end); + my ($form_start,$form_end,$form_common); # Edit commands my ($container, $type, $esc_path, $path, $symb); if ($env{'form.folderpath'}) { @@ -1970,8 +1255,7 @@ sub entryline { if ($allowed) { my $incindex=$index+1; my $selectbox=''; - if (($folder!~/^supplemental/) && - ($#LONCAPA::map::order>0) && + if (($#LONCAPA::map::order>0) && ((split(/\:/, $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] ne '') && @@ -2034,16 +1318,18 @@ sub entryline { if (!$nocopy) { $copylink=(<$lt{'cp'} +$lt{'cp'} ENDCOPY } if (!$nocut) { $cutlink=(<$lt{'ct'} +$lt{'ct'} ENDCUT } - $form_start = (< + $form_start = ' +
+'; + $form_common=(< @@ -2065,6 +1351,7 @@ END $form_start + $form_common $selectbox $form_end @@ -2087,18 +1374,23 @@ END my $pagearg; my $pagefile; if ($uploaded) { - if ($extension eq 'sequence') { - $icon=$iconpath.'/navmap.folder.closed.gif'; - $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/; - $url='/adm/coursedocs?'; - $folderarg=$1; - $isfolder=1; - } elsif ($extension eq 'page') { - $icon=$iconpath.'/page.gif'; - $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/; - $pagearg=$1; - $url='/adm/coursedocs?'; - $ispage=1; + if (($extension eq 'sequence') || ($extension eq 'page')) { + $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/; + my $containerarg = $1; + if ($extension eq 'sequence') { + $icon=$iconpath.'navmap.folder.closed.gif'; + $folderarg=$containerarg; + $isfolder=1; + } else { + $icon=$iconpath.'page.gif'; + $pagearg=$containerarg; + $ispage=1; + } + if ($allowed) { + $url='/adm/coursedocs?'; + } else { + $url='/adm/supplemental?'; + } } else { &Apache::lonnet::allowuploaded('/adm/coursedoc',$url); } @@ -2143,7 +1435,7 @@ END $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); } } - my ($parameterset,$rand_order_text) = (' ', ' '); + my ($rand_pick_text,$rand_order_text); if ($isfolder || $extension eq 'sequence') { my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; @@ -2159,16 +1451,27 @@ END .':'.((&LONCAPA::map::getparameter($orderidx, 'parameter_randomorder'))[0]=~/^yes$/i); $url.='folderpath='.&escape($folderpath).$cpinfo; - $parameterset=''; + my $rpicknum = (&LONCAPA::map::getparameter($orderidx, + 'parameter_randompick'))[0]; + my $rpckchk; + if ($rpicknum) { + $rpckchk = ' checked="checked"'; + } + my $formname = 'edit_rpick_'.$orderidx; + $rand_pick_text = +''."\n". +$form_common."\n". +''; + if ($rpicknum ne '') { + $rand_pick_text .= ': '.$rpicknum.''; + } + $rand_pick_text .= ''; my $ro_set= ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); - $rand_order_text =' -'; + $rand_order_text = +$form_start. +$form_common.' +'; } if ($ispage) { my $pagename=&escape($pagetitle); @@ -2200,13 +1503,27 @@ END } else { $reinit = &mt('(re-initialize course to access)'); } - $line.=' - - '.($url?'':'').''.($url?'':'').' - - - '.($url?"":'').$title.($url?'':' '.$reinit.'').$external." - "; + $line.=''; + if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { + $line.=''; + } elsif ($url) { + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + '',600,500); + } else { + $line.=''; + } + $line.=''; + if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { + $line.=''.$title.''; + } elsif ($url) { + $line.=&Apache::loncommon::modal_link($url.(($url=~/\?/)?'&':'?').'inhibitmenu=yes', + $title,600,500); + } else { + $line.=$title.' '.$reinit.''; + } + $line.=$external.""; + $rand_pick_text = ' ' if ($rand_pick_text eq ''); + $rand_order_text = ' ' if ($rand_order_text eq ''); if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', @@ -2218,15 +1535,17 @@ END $line.=(< $form_start + $form_common $form_end
$form_start + $form_common $form_end - $form_start $parameterset $form_end
- $form_start $rand_order_text $form_end + $rand_pick_text
+ $rand_order_text ENDPARMS } $line.=&Apache::loncommon::end_data_table_row(); @@ -2345,7 +1664,7 @@ sub checkonthis { =item list_symbs() -List Symbs +List Content Identifiers =cut @@ -2353,9 +1672,9 @@ sub list_symbs { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Symb List')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); - &startContentScreen($r,'tools'); + $r->print(&Apache::loncommon::start_page('List of Content Identifiers')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content Identifiers')); + $r->print(&startContentScreen('tools')); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { $r->print('

'.&mt('Retrieval of List Failed').'

'. @@ -2364,11 +1683,25 @@ sub list_symbs { ''); &Apache::lonnet::logthis('Symb list failed - could not create navmap object in '.lc($crstype).':'.$env{'request.course.id'}); } else { - $r->print("
\n");
+        $r->print('

'.&mt("$crstype Content Identifiers").'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ''.&mt('Title').''.&mt('Identifier').''. + &Apache::loncommon::end_data_table_header_row()."\n"); + my $count; foreach my $res ($navmap->retrieveResources()) { - $r->print($res->compTitle()."\t".$res->symb()."\n"); + $r->print(&Apache::loncommon::start_data_table_row(). + ''.$res->compTitle().''. + ''.$res->symb().''. + &Apache::loncommon::start_data_table_row()); + $count ++; + } + if (!$count) { + $r->print(&Apache::loncommon::start_data_table_row(). + ''.&mt("$crstype is empty").''. + &Apache::loncommon::end_data_table_row()); } - $r->print("\n
\n"); + $r->print(&Apache::loncommon::end_data_table()); } } @@ -2376,13 +1709,15 @@ sub list_symbs { sub verifycontent { my ($r) = @_; my $crstype = &Apache::loncommon::course_type(); - $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); - &startContentScreen($r,'tools'); + $r->print(&Apache::loncommon::start_page('Verify '.$crstype.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$crstype.' Documents')); + $r->print(&startContentScreen('tools')); + $r->print('

'.&mt($crstype.' content verification').'

'); $hashtied=0; undef %alreadyseen; %alreadyseen=(); &tiehash(); + foreach my $key (keys(%hash)) { if ($hash{$key}=~/\.(page|sequence)$/) { if (($key=~/^src_/) && ($alreadyseen{&unescape($hash{$key})})) { @@ -2412,7 +1747,7 @@ sub checkversions { my $crstype = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page("Check $crstype Document Versions")); $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $crstype Document Versions")); - &startContentScreen($r,'tools'); + $r->print(&startContentScreen('tools')); my $header=''; my $startsel=''; @@ -2465,9 +1800,11 @@ sub checkversions { if (&Apache::lonnet::put('resourceversions',\%newsetversions, $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { - $r->print('

'.&mt('Your Version Settings have been Saved').'

'); + $r->print(&Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success(&mt('Your Version Settings have been Saved')))); } else { - $r->print('

'.&mt('An Error Occured while Attempting to Save your Version Settings').'

'); + $r->print(&Apache::loncommon::confirmwrapper( + &Apache::lonhtmlcommon::confirm_success(&mt('An Error Occured while Attempting to Save your Version Settings'),1))); } &mark_hash_old(); } @@ -2524,6 +1861,7 @@ sub checkversions { 'lw' => 'Version changes since last Week', 'sy' => 'Version changes since Yesterday', 'al' => 'All Resources (possibly large output)', + 'cd' => 'Change display', 'sd' => 'Display', 'fi' => 'File', 'md' => 'Modification Date', @@ -2533,12 +1871,17 @@ sub checkversions { 'sv' => 'Set Versions to be used in '.$crstype.' according to Selections below', 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)', 'sc' => 'Set all Resource Versions to current Version (Fix Versions)', - 'di' => 'Differences'); + 'di' => 'Differences', + 'save' => 'Save changes', + 'vers' => 'Version choice(s) for specific resources', + 'act' => 'Actions'); $r->print(<$header
- -
+
+
+$lt{'cd'} -

$header

- +
+
+
+
+$lt{'act'} +$lt{'sm'}:
+$lt{'sc'}: +
+
+
+
+

$lt{'vers'}

+ ENDHEADERS + #number of columns for version history + my $num_ver_col = 1; + $r->print( + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ''. + "". + "". + "". + ''. + ''); foreach my $key (sort(keys(%changes))) { if ($changes{$key}>$starttime) { my ($root,$extension)=($key=~/^(.*)\.(\w+)$/); my $currentversion=&Apache::lonnet::getversion($key); if ($currentversion<0) { - $currentversion=&mt('Could not be determined.'); + $currentversion=''.&mt('Could not be determined.').''; } my $linkurl=&Apache::lonnet::clutter($key); - $r->print( - ''. - ''. - ''. - ''. - ''. - ''. - ''. + ''. + ''); my $lastold=1; for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { my $url=$root.'.'.$prevvers.'.'.$extension; @@ -2610,13 +1965,13 @@ ENDHEADERS # each of the four columns my $entries_per_col = 0; my $num_entries = ($currentversion-$lastold); - if ($num_entries % 4 == 0) { - $entries_per_col = $num_entries/4; + if ($num_entries % $num_ver_col == 0) { + $entries_per_col = $num_entries/$num_ver_col; } else { - $entries_per_col = $num_entries/4 + 1; + $entries_per_col = $num_entries/$num_ver_col + 1; } my $entries_count = 0; - $r->print(''); - if ($cols_output != 4) { - $r->print(''); + if ($cols_output != $num_ver_col) { + $r->print(''."\n"); } } - $r->print('
'.&mt('Resources').'$lt{'mr'}$lt{'ve'}$lt{'vu'}'.&mt('History').'


'. - &Apache::lonnet::gettitle($linkurl). - '
   '. - ''.$linkurl. - '
'. - &Apache::lonlocal::locallocaltime( - &Apache::lonnet::metadata($root.'.'.$extension, - 'lastrevisiondate') - ). - 'Most Recent: '. - ''.$currentversion.''. - 'In '.$crstype.': '. - ''); + $r->print( + &Apache::loncommon::end_data_table_header_row(). + &Apache::loncommon::start_data_table_row(). + ''.&Apache::lonnet::gettitle($linkurl).'
'. + ''.$linkurl.'
'.$currentversion.'
('. + &Apache::lonlocal::locallocaltime(&Apache::lonnet::metadata($root.'.'.$extension,'lastrevisiondate')).')
'); # Used in course my $usedversion=$hash{'version_'.$linkurl}; if (($usedversion) && ($usedversion ne 'mostrecent')) { - $r->print($usedversion); + if($usedversion != $currentversion){ + $r->print(''.$usedversion.''); + }else{ + $r->print($usedversion); + } } else { $r->print($currentversion); } - $r->print(''. - 'Use: '); + $r->print(''); # Set version $r->print(&Apache::loncommon::select_form($setversions{$linkurl}, 'set_version_'.$linkurl, @@ -2596,7 +1952,6 @@ ENDHEADERS '' => '', 'mostrecent' => &mt('most recent'), map {$_,$_} (1..$currentversion)})); - $r->print('
'); + $r->print(''); my $cols_output = 1; for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { my $url=$root.'.'.$prevvers.'.'.$extension; @@ -2631,25 +1986,25 @@ ENDHEADERS $r->print(' '.&mt('Diffs').''); + '" target="diffs">'.&mt('Diffs').''); } $r->print('
'); if (++$entries_count % $entries_per_col == 0) { - $r->print('
'); + $r->print(''); $cols_output++; } } } - while($cols_output++ < 4) { - $r->print('') + while($cols_output++ < $num_ver_col) { + $r->print(''); } - $r->print('
'); - $r->print('

'.&mt('Done').'

'); + $r->print(''.&Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(). + ''); &untiehash(); } @@ -2713,7 +2068,7 @@ $help{'Caching'}.'

'."\n\n"); sub init_breadcrumbs { my ($form,$text)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs", + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?tools=1", text=>&Apache::loncommon::course_type().' Editor', faq=>273, bug=>'Instructor Interface', @@ -2748,29 +2103,24 @@ sub create_form_ul { # sub startContentScreen { - my ($r,$mode)=@_; - $r->print(''); - $r->print('
' - .'
'); - $r->print('
'); + my ($mode) = @_; + my $output = ''."\n"; + $output .= '
'. + '
'. + '
'; + return $output; } # @@ -2778,12 +2128,11 @@ sub startContentScreen { # sub endContentScreen { - my ($r)=@_; - $r->print('
'); + return '
'; } sub supplemental_base { - return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents')); + return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Content')); } sub handler { @@ -2791,7 +2140,14 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; + +# get course data my $crstype = &Apache::loncommon::course_type(); + my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + +# graphics settings + $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL').'/'); # # --------------------------------------------- Initialize help topics for this @@ -2817,44 +2173,61 @@ sub handler { $help{'Group Portfolio'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files'); $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching'); -# does this user have privileges to modify docs - my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); - if ($allowed && $env{'form.verify'}) { + + my $allowed; +# URI is /adm/supplemental when viewing supplemental docs in non-edit mode. + unless ($r->uri eq '/adm/supplemental') { + # does this user have privileges to modify content. + $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + } + + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['chooseserver', + 'inhibitmenu']); + if ($allowed && $env{'form.chooseserver'}) { + &choose_dump_server($r); + return OK; + } elsif ($allowed && $env{'form.verify'}) { &init_breadcrumbs('verify','Verify Content'); &verifycontent($r); } elsif ($allowed && $env{'form.listsymbs'}) { - &init_breadcrumbs('listsymbs','List Symbs'); + &init_breadcrumbs('listsymbs','List Content IDs'); &list_symbs($r); } elsif ($allowed && $env{'form.docslog'}) { &init_breadcrumbs('docslog','Show Log'); - &docs_change_log($r); + my $folder = $env{'form.folder'}; + if ($folder eq '') { + $folder='default'; + } + &docs_change_log($r,$coursenum,$coursedom,$folder,$allowed,$crstype,$iconpath); } elsif ($allowed && $env{'form.versions'}) { &init_breadcrumbs('versions','Check/Set Resource Versions'); &checkversions($r); } elsif ($allowed && $env{'form.dumpcourse'}) { - &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Documents to Construction Space'); + &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' Content to Authoring Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { &init_breadcrumbs('exportcourse','IMS Export'); - &exportcourse($r); + &Apache::imsexport::exportcourse($r); } else { # # Done catching special calls -# The whole rest is for course and supplemental documents +# The whole rest is for course and supplemental documents and utilities menu # Get the parameters that may be needed # &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['folderpath','pagepath', - 'pagesymb','forcesupplement','forcestandard']); + 'pagesymb','forcesupplement','forcestandard', + 'tools','symb','command']); # standard=1: this is a "new-style" course with an uploaded map as top level # standard=2: this is a "old-style" course, and there is nothing we can do my $standard=($env{'request.course.uri'}=~/^\/uploaded\//); -# Decide whether this should display supplemental or main content +# Decide whether this should display supplemental or main content or utilities # supplementalflag=1: show supplemental documents # supplementalflag=0: show standard documents +# toolsflag=1: show utilities my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); @@ -2865,19 +2238,96 @@ sub handler { if ($env{'form.forcestandard'}) { $supplementalflag=0; } unless ($allowed) { $supplementalflag=1; } unless ($standard) { $supplementalflag=1; } + my $toolsflag=0; + if ($env{'form.tools'}) { $toolsflag=1; } my $script=''; my $showdoc=0; my $addentries = {}; + my $container; my $containertag; my $uploadtag; +# Do we directly jump somewhere? + + if ($env{'form.command'} eq 'direct') { + my ($mapurl,$id,$resurl); + if ($env{'form.symb'} ne '') { + ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($env{'form.symb'}); + if ($resurl=~/\.(sequence|page)$/) { + $mapurl=$resurl; + } elsif ($resurl eq 'adm/navmaps') { + $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; + } + my $mapresobj; + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + $mapresobj = $navmap->getResourceByUrl($mapurl); + } + $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; + my $type=$2; + my $path; + if (ref($mapresobj)) { + my $pcslist = $mapresobj->map_hierarchy(); + if ($pcslist ne '') { + foreach my $pc (split(/,/,$pcslist)) { + next if ($pc <= 1); + my $res = $navmap->getByMapPc($pc); + if (ref($res)) { + my $thisurl = $res->src(); + $thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; + my $thistitle = $res->title(); + $path .= '&'. + &Apache::lonhtmlcommon::entity_encode($thisurl).'&'. + &Apache::lonhtmlcommon::entity_encode($thistitle). + ':'.$res->randompick(). + ':'.$res->randomout(). + ':'.$res->encrypted(). + ':'.$res->randomorder(); + } + } + } + $path .= '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. + &Apache::lonhtmlcommon::entity_encode($mapresobj->title()). + ':'.$mapresobj->randompick(). + ':'.$mapresobj->randomout(). + ':'.$mapresobj->encrypted(). + ':'.$mapresobj->randomorder(); + } else { + my $maptitle = &Apache::lonnet::gettitle($mapurl); + $path = '&default&...::::'. + '&'.&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. + &Apache::lonhtmlcommon::entity_encode($maptitle).'::::'; + } + $path = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Main Course Documents'). + $path; + if ($type eq 'sequence') { + $env{'form.folderpath'}=$path; + $env{'form.pagepath'}=''; + } else { + $env{'form.pagepath'}=$path; + $env{'form.folderpath'}=''; + } + } elsif ($env{'form.supppath'} ne '') { + $env{'form.folderpath'}=$env{'form.supppath'}; + } + } elsif ($env{'form.command'} eq 'editdocs') { + $env{'form.folderpath'} = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Main Course Content'); + $env{'form.pagepath'}=''; + } elsif ($env{'form.command'} eq 'editsupp') { + $env{'form.folderpath'} = 'default&'. + &Apache::lonhtmlcommon::entity_encode('Supplemental Content'); + $env{'form.pagepath'}=''; + } + # Where do we store these for when we come back? my $stored_folderpath='docs_folderpath'; if ($supplementalflag) { $stored_folderpath='docs_sup_folderpath'; } - + # No folderpath, no pagepath, see if we have something stored if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) { &Apache::loncommon::restore_course_settings($stored_folderpath, @@ -2909,82 +2359,93 @@ sub handler { } else { $env{'form.folderpath'}='default'; } - } + } # Store this - &Apache::loncommon::store_course_settings($stored_folderpath, - {'pagepath' => 'scalar', - 'folderpath' => 'scalar'}); - - if ($env{'form.folderpath'}) { - my (@folderpath)=split('&',$env{'form.folderpath'}); - $env{'form.foldername'}=&unescape(pop(@folderpath)); - $env{'form.folder'}=pop(@folderpath); - } - if ($env{'form.pagepath'}) { - my (@pagepath)=split('&',$env{'form.pagepath'}); - $env{'form.pagename'}=&unescape(pop(@pagepath)); - $env{'form.folder'}=pop(@pagepath); - $containertag = ''. - ''; - $uploadtag = - ''. - ''. - ''; - } else { - my $folderpath=$env{'form.folderpath'}; - if (!$folderpath) { - if ($env{'form.folder'} eq '' || - $env{'form.folder'} eq 'supplemental') { - $folderpath='default&'. - &escape(&mt('Main '.$crstype.' Documents')); + unless ($toolsflag) { + &Apache::loncommon::store_course_settings($stored_folderpath, + {'pagepath' => 'scalar', + 'folderpath' => 'scalar'}); + if ($env{'form.folderpath'}) { + my (@folderpath)=split('&',$env{'form.folderpath'}); + $env{'form.foldername'}=&unescape(pop(@folderpath)); + $env{'form.folder'}=pop(@folderpath); + $container='sequence'; + } + if ($env{'form.pagepath'}) { + my (@pagepath)=split('&',$env{'form.pagepath'}); + $env{'form.pagename'}=&unescape(pop(@pagepath)); + $env{'form.folder'}=pop(@pagepath); + $container='page'; + $containertag = ''. + ''; + $uploadtag = + ''. + ''. + ''; + } else { + my $folderpath=$env{'form.folderpath'}; + if (!$folderpath) { + if ($env{'form.folder'} eq '' || + $env{'form.folder'} eq 'supplemental') { + $folderpath='default&'. + &escape(&mt('Main '.$crstype.' Documents')); + } + } + $containertag = ''; + $uploadtag = ''; + } + if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { + $showdoc='/'.$1; + } + if ($showdoc) { # got called in sequence from course + $allowed=0; + } else { + if ($allowed) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); + $script=&Apache::lonratedt::editscript('simple'); } } - $containertag = ''; - $uploadtag = ''; - } - if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { - $showdoc='/'.$1; - } - if ($showdoc) { # got called in sequence from course - $allowed=0; - } else { - if ($allowed) { - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); - $script=&Apache::lonratedt::editscript('simple'); - } } -# get course data - my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; - my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; - # get personal data my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom)); -# graphics settings - - $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); - if ($allowed) { - my @tabids; - if ($supplementalflag) { - @tabids = ('002','ee2','ff2'); + if ($toolsflag) { + $script .= &inject_data_js(); + my ($home,$other,%outhash)=&authorhosts(); + if (!$home && $other) { + my @hosts; + foreach my $aurole (keys(%outhash)) { + unless(grep(/^\Q$outhash{$aurole}\E/,@hosts)) { + push(@hosts,$outhash{$aurole}); + } + } + $script .= &dump_switchserver_js(@hosts); + } } else { - @tabids = ('aa1','bb1','cc1','ff1'); - unless ($env{'form.pagepath'}) { - unshift(@tabids,'001'); - push(@tabids,('dd1','ee1')); + my @tabids; + if ($supplementalflag) { + @tabids = ('002','ee2','ff2'); + } else { + @tabids = ('aa1','bb1','cc1','ff1'); + unless ($env{'form.pagepath'}) { + unshift(@tabids,'001'); + push(@tabids,('dd1','ee1')); + } } + my $tabidstr = join("','",@tabids); + $script .= &editing_js($udom,$uname,$supplementalflag). + &history_tab_js(). + &inject_data_js(). + &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr); + $addentries = { + onload => "javascript:resize_scrollbox('contentscroll','1','1');", + }; } - my $tabidstr = join("','",@tabids); - $script .= &editing_js($udom,$uname). - &resize_contentdiv_js($tabidstr); - $addentries = { - onload => "javascript:resize_contentdiv('contentscroll','1','1');", - }; } # -------------------------------------------------------------------- Body tag $script = ' - if (newscrollboxw != scrollboxw) { - var newscrolltablew = newscrollboxw+offsetw; - scrolltable.style.width = newscrolltablew+"px"; - } - } +ENDSWJS - if (contentlistid.offsetWidth != contentlistwstart) { - listwchange = 1; - } + my $startpage = &Apache::loncommon::start_page('Choose server',$js, + {'only_body' => 1, + 'js_ready' => 1,}); + my $endpage = &Apache::loncommon::end_page({'js_ready' => 1}); - if (activeTab == 'cc1') { - if (document.getElementById('cc_hrule') != null) { - document.getElementById('cc_hrule').style.width=actabw+"px"; - } - } else { - if (activeTab == 'bb1') { - if (document.getElementById('bb_hrule') != null) { - document.getElementById('bb_hrule').style.width=actabw+"px"; - } - } else { - if (activeTab == 'ee2') { - if (document.getElementById('ee_hrule') != null) { - document.getElementById('ee_hrule').style.width=actabw+"px"; - } - } - } - } + my $hostpicker; + my $count = 0; + foreach my $host (sort(@hosts)) { + my $checked; + if ($count == 0) { + $checked = ' checked="checked"'; + } + $hostpicker .= '  '; + $count++; } - if ((chkh == 1) || (listwchange)) { - var primaryheight = document.getElementById("LC_nav_bar").offsetHeight; - var secondaryheight = document.getElementById("LC_secondary_menu").offsetHeight; - var crumbsheight = document.getElementById("LC_breadcrumbs").offsetHeight; - var dccidheight = document.getElementById("dccid").offsetHeight; - - var uploadresultheight = 0; - if (document.getElementById("uploadfileresult") != null) { - uploadresultheight = document.getElementById("uploadfileresult").offsetHeight; - } - var tabbedheight = document.getElementById("tabbededitor").offsetHeight; - var contenteditorheight = document.getElementById("contenteditor").offsetHeight; - var scrollboxheight = scrollbox.offsetHeight; - var scrollboxscrollheight = scrollbox.scrollHeight; - var freevspace = vph-(primaryheight+secondaryheight+crumbsheight+dccidheight+uploadresultheight+tabbedheight+contenteditorheight); - - var minvscrollbox = 200; - var offsetv = 20; - var newscrollboxheight; - if (freevspace < 0) { - newscrollboxheight = scrollboxheight+freevspace-offsetv; - if (newscrollboxheight < minvscrollbox) { - newscrollboxheight = minvscrollbox; - } - scrollbox.style.height = newscrollboxheight + "px"; - } else { - if (scrollboxscrollheight > scrollboxheight) { - if (freevspace > offsetv) { - newscrollboxheight = scrollboxheight+freevspace-offsetv; - if (newscrollboxheight < minvscrollbox) { - newscrollboxheight = minvscrollbox; - } - scrollbox.style.height = newscrollboxheight+"px"; - } - } - } - scrollboxheight = scrollbox.offsetHeight; - var contentlistheight = document.getElementById("contentlist").offsetHeight; + + return <<"ENDSWITCHJS"; - if (scrollboxscrollheight <= scrollboxheight) { - if ((contentlistheight+offsetv)$lt{'duco'}<\\/h3>\\n'+ + '

$lt{'yone'}<\\/p>\\n'+ + '

$lt{'chos'}<\\/legend>\\n'+ + '
\\n'+ + '$hostpicker\\n'+ + '

\\n'+ + '\\n'+ + '<\\/form><\\/fieldset><\\/div>
\\n'); + newWindow.document.writeln('$endpage'); + newWindow.document.close(); + newWindow.focus(); +} + +ENDSWITCHJS +} + +sub makedocslogform { + my ($formelems,$docslog) = @_; + return <<"LOGSFORM"; + + + $formelems +
+LOGSFORM } -ENDRESIZESCRIPT - return; +sub makesimpleeditform { + my ($formelems) = @_; + return <<"SIMPFORM"; +
+ + $formelems +
+SIMPFORM } 1; @@ -4243,37 +3852,12 @@ sets @resources - array with the resourc Return hash with valid author names -=item dumpbutton() - -Generate "dump" button - =item clean() =item dumpcourse() Actually dump course - -=item exportbutton() - - Generate "export" button - -=item exportcourse() - -=item create_ims_store() - -=item build_package() - -=item get_dependencies() - -=item process_content() - -=item replicate_content() - -=item extract_media() - -=item store_template() - =item group_import() Imports the given (name, url) resources into the course @@ -4333,6 +3917,48 @@ Check Versions Breadcrumbs for special functions +=item create_list_elements() + +=item create_form_ul() + +=item startContentScreen() + +=item endContentScreen() + +=item supplemental_base() + +=item embedded_form_elems() + +=item embedded_destination() + +=item return_to_editor() + +=item decompression_info() + +=item decompression_phase_one() + +=item decompression_phase_two() + +=item remove_archive() + +=item generate_admin_menu() + +=item generate_edit_table() + +=item editing_js() + +=item history_tab_js() + +=item inject_data_js() + +=item dump_switchserver_js() + +=item resize_scrollbox_js() + +=item makedocslogform() + +=item makesimpleeditform() + =back =cut 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.