--- loncom/interface/londocs.pm 2010/08/16 08:58:39 1.435 +++ loncom/interface/londocs.pm 2011/11/27 20:55:58 1.464 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.435 2010/08/16 08:58:39 wenzelju Exp $ +# $Id: londocs.pm,v 1.464 2011/11/27 20:55:58 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -176,7 +176,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++) { @@ -280,6 +280,7 @@ sub exportcourse { 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'). @@ -310,6 +311,7 @@ sub exportcourse { &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) { @@ -331,9 +333,10 @@ sub exportcourse { my $imsresources; my $tempexport; my $copyresult; - my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport); + 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); + &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest,$format,$testbank); close($ims_manifest); #Create zip file in prtspool @@ -435,6 +438,8 @@ sub exportcourse { if (($curRes->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++) { @@ -519,6 +524,16 @@ function containerCheck(item) { $r->print(&Apache::loncommon::start_page('Export '.$crstype.' to IMS Package', $scripttag)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('IMS Export')); + if ($numprobs > 0) { + $display .= '<p><span class="LC_nobreak">'. + &mt('Export format for LON-CAPA problems:'). + '<label><input type="radio" name="format" value="xml" checked="checked" />'. + ' '.&mt('XML').'</label>'.(' ' x3). + '<label><input type="radio" name="format" value="html" />'. + ' '.&mt('HTML').'</label>'.(' ' x3). + '<label><input type="radio" name="format" value="plaintext" />'. + ' '.&mt('Text').'</label></span></p>'; + } $r->print($display. '<p><input type="hidden" name="finishexport" value="1" />'. '<input type="submit" name="exportcourse" value="'. @@ -527,7 +542,7 @@ function containerCheck(item) { } sub create_ims_store { - my ($now,$manifestok,$outcome,$tempexport) = @_; + my ($now,$manifestok,$outcome,$tempexport,$format,$testbank) = @_; $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports'; my $ims_manifest; if (!-e $$tempexport) { @@ -571,7 +586,11 @@ sub create_ims_store { ' <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n". ' <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'. ' structure="hierarchical">'."\n". -' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>' +' <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'; + if ($format eq 'plaintext') { + my $testbankfilename = $$tempexport.'/testbank.txt'; + $$testbank = Apache::File->new('>'.$testbankfilename); + } } else { $$outcome .= 'An error occurred opening the IMS manifest file.<br />' ; @@ -580,7 +599,8 @@ sub create_ims_store { } sub build_package { - my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_; + 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; @@ -619,6 +639,7 @@ sub build_package { $count = 0; my $imsresources; my $pkgdepth; + my $currdirpath = 'Top'; while ($curRes = $it->next()) { if ($curRes == $it->BEGIN_MAP()) { $prevdepth = $depth; @@ -656,10 +677,28 @@ sub build_package { '<title>'.$curRes->title().'</title>'; print $ims_manifest "\n".$itementry; - unless ($curRes->is_sequence()) { + 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); + &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport,$format,$currdirpath,$testbank); if ($content_file) { $imsresources .= "\n". ' <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count. @@ -720,7 +759,7 @@ sub get_dependencies { } sub process_content { - my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_; + my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport,$format,$currdirpath,$testbank) = @_; my $content_type; my $message; my @uploads = (); @@ -777,10 +816,15 @@ sub process_content { $canedit= 1; } # only include problem code where current user is author - 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'); + 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'); @@ -800,7 +844,8 @@ sub process_content { } sub replicate_content { - my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_; + my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller,$currdirpath, + $title,$testbank) = @_; my ($map,$ind,$url); if ($caller eq 'templateupload') { $url = $symb; @@ -844,10 +889,71 @@ sub replicate_content { } else { $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n"; } - } elsif ($caller eq 'noedit') { + } 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<br />Incorrect:<label>\E}) { + $foilcounter ++; + } elsif ($line =~ m{(|\Q</label>\E)\Q<br />Correct:<b><label>\E}) { + $foilcounter ++; + $mc_answer = $alphabet[$foilcounter-1]; + } elsif ($line !~ m{\Q</label>\E(|\Q</b>\E)\Q<br />\E}) { + $line =~ s/^(\s+|\s+)$//g; + $line =~ s{^\Q<b>\E([^<]+)\Q</b>\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 = '<html><body>'.$content.'</body></html>'; + } + 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'; - $content = 'Not the owner of this resource'; } if ($repstatus eq 'ok') { print $copiedfile $content; @@ -905,7 +1011,6 @@ sub extract_media { $repstatus = 'ok'; } } elsif ($caller eq 'uploaded') { - $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode); } if ($repstatus eq 'ok') { @@ -1150,6 +1255,7 @@ sub docs_change_log { &Apache::loncommon::restore_course_settings('docs_log', \%saveable_parameters); if (!$env{'form.show'}) { $env{'form.show'}=10; } +# FIXME: internationalization seems wrong here my %lt=('hiddenresource' => 'Resources hidden', 'encrypturl' => 'URL hidden', 'randompick' => 'Randomly pick', @@ -1238,6 +1344,7 @@ sub docs_change_log { $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>'); foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder') { if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) { +# FIXME: internationalization seems wrong here $r->print('<li>'. &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]', $docslog{$id}{'logentry'}{'parameter_value_'.$parameter}) @@ -1470,7 +1577,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]); @@ -1506,7 +1613,8 @@ sub handle_edit_cmd { } sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype)=@_; + my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$crstype, + $supplementalflag,$orderhash)=@_; my $container= ($env{'form.pagepath'}) ? 'page' : 'sequence'; @@ -1521,12 +1629,11 @@ sub editor { $LONCAPA::map::resources[$idx]=''; } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order); - if ($allowed) { - ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order) = &breadcrumbs($allowed,$crstype); $r->print($breadcrumbtrail); - } else { + + unless ($allowed) { $randompick = -1; } @@ -1636,7 +1743,7 @@ sub editor { $r->print('</div>'); } - my $output; + my ($to_show,$output); &Apache::loncommon::start_data_table_count(); #setup a row counter foreach my $res (@LONCAPA::map::order) { @@ -1653,28 +1760,38 @@ sub editor { &Apache::loncommon::end_data_table_count(); if ($shown) { - $r->print(&Apache::loncommon::start_data_table()); + $to_show = &Apache::loncommon::start_scrollbox('900px','880px','400px','contentscroll') + .&Apache::loncommon::start_data_table(undef,'contentlist'); if ($allowed) { - $r->print(&Apache::loncommon::start_data_table_header_row() + $to_show .= &Apache::loncommon::start_data_table_header_row() .'<th colspan="2">'.&mt('Move').'</th>' .'<th>'.&mt('Actions').'</th>' - .'<th colspan="2">'.&mt('Document').'</th>'); + .'<th colspan="2">'.&mt('Document').'</th>'; if ($folder !~ /^supplemental/) { - $->print('<th colspan="4">'.&mt('Settings').'</th>'); + $to_show .= '<th colspan="4">'.&mt('Settings').'</th>'; } - $r->print(&Apache::loncommon::end_data_table_header_row()); + $to_show .= &Apache::loncommon::end_data_table_header_row(); } - $r->print($output + $to_show .= $output.' ' .&Apache::loncommon::end_data_table() - ); + .'<br style="line-height:2px;" />' + .&Apache::loncommon::end_scrollbox(); } else { - $r->print('<p class="LC_info">' + $to_show .= &Apache::loncommon::start_scrollbox('400px','380px','200px','contentscroll') + .'<div class="LC_info" id="contentlist">' .&mt('Currently no documents.') - .'</p>' - ); + .'</div>' + .&Apache::loncommon::end_scrollbox(); + } + my $tid = 1; + if ($supplementalflag) { + $tid = 2; } if ($allowed) { + $r->print(&generate_edit_table($tid,$orderhash,$to_show)); &print_paste_buffer($r,$container); + } else { + $r->print($to_show); } return; } @@ -1682,11 +1799,10 @@ sub editor { sub process_file_upload { my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_; # upload a file, if present - my $parseaction; - if ($env{'form.parserflag'}) { + my ($parseaction,$showupload,$nextphase,$mimetype); + if ($env{'form.parserflag'}) { $parseaction = 'parse'; } - my $phase_status; my $folder=$env{'form.folder'}; if ($folder eq '') { $folder='default'; @@ -1705,7 +1821,8 @@ sub process_file_upload { $LONCAPA::map::resources[1]=''; } if ($fatal) { - return 'failed'; + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('The uploaded file has not been stored as an error occurred reading the contents of the current folder.').'</div>'; + return; } my $destination = 'docs/'; if ($folder =~ /^supplemental/) { @@ -1716,13 +1833,23 @@ sub process_file_upload { } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { $destination .= $2.'/'; } -# this is for a course, not a user, so set coursedoc flag -# probably the only place in the system where this should be "1" +# this is for a course, not a user, so set context to coursedoc. my $newidx=&LONCAPA::map::getresidx(); $destination .= $newidx; - my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination, + my $url=&Apache::lonnet::userfileupload('uploaddoc','coursedoc',$destination, $parseaction,$allfiles, - $codebase); + $codebase,undef,undef,undef,undef, + undef,undef,\$mimetype); + if ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E.*/([^/]+)$}) { + my $stored = $1; + $showupload = '<p>'.&mt('Uploaded [_1]','<span class="LC_filename">'. + $stored.'</span>').'</p>'; + } else { + my ($filename) = ($env{'form.uploaddoc.filename'} =~ m{([^/]+)$}); + + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.&mt('Unable to save file [_1].','<span class="LC_filename">'.$filename.'</span>').'</div>'; + return; + } my $ext='false'; if ($url=~m{^http://}) { $ext='true'; } $url = &LONCAPA::map::qtunescape($url); @@ -1739,51 +1866,38 @@ sub process_file_upload { ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); if ($fatal) { - $$upload_output .= '<p><span class="LC_error">'.$errtext.'</span></p>'; - return 'failed'; + $$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>'; + return; } else { - if ($parseaction eq 'parse') { + if ($parseaction eq 'parse' && $mimetype eq 'text/html') { + $$upload_output = $showupload; my $total_embedded = scalar(keys(%{$allfiles})); if ($total_embedded > 0) { - my $num = 0; - my $state = ' - <input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> - <input type="hidden" name="cmd" value="upload_embedded" /> - <input type="hidden" name="newidx" value="'.$newidx.'" /> - <input type="hidden" name="primaryurl" value="'.&escape($url).'" /> - <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />'; - $phase_status = 'phasetwo'; - - $$upload_output .= - 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />'. - &Apache::loncommon::ask_for_embedded_content( - '/adm/coursedocs',$state,$allfiles,$codebase); + my $uploadphase = 'upload_embedded'; + my $primaryurl = &HTML::Entities::encode($url,'<>&"'); + my $state = &embedded_form_elems($uploadphase,$primaryurl,$newidx); + my ($embedded,$num) = + &Apache::loncommon::ask_for_embedded_content( + '/adm/coursedocs',$state,$allfiles,$codebase,{'docs_url' => $url}); + if ($embedded) { + if ($num) { + $$upload_output .= + '<p>'.&mt('This file contains embedded multimedia objects, which need to be uploaded.').'</p>'.$embedded; + $nextphase = $uploadphase; + } else { + $$upload_output .= $embedded; + } + } else { + $$upload_output .= &mt('Embedded item(s) already present, so no additional upload(s) required').'<br />'; + } } else { - $$upload_output .= 'No embedded items identified<br />'; + $$upload_output .= &mt('No embedded items identified').'<br />'; } + $$upload_output = '<div id="uploadfileresult">'.$$upload_output.'</div>'; } } } - return $phase_status; -} - -sub process_secondary_uploads { - my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; - my $folder=$env{'form.folder'}; - my $destination = 'docs/'; - if ($folder =~ /^supplemental/) { - $destination = 'supplemental/'; - } - if (($folder eq 'default') || ($folder eq 'supplemental')) { - $destination .= 'default/'; - } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { - $destination .= $2.'/'; - } - $destination .= $newidx; - my ($url,$filename); - $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination); - ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$}); - return $filename; + return $nextphase; } sub is_supplemental_title { @@ -1848,7 +1962,7 @@ sub entryline { } if ($env{'form.pagepath'}) { $type = $container = 'page'; - $esc_path=&escape($path = $env{'form.pagepath'}); + $esc_path=&escape($env{'form.pagepath'}); $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"'); $symb=&escape($env{'form.pagesymb'}); } @@ -2106,14 +2220,13 @@ END $form_start <label><input type="checkbox" name="hiddenresource_$orderidx" onclick="this.form.changeparms.value='hiddenresource';this.form.submit()" $hidtext /> $lt{'hd'}</label> $form_end - </td> - <td class="LC_docs_entry_parameter"> + <br /> $form_start <label><input type="checkbox" name="encrypturl_$orderidx" onclick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label> $form_end </td> - <td class="LC_docs_entry_parameter">$form_start $rand_order_text $form_end</td> - <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end</td> + <td class="LC_docs_entry_parameter">$form_start $parameterset $form_end<br /> + $form_start $rand_order_text $form_end</td> ENDPARMS } $line.=&Apache::loncommon::end_data_table_row(); @@ -2242,6 +2355,7 @@ sub list_symbs { my $crstype = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page('Symb List')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List')); + &startContentScreen($r,'tools'); my $navmap = Apache::lonnavmaps::navmap->new(); if (!defined($navmap)) { $r->print('<h2>'.&mt('Retrieval of List Failed').'</h2>'. @@ -2256,7 +2370,6 @@ sub list_symbs { } $r->print("\n</pre>\n"); } - $r->print('<hr /><a href="/adm/coursedocs">'.&mt('Back to Course Editor').'</a>'); } @@ -2265,6 +2378,7 @@ sub verifycontent { 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'); $hashtied=0; undef %alreadyseen; %alreadyseen=(); @@ -2283,13 +2397,7 @@ sub verifycontent { } } &untiehash(); - $r->print( - '<p class="LC_success">'.&mt('Done').'</p>' - .'<hr />' - .'<p><a href="/adm/coursedocs">' - .&mt('Back to Course Editor') - .'</a></p>' - ); + $r->print('<p class="LC_success">'.&mt('Done').'</p>'); } @@ -2304,6 +2412,8 @@ 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'); + my $header=''; my $startsel=''; my $monthsel=''; @@ -2521,7 +2631,7 @@ ENDHEADERS $r->print(' <a href="/adm/diff?filename='. &Apache::lonnet::clutter($root.'.'.$extension). '&versionone='.$prevvers. - '">'.&mt('Diffs').'</a>'); + '" target="diffs">'.&mt('Diffs').'</a>'); } $r->print('</span><br />'); if (++$entries_count % $entries_per_col == 0) { @@ -2614,8 +2724,67 @@ sub init_breadcrumbs { bug=>'Instructor Interface'}); } +# subroutine to list form elements +sub create_list_elements { + my @formarr = @_; + my $list = ''; + for my $button (@formarr){ + for my $picture(keys %$button) { + $list .= &Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); + } + } + return $list; +} +# subroutine to create ul from list elements +sub create_form_ul { + my $list = shift; + my $ul = &Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'}); + return $ul; +} +# +# Start tabs +# + +sub startContentScreen { + my ($r,$mode)=@_; + $r->print('<ul class="LC_TabContentBigger" id="mainnav">'); + $r->print('<li'.(($mode eq 'navmaps')?' class="active"':'').'><a href="/adm/navmaps"><b> '.&mt('Content Overview').' </b></a></li>'); + + my $active = ''; +# does this user have privileges to modify docs? + my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); + + my $onclick; + my $href; + + if ($allowed) { + $r->print('<li '.(($mode eq 'docs')?' class="active"':''). + ' id="tabbededitor"><a href="/adm/coursedocs?forcestandard=1"><b> '.&mt('Content Editor').' </b></a></li>'); + } + $r->print('<li'.(($mode eq 'coursesearch')?' class="active"':'').'><a href="/adm/searchcourse"><b> '.&mt('Content Search').' </b></a></li>'); + $r->print('<li'.(($mode eq 'courseindex')?' class="active"':'').'><a href="/adm/indexcourse"><b> '.&mt('Content Index').' </b></a></li>'); + $r->print('<li '.(($mode eq 'supdocs')?' class="active"':''). + '><a href="/adm/coursedocs?forcesupplement=1"><b>'.&mt('Supplemental Documents').'</b></a></li>'); + $r->print('</ul>'); + $r->print('<div class="LC_DocsBox" style="clear:both;margin:0;" id="contenteditor">' + .'<div id="maincoursedoc" style="margin:0 0;padding:0 0">'); + $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">'); +} + +# +# End tabs +# + +sub endContentScreen { + my ($r)=@_; + $r->print('</div></div></div>'); +} + +sub supplemental_base { + return 'supplemental&'.&escape(&mt('Supplemental '.&Apache::loncommon::course_type().' Documents')); +} sub handler { my $r = shift; @@ -2624,7 +2793,7 @@ sub handler { return OK if $r->header_only; my $crstype = &Apache::loncommon::course_type(); - +# # --------------------------------------------- Initialize help topics for this foreach my $topic ('Adding_Course_Doc','Main_Course_Documents', 'Adding_External_Resource','Navigate_Content', @@ -2669,45 +2838,99 @@ sub handler { &init_breadcrumbs('exportcourse','IMS Export'); &exportcourse($r); } else { -# is this a standard course? +# +# Done catching special calls +# The whole rest is for course and supplemental documents +# Get the parameters that may be needed +# + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','pagepath', + 'pagesymb','forcesupplement','forcestandard']); + +# 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\//); - my $forcestandard = 0; - my $forcesupplement; + +# Decide whether this should display supplemental or main content +# supplementalflag=1: show supplemental documents +# supplementalflag=0: show standard documents + + + my $supplementalflag=($env{'form.folderpath'}=~/^supplemental/); + if (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'} eq "" || ($env{'form.pagepath'})) { + $supplementalflag=0; + } + if ($env{'form.forcesupplement'}) { $supplementalflag=1; } + if ($env{'form.forcestandard'}) { $supplementalflag=0; } + unless ($allowed) { $supplementalflag=1; } + unless ($standard) { $supplementalflag=1; } + my $script=''; my $showdoc=0; + my $addentries = {}; my $containertag; my $uploadtag; +# Do we directly jump somewhere? + if ($env{'form.command'} eq 'direct') { + (my $mapurl) = &Apache::lonnet::decode_symb($env{'form.symb'}); + my $maptitle = &Apache::lonnet::gettitle($mapurl); + $mapurl=~s{^.*/([^/]+)\.\w+$}{$1}; + $env{'form.folderpath'}= + 'default&'.&Apache::lonhtmlcommon::entity_encode('Main Course Documents'). + '&default&...::::&'. + &Apache::lonhtmlcommon::entity_encode($mapurl).'&'. + &Apache::lonhtmlcommon::entity_encode($maptitle).'::::'; + } + +# Where do we store these for when we come back? + my $stored_folderpath='docs_folderpath'; + if ($supplementalflag) { + $stored_folderpath='docs_sup_folderpath'; + } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['folderpath','pagepath', - 'pagesymb']); # No folderpath, no pagepath, see if we have something stored if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) { - &Apache::loncommon::restore_course_settings('docs_folderpath', + &Apache::loncommon::restore_course_settings($stored_folderpath, {'folderpath' => 'scalar'}); } + +# If we are not allowed to make changes, all we can see are supplemental docs if (!$allowed) { - unless($env{'form.folderpath'} =~ /^supplemental/) { - $env{'form.folderpath'} = ''; + $env{'form.pagepath'}=''; + unless ($env{'form.folderpath'} =~ /^supplemental/) { + $env{'form.folderpath'} = &supplemental_base(); } } +# If we still not have a folderpath, see if we can resurrect at pagepath if (!$env{'form.folderpath'} && $allowed) { - &Apache::loncommon::restore_course_settings('docs_folderpath', + &Apache::loncommon::restore_course_settings($stored_folderpath, {'pagepath' => 'scalar'}); } - if ($env{'form.pagepath'}) { - $env{'form.folderpath'}=''; - } +# Make the zeroth entry in supplemental docs page paths, so we can get to top level if ($env{'form.folderpath'} =~ /^supplemental_\d+/) { - $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$crstype.' Documents')).'&'. + $env{'form.folderpath'} = &supplemental_base() + .'&'. $env{'form.folderpath'}; } - &Apache::loncommon::store_course_settings('docs_folderpath', +# If after all of this, we still don't have any paths, make them + unless (($env{'form.pagepath'}) || ($env{'form.folderpath'})) { + if ($supplementalflag) { + $env{'form.folderpath'}=&supplemental_base(); + } else { + $env{'form.folderpath'}='default'; + } + } + +# Store this + &Apache::loncommon::store_course_settings($stored_folderpath, {'pagepath' => 'scalar', 'folderpath' => 'scalar'}); + + &Apache::lonnet::logthis("Folder: ".$env{'form.folderpath'}); + + if ($env{'form.folderpath'}) { my (@folderpath)=split('&',$env{'form.folderpath'}); $env{'form.foldername'}=&unescape(pop(@folderpath)); @@ -2741,38 +2964,12 @@ sub handler { if ($showdoc) { # got called in sequence from course $allowed=0; } else { - if (($env{'form.folder'}=~/^(?:group|default)_/) || - ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) { - $forcestandard = 1; - } - $forcesupplement=($env{'form.folder'}=~/^supplemental_/); - if ($allowed) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']); $script=&Apache::lonratedt::editscript('simple'); } } -# subroutine to list form elements -sub create_list_elements { - my @formarr = @_; - my $list = ''; - for my $button (@formarr){ - for my $picture(keys %$button) { - #my $link = Apache::lonhtmlcommon::htmltag('a' ,$button->{$picture}, {href => "test"}); - $list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); - } - } - return $list; -} - -# subroutine to create ul from list elements -sub create_form_ul { - my $list = shift; - my $ul = Apache::lonhtmlcommon::htmltag('ul',$list, {class => 'LC_ListStyleNormal'}); - return $ul; -} - # get course data my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'}; my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -2787,7 +2984,22 @@ sub create_form_ul { $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/"); if ($allowed) { - $script .= &editing_js($udom,$uname); + 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). + &resize_contentdiv_js($tabidstr); + $addentries = { + onload => "javascript:resize_contentdiv('contentscroll','1','1');", + }; } # -------------------------------------------------------------------- Body tag $script = '<script type="text/javascript">'."\n" @@ -2798,119 +3010,69 @@ sub create_form_ul { # Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); - if ($allowed) { + unless ($showdoc) { &Apache::lonhtmlcommon::add_breadcrumb({ - href=>"/adm/coursedocs",text=>"$crstype Editor"}); + href=>"/adm/coursedocs",text=>"$crstype Contents"}); - $r->print(&Apache::loncommon::start_page("$crstype Editor", $script, - {'force_register' => $showdoc,}) + $r->print(&Apache::loncommon::start_page("$crstype Contents", $script, + {'force_register' => $showdoc, + 'add_entries' => $addentries, + }) .&Apache::loncommon::help_open_menu('','',273,'RAT') .&Apache::lonhtmlcommon::breadcrumbs( 'Editing the Table of Contents for your '.$crstype, 'Docs_Adding_Course_Doc') ); - } elsif ($showdoc) { + } else { $r->print(&Apache::loncommon::start_page("$crstype documents",undef, {'force_register' => $showdoc,})); - } else { - my $folder=$env{'form.folder'}; - if ($folder eq '' || $folder eq 'supplemental') { - $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$crstype.' Documents')); - } - my ($breadcrumbtrail) = &breadcrumbs($allowed,$crstype); - $r->print(&Apache::loncommon::start_page("Supplemental documents"). - $breadcrumbtrail); } my %allfiles = (); my %codebase = (); - my ($upload_result,$upload_output); + my ($upload_result,$upload_output,$uploadphase); if ($allowed) { if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { -# Process file upload - phase one - upload and parse primary file. + my $context = $1; + # Process file upload - phase one - upload and parse primary file. undef($hadchanges); - $upload_result = &process_file_upload(\$upload_output,$coursenum, - $coursedom,\%allfiles, - \%codebase,$1); + $uploadphase = &process_file_upload(\$upload_output,$coursenum,$coursedom, + \%allfiles,\%codebase,$context); if ($hadchanges) { &mark_hash_old(); } - if ($upload_result eq 'phasetwo') { - $r->print($upload_output); - } - } elsif ($env{'form.phasetwo'}) { - my %newname = (); - my %origname = (); - my %attribs = (); - my $updateflag = 0; - my $residx = $env{'form.newidx'}; - my $primary_url = &unescape($env{'form.primaryurl'}); -# Process file upload - phase two - gather secondary files. - for (my $i=0; $i<$env{'form.phasetwo'}; $i++) { - if ($env{'form.embedded_item_'.$i.'.filename'}) { - my $javacodebase; - $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx); - $origname{$i} = &unescape($env{'form.embedded_orig_'.$i}); - if (exists($env{'form.embedded_codebase_'.$i})) { - $javacodebase = &unescape($env{'form.embedded_codebase_'.$i}); - $origname{$i} =~ s#^\Q$javacodebase\E/##; - } - my @attributes = (); - if ($env{'form.embedded_attrib_'.$i} =~ /:/) { - @attributes = split(/:/,$env{'form.embedded_attrib_'.$i}); - } else { - @attributes = ($env{'form.embedded_attrib_'.$i}); - } - foreach my $attr (@attributes) { - push(@{$attribs{$i}},&unescape($attr)); - } - if ($javacodebase) { - $codebase{$i} = $javacodebase; - $codebase{$i} =~ s#/$##; - $updateflag = 1; - } - } - unless ($newname{$i} eq $origname{$i}) { - $updateflag = 1; - } - } -# Process file upload - phase three - modify primary file - if ($updateflag) { - my ($content,$rtncode); - my $updateflag = 0; - my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode); - if ($getstatus eq 'ok') { - foreach my $item (keys(%newname)) { - if ($newname{$item} ne $origname{$item}) { - my $attrib_regexp = ''; - if (@{$attribs{$item}} > 1) { - $attrib_regexp = join('|',@{$attribs{$item}}); - } else { - $attrib_regexp = $attribs{$item}[0]; - } - if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) { - } - $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; - } - if (exists($codebase{$item})) { - $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs - } - } -# Save edited file. - my $saveresult; - my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; - my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; - my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult); - } else { - &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); - } - } + $r->print($upload_output); + } elsif ($env{'form.phase'} eq 'upload_embedded') { + # Process file upload - phase two - upload embedded objects + $uploadphase = 'check_embedded'; + my $primaryurl = &HTML::Entities::encode($env{'form.primaryurl'},'<>&"'); + my $state = &embedded_form_elems($uploadphase,$primaryurl, + $env{'form.newidx'}); + my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my ($destination,$dir_root) = &embedded_destination(); + my $url_root = '/uploaded/'.$docudom.'/'.$docuname; + my $actionurl = '/adm/coursedocs'; + my ($result,$flag) = + &Apache::loncommon::upload_embedded('coursedoc',$destination, + $docuname,$docudom,$dir_root,$url_root,undef,undef,undef,$state, + $actionurl); + $r->print($result.&return_to_editor()); + } elsif ($env{'form.phase'} eq 'check_embedded') { + # Process file upload - phase three - modify references in HTML file + $uploadphase = 'modified_orightml'; + my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my ($destination,$dir_root) = &embedded_destination(); + $r->print(&Apache::loncommon::modify_html_refs('coursedoc',$destination, + $docuname,$docudom,undef, + $dir_root). + &return_to_editor()); } } - unless ($showdoc || $upload_result eq 'phasetwo') { + unless ($showdoc || $uploadphase) { # ----------------------------------------------------------------------------- my %lt=&Apache::lonlocal::texthash( 'uplm' => 'Upload a new main '.lc($crstype).' document', @@ -2920,7 +3082,6 @@ sub create_form_ul { 'upld' => 'Import Document', 'srch' => 'Search', 'impo' => 'Import', - 'book' => 'Import Bookmarks', 'wish' => 'Import from Wishlist', 'selm' => 'Select Map', 'load' => 'Load Map', @@ -2933,7 +3094,7 @@ sub create_form_ul { 'sipa' => 'Simple Course Page', 'sipr' => 'Simple Problem', 'drbx' => 'Drop Box', - 'scuf' => 'Score Upload Form', + 'scuf' => 'External Scores (handgrade, upload, clicker)', 'bull' => 'Discussion Board', 'mypi' => 'My Personal Information Page', 'grpo' => 'Group Portfolio', @@ -2965,27 +3126,22 @@ FIUP </label> CHBO - my $fileuploada = "<input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}"; + my $fileuploada = "<br clear='all' /><input type='submit' value='".$lt{'upld'}."' /> $help{'Uploading_From_Harddrive'}"; my $fileuploadform=(<<FUFORM); <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data"> <input type="hidden" name="active" value="aa" /> $fileupload <br /> $lt{'title'}:<br /> - <input type="text" size="50" name="comment" /> + <input type="text" size="60" name="comment" /> $uploadtag <input type="hidden" name="cmd" value="upload_default" /> <br /> - <span class="LC_nobreak"> + <span class="LC_nobreak" style="float:left"> $checkbox </span> FUFORM - #$list .= Apache::lonhtmlcommon::htmltag('li', $picture.' '.$button->{$picture}, {class => 'LC_menubuttons_inline_text'}); - #$fileuploadform .= create_form_ul(create_list_elements(@fileuploada)); - $fileuploadform .= create_form_ul(Apache::lonhtmlcommon::htmltag('li',$fileuploada,{class => 'LC_menubuttons_inline_text'})); - $fileuploadform .= (<<FUFORM); - </form> -FUFORM + $fileuploadform .= $fileuploada.'</form>'; my $simpleeditdefaultform=(<<SEDFFORM); <form action="/adm/coursedocs" method="post" name="simpleeditdefault"> @@ -2994,31 +3150,29 @@ SEDFFORM my @simpleeditdefaultforma = ( { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/src.png" alt="'.$lt{srch}.'" onclick="javascript:groupsearch()" />' => "$uploadtag<a class='LC_menubuttons_link' href='javascript:groupsearch()'>$lt{'srch'}</a>" }, { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{impo}.'" onclick="javascript:groupimport();"/>' => "<a class='LC_menubuttons_link' href='javascript:groupimport();'>$lt{'impo'}</a>$help{'Importing_LON-CAPA_Resource'}" }, - { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/vbkm.png" alt="'.$lt{book}.'" onclick="javascript:groupopen(0,1,1);" />' => "<a class='LC_menubuttons_link' href='javascript:groupopen(0,1,1);'>$lt{'book'}</a>" }, { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/wishlist.png" alt="'.$lt{wish}.'" onclick="javascript:open_Wishlist_Import();" />' => "<a class='LC_menubuttons_link' href='javascript:open_Wishlist_Import();'>$lt{'wish'}</a>" }, ); - $simpleeditdefaultform .= create_form_ul(create_list_elements(@simpleeditdefaultforma)); + $simpleeditdefaultform .= &create_form_ul(&create_list_elements(@simpleeditdefaultforma)); $simpleeditdefaultform .=(<<SEDFFORM); - <hr /> - <p> + <hr id="bb_hrule" style="width:0px;text-align:left;margin-left:0" /> $lt{'copm'}<br /> <input type="text" size="40" name="importmap" /><br /> - <span class="LC_nobreak"><input type="button" + <span class="LC_nobreak" style="float:left"><input type="button" onclick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')" value="$lt{'selm'}" /> <input type="submit" name="loadmap" value="$lt{'load'}" /> $help{'Load_Map'}</span> - </p> </form> SEDFFORM - my $extresourcesform=(<<ERFORM); - <form action="/adm/coursedocs" method="post" name="newext"> - $uploadtag - <input type="hidden" name="importdetail" value="" /> - <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'} - </form> + my $extresourcesform=(<<ERFORM); + <form action="/adm/coursedocs" method="post" name="newext"> + $uploadtag + <input type="hidden" name="importdetail" value="" /> + <a class="LC_menubuttons_link" href="javascript:makenewext('newext');">$lt{'extr'}</a>$help{'Adding_External_Resource'} + </form> ERFORM + if ($allowed) { &update_paste_buffer($coursenum,$coursedom); my %lt=&Apache::lonlocal::texthash( @@ -3042,59 +3196,21 @@ ERFORM </form> HIDDENFORM } -# --------------------------------------------------------- Main tab structure - - my $activeClass = 1; - my $active = ''; - my %tabtitles = ( - main => { - Course => &mt('Main Course Documents'), - Community => &mt('Main Community Documents'), - }, - supplemental => { - Course => &mt('Supplemental Course Documents'), - Community => &mt('Supplemental Community Documents'), - }, - ); + +# Generate the tabs + &startContentScreen($r,($supplementalflag?'supdocs':'docs')); + + +# + + my $savefolderpath; + if ($allowed) { - $r->print('<ul class="LC_TabContentBigger" id="mainnav">'); - if (($standard) && ($allowed) && (!$forcesupplement) && (($env{'form.folderpath'}=~/^default/) || $env{'form.folderpath'}eq"" || ($env{'form.pagepath'}))) { - if($activeClass == 1){ - $active = 'class="active"'; - $activeClass = 0; - } - } - $r->print('<li '.$active - . ' onmouseover="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"' - . ' onclick="javascript:showPage(this,\'mainCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'main'}{$crstype}.'</b></a></li>'); - $active = ''; - if (!$forcestandard || ($env{'form.folderpath'}=~/^supplemental/)) { - if($activeClass == 1){ - $active = 'class="active"'; - } - } - $r->print('<li '.$active - .' onmouseover="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"' - .' onclick="javascript:showPage(this,\'supplCourseDocuments\',\'mainnav\',\'maincoursedoc\');"><a href="#"><b>'.$tabtitles{'supplemental'}{$crstype}.'</b></a></li>'); - $r->print('</ul>'); - } else { - $r->print('<br />'); - } - $r->print('<div class="LC_Box" style="clear:both;margin:0;">' - .'<div id="maincoursedoc" style="margin:0 0;padding:0 0;">'); -# --------------------------------------------------------- Standard documents - my $savefolderpath; - $active = 'style="display: none;"'; - if($activeClass == 0){ - $active = 'style="display: block;"'; - } - if ($allowed) { - $r->print('<div class="LC_ContentBox" id="mainCourseDocuments" '.$active.'>'); my $folder=$env{'form.folder'}; - if ($folder eq '' || $folder=~/^supplemental/) { + if ($folder eq '' || $supplementalflag) { $folder='default'; $savefolderpath = $env{'form.folderpath'}; - $env{'form.folderpath'}='default&'.&escape($tabtitles{'main'}{$crstype}); + $env{'form.folderpath'}='default&'.&escape(&mt('Content')); $uploadtag = '<input type="hidden" name="folderpath" value="'. &HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" />'; } @@ -3123,7 +3239,7 @@ HIDDENFORM my $recoverform=(<<RFORM); <form action="/adm/groupsort" method="post" name="recover"> - <a class="LC_menubuttons_link" href="javascript:groupopen('$readfile',1,0)">$lt{'reco'}</a> + <a class="LC_menubuttons_link" href="javascript:groupopen('$readfile',1)">$lt{'reco'}</a> </form> RFORM @@ -3228,11 +3344,14 @@ NROSTFORM my $specialdocumentsform; my @specialdocumentsforma; +my $gradingform; +my @gradingforma; +my $communityform; +my @communityforma; my $newfolderform; my $newfolderb; - unless ($env{'form.pagepath'}) { - my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); my $newpageform=(<<NPFORM); <form action="/adm/coursedocs" method="post" name="newpage"> @@ -3279,81 +3398,78 @@ NGFFORM @specialdocumentsforma=( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/page.png" alt="'.$lt{newp}.'" onclick="javascript:makenewpage(document.newpage,\''.$pageseq.'\');" />'=>$newpageform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/syllabus.png" alt="'.$lt{syll}.'" onclick="document.newsyl.submit()" />'=>$newsylform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform}, - ); + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform}, + ); + $specialdocumentsform = &create_form_ul(&create_list_elements(@specialdocumentsforma)); + my @importdoc = ( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'newext\');" />'=>$extresourcesform}, {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" onclick="javascript:makeims();" />'=>$imspform},); - $fileuploadform = create_form_ul(create_list_elements(@importdoc)) . '<hr/>' . $fileuploadform; + $fileuploadform = &create_form_ul(&create_list_elements(@importdoc)) . '<hr id="cc_hrule" style="width:0px;text-align:left;margin-left:0" />' . $fileuploadform; - push @specialdocumentsforma, ({'<img class="LC_noBorder LC_middle" src="/res/adm/pages/navigation.png" alt="'.$lt{navc}.'" onclick="document.newnav.submit()" />'=>$newnavform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simple.png" alt="'.$lt{sipa}.'" onclick="javascript:makesmppage();" />'=>$newsmppageform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform},); + @gradingforma=( + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform}, + + ); + $gradingform = &create_form_ul(&create_list_elements(@gradingforma)); + + @communityforma=( + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/bchat.png" alt="'.$lt{bull}.'" onclick="javascript:makebulboard();" />'=>$newbulform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/myaboutme.png" alt="'.$lt{mypi}.'" onclick="javascript:makebulboard();" />'=>$newaboutmeform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/aboutme.png" alt="'.$lt{abou}.'" onclick="javascript:makeabout();" />'=>$newaboutsomeoneform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/clst.png" alt="'.$lt{rost}.'" onclick="document.newroster.submit()" />'=>$newrosterform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/groupportfolio.png" alt="'.$lt{grpo}.'" onclick="document.newgroupfiles.submit()" />'=>$newgroupfileform}, + ); + $communityform = &create_form_ul(&create_list_elements(@communityforma)); - $specialdocumentsform = create_form_ul(create_list_elements(@specialdocumentsforma)); - } -if($env{'form.pagepath'}) { - - @specialdocumentsforma=( - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.&mt('Simple Problem').'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.&mt('Score Upload Form').'" onclick="javascript:makeexamupload();" />'=>$newexuploadform} - ); - $specialdocumentsform= create_form_ul(create_list_elements(@specialdocumentsforma)); -} my @tools = ( # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" />'=>$extresourcesform}, # {'<img class="LC_noBorder LC_middle" align="left" src="/res/adm/pages/ims.png" alt="'.$lt{imsf}.'" />'=>$imspform}, - {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1,0)" />'=>$recoverform}, + {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/recover.png" alt="'.$lt{reco}.'" onclick="javascript:groupopen(\''.$readfile.'\',1)" />'=>$recoverform}, ); my %orderhash = ( 'aa' => ['Import Documents',$fileuploadform], 'bb' => ['Published Resources',$simpleeditdefaultform], - 'cc' => ['Special Documents',$specialdocumentsform], - 'dd' => ['Tools', create_form_ul(create_list_elements(@tools)).&generate_admin_options(\%help,\%env)], + 'cc' => ['Grading Resources',$gradingform], + 'ff' => ['Tools', &create_form_ul(&create_list_elements(@tools)).&generate_admin_options(\%help,\%env)], ); -unless($env{'form.pagepath'}) { +unless ($env{'form.pagepath'}) { $orderhash{'00'} = ['Newfolder',$newfolderform]; + $orderhash{'dd'} = ['Community Resources',$communityform]; + $orderhash{'ee'} = ['Special Documents',$specialdocumentsform]; } -my $tid='1'; $hadchanges=0; - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); - if ($error) { - $r->print('<p><span class="LC_error">'.$error.'</span></p>'); - } - if ($hadchanges) { - &mark_hash_old(); - } + unless ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag,\%orderhash); + if ($error) { + $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + } + if ($hadchanges) { + &mark_hash_old(); + } + + &changewarning($r,''); + } + } - &changewarning($r,''); -$r->print(&generate_edit_table($tid,\%orderhash)); +# Supplemental documents start here -$r->print('</div>'); - } -# ----------------------------------------------------- Supplemental documents - $active = 'style="display: none;"'; - if($activeClass == 1){ - $active = 'style="display: block;"'; - } - $r->print('<div class="LC_ContentBox" id="supplCourseDocuments" '.$active.'>'); my $folder=$env{'form.folder'}; - unless ($folder=~/^supplemental/) { + unless ($supplementalflag) { $folder='supplemental'; } if ($folder =~ /^supplemental$/ && (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { - $env{'form.folderpath'} = 'supplemental&'. - &escape(&mt('Supplemental '.$crstype.' Documents')); + $env{'form.folderpath'} = &supplemental_base(); } elsif ($allowed) { $env{'form.folderpath'} = $savefolderpath; } @@ -3382,7 +3498,7 @@ $r->print('</div>'); <input type="hidden" name="folderpath" value="$path" /> <input type="hidden" name="cmd" value="upload_supplemental" /> SUPDOCFORM - $supupdocform .= create_form_ul(Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>"; + $supupdocform .= &create_form_ul(&Apache::lonhtmlcommon::htmltag('li',$supupdocformbtn,{class => 'LC_menubuttons_inline_text'}))."</form>"; my $supnewfolderform=(<<SNFFORM); <form action="/adm/coursedocs" method="post" name="supnewfolder"> @@ -3437,30 +3553,28 @@ my @supimportdoc = ( {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:makenewext(\'supnewext\');" />' =>$supnewextform}, ); -$supupdocform = create_form_ul(create_list_elements(@supimportdoc)) . '<hr/>' . $supupdocform; +$supupdocform = &create_form_ul(&create_list_elements(@supimportdoc)) . '<hr id="ee_hrule" style="width:0px;text-align:left;margin-left:0" />' . $supupdocform; my %suporderhash = ( '00' => ['Supnewfolder', $supnewfolderform], 'ee' => ['Import Documents',$supupdocform], - 'ff' => ['Special Documents',create_form_ul(create_list_elements(@specialdocs))] + 'ff' => ['Special Documents',&create_form_ul(&create_list_elements(@specialdocs))] ); - - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); - if ($error) { - $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + if ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag,\%suporderhash); + if ($error) { + $r->print('<p><span class="LC_error">'.$error.'</span></p>'); + } } - my $tid='2'; - $r->print(&generate_edit_table($tid,\%suporderhash)); - } else { - my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype); + } elsif ($supplementalflag) { + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$crstype, + $supplementalflag); if ($error) { $r->print('<p><span class="LC_error">'.$error.'</span></p>'); } } - -$r->print('</div>'); -$r->print('</div></div>'); - + &endContentScreen($r); if ($allowed) { $r->print(' @@ -3472,7 +3586,7 @@ $r->print('</div></div>'); </form>'); } } else { - unless ($upload_result eq 'phasetwo') { + unless ($uploadphase) { # -------------------------------------------------------- This is showdoc mode $r->print("<h1>".&mt('Uploaded Document').' - '. &Apache::lonnet::gettitle($r->uri).'</h1><p>'. @@ -3485,6 +3599,42 @@ $r->print('</div></div>'); return OK; } +sub embedded_form_elems { + my ($phase,$primaryurl,$newidx) = @_; + my $folderpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + return <<STATE; + <input type="hidden" name="folderpath" value="$folderpath" /> + <input type="hidden" name="cmd" value="upload_embedded" /> + <input type="hidden" name="newidx" value="$newidx" /> + <input type="hidden" name="phase" value="$phase" /> + <input type="hidden" name="primaryurl" value="$primaryurl" /> +STATE +} + +sub embedded_destination { + my $folder=$env{'form.folder'}; + my $destination = 'docs/'; + if ($folder =~ /^supplemental/) { + $destination = 'supplemental/'; + } + if (($folder eq 'default') || ($folder eq 'supplemental')) { + $destination .= 'default/'; + } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) { + $destination .= $2.'/'; + } + $destination .= $env{'form.newidx'}; + my $dir_root = '/userfiles'; + return ($destination,$dir_root); +} + +sub return_to_editor { + my $actionurl = '/adm/coursedocs'; + return '<p><form name="backtoeditor" method="post" action="'.$actionurl.'" />'."\n". + '<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /></form>'."\n". + '<a href="javascript:document.backtoeditor.submit();">'.&mt('Return to Editor'). + '</a></p>'; +} + sub generate_admin_options { my ($help_ref,$env_ref) = @_; my %lt=&Apache::lonlocal::texthash( @@ -3515,13 +3665,13 @@ sub generate_admin_options { {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/document-properties.png" alt="'.$lt{sl}.'" onclick=\'javascript:injectData(document.courseverify, "dummy", "docslog", "'.$lt{'sl'}.'")\' />' =>"<a class='LC_menubuttons_link' href='javascript:injectData(document.courseverify, \"dummy\", \"docslog\", \"$lt{'sl'}\")'>$lt{'sl'}</a>"}, ); - return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.create_form_ul(create_list_elements(@list)).'</form>'; + return '<form action="/adm/coursedocs" method="post" name="courseverify"><input type="hidden" id="dummy" />'.&create_form_ul(&create_list_elements(@list)).'</form>'; } sub generate_edit_table { - my ($tid,$orderhash_ref) = @_; + my ($tid,$orderhash_ref,$to_show) = @_; return unless(ref($orderhash_ref) eq 'HASH'); my %orderhash = %{$orderhash_ref}; my $form; @@ -3530,31 +3680,35 @@ sub generate_edit_table { if($env{'form.active'} ne ''){ $activetab = $env{'form.active'}; } - $form = '<div class="LC_Box" style="margin-right:0">'; - $form .= '<ul id="navigation'.$tid.'" class="LC_TabContent">'; - foreach my $name (sort(keys(%orderhash))){ + $form = '<div class="LC_Box" style="margin:0;">'. + '<ul id="navigation'.$tid.'" class="LC_TabContent">'; + foreach my $name (reverse(sort(keys(%orderhash)))) { if($name ne '00'){ if($activetab eq '' || $activetab ne $name){ $active = ''; }elsif($activetab eq $name){ $active = 'class="active"'; } - $form .= '<li '.$active + $form .= '<li style="float:right" '.$active .' onmouseover="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"' .' onclick="javascript:showPage(this, \''.$name.$tid.'\', \'navigation'.$tid.'\',\'content'.$tid.'\');"><a href="javascript:;"><b>'.&mt(${$orderhash{$name}}[0]).'</b></a></li>'; } else { - $form .= '<li '.$active.'>'.${$orderhash{$name}}[1].'</li>'; + $form .= '<li '.$active.' style="float:right">'.${$orderhash{$name}}[1].'</li>'; } } $form .= '</ul>'; - $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; clear: both;">'; + $form .= '<div id="content'.$tid.'" style="padding: 0 0; margin: 0 0; overflow: hidden; clear:right">'; + + if ($to_show ne '') { + $form .= '<div style="padding:0;margin:0;float:left">'.$to_show.'</div>'; + } foreach my $field (keys(%orderhash)){ if($field ne '00'){ if($activetab eq '' || $activetab ne $field){ - $active = 'style="display: none;"'; + $active = 'style="display: none;float:left"'; }elsif($activetab eq $field){ - $active = 'style="display:block;"'; + $active = 'style="display:block;float:left"'; } $form .= '<div id="'.$field.$tid.'"' .' class="LC_ContentBox" '.$active.'>'.${$orderhash{$field}}[1] @@ -3574,7 +3728,7 @@ sub editing_js { t_mnf => 'New Folder', p_mnp => 'Name of New Page', t_mnp => 'New Page', - p_mxu => 'Title for the Uploaded Score', + p_mxu => 'Title for the External Score', p_msp => 'Name of Simple Course Page', p_msb => 'Title for the Problem', p_mdb => 'Title for the Drop Box', @@ -3603,7 +3757,7 @@ sub editing_js { } } my $toplevelmain = 'default&Main%20'.$crstype.'%20Documents'; - my $toplevelsupp = 'supplemental&Supplemental%20'.$crstype.'%20Documents'; + my $toplevelsupp = &supplemental_base(); return <<ENDNEWSCRIPT; function makenewfolder(targetform,folderseq) { @@ -3833,6 +3987,7 @@ function showPage(current, pageId, nav, current.className = 'active'; currentData = document.getElementById(pageId); currentData.style.display = 'block'; + activeTab = pageId; if (nav == 'mainnav') { var storedpath = "$docs_folderpath"; if (storedpath == '') { @@ -3867,6 +4022,7 @@ function showPage(current, pageId, nav, } } } + resize_contentdiv('contentscroll','1','0'); return false; } @@ -3879,6 +4035,197 @@ function injectData(current, hiddenField ENDNEWSCRIPT } + +sub resize_contentdiv_js { + my ($tabidstr) = @_; + my $viewport_js = &Apache::loncommon::viewport_geometry_js(); + return <<ENDRESIZESCRIPT; + +window.onresize=resizeContentEditor; + +var activeTab; + +$viewport_js + +function resize_contentdiv(scrollboxname,chkw,chkh) { + var scrollboxid = 'div_'+scrollboxname; + var scrolltableid = 'table_'+scrollboxname; + var scrollbox; + var scrolltable; + + if (document.getElementById("contenteditor") == null) { + return; + } + + if (document.getElementById(scrollboxid) == null) { + return; + } else { + scrollbox = document.getElementById(scrollboxid); + } + + if (document.getElementById(scrolltableid) == null) { + return; + } else { + scrolltable = document.getElementById(scrolltableid); + } + + init_geometry(); + var vph = Geometry.getViewportHeight(); + var vpw = Geometry.getViewportWidth(); + + var alltabs = ['$tabidstr']; + var listwchange; + if (chkw == 1) { + var contenteditorw = document.getElementById("contenteditor").offsetWidth; + var contentlistw; + var contentlistid = document.getElementById("contentlist"); + if (contentlistid != null) { + contentlistw = document.getElementById("contentlist").offsetWidth; + } + var contentlistwstart = contentlistw; + + var scrollboxw = scrollbox.offsetWidth; + var scrollboxscrollw = scrollbox.scrollWidth; + + var offsetw = parseInt(vpw * 0.015); + var paddingw = parseInt(vpw * 0.09); + + var minscrollboxw = 250; + + var maxtabw = 0; + var actabw = 0; + for (var i=0; i<alltabs.length; i++) { + if (activeTab == alltabs[i]) { + actabw = document.getElementById(alltabs[i]).offsetWidth; + if (actabw > maxtabw) { + maxtabw = actabw; + } + } else { + if (document.getElementById(alltabs[i]) != null) { + var thistab = document.getElementById(alltabs[i]); + thistab.style.visibility = 'hidden'; + thistab.style.display = 'block'; + var tabw = document.getElementById(alltabs[i]).offsetWidth; + thistab.style.display = 'none'; + thistab.style.visibility = ''; + if (tabw > maxtabw) { + maxtabw = tabw; + } + } + } + } + + if (maxtabw > 0) { + var newscrollboxw; + if (maxtabw+paddingw+scrollboxscrollw<contenteditorw) { + newscrollboxw = contenteditorw-paddingw-maxtabw; + if (newscrollboxw < minscrollboxw) { + newscrollboxw = minscrollboxw; + } + scrollbox.style.width = newscrollboxw+"px"; + if (newscrollboxw != scrollboxw) { + var newcontentlistw = newscrollboxw-offsetw; + contentlistid.style.width = newcontentlistw+"px"; + } + } else { + newscrollboxw = contenteditorw-paddingw-maxtabw; + if (newscrollboxw < minscrollboxw) { + newscrollboxw = minscrollboxw; + } + scrollbox.style.width = newscrollboxw+"px"; + if (newscrollboxw != scrollboxw) { + var newcontentlistw = newscrollboxw-offsetw; + contentlistid.style.width = newcontentlistw+"px"; + } + } + + if (newscrollboxw != scrollboxw) { + var newscrolltablew = newscrollboxw+offsetw; + scrolltable.style.width = newscrolltablew+"px"; + } + } + + if (contentlistid.offsetWidth != contentlistwstart) { + listwchange = 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"; + } + } + } + } + } + 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; + + if (scrollboxscrollheight <= scrollboxheight) { + if ((contentlistheight+offsetv)<scrollboxheight) { + newscrollheight = contentlistheight+offsetv; + scrollbox.style.height = newscrollheight+"px"; + } + } + } + return; +} + +function resizeContentEditor() { + var timer; + clearTimeout(timer) + timer=setTimeout('resize_contentdiv("contentscroll","1","1")',500); +} + +ENDRESIZESCRIPT + return; +} + 1; __END__