Annotation of loncom/interface/londocs.pm, revision 1.242

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.242   ! www         4: # $Id: londocs.pm,v 1.241 2006/07/20 18:37:14 www Exp $
1.1       www         5: #
1.3       www         6: # Copyright Michigan State University Board of Trustees
1.1       www         7: #
1.3       www         8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
1.1       www         9: #
1.3       www        10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
1.1       www        14: #
1.3       www        15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
                     28: 
1.2       www        29: package Apache::londocs;
1.1       www        30: 
                     31: use strict;
1.28      www        32: use Apache::Constants qw(:common :http);
1.158     raeburn    33: use Apache::imsexport;
1.4       www        34: use Apache::lonnet;
                     35: use Apache::loncommon;
1.7       www        36: use Apache::lonratedt;
                     37: use Apache::lonratsrv;
1.15      www        38: use Apache::lonxml;
1.74      www        39: use Apache::loncreatecourse;
1.138     raeburn    40: use Apache::lonnavmaps;
1.38      www        41: use HTML::Entities;
1.27      www        42: use GDBM_File;
1.81      www        43: use Apache::lonlocal;
1.143     raeburn    44: use Cwd;
1.228     www        45: use lib '/home/httpd/lib/perl/';
                     46: use LONCAPA;
1.7       www        47: 
1.8       www        48: my $iconpath;
1.7       www        49: 
1.27      www        50: my %hash;
                     51: 
                     52: my $hashtied;
1.29      www        53: my %alreadyseen=();
1.27      www        54: 
1.40      www        55: my $hadchanges;
                     56: 
1.47      www        57: # Available help topics
                     58: 
                     59: my %help=();
                     60: 
1.7       www        61: # Mapread read maps into lonratedt::global arrays 
1.10      www        62: # @order and @resources, determines status
1.7       www        63: # sets @order - pointer to resources in right order
                     64: # sets @resources - array with the resources with correct idx
                     65: #
                     66: 
                     67: sub mapread {
                     68:     my ($coursenum,$coursedom,$map)=@_;
                     69:     return
                     70:       &Apache::lonratedt::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
                     71:                                 $map);
                     72: }
                     73: 
                     74: sub storemap {
                     75:     my ($coursenum,$coursedom,$map)=@_;
1.104     albertel   76:     my ($outtext,$errtext)=
1.7       www        77:       &Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
1.15      www        78:                                 $map,1);
1.104     albertel   79:     if ($errtext) { return ($errtext,2); }
                     80:     
                     81:     $hadchanges=1;
                     82:     return ($errtext,0);
1.7       www        83: }
                     84: 
1.74      www        85: # ----------------------------------------- Return hash with valid author names
                     86: 
                     87: sub authorhosts {
                     88:     my %outhash=();
                     89:     my $home=0;
                     90:     my $other=0;
1.174     albertel   91:     foreach (keys %env) {
1.74      www        92: 	if ($_=~/^user\.role\.(au|ca)\.(.+)$/) {
                     93: 	    my $role=$1;
                     94: 	    my $realm=$2;
1.174     albertel   95: 	    my ($start,$end)=split(/\./,$env{$_});
1.74      www        96: 	    if (($start) && ($start>time)) { next; }
                     97: 	    if (($end) && (time>$end)) { next; }
                     98: 	    my $ca; my $cd;
                     99: 	    if ($1 eq 'au') {
1.174     albertel  100: 		$ca=$env{'user.name'};
                    101: 		$cd=$env{'user.domain'};
1.74      www       102: 	    } else {
                    103: 		($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
                    104: 	    }
1.107     albertel  105: 	    my $allowed=0;
                    106: 	    my $myhome=&Apache::lonnet::homeserver($ca,$cd);
                    107: 	    my @ids=&Apache::lonnet::current_machine_ids();
                    108: 	    foreach my $id (@ids) { if ($id eq $myhome) { $allowed=1; } }
                    109: 	    if ($allowed) {
1.74      www       110: 		$home++;
                    111: 		$outhash{'home_'.$ca.'@'.$cd}=1;
                    112: 	    } else {
1.107     albertel  113: 		$outhash{'otherhome_'.$ca.'@'.$cd}=$myhome;
1.74      www       114: 		$other++;
                    115: 	    }
                    116: 	}
                    117:     }
                    118:     return ($home,$other,%outhash);
                    119: }
                    120: # ------------------------------------------------------ Generate "dump" button
                    121: 
                    122: sub dumpbutton {
                    123:     my ($home,$other,%outhash)=&authorhosts();
1.230     albertel  124:     my $type = &Apache::loncommon::course_type();
1.74      www       125:     if ($home+$other==0) { return ''; }
                    126:     my $output='</td><td bgcolor="#DDDDCC">';
                    127:     if ($home) {
                    128: 	return '</td><td bgcolor="#DDDDCC">'.
1.81      www       129: 	    '<input type="submit" name="dumpcourse" value="'.
1.230     albertel  130: 	    &mt('Dump '.$type.' DOCS to Construction Space').'" />'.
1.130     www       131: 	    &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs');
1.74      www       132:     } else {
                    133: 	return'</td><td bgcolor="#DDDDCC">'.
1.230     albertel  134:      &mt('Dump '.$type.
                    135: 	 ' DOCS to Construction Space: available on other servers');
1.74      www       136:     }
                    137: }
                    138: 
1.164     albertel  139: sub clean {
                    140:     my ($title)=@_;
                    141:     $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs;
                    142:     return $title;	
                    143: }
1.74      www       144: # -------------------------------------------------------- Actually dump course
                    145: 
                    146: sub dumpcourse {
1.224     albertel  147:     my ($r) = @_;
1.230     albertel  148:     my $type = &Apache::loncommon::course_type();
                    149:     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
                    150: 	      '<form name="dumpdoc" method="post">');
1.74      www       151:     my ($home,$other,%outhash)=&authorhosts();
1.75      www       152:     unless ($home) { return ''; }
1.174     albertel  153:     my $origcrsid=$env{'request.course.id'};
1.76      www       154:     my %origcrsdata=&Apache::lonnet::coursedescription($origcrsid);
1.174     albertel  155:     if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
1.76      www       156: # Do the dumping
1.174     albertel  157: 	unless ($outhash{'home_'.$env{'form.authorspace'}}) { return ''; }
                    158: 	my ($ca,$cd)=split(/\@/,$env{'form.authorspace'});
1.87      www       159: 	$r->print('<h3>'.&mt('Copying Files').'</h3>');
1.174     albertel  160: 	my $title=$env{'form.authorfolder'};
1.164     albertel  161: 	$title=&clean($title);
1.79      www       162: 	my %replacehash=();
1.174     albertel  163: 	foreach (keys %env) {
1.79      www       164: 	    if ($_=~/^form\.namefor\_(.+)/) {
1.174     albertel  165: 		$replacehash{$1}=$env{$_};
1.79      www       166: 	    }
                    167: 	}
1.174     albertel  168: 	my $crs='/uploaded/'.$env{'request.course.id'}.'/';
1.79      www       169: 	$crs=~s/\_/\//g;
                    170: 	foreach (keys %replacehash) {
                    171: 	    my $newfilename=$title.'/'.$replacehash{$_};
1.205     albertel  172: 	    $newfilename=~s/\.(\w+)$//;
                    173: 	    my $ext=$1;
1.164     albertel  174: 	    $newfilename=&clean($newfilename);
1.205     albertel  175: 	    $newfilename.='.'.$ext;
1.79      www       176: 	    my @dirs=split(/\//,$newfilename);
                    177: 	    my $path='/home/'.$ca.'/public_html';
                    178: 	    my $makepath=$path;
                    179: 	    my $fail=0;
                    180: 	    for (my $i=0;$i<$#dirs;$i++) {
                    181: 		$makepath.='/'.$dirs[$i];
                    182: 		unless (-e $makepath) { 
                    183: 		    unless(mkdir($makepath,0777)) { $fail=1; } 
                    184: 		}
                    185: 	    }
                    186: 	    $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
                    187: 	    if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
                    188: 		if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
                    189: 		    print $fh &Apache::loncreatecourse::rewritefile(
1.174     albertel  190:          &Apache::loncreatecourse::readfile($env{'request.course.id'},$_),
1.79      www       191: 				     (%replacehash,$crs => '')
                    192: 								    );
                    193: 		} else {
                    194: 		    print $fh
1.174     albertel  195:          &Apache::loncreatecourse::readfile($env{'request.course.id'},$_);
1.79      www       196: 		       }
                    197: 		$fh->close();
                    198: 	    } else {
                    199: 		$fail=1;
                    200: 	    }
                    201: 	    if ($fail) {
                    202: 		$r->print('<font color="red">fail</font>');
                    203: 	    } else {
                    204: 		$r->print('<font color="green">ok</font>');
                    205: 	    }
                    206: 	}
1.76      www       207:     } else {
                    208: # Input form
                    209: 	unless ($home==1) {
                    210: 	    $r->print(
1.81      www       211: 		      '<h3>'.&mt('Select the Construction Space').'</h3><select name="authorspace">');
1.76      www       212: 	}
                    213: 	foreach (sort keys %outhash) {
                    214: 	    if ($_=~/^home_(.+)$/) {
                    215: 		if ($home==1) {
                    216: 		    $r->print(
                    217: 		  '<input type="hidden" name="authorspace" value="'.$1.'" />');
                    218: 		} else {
1.133     www       219: 		    $r->print('<option value="'.$1.'">'.$1.' - '.
                    220: 			      &Apache::loncommon::plainname(split(/\@/,$1)).'</option>');
1.76      www       221: 		}
                    222: 	    }
                    223: 	}
                    224: 	unless ($home==1) {
                    225: 	    $r->print('</select>');
                    226: 	}
                    227: 	my $title=$origcrsdata{'description'};
1.227     albertel  228: 	$title=~s/[\/\s]+/\_/gs;
1.164     albertel  229: 	$title=&clean($title);
1.81      www       230: 	$r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
1.76      www       231: 	&tiehash();
1.81      www       232: 	$r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
1.76      www       233: 	foreach (&Apache::loncreatecourse::crsdirlist($origcrsid,'userfiles')) {
1.78      www       234: 	    $r->print('<tr><td>'.$_.'</td>');
                    235: 	    my ($ext)=($_=~/\.(\w+)$/);
                    236: 	    my $title=$hash{'title_'.$hash{
                    237: 		'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}};
1.163     albertel  238: 	    $title=~s/&colon;/:/g;
1.78      www       239: 	    $r->print('<td>'.($title?$title:'&nbsp;').'</td>');
1.235     albertel  240: 	    if (!$title) {
1.78      www       241: 		$title=$_;
1.235     albertel  242: 	    } else {
                    243: 		$title=~s|/|_|g;
1.78      www       244: 	    }
                    245: 	    $title=~s/\.(\w+)$//;
1.164     albertel  246: 	    $title=&clean($title);
1.78      www       247: 	    $title.='.'.$ext;
1.79      www       248: 	    $r->print("\n<td><input type='text' size='60' name='namefor_".$_."' value='".$title."' /></td></tr>\n");
1.76      www       249: 	}
1.78      www       250: 	$r->print("</table>\n");
1.76      www       251: 	&untiehash();
                    252: 	$r->print(
1.229     raeburn   253:   '<p><input type="submit" name="dumpcourse" value="'.&mt('Dump [_1] DOCS',$type).'" /></p></form>');
1.75      www       254:     }
1.74      www       255: }
1.76      www       256: 
1.138     raeburn   257: # ------------------------------------------------------ Generate "export" button
                    258: 
                    259: sub exportbutton {
1.230     albertel  260:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   261:     return '</td><td bgcolor="#DDDDCC">'.
                    262:             '<input type="submit" name="exportcourse" value="'.
1.230     albertel  263:             &mt('Export '.$type.' to IMS').'" />'.
1.203     raeburn   264:     &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs');
1.138     raeburn   265: }
                    266: 
                    267: sub exportcourse {
                    268:     my $r=shift;
1.230     albertel  269:     my $type = &Apache::loncommon::course_type();
1.138     raeburn   270:     my %discussiontime = &Apache::lonnet::dump('discussiontimes',
1.174     albertel  271:                                                $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});
1.138     raeburn   272:     my $numdisc = keys %discussiontime;
                    273:     my $navmap = Apache::lonnavmaps::navmap->new();
                    274:     my $it=$navmap->getIterator(undef,undef,undef,1,undef,undef);
                    275:     my $curRes;
1.143     raeburn   276:     my $outcome;
1.138     raeburn   277: 
                    278:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    279:                                             ['finishexport']);
1.174     albertel  280:     if ($env{'form.finishexport'}) {
1.138     raeburn   281:         &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                    282:                                             ['archive','discussion']);
                    283: 
1.175     albertel  284:         my @exportitems = &Apache::loncommon::get_env_multiple('form.archive');
                    285:         my @discussions = &Apache::loncommon::get_env_multiple('form.discussion');
1.143     raeburn   286:         if (@exportitems == 0 && @discussions == 0) {
                    287:             $outcome = '<br />As you did not select any content items or discussions for export, an IMS package has not been created.  Please <a href="javascript:history.go(-1)">go back</a> to select either content items or discussions for export';
                    288:         } else {
                    289:             my $now = time;
                    290:             my %symbs;
                    291:             my $manifestok = 0;
                    292:             my $imsresources;
                    293:             my $tempexport;
                    294:             my $copyresult;
                    295:             my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport);
                    296:             if ($manifestok) {
1.157     raeburn   297:                 &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest);
1.143     raeburn   298:                 close($ims_manifest);
                    299: 
                    300: #Create zip file in prtspool
                    301:                 my $imszipfile = '/prtspool/'.
1.174     albertel  302:                 $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.143     raeburn   303:                    time.'_'.rand(1000000000).'.zip';
                    304:                 my $cwd = &Cwd::getcwd();
                    305:                 my $imszip = '/home/httpd/'.$imszipfile;
                    306:                 chdir $tempexport;
                    307:                 open(OUTPUT, "zip -r $imszip *  2> /dev/null |");
                    308:                 close(OUTPUT);
                    309:                 chdir $cwd;
1.230     albertel  310:                 $outcome .= &mt('Download the zip file from <a href="[_1]">IMS '.lc($type).' archive</a><br />',$imszipfile,);
1.143     raeburn   311:                 if ($copyresult) {
                    312:                     $outcome .= 'The following errors occurred during export - '.$copyresult;
1.138     raeburn   313:                 }
1.143     raeburn   314:             } else {
                    315:                 $outcome = '<br />Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.<br />';
1.138     raeburn   316:             }
                    317:         }
1.229     raeburn   318:         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
1.143     raeburn   319:         $r->print($outcome);
1.224     albertel  320:         $r->print(&Apache::loncommon::end_page());
1.138     raeburn   321:     } else {
                    322:         my $display;
                    323:         $display = '<form name="exportdoc" method="post">'."\n";
1.230     albertel  324:         $display .= &mt('Choose which items you wish to export from your '.$type.'.<br /><br />');
1.138     raeburn   325:         $display .= '<table border="0" cellspacing="0" cellpadding="3">'.
                    326:                     '<tr><td><fieldset><legend>&nbsp;<b>Content items</b></legend>'.
                    327:                     '<input type="button" value="check all" '.
                    328:                     'onclick="javascript:checkAll(document.exportdoc.archive)" />'.
                    329:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    330:                     ' onclick="javascript:uncheckAll(document.exportdoc.archive)" /></fieldset></td>'.
                    331:                     '<td>&nbsp;</td><td>&nbsp;</td>'.
                    332:                     '<td align="right"><fieldset><legend>&nbsp;<b>Discussion posts'.
                    333:                     '</b></legend><input type="button" value="check all"'.
                    334:                     ' onclick="javascript:checkAll(document.exportdoc.discussion)" />'.
                    335:                     '&nbsp;&nbsp;<input type="button" value="uncheck all"'.
                    336:                     ' onclick="javascript:uncheckAll(document.exportdoc.discussion)" /></fieldset></td>'.
                    337:                     '</tr></table>';
                    338:         my $curRes;
                    339:         my $depth = 0;
                    340:         my $count = 0;
                    341:         my $boards = 0;
                    342:         my $startcount = 5;
                    343:         my %parent = ();
                    344:         my %children = ();
                    345:         my $lastcontainer = $startcount;
                    346:         my @bgcolors = ('#F6F6F6','#FFFFFF');
                    347:         $display .= '<table cellspacing="0"><tr>'.
                    348:             '<td><b>Export content item?<br /></b></td><td>&nbsp;</td><td align="right">'."\n";
                    349:         if ($numdisc > 0) {
                    350:             $display.='<b>Export&nbsp;discussion posts?</b>'."\n";
                    351:         }
                    352:         $display.='&nbsp;</td></tr>';
                    353:         while ($curRes = $it->next()) {
                    354:             if (ref($curRes)) {
                    355:                 $count ++;
                    356:             }
                    357:             if ($curRes == $it->BEGIN_MAP()) {
                    358:                 $depth++;
                    359:                 $parent{$depth} = $lastcontainer;
                    360:             }
                    361:             if ($curRes == $it->END_MAP()) {
                    362:                 $depth--;
                    363:                 $lastcontainer = $parent{$depth};
                    364:             }
                    365:             if (ref($curRes)) {
                    366:                 my $symb = $curRes->symb();
1.158     raeburn   367:                 my $ressymb = $symb;
                    368:                 if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    369:                     unless ($ressymb =~ m|adm/wrapper/adm|) {
                    370:                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    371:                     }
                    372:                 }
1.138     raeburn   373:                 my $color = $count%2;
                    374:                 $display .='<tr bgcolor='.$bgcolors[$color].'><td>'."\n".
                    375:                     '<input type="checkbox" name="archive" value="'.$count.'" ';
                    376:                 if (($curRes->is_sequence()) || ($curRes->is_page())) {
                    377:                     my $checkitem = $count + $boards + $startcount;
                    378:                     $display .= 'onClick="javascript:propagateCheck('."'$checkitem'".')"';
                    379:                 }
                    380:                 $display .= ' />'."\n";
                    381:                 for (my $i=0; $i<$depth; $i++) {
                    382:                     $display .= '<img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" /><img src="/adm/lonIcons/whitespace1.gif" width="25" height="1" alt="" border="0" />'."\n";
                    383:                 }
                    384:                 if ($curRes->is_sequence()) {
                    385:                     $display .= '<img src="/adm/lonIcons/navmap.folder.open.gif">&nbsp;'."\n";
                    386:                     $lastcontainer = $count + $startcount + $boards;
                    387:                 } elsif ($curRes->is_page()) {
                    388:                     $display .= '<img src="/adm/lonIcons/navmap.page.open.gif">&nbsp;'."\n";
                    389:                     $lastcontainer = $count + $startcount + $boards;
                    390:                 }
                    391:                 my $currelem = $count+$boards+$startcount;
                    392:                 $children{$parent{$depth}} .= $currelem.':';
                    393:                 $display .= '&nbsp;'.$curRes->title().'</td>';
1.158     raeburn   394:                 if ($discussiontime{$ressymb} > 0) {
1.138     raeburn   395:                     $boards ++;
                    396:                     $currelem = $count+$boards+$startcount;
                    397:                     $display .= '<td>&nbsp;</td><td align="right"><input type="checkbox" name="discussion" value="'.$count.'" />&nbsp;</td>'."\n";
                    398:                 } else {
                    399:                     $display .= '<td colspan="2">&nbsp;</td>'."\n";
                    400:                 }
                    401:             }
                    402:         }
                    403:         my $scripttag = qq|
                    404: <script>
                    405: 
                    406: function checkAll(field) {
1.158     raeburn   407:     if (field.length > 0) {
                    408:         for (i = 0; i < field.length; i++) {
                    409:             field[i].checked = true ;
                    410:         }
                    411:     } else {
                    412:         field.checked = true
                    413:     }
1.138     raeburn   414: }
1.158     raeburn   415:                                                                                 
1.138     raeburn   416: function uncheckAll(field) {
1.158     raeburn   417:     if (field.length > 0) {
                    418:         for (i = 0; i < field.length; i++) {
                    419:             field[i].checked = false ;
                    420:         }
                    421:     } else {
                    422:         field.checked = false ;
                    423:     }
1.138     raeburn   424: }
                    425: 
                    426: function propagateCheck(item) {
                    427:     if (document.exportdoc.elements[item].checked == true) {
                    428:         containerCheck(item)
                    429:     }
                    430: } 
                    431: 
                    432: function containerCheck(item) {
                    433:     document.exportdoc.elements[item].checked = true
                    434:     var numitems = $count + $boards + $startcount
                    435:     var parents = new Array(numitems)
                    436:     for (var i=$startcount; i<numitems; i++) {
                    437:         parents[i] = new Array
                    438:     }
                    439:         |;
                    440: 
                    441:         foreach my $container (sort { $a <=> $b } keys %children) {
                    442:             my @contents = split/:/,$children{$container};
                    443:             for (my $i=0; $i<@contents; $i ++) {
                    444:                 $scripttag .= '    parents['.$container.']['.$i.'] = '.$contents[$i]."\n";
                    445:             }
                    446:         }
                    447: 
                    448:         $scripttag .= qq|
                    449:     if (parents[item].length > 0) {
                    450:         for (var j=0; j<parents[item].length; j++) {
                    451:             containerCheck(parents[item][j])
                    452:         }
                    453:      }   
                    454: }
                    455: 
                    456: </script>
                    457:         |;
1.229     raeburn   458: 	$r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
1.224     albertel  459: 						 $scripttag));
                    460: 	$r->print($display.'</table>'.
1.138     raeburn   461:                   '<p><input type="hidden" name="finishexport" value="1">'.
                    462:                   '<input type="submit" name="exportcourse" value="'.
1.230     albertel  463:                   &mt('Export '.$type.' DOCS').'" /></p></form>'.
1.224     albertel  464: 		  &Apache::loncommon::end_page());
1.138     raeburn   465:     }
                    466: }
                    467: 
1.143     raeburn   468: sub create_ims_store {
                    469:     my ($now,$manifestok,$outcome,$tempexport) = @_;
                    470:     $$tempexport = $Apache::lonnet::perlvar{'lonDaemons'}.'/tmp/ims_exports';
                    471:     my $ims_manifest;
                    472:     if (!-e $$tempexport) {
                    473:         mkdir($$tempexport,0700);
                    474:     }
                    475:     $$tempexport .= '/'.$now;
                    476:     if (!-e $$tempexport) {
                    477:         mkdir($$tempexport,0700);
                    478:     }
1.174     albertel  479:     $$tempexport .= '/'.$env{'user.domain'}.'_'.$env{'user.name'};
1.143     raeburn   480:     if (!-e $$tempexport) {
                    481:         mkdir($$tempexport,0700);
                    482:     }
1.159     raeburn   483:     if (!-e "$$tempexport/resources") {
                    484:         mkdir("$$tempexport/resources",0700);
                    485:     }
1.143     raeburn   486: # open manifest file
                    487:     my $manifest = '/imsmanifest.xml';
                    488:     my $manifestfilename = $$tempexport.$manifest;
                    489:     if ($ims_manifest = Apache::File->new('>'.$manifestfilename)) {
                    490:         $$manifestok=1;
                    491:         print $ims_manifest
                    492: '<?xml version="1.0" encoding="UTF-8"?>'."\n".
                    493: '<manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"'.
                    494: ' xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"'.
                    495: ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'.
1.174     albertel  496: ' identifier="MANIFEST-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   497: '  xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1imscp_v1p1.xsd'.
                    498: '  http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p2.xsd">'."\n".
1.199     raeburn   499: '  <metadata>
                    500:     <schema></schema>
                    501:     <imsmd:lom>
                    502:       <imsmd:general>
                    503:         <imsmd:identifier>'.$env{'request.course.id'}.'</imsmd:identifier>
                    504:         <imsmd:title>
                    505:           <imsmd:langstring xml:lang="en">'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</imsmd:langstring>
                    506:         </imsmd:title>
                    507:       </imsmd:general>
                    508:     </imsmd:lom>
                    509:   </metadata>'."\n".
1.174     albertel  510: '  <organizations default="ORG-'.$env{'request.course.id'}.'-'.$now.'">'."\n".
                    511: '    <organization identifier="ORG-'.$env{'request.course.id'}.'-'.$now.'"'.
1.143     raeburn   512: ' structure="hierarchical">'."\n".
1.199     raeburn   513: '      <title>'.$env{'course.'.$env{'request.course.id'}.'.description'}.'</title>'
1.143     raeburn   514:     } else {
                    515:         $$outcome .= 'An error occurred opening the IMS manifest file.<br />'
                    516: ;
                    517:     }
                    518:     return $ims_manifest;
                    519: }
                    520: 
                    521: sub build_package {
                    522:     my ($now,$navmap,$exportitems,$discussions,$outcome,$tempexport,$copyresult,$ims_manifest) = @_;
                    523: # first iterator to look for dependencies
                    524:     my $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    525:     my $curRes;
                    526:     my $count = 0;
                    527:     my $depth = 0;
                    528:     my $lastcontainer = 0;
                    529:     my %parent = ();
                    530:     my @dependencies = ();
1.174     albertel  531:     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                    532:     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.143     raeburn   533:     while ($curRes = $it->next()) {
                    534:         if (ref($curRes)) {
                    535:             $count ++;
                    536:         }
                    537:         if ($curRes == $it->BEGIN_MAP()) {
                    538:             $depth++;
                    539:             $parent{$depth} = $lastcontainer;
                    540:         }
                    541:         if ($curRes == $it->END_MAP()) {
                    542:             $depth--;
                    543:             $lastcontainer = $parent{$depth};
                    544:         }
                    545:         if (ref($curRes)) {
                    546:             if ($curRes->is_sequence() || $curRes->is_page()) {
                    547:                 $lastcontainer = $count;
                    548:             }
                    549:             if (grep/^$count$/,@$exportitems) {
                    550:                 &get_dependencies($exportitems,\%parent,$depth,\@dependencies);
                    551:             }
                    552:         }
                    553:     }
                    554: # second iterator to build manifest and store resources
                    555:     $it = $navmap->getIterator(undef,undef,undef,1,undef,undef);
                    556:     $depth = 0;
                    557:     my $prevdepth;
                    558:     $count = 0;
                    559:     my $imsresources;
                    560:     my $pkgdepth;
1.157     raeburn   561:     while ($curRes = $it->next()) {
                    562:         if ($curRes == $it->BEGIN_MAP()) {
                    563:             $prevdepth = $depth;
                    564:             $depth++;
                    565:         }
                    566:         if ($curRes == $it->END_MAP()) {
1.143     raeburn   567:             $prevdepth = $depth;
1.157     raeburn   568:             $depth--;
                    569:         }
                    570: 
                    571:         if (ref($curRes)) {
                    572:             $count ++;
                    573:             if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) {
                    574:                 my $symb = $curRes->symb();
                    575:                 my $isvisible = 'true';
                    576:                 my $resourceref;
                    577:                 if ($curRes->randomout()) {
                    578:                     $isvisible = 'false';
                    579:                 }
                    580:                 unless ($curRes->is_sequence()) {
1.174     albertel  581:                     $resourceref = 'identifierref="RES-'.$env{'request.course.id'}.'-'.$count.'"';
1.157     raeburn   582:                 }
1.199     raeburn   583:                 my $step = $prevdepth - $depth;
                    584:                 if (($step >= 0) && ($count > 1)) {
                    585:                     while ($step >= 0) {
                    586:                         print $ims_manifest "\n".'  </item>'."\n";
                    587:                         $step --;
                    588:                     }
1.157     raeburn   589:                 }
                    590:                 $prevdepth = $depth;
1.143     raeburn   591: 
1.157     raeburn   592:                 my $itementry =
1.174     albertel  593:               '<item identifier="ITEM-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   594:               '" isvisible="'.$isvisible.'" '.$resourceref.'>'.
                    595:               '<title>'.$curRes->title().'</title>';
1.157     raeburn   596:                 print $ims_manifest "\n".$itementry;
1.143     raeburn   597: 
1.157     raeburn   598:                 unless ($curRes->is_sequence()) {
                    599:                     my $content_file;
                    600:                     my @hrefs = ();
                    601:                     &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport);
                    602:                     if ($content_file) {
                    603:                         $imsresources .= "\n".
1.174     albertel  604:                      '   <resource identifier="RES-'.$env{'request.course.id'}.'-'.$count.
1.143     raeburn   605:                      '" type="webcontent" href="'.$content_file.'">'."\n".
                    606:                      '       <file href="'.$content_file.'" />'."\n";
1.157     raeburn   607:                         foreach (@hrefs) {
                    608:                             $imsresources .=
1.143     raeburn   609:                      '        <file href="'.$_.'" />'."\n";
1.157     raeburn   610:                         }
1.158     raeburn   611:                         if (grep/^$count$/,@$discussions) {
                    612:                             my $ressymb = $symb;
                    613:                             my $mode;
                    614:                             if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
                    615:                                 unless ($ressymb =~ m|adm/wrapper/adm|) {
                    616:                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                    617:                                 }
                    618:                                 $mode = 'board';
                    619:                             }
                    620:                             my %extras = (
                    621:                                           caller => 'imsexport',
1.159     raeburn   622:                                           tempexport => $tempexport.'/resources',
1.158     raeburn   623:                                           count => $count
                    624:                                          );
                    625:                             my $discresult = &Apache::lonfeedback::list_discussion($mode,undef,$ressymb,\%extras);
                    626:                         }
1.157     raeburn   627:                         $imsresources .= '    </resource>'."\n";
1.143     raeburn   628:                     }
                    629:                 }
1.157     raeburn   630:                 $pkgdepth = $depth;
1.143     raeburn   631:             }
                    632:         }
                    633:     }
1.157     raeburn   634:     while ($pkgdepth > 0) {
1.143     raeburn   635:         print $ims_manifest "    </item>\n";
                    636:         $pkgdepth --;
                    637:     }
                    638:     my $resource_text = qq|
                    639:     </organization>
                    640:   </organizations>
                    641:   <resources>
                    642:     $imsresources
                    643:   </resources>
                    644: </manifest>
                    645:     |;
                    646:     print $ims_manifest $resource_text;
                    647: }
                    648: 
                    649: sub get_dependencies {
                    650:     my ($exportitems,$parent,$depth,$dependencies) = @_;
                    651:     if ($depth > 1) {
1.157     raeburn   652:         if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) {
1.143     raeburn   653:             push @$dependencies, $$parent{$depth};
                    654:             if ($depth > 2) {
                    655:                 &get_dependencies($exportitems,$parent,$depth-1,$dependencies);
                    656:             }
                    657:         }
                    658:     }
                    659: }
                    660: 
                    661: sub process_content {
                    662:     my ($count,$curRes,$cdom,$cnum,$symb,$content_file,$href,$copyresult,$tempexport) = @_;
                    663:     my $content_type;
                    664:     my $message;
1.158     raeburn   665:     my @uploads = ();
1.157     raeburn   666:     if ($curRes->is_sequence()) {
                    667:         $content_type = 'sequence';
                    668:     } elsif ($curRes->is_page()) {
                    669:         $content_type = 'page'; # need to handle individual items in pages.
1.143     raeburn   670:     } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) {
                    671:         $content_type = 'syllabus';
1.158     raeburn   672:         my $contents = &Apache::imsexport::templatedpage($content_type);
                    673:         if ($contents) {
                    674:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    675:         }
1.157     raeburn   676:     } elsif ($symb =~ m-\.sequence___\d+___ext-) {
1.143     raeburn   677:         $content_type = 'external';
1.158     raeburn   678:         my $title = $curRes->title;
                    679:         my $contents =  &Apache::imsexport::external($symb,$title);
                    680:         if ($contents) {
                    681:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    682:         }
1.143     raeburn   683:     } elsif ($symb =~ m-adm/navmaps$-) {
                    684:         $content_type =  'navmap';
1.158     raeburn   685:     } elsif ($symb =~ m-adm/[^/]+/[^/]+/(\d+)/smppg$-) {
1.143     raeburn   686:         $content_type = 'simplepage';
1.158     raeburn   687:         my $contents = &Apache::imsexport::templatedpage($content_type,$1,$count,\@uploads);
                    688:         if ($contents) {
                    689:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    690:         }
                    691:     } elsif ($symb =~ m-lib/templates/simpleproblem\.problem$-) {
1.143     raeburn   692:         $content_type = 'simpleproblem';
1.158     raeburn   693:         my $contents =  &Apache::imsexport::simpleproblem($symb);
                    694:         if ($contents) {
                    695:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    696:         }
1.188     raeburn   697:     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
1.158     raeburn   698:         $content_type = 'examupload';
                    699:     } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
1.143     raeburn   700:         $content_type = 'bulletinboard';
1.158     raeburn   701:         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
                    702:         if ($contents) {
                    703:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    704:         }
                    705:     } elsif ($symb =~ m-adm/([^/]+)/([^/]+)/aboutme$-) {
1.143     raeburn   706:         $content_type = 'aboutme';
1.158     raeburn   707:         my $contents =  &Apache::imsexport::templatedpage($content_type,undef,$count,\@uploads,$1,$2);
                    708:         if ($contents) {
                    709:             $$content_file = &store_template($contents,$tempexport,$count,$content_type);
                    710:         }
1.157     raeburn   711:     } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) {
                    712:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.162     raeburn   713:     } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/]+)/([^/]+)-) {
1.143     raeburn   714:         my $canedit = 0;
1.174     albertel  715:         if ($2 eq $env{'user.domain'} && $3 eq $env{'user.name'})  {
1.143     raeburn   716:             $canedit= 1;
                    717:         }
1.200     raeburn   718: # only include problem code where current user is author
1.143     raeburn   719:         if ($canedit) {
1.157     raeburn   720:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource');
1.143     raeburn   721:         } else {
1.157     raeburn   722:             $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit');
1.143     raeburn   723:         }
1.162     raeburn   724:     } elsif ($symb =~ m-uploaded/$cdom/$cnum-) {
                    725:         $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded');
1.143     raeburn   726:     }
1.158     raeburn   727:     if (@uploads > 0) {
                    728:         foreach my $item (@uploads) {
                    729:             my $uploadmsg = '';
1.159     raeburn   730:             &replicate_content($cdom,$cnum,$tempexport,$item,$count,\$uploadmsg,$href,'templateupload');
1.158     raeburn   731:             if ($uploadmsg) {
                    732:                 $$copyresult .= $uploadmsg."\n";
                    733:             }
                    734:         }
                    735:     }
1.157     raeburn   736:     if ($message) {
                    737:         $$copyresult .= $message."\n";
                    738:     }
1.143     raeburn   739: }
                    740: 
                    741: sub replicate_content {
1.157     raeburn   742:     my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_;
1.159     raeburn   743:     my ($map,$ind,$url);
                    744:     if ($caller eq 'templateupload') {
                    745:         $url = $symb;
                    746:         $url =~ s#//#/#g;
                    747:     } else { 
                    748:         ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
                    749:     }
1.143     raeburn   750:     my $content;
                    751:     my $filename;
                    752:     my $repstatus;
1.157     raeburn   753:     my $content_name;
                    754:     if ($url =~ m-/([^/]+)$-) {
1.143     raeburn   755:         $filename = $1;
                    756:         if (!-e $tempexport.'/resources') {
                    757:             mkdir($tempexport.'/resources',0700);
                    758:         }
1.157     raeburn   759:         if (!-e $tempexport.'/resources/'.$count) {
1.143     raeburn   760:             mkdir($tempexport.'/resources/'.$count,0700);
                    761:         }
1.157     raeburn   762:         my $destination = $tempexport.'/resources/'.$count.'/'.$filename;
1.143     raeburn   763:         my $copiedfile;
                    764:         if ($copiedfile = Apache::File->new('>'.$destination)) {
                    765:             my $content;
1.157     raeburn   766:             if ($caller eq 'resource') {
1.197     raeburn   767:                 my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';
                    768:                 my $filepath = &Apache::lonnet::filelocation($respath,$url);
                    769:                 $content = &Apache::lonnet::getfile($filepath);
1.143     raeburn   770:                 if ($content eq -1) {
                    771:                     $$message = 'Could not copy file '.$filename;
                    772:                 } else {
1.197     raeburn   773:                     &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'resource');
1.143     raeburn   774:                     $repstatus = 'ok';
                    775:                 }
1.162     raeburn   776:             } elsif ($caller eq 'uploaded' || $caller eq 'templateupload') {
1.143     raeburn   777:                 my $rtncode;
1.157     raeburn   778:                 $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode);
                    779:                 if ($repstatus eq 'ok') {
                    780:                     if ($url =~ /\.html?$/i) {
1.197     raeburn   781:                         &extract_media($url,$cdom,$cnum,\$content,$count,$tempexport,$href,$message,'uploaded');
1.157     raeburn   782:                     }
                    783:                 } else {
1.197     raeburn   784:                     $$message = 'Could not render '.$url.' server message - '.$rtncode."<br />\n";
1.143     raeburn   785:                 }
1.162     raeburn   786:             } elsif ($caller eq 'noedit') {
                    787: # Need to render the resource without the LON-CAPA Internal header and the Post discussion footer, and then set $content equal to this. 
                    788:                 $repstatus = 'ok';
                    789:                 $content = 'Not the owner of this resource'; 
1.143     raeburn   790:             }
                    791:             if ($repstatus eq 'ok') {
                    792:                 print $copiedfile $content;
                    793:             }
                    794:             close($copiedfile);
                    795:         } else {
1.197     raeburn   796:             $$message = 'Could not open destination file for '.$filename."<br />\n";
1.143     raeburn   797:         }
                    798:     } else {
1.197     raeburn   799:         $$message = 'Could not determine name of file for '.$symb."<br />\n";
1.143     raeburn   800:     }
1.157     raeburn   801:     if ($repstatus eq 'ok') {
1.198     raeburn   802:         $content_name = 'resources/'.$count.'/'.$filename;
1.157     raeburn   803:     }
                    804:     return $content_name;
                    805: }
                    806: 
                    807: sub extract_media {
1.197     raeburn   808:     my ($url,$cdom,$cnum,$content,$count,$tempexport,$href,$message,$caller) = @_;
1.198     raeburn   809:     my ($dirpath,$container);
1.197     raeburn   810:     my %allfiles = ();
                    811:     my %codebase = ();
1.198     raeburn   812:     if ($url =~ m-(.*/)([^/]+)$-) {
                    813:         $dirpath = $1;
                    814:         $container = $2;
                    815:     } else {
                    816:         $dirpath = $url;
                    817:         $container = '';
                    818:     }
1.197     raeburn   819:     &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content);
                    820:     foreach my $embed_file (keys(%allfiles)) {
                    821:         my $filename;
                    822:         if ($embed_file =~ m#([^/]+)$#) {
                    823:             $filename = $1;
                    824:         } else {
                    825:             $filename = $embed_file;
                    826:         }
                    827:         my $newname = 'res/'.$filename;
                    828:         my ($rtncode,$embed_content,$repstatus);
                    829:         my $embed_url;
                    830:         if ($embed_file =~ m-^/-) {
                    831:             $embed_url = $embed_file;           # points to absolute path
                    832:         } else {
                    833:             if ($embed_file =~ m-https?://-) {
                    834:                 next;                           # points to url
                    835:             } else {
1.198     raeburn   836:                 $embed_url = $dirpath.$embed_file;  # points to relative path
1.197     raeburn   837:             }
                    838:         }
                    839:         if ($caller eq 'resource') {
                    840:             my $respath =  $Apache::lonnet::perlvar{'lonDocRoot'}.'/res';  
                    841:             my $embed_path = &Apache::lonnet::filelocation($respath,$embed_url); 
                    842:             $embed_content = &Apache::lonnet::getfile($embed_path);
                    843:             unless ($embed_content eq -1) {
                    844:                 $repstatus = 'ok';
                    845:             }
                    846:         } elsif ($caller eq 'uploaded') {
                    847:             
                    848:             $repstatus = &Apache::lonnet::getuploaded('GET',$embed_url,$cdom,$cnum,\$embed_content,$rtncode);
                    849:         }
                    850:         if ($repstatus eq 'ok') {
                    851:             my $destination = $tempexport.'/resources/'.$count.'/res';
                    852:             if (!-e "$destination") {
                    853:                 mkdir($destination,0755);
                    854:             }
                    855:             $destination .= '/'.$filename;
                    856:             my $copiedfile;
                    857:             if ($copiedfile = Apache::File->new('>'.$destination)) {
                    858:                 print $copiedfile $embed_content;
1.198     raeburn   859:                 push @{$href}, 'resources/'.$count.'/res/'.$filename;
1.197     raeburn   860:                 my $attrib_regexp = '';
                    861:                 if (@{$allfiles{$embed_file}} > 1) {
                    862:                     $attrib_regexp = join('|',@{$allfiles{$embed_file}});
                    863:                 } else {
                    864:                     $attrib_regexp = $allfiles{$embed_file}[0];
                    865:                 }
                    866:                 $$content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$embed_file\E(['"]?)#$1$newname$2#gi;
1.198     raeburn   867:                 if ($caller eq 'resource' && $container =~ /\.(problem|library)$/) {
1.197     raeburn   868:                     $$content =~ s#\Q$embed_file\E#$newname#gi;
                    869:                 }
                    870:             }
                    871:         } else {
                    872:             $$message .= 'replication of embedded file - '.$embed_file.' in '.$url.' failed, reason -'.$rtncode."<br />\n";
                    873:         }
                    874:     }
1.157     raeburn   875:     return;
1.143     raeburn   876: }
1.74      www       877: 
1.158     raeburn   878: sub store_template {
                    879:     my ($contents,$tempexport,$count,$content_type) = @_;
                    880:     if ($contents) {
1.159     raeburn   881:         if ($tempexport) {
                    882:             if (!-e $tempexport.'/resources') {
                    883:                 mkdir($tempexport.'/resources',0700);
                    884:             }
                    885:             if (!-e $tempexport.'/resources/'.$count) {
                    886:                 mkdir($tempexport.'/resources/'.$count,0700);
                    887:             }
                    888:             my $destination = $tempexport.'/resources/'.$count.'/'.$content_type.'.xml';
                    889:             my $storetemplate;
                    890:             if ($storetemplate = Apache::File->new('>'.$destination)) {
                    891:                 print $storetemplate $contents;
                    892:                 close($storetemplate);
                    893:             }
                    894:             if ($content_type eq 'external') {
1.198     raeburn   895:                 return 'resources/'.$count.'/'.$content_type.'.html';
1.159     raeburn   896:             } else {
1.198     raeburn   897:                 return 'resources/'.$count.'/'.$content_type.'.xml';
1.159     raeburn   898:             }
1.158     raeburn   899:         }
                    900:     }
                    901: }
                    902: 
1.73      bowersj2  903: # Imports the given (name, url) resources into the course
                    904: # coursenum, coursedom, and folder must precede the list
                    905: sub group_import {
                    906:     my $coursenum = shift;
                    907:     my $coursedom = shift;
                    908:     my $folder = shift;
1.142     raeburn   909:     my $container = shift;
                    910:     my $caller = shift;
1.73      bowersj2  911:     while (@_) {
                    912: 	my $name = shift;
                    913: 	my $url = shift;
1.142     raeburn   914:         if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
                    915:             my $errtext = '';
                    916:             my $fatal = 0;
                    917:             my $newmapstr = '<map>'."\n".
                    918:                             '<resource id="1" src="" type="start"></resource>'."\n".
                    919:                             '<link from="1" to="2" index="1"></link>'."\n".
                    920:                             '<resource id="2" src="" type="finish"></resource>'."\n".
                    921:                             '</map>';
1.174     albertel  922:             $env{'form.output'}=$newmapstr;
1.189     albertel  923:             my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,
1.142     raeburn   924:                                                 'output',$1.$2);
                    925:             if ($result != m|^/uploaded/|) {
                    926:                 $errtext.='Map not saved: A network error occured when trying to save the new map. ';
                    927:                 $fatal = 2;
                    928:             }
                    929:             if ($fatal) {
                    930:                 return ($errtext,$fatal);
                    931:             }
                    932:         }
1.73      bowersj2  933: 	if ($url) {
1.178     www       934: 	    my $idx = &Apache::lonratedt::getresidx($url);
1.73      bowersj2  935: 	    $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=$idx;
                    936: 	    my $ext = 'false';
                    937: 	    if ($url=~/^http:\/\//) { $ext = 'true'; }
                    938: 	    $url =~ s/:/\&colon;/g;
                    939: 	    $name =~ s/:/\&colon;/g;
                    940: 	    $Apache::lonratedt::resources[$idx] = 
                    941: 		join ':', ($name, $url, $ext, 'normal', 'res');
                    942: 	}
                    943:     }
1.142     raeburn   944:     return &storemap($coursenum, $coursedom, $folder.'.'.$container);
1.73      bowersj2  945: }
                    946: 
1.114     albertel  947: sub breadcrumbs {
                    948:     my ($where)=@_;
                    949:     &Apache::lonhtmlcommon::clear_breadcrumbs();
1.142     raeburn   950:     my (@folders);
1.174     albertel  951:     if ($env{'form.pagepath'}) {
                    952:         @folders = split('&',$env{'form.pagepath'});
1.142     raeburn   953:     } else {
1.174     albertel  954:         @folders=split('&',$env{'form.folderpath'});
1.142     raeburn   955:     }
1.116     albertel  956:     my $folderpath;
1.168     www       957:     my $cpinfo='';
1.174     albertel  958:     if ($env{'form.markedcopy_url'}) {
1.168     www       959:        $cpinfo='&markedcopy_url='.
1.228     www       960:                &escape($env{'form.markedcopy_url'}).
1.168     www       961:                '&markedcopy_title='.
1.228     www       962:                &escape($env{'form.markedcopy_title'});
1.168     www       963:     }
1.242   ! www       964:     my $randompick=-1;
        !           965:     my $isencrypted=0;
        !           966:     my $ishidden=0;
1.116     albertel  967:     while (@folders) {
                    968: 	my $folder=shift(@folders);
                    969: 	my $foldername=shift(@folders);
                    970: 	if ($folderpath) {$folderpath.='&';}
                    971: 	$folderpath.=$folder.'&'.$foldername;
                    972: 	my $url='/adm/coursedocs?folderpath='.
1.228     www       973: 	    &escape($folderpath);
1.242   ! www       974:             my $name=&unescape($foldername);
        !           975: # randompick number, hidden, encrypted is appended with ":"s to the foldername	
        !           976:             $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;
        !           977:             if ($1 ne '') { 
        !           978:                $randompick=$1;
        !           979:             } else {
        !           980:                $randompick=-1;
        !           981:             }
        !           982:             if ($2) { $ishidden=1; }
        !           983:             if ($3) { $isencrypted=1; }
1.114     albertel  984: 	    &Apache::lonhtmlcommon::add_breadcrumb(
1.168     www       985: 		      {'href'=>$url.$cpinfo,
1.242   ! www       986: 		       'title'=>$name,
1.117     albertel  987: 		       'text'=>'<font size="+1">'.
1.242   ! www       988: 			   $name.'</font>'
1.117     albertel  989: 		       });
1.114     albertel  990:     }
1.242   ! www       991:     return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
        !           992: 					       'LC_docs_path'),$randompick,$ishidden,$isencrypted);
1.114     albertel  993: }
                    994: 
1.7       www       995: sub editor {
1.188     raeburn   996:     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10      www       997:     my $errtext='';
                    998:     my $fatal=0;
1.142     raeburn   999:     my $container='sequence';
1.174     albertel 1000:     if ($env{'form.pagepath'}) {
1.142     raeburn  1001:         $container='page';
                   1002:     }
1.10      www      1003:     ($errtext,$fatal)=
1.142     raeburn  1004:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.17      www      1005:     if ($#Apache::lonratedt::order<1) {
1.178     www      1006: 	my $idx=&Apache::lonratedt::getresidx();
                   1007: 	if ($idx<=0) { $idx=1; }
                   1008:        	$Apache::lonratedt::order[0]=$idx;
                   1009:         $Apache::lonratedt::resources[$idx]='';
1.17      www      1010:     }
1.174     albertel 1011:     if (defined($env{'form.markcopy'})) {
1.168     www      1012: # Mark for copying
1.174     albertel 1013: 	my ($title,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$env{'form.markcopy'}]]);
                   1014: 	$env{'form.markedcopy_title'}=$title;
                   1015: 	$env{'form.markedcopy_url'}=$url;
1.168     www      1016:     }
1.242   ! www      1017:     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted)=&breadcrumbs($folder);
        !          1018:     $r->print($breadcrumbtrail);
1.7       www      1019:     if ($fatal) {
                   1020: 	   $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1021:     } else {
                   1022: # ------------------------------------------------------------ Process commands
1.121     www      1023: 
1.16      www      1024: # ---------------- if they are for this folder and user allowed to make changes
1.174     albertel 1025: 	if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123     www      1026: # set parameters and change order
1.174     albertel 1027: 	    if (defined($env{'form.setparms'})) {
                   1028: 		my $idx=$env{'form.setparms'};
1.123     www      1029: # set parameters
1.174     albertel 1030: 		if ($env{'form.randpick_'.$idx}) {
                   1031: 		    &Apache::lonratedt::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
1.121     www      1032: 		} else {
1.122     www      1033: 		    &Apache::lonratedt::delparameter($idx,'parameter_randompick');
1.121     www      1034: 		}
1.174     albertel 1035: 		if ($env{'form.hidprs_'.$idx}) {
1.122     www      1036: 		    &Apache::lonratedt::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
1.121     www      1037: 		} else {
1.122     www      1038: 		    &Apache::lonratedt::delparameter($idx,'parameter_hiddenresource');
1.121     www      1039: 		}
1.174     albertel 1040: 		if ($env{'form.encprs_'.$idx}) {
1.122     www      1041: 		    &Apache::lonratedt::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
1.121     www      1042: 		} else {
1.122     www      1043: 		    &Apache::lonratedt::delparameter($idx,'parameter_encrypturl');
1.121     www      1044: 		}
                   1045: 
1.174     albertel 1046: 		if ($env{'form.newpos'}) {
1.123     www      1047: # change order
                   1048: 
1.174     albertel 1049: 		    my $newpos=$env{'form.newpos'}-1;
                   1050: 		    my $currentpos=$env{'form.currentpos'}-1;
1.125     www      1051: 		    my $i;
                   1052: 		    my @neworder=();
                   1053: 		    if ($newpos>$currentpos) {
                   1054: # moving stuff up
                   1055: 			for ($i=0;$i<$currentpos;$i++) {
                   1056: 			    $neworder[$i]=$Apache::lonratedt::order[$i];
                   1057: 			}
                   1058: 			for ($i=$currentpos;$i<$newpos;$i++) {
                   1059: 			    $neworder[$i]=$Apache::lonratedt::order[$i+1];
                   1060: 			}
                   1061:                         $neworder[$newpos]=$Apache::lonratedt::order[$currentpos];
                   1062: 			for ($i=$newpos+1;$i<=$#Apache::lonratedt::order;$i++) {
                   1063: 			    $neworder[$i]=$Apache::lonratedt::order[$i];
                   1064: 			}
                   1065: 		    } else {
                   1066: # moving stuff down
                   1067: 			for ($i=0;$i<$newpos;$i++) {
                   1068: 			    $neworder[$i]=$Apache::lonratedt::order[$i];
                   1069: 			}
                   1070: 			$neworder[$newpos]=$Apache::lonratedt::order[$currentpos];
                   1071: 			for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   1072: 			    $neworder[$i]=$Apache::lonratedt::order[$i-1];
                   1073: 			}
                   1074: 			for ($i=$currentpos+1;$i<=$#Apache::lonratedt::order;$i++) {
                   1075: 			    $neworder[$i]=$Apache::lonratedt::order[$i];
                   1076: 			}
                   1077: 		    }
                   1078: 		    @Apache::lonratedt::order=@neworder;
1.124     www      1079: 		}
                   1080: # store the changed version
1.123     www      1081: 
1.142     raeburn  1082: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124     www      1083: 		if ($fatal) {
                   1084: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1085: 		    return;
1.123     www      1086: 		}
1.124     www      1087: 		
                   1088: 	    }
1.174     albertel 1089: 	    if ($env{'form.pastemarked'}) {
1.168     www      1090: # paste resource to end of list
1.174     albertel 1091:                 my $url=$env{'form.markedcopy_url'};
                   1092: 		my $title=$env{'form.markedcopy_title'};
1.168     www      1093: # Maps need to be copied first
                   1094: 		if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
                   1095: 		    $title=&mt('Copy of').' '.$title;
                   1096:                     my $newid=$$.time;
                   1097: 		    $url=~/^(.+)\.(\w+)$/;
                   1098: 		    my $newurl=$1.$newid.'.'.$2;
                   1099: 		    my $storefn=$newurl;
                   1100:                     $storefn=~s/^\/\w+\/\w+\/\w+\///;
                   1101: 		    &Apache::loncreatecourse::writefile
1.174     albertel 1102: 			($env{'request.course.id'},$storefn,
1.168     www      1103: 			 &Apache::lonnet::getfile($url));
                   1104: 		    $url=$newurl;
                   1105: 		}
                   1106: 		$title=~s/\</\&lt\;/g;
                   1107: 		$title=~s/\>/\&gt\;/g;
                   1108: 		$title=~s/\:/\&colon;/g;
                   1109: 		my $ext='false';
                   1110: 		if ($url=~/^http\:\/\//) { $ext='true'; }
                   1111: 		$url=~s/\:/\&colon;/g;
                   1112: # Now insert the URL at the bottom
1.179     www      1113:                 my $newidx=&Apache::lonratedt::getresidx($url);
1.168     www      1114: 		$Apache::lonratedt::resources[$newidx]=
                   1115: 		    $title.':'.$url.':'.$ext.':normal:res';
                   1116: 		$Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;
                   1117: # Store the result
                   1118: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1119: 		if ($fatal) {
                   1120: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1121: 		    return;
                   1122: 		}
1.123     www      1123: 
1.168     www      1124: 	    }
1.188     raeburn  1125:             $r->print($upload_output);
1.174     albertel 1126: 	    if ($env{'form.cmd'}) {
                   1127:                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10      www      1128:                 if ($cmd eq 'del') {
1.128     albertel 1129: 		    my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
1.187     www      1130: 		    if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206     albertel 1131: 			($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187     www      1132: 			&Apache::lonnet::removeuploadedurl($url);
                   1133: 		    } else {
                   1134: 			&Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
1.128     albertel 1135: 		    }
1.10      www      1136: 		    for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
                   1137:                         $Apache::lonratedt::order[$i]=
                   1138:                           $Apache::lonratedt::order[$i+1];
                   1139:                     }
                   1140:                     $#Apache::lonratedt::order--;
1.171     www      1141:                 } elsif ($cmd eq 'cut') {
                   1142: 		    my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
1.179     www      1143: 		    &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
1.171     www      1144: 		    for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
                   1145:                         $Apache::lonratedt::order[$i]=
                   1146:                           $Apache::lonratedt::order[$i+1];
                   1147:                     }
                   1148:                     $#Apache::lonratedt::order--;
1.10      www      1149:                 } elsif ($cmd eq 'up') {
1.38      www      1150: 		  if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) {
1.10      www      1151:                     my $i=$Apache::lonratedt::order[$idx-1];
                   1152:                     $Apache::lonratedt::order[$idx-1]=
                   1153: 			$Apache::lonratedt::order[$idx];
                   1154:                     $Apache::lonratedt::order[$idx]=$i;
1.38      www      1155: 		   }
1.10      www      1156:                 } elsif ($cmd eq 'down') {
1.38      www      1157: 		   if (defined($Apache::lonratedt::order[$idx+1])) {
1.10      www      1158:                     my $i=$Apache::lonratedt::order[$idx+1];
                   1159:                     $Apache::lonratedt::order[$idx+1]=
                   1160: 			$Apache::lonratedt::order[$idx];
                   1161:                     $Apache::lonratedt::order[$idx]=$i;
1.38      www      1162: 		   }
1.36      www      1163:                 } elsif ($cmd eq 'rename') {
1.142     raeburn  1164:                     my $ratstr = $Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]];
1.36      www      1165:                     my ($rtitle,@rrest)=split(/\:/,
                   1166:                        $Apache::lonratedt::resources[
                   1167: 				       $Apache::lonratedt::order[$idx]]);
1.38      www      1168:                     my $comment=
1.174     albertel 1169:                      &HTML::Entities::decode($env{'form.title'});
1.36      www      1170:                     $comment=~s/\</\&lt\;/g;
                   1171:                     $comment=~s/\>/\&gt\;/g;
                   1172:                     $comment=~s/\:/\&colon;/g;
1.144     albertel 1173: 		    if ($comment=~/\S/) {
                   1174: 			$Apache::lonratedt::resources[
1.36      www      1175: 				       $Apache::lonratedt::order[$idx]]=
1.144     albertel 1176: 				            $comment.':'.join(':',@rrest);
                   1177: 		    }
1.238     www      1178: # Devalidate title cache
1.240     www      1179:                     my $renamed_url=$rrest[0];
                   1180: # Has the &colon;-escaping
                   1181:                     $renamed_url=~s/\&colon\;/\:/g;
                   1182: 		    &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10      www      1183:                 }
                   1184: # Store the changed version
1.104     albertel 1185: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1186: 					    $folder.'.'.$container);
1.104     albertel 1187: 		if ($fatal) {
                   1188: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1189: 		    return;
                   1190: 		}
1.8       www      1191:             }
1.11      www      1192: # Group import/search
1.174     albertel 1193: 	    if ($env{'form.importdetail'}) {
1.73      bowersj2 1194: 		my @imports;
1.236     albertel 1195: 		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174     albertel 1196: 		foreach (split(/\&/,$env{'form.importdetail'})) {
1.73      bowersj2 1197: 		    if (defined($_)) {
                   1198: 			my ($name,$url)=split(/\=/,$_);
1.228     www      1199: 			$name=&unescape($name);
                   1200: 			$url=&unescape($url);
1.73      bowersj2 1201: 			push @imports, $name, $url;
                   1202: 		    }
                   1203: 		}
1.11      www      1204: # Store the changed version
1.104     albertel 1205: 		($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,
1.142     raeburn  1206: 					       $container,'londocs',@imports);
1.104     albertel 1207: 		if ($fatal) {
                   1208: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1209: 		    return;
                   1210: 		}
1.11      www      1211:             }
1.53      www      1212: # Loading a complete map
1.223     www      1213: 	   if ($env{'form.loadmap'}) {
                   1214:                if ($env{'form.importmap'}=~/\w/) {
                   1215: 	          foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                   1216: 		      my ($title,$url,$ext,$type)=split(/\:/,$_);
                   1217:                       my $idx=&Apache::lonratedt::getresidx($url);
                   1218:                       $Apache::lonratedt::resources[$idx]=$_;
                   1219:                       $Apache::lonratedt::order
                   1220: 		          [$#Apache::lonratedt::order+1]=$idx;
                   1221: 	          }
1.53      www      1222: # Store the changed version
1.223     www      1223:   	          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1224: 					   $folder.'.'.$container);
1.223     www      1225: 	          if ($fatal) {
                   1226: 		      $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1227: 		      return;
                   1228: 	          }
                   1229:                } else {
                   1230:                    $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
                   1231:                }
1.53      www      1232:            }
1.16      www      1233:        }
                   1234: # ---------------------------------------------------------------- End commands
1.7       www      1235: # ---------------------------------------------------------------- Print screen
1.10      www      1236:         my $idx=0;
1.148     www      1237: 	my $shown=0;
1.242   ! www      1238:         if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
        !          1239:            $r->print('<p>'.&mt('Parameters').':<ul>'.
        !          1240:                      ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
        !          1241:                      ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
        !          1242:                      ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
        !          1243:                      '</ul></p>');
        !          1244:         }                                                                                                     
        !          1245:         if ($randompick>=0) {
        !          1246:            $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');
        !          1247:         }
1.10      www      1248:         $r->print('<table>');
                   1249:         foreach (@Apache::lonratedt::order) {
                   1250:            my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
1.207     albertel 1251: 	   $name=&Apache::lonratsrv::qtescape($name);
                   1252: 	   $url=&Apache::lonratsrv::qtescape($url);
1.10      www      1253:            unless ($name) {  $name=(split(/\//,$url))[-1]; }
1.148     www      1254:            unless ($name) { $idx++; next; }
1.112     raeburn  1255:            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
1.10      www      1256:            $idx++;
1.148     www      1257: 	   $shown++;
1.10      www      1258:         }
1.148     www      1259: 	unless ($shown) {
1.131     www      1260: 	    $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
                   1261: 	}
1.168     www      1262:         $r->print("\n</table>\n");
1.174     albertel 1263: 	if ($env{'form.markedcopy_url'}) {
1.168     www      1264: 	    $r->print(<<ENDPASTE);
                   1265: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174     albertel 1266: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1267: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168     www      1268: ENDPASTE
                   1269:             $r->print(
                   1270: 	   '<input type="submit" name="pastemarked" value="'.&mt('Paste').
                   1271: 		      '" /> '.&Apache::loncommon::filedescription(
1.174     albertel 1272: 		(split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
                   1273: 		      $env{'form.markedcopy_title'});
1.168     www      1274:             if ($container eq 'page') {
                   1275: 		$r->print(<<PAGEINFO);
1.174     albertel 1276: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1277: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168     www      1278: PAGEINFO
                   1279:             } else {
                   1280: 		$r->print(<<FOLDERINFO);
1.174     albertel 1281: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168     www      1282: FOLDERINFO
                   1283: 	    }
                   1284: 	    $r->print('</form></p>');
                   1285: 	}
1.7       www      1286:     }
                   1287: }
1.1       www      1288: 
1.188     raeburn  1289: sub process_file_upload {
1.194     raeburn  1290:     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188     raeburn  1291: # upload a file, if present
                   1292:     my $parseaction;
1.190     albertel 1293:    if ($env{'form.parserflag'}) {
1.188     raeburn  1294:         $parseaction = 'parse';
                   1295:     }
                   1296:     my $phase_status;
                   1297:     my $folder=$env{'form.folder'};
1.194     raeburn  1298:     if ($folder eq '') {
1.188     raeburn  1299:         $folder='default';
                   1300:     }
1.194     raeburn  1301:     if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188     raeburn  1302:         my $errtext='';
                   1303:         my $fatal=0;
                   1304:         my $container='sequence';
                   1305:         if ($env{'form.pagepath'}) {
                   1306:             $container='page';
                   1307:         }
                   1308:         ($errtext,$fatal)=
                   1309:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
                   1310:         if ($#Apache::lonratedt::order<1) {
                   1311:             $Apache::lonratedt::order[0]=1;
                   1312:             $Apache::lonratedt::resources[1]='';
                   1313:         }
                   1314:         if ($fatal) {
                   1315:             return 'failed';
                   1316:         }
                   1317:         my $destination = 'docs/';
1.194     raeburn  1318:         if ($folder =~ /^supplemental/) {
                   1319:             $destination = 'supplemental/';
                   1320:         }
                   1321:         if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1322:             $destination .= 'default/';
1.194     raeburn  1323:         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
                   1324:             $destination .=  $2.'/';
1.188     raeburn  1325:         }
                   1326: # this is for a course, not a user, so set coursedoc flag
                   1327: # probably the only place in the system where this should be "1"
                   1328:         my $newidx=&Apache::lonratedt::getresidx();
                   1329:         $destination .= $newidx;
1.190     albertel 1330:         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
                   1331: 						$parseaction,$allfiles,
                   1332: 						$codebase);
1.188     raeburn  1333:         my $ext='false';
                   1334:         if ($url=~/^http\:\/\//) { $ext='true'; }
                   1335:         $url=~s/\:/\&colon;/g;
                   1336:         my $comment=$env{'form.comment'};
                   1337:         $comment=~s/\</\&lt\;/g;
                   1338:         $comment=~s/\>/\&gt\;/g;
                   1339:         $comment=~s/\:/\&colon;/g;
                   1340:         if ($folder=~/^supplemental/) {
                   1341:               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1342:                   $env{'user.domain'}.'___&&&___'.$comment;
                   1343:         }
                   1344: 
                   1345:         $Apache::lonratedt::resources[$newidx]=
                   1346:                   $comment.':'.$url.':'.$ext.':normal:res';
1.190     albertel 1347:         $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= $newidx;
                   1348:         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
                   1349: 				    $folder.'.'.$container);
1.188     raeburn  1350:         if ($fatal) {
                   1351:             $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
                   1352:             return 'failed';
                   1353:         } else {
                   1354:             if ($parseaction eq 'parse') {
1.190     albertel 1355:                 my $total_embedded = keys(%{$allfiles});
1.188     raeburn  1356:                 if ($total_embedded > 0) {
                   1357:                     my $num = 0;
                   1358:                     $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
                   1359:    <form name="upload_embedded" action="/adm/coursedocs"
                   1360:                   method="post" enctype="multipart/form-data">
                   1361:    <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
                   1362:    <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228     www      1363:    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188     raeburn  1364:    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                   1365:                     $$upload_output .= '<b>Upload embedded files</b>:<br />
                   1366:    <table>';
1.190     albertel 1367:                     foreach my $embed_file (keys(%{$allfiles})) {
1.188     raeburn  1368:                         $$upload_output .= '<tr><td>'.$embed_file.
1.190     albertel 1369:           '<input name="embedded_item_'.$num.'" type="file" />
1.228     www      1370:            <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.188     raeburn  1371:                         my $attrib;
                   1372:                         if (@{$$allfiles{$embed_file}} > 1) {
                   1373:                             $attrib = join(':',@{$$allfiles{$embed_file}});
                   1374:                         } else {
                   1375:                             $attrib = $$allfiles{$embed_file}[0];
                   1376:                         }
                   1377:                         $$upload_output .=
                   1378:            '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
                   1379:                         if (exists($$codebase{$embed_file})) {
                   1380:                             $$upload_output .= 
1.228     www      1381:           '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
1.188     raeburn  1382:                         }
                   1383:                         $$upload_output .= '</td></tr>';
                   1384:                         $num ++;
                   1385:                     }
                   1386:                     $phase_status = 'phasetwo';
                   1387:                     $$upload_output .= '</table><br />
                   1388:    <input type ="submit" value="Complete upload" />
                   1389:    </form>';
                   1390:                 } else {
                   1391:                     $$upload_output .= 'No embedded items identified<br />';
                   1392:                 }
                   1393:             }
                   1394:         }
                   1395:     }
                   1396:     return $phase_status;
                   1397: }
                   1398: 
                   1399: sub process_secondary_uploads {
                   1400:     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
                   1401:     my $folder=$env{'form.folder'};
                   1402:     my $destination = 'docs/';
1.195     raeburn  1403:     if ($folder =~ /^supplemental/) {
                   1404:         $destination = 'supplemental/';
                   1405:     }
                   1406:     if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1407:         $destination .= 'default/';
1.195     raeburn  1408:     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217     raeburn  1409:         $destination .=  $2.'/';
1.188     raeburn  1410:     }
                   1411:     $destination .= $newidx;
                   1412:     my ($url,$filename);
                   1413:     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
                   1414:     ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
                   1415:     return $filename;
                   1416: }
                   1417: 
1.8       www      1418: # --------------------------------------------------------------- An entry line
                   1419: 
                   1420: sub entryline {
1.112     raeburn  1421:     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.38      www      1422:     $title=~s/\&colon\;/\:/g;
                   1423:     $title=&HTML::Entities::encode(&HTML::Entities::decode(
1.228     www      1424:      &unescape($title)),'"<>&\'');
1.38      www      1425:     my $renametitle=$title;
                   1426:     my $foldertitle=$title;
1.142     raeburn  1427:     my $pagetitle=$title;
1.122     www      1428:     my $orderidx=$Apache::lonratedt::order[$index];
1.109     albertel 1429:     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
                   1430: 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
                   1431: 	$renametitle=$4;
                   1432: 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
                   1433: 	    &Apache::loncommon::plainname($2,$3).': <br />'.
                   1434: 	    $foldertitle;
                   1435:     }
1.222     albertel 1436:     $renametitle=~s/\\/\\\\/g;
1.38      www      1437:     $renametitle=~s/\&quot\;/\\\"/g;
1.8       www      1438:     my $line='<tr>';
                   1439: # Edit commands
1.142     raeburn  1440:     my $container;
1.120     www      1441:     my $folderpath;
1.174     albertel 1442:     if ($env{'form.folderpath'}) {
1.142     raeburn  1443:         $container = 'sequence';
1.228     www      1444: 	$folderpath=&escape($env{'form.folderpath'});
1.174     albertel 1445: 	# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120     www      1446:     }
1.156     albertel 1447:     my ($pagepath,$pagesymb);
1.174     albertel 1448:     if ($env{'form.pagepath'}) {
1.142     raeburn  1449:         $container = 'page';
1.228     www      1450:         $pagepath=&escape($env{'form.pagepath'});
                   1451:         $pagesymb=&escape($env{'form.pagesymb'});
1.142     raeburn  1452:     }
1.168     www      1453:     my $cpinfo='';
1.174     albertel 1454:     if ($env{'form.markedcopy_url'}) {
1.168     www      1455:        $cpinfo='&markedcopy_url='.
1.228     www      1456:                &escape($env{'form.markedcopy_url'}).
1.168     www      1457:                '&markedcopy_title='.
1.228     www      1458:                &escape($env{'form.markedcopy_title'});
1.168     www      1459:     }
1.109     albertel 1460:     if ($allowed) {
1.123     www      1461: 	my $incindex=$index+1;
                   1462: 	my $selectbox='';
1.168     www      1463: 	if (($folder!~/^supplemental/) &&
                   1464: 	    ($#Apache::lonratedt::order>0) && 
                   1465: 	    ((split(/\:/,
                   1466: 	     $Apache::lonratedt::resources[$Apache::lonratedt::order[0]]))[1] 
                   1467: 	     ne '') && 
                   1468: 	    ((split(/\:/,
                   1469: 	     $Apache::lonratedt::resources[$Apache::lonratedt::order[1]]))[1] 
                   1470: 	     ne '')) {
1.123     www      1471: 	    $selectbox=
1.124     www      1472: 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123     www      1473: 		'<select name="newpos" onChange="this.form.submit()">';
                   1474: 	    for (my $i=1;$i<=$#Apache::lonratedt::order+1;$i++) {
                   1475: 		if ($i==$incindex) {
                   1476: 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
                   1477: 		} else {
                   1478: 		    $selectbox.='<option value="'.$i.'">'.$i.'</option>';
                   1479: 		}
                   1480: 	    }
                   1481: 	    $selectbox.='</select>';
                   1482: 	}
1.119     www      1483: 	my %lt=&Apache::lonlocal::texthash(
                   1484:                 'up' => 'Move Up',
1.109     albertel 1485: 		'dw' => 'Move Down',
                   1486: 		'rm' => 'Remove',
1.171     www      1487:                 'ct' => 'Cut',
1.168     www      1488: 		'rn' => 'Rename',
                   1489: 		'cp' => 'Copy');
1.211     www      1490: 	my $nocopy=0;
                   1491:         if ($url=~/\.(page|sequence)$/) {
                   1492: 	    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
                   1493: 		my ($title,$url,$ext,$type)=split(/\:/,$_);
                   1494: 		if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                   1495: 		    $nocopy=1;
                   1496: 		    last;
                   1497: 		}
                   1498: 	    }
                   1499: 	}
                   1500:         my $copylink='&nbsp;';
1.174     albertel 1501:         if ($env{'form.pagepath'}) {
1.211     www      1502:            unless ($nocopy) {
                   1503:                $copylink=(<<ENDCOPY);
                   1504: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1505: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1506: ENDCOPY
                   1507:             }
1.142     raeburn  1508:             $line.=(<<END);
                   1509: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1510: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1511: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
                   1512: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1513: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142     raeburn  1514: <input type="hidden" name="setparms" value="$orderidx" />
                   1515: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1516: <tr><td bgcolor="#DDDDDD">
1.168     www      1517: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1518: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
                   1519: <tr><td bgcolor="#DDDDDD">
1.168     www      1520: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1521: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
                   1522: </table></td>
                   1523: <td>$selectbox
                   1524: </td><td bgcolor="#DDDDDD">
1.156     albertel 1525: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142     raeburn  1526: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1527: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1528: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.213     albertel 1529: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168     www      1530: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1531: $copylink
1.142     raeburn  1532: END
                   1533:         } else {
1.211     www      1534:            unless ($nocopy) {
                   1535:                $copylink=(<<ENDCOPY);
                   1536: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
                   1537: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1538: ENDCOPY
                   1539:             }
1.142     raeburn  1540:             $line.=(<<END); 
1.121     www      1541: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1542: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
                   1543: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1544: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122     www      1545: <input type="hidden" name="setparms" value="$orderidx" />
1.54      www      1546: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1547: <tr><td bgcolor="#DDDDDD">
1.168     www      1548: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1549: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54      www      1550: <tr><td bgcolor="#DDDDDD">
1.168     www      1551: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1552: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123     www      1553: </table></td>
                   1554: <td>$selectbox
                   1555: </td><td bgcolor="#DDDDDD">
1.142     raeburn  1556: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90      www      1557: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1558: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
                   1559: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.142     raeburn  1560: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168     www      1561: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1562: $copylink
1.8       www      1563: END
1.142     raeburn  1564:         }
1.8       www      1565:     }
1.16      www      1566: # Figure out what kind of a resource this is
                   1567:     my ($extension)=($url=~/\.(\w+)$/);
                   1568:     my $uploaded=($url=~/^\/*uploaded\//);
1.97      albertel 1569:     my $icon=&Apache::loncommon::icon($url);
1.17      www      1570:     my $isfolder=0;
1.142     raeburn  1571:     my $ispage=0;
1.114     albertel 1572:     my $folderarg;
1.142     raeburn  1573:     my $pagearg;
                   1574:     my $pagefile;
1.16      www      1575:     if ($uploaded) {
1.135     albertel 1576: 	if ($extension eq 'sequence') {
                   1577: 	    $icon=$iconpath.'/folder_closed.gif';
                   1578: 	    $url=~/$coursenum\/([\/\w]+)\.sequence$/;
                   1579: 	    $url='/adm/coursedocs?';
                   1580: 	    $folderarg=$1;
                   1581: 	    $isfolder=1;
1.142     raeburn  1582:         } elsif ($extension eq 'page') {
                   1583:             $icon=$iconpath.'/page.gif';
                   1584:             $url=~/$coursenum\/([\/\w]+)\.page$/;
                   1585:             $pagearg=$1;
                   1586:             $url='/adm/coursedocs?';
                   1587:             $ispage=1;
1.135     albertel 1588: 	} else {
                   1589: 	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
                   1590: 	}
1.16      www      1591:     }
1.215     albertel 1592:     $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142     raeburn  1593:     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113     albertel 1594: 	my $symb=&Apache::lonnet::symbclean(
1.50      www      1595:           &Apache::lonnet::declutter('uploaded/'.
1.174     albertel 1596:            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1597:            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50      www      1598:            '.sequence').
                   1599:            '___'.$residx.'___'.
1.113     albertel 1600: 	   &Apache::lonnet::declutter($url));
                   1601: 	(undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
                   1602: 	$url=&Apache::lonnet::clutter($url);
1.127     albertel 1603: 	if ($url=~/^\/*uploaded\//) {
                   1604: 	    $url=~/\.(\w+)$/;
                   1605: 	    my $embstyle=&Apache::loncommon::fileembstyle($1);
                   1606: 	    if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
                   1607: 		$url='/adm/wrapper'.$url;
                   1608: 	    } elsif ($embstyle eq 'ssi') {
                   1609: 		#do nothing with these
                   1610: 	    } elsif ($url!~/\.(sequence|page)$/) {
                   1611: 		$url='/adm/coursedocs/showdoc'.$url;
                   1612: 	    }
1.145     albertel 1613: 	} elsif ($url=~m|^/ext/|) { 
                   1614: 	    $url='/adm/wrapper'.$url;
1.127     albertel 1615: 	}
1.241     www      1616:         if (&Apache::lonnet::symbverify($symb,$url)) {
                   1617: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                   1618:         } else {
                   1619:             $url='';
                   1620:         }
1.152     albertel 1621: 	if ($container eq 'page') {
1.174     albertel 1622: 	    my $symb=$env{'form.pagesymb'};
1.152     albertel 1623: 	    	    
                   1624: 	    $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228     www      1625: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152     albertel 1626: 	}
1.50      www      1627:     }
1.120     www      1628:     my $parameterset='&nbsp;';
1.216     albertel 1629:     if ($isfolder || $extension eq 'sequence') {
1.228     www      1630: 	my $foldername=&escape($foldertitle);
1.174     albertel 1631: 	my $folderpath=$env{'form.folderpath'};
1.114     albertel 1632: 	if ($folderpath) { $folderpath.='&' };
1.242   ! www      1633: # Append randompick number, hidden, and encrypted with ":" to foldername, 
        !          1634: # so it gets transferred between levels
        !          1635: 	$folderpath.=$folderarg.'&'.$foldername.':'.(&Apache::lonratedt::getparameter($orderidx,
        !          1636:                                               'parameter_randompick'))[0]
        !          1637:                                                .':'.((&Apache::lonratedt::getparameter($orderidx,
        !          1638:                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
        !          1639:                                                .':'.((&Apache::lonratedt::getparameter($orderidx,
        !          1640:                                               'parameter_encrypturl'))[0]=~/^yes$/i);
1.228     www      1641: 	$url.='folderpath='.&escape($folderpath).$cpinfo;
1.147     matthew  1642: 	$parameterset='<label>'.&mt('Randomly Pick: ').
1.165     www      1643: 	    '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.147     matthew  1644: 	    (&Apache::lonratedt::getparameter($orderidx,
                   1645:                                               'parameter_randompick'))[0].
1.165     www      1646:                                               '" />'.
                   1647: '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
1.147     matthew  1648:        
1.114     albertel 1649:     }
1.142     raeburn  1650:     if ($ispage) {
1.228     www      1651:         my $pagename=&escape($pagetitle);
1.142     raeburn  1652:         my $pagepath;
1.174     albertel 1653:         my $folderpath=$env{'form.folderpath'};
1.142     raeburn  1654:         if ($folderpath) { $pagepath = $folderpath.'&' };
                   1655:         $pagepath.=$pagearg.'&'.$pagename;
1.174     albertel 1656: 	my $symb=$env{'form.pagesymb'};
1.152     albertel 1657: 	if (!$symb) {
                   1658: 	    my $path='uploaded/'.
1.174     albertel 1659: 		$env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1660: 		$env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152     albertel 1661: 	    $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
                   1662: 					       $residx,
                   1663: 					       $path.$pagearg.'.page');
                   1664: 	}
1.228     www      1665: 	$url.='pagepath='.&escape($pagepath).
                   1666: 	    '&pagesymb='.&escape($symb).$cpinfo;
1.142     raeburn  1667:     }
1.113     albertel 1668:     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
                   1669: 	'" border="0"></a></td>'.
1.241     www      1670:         "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
                   1671:         ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120     www      1672:     if (($allowed) && ($folder!~/^supplemental/)) {
                   1673:  	my %lt=&Apache::lonlocal::texthash(
                   1674:  			      'hd' => 'Hidden',
1.165     www      1675:  			      'ec' => 'URL hidden');
1.122     www      1676: 	my $enctext=
                   1677: 	    ((&Apache::lonratedt::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
                   1678: 	my $hidtext=
                   1679: 	    ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120     www      1680: 	$line.=(<<ENDPARMS);
                   1681: <td bgcolor="#BBBBFF"><font size='-2'>
1.165     www      1682: <nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
1.149     albertel 1683: <td bgcolor="#BBBBFF"><font size='-2'>
1.165     www      1684: <nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
1.120     www      1685: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
                   1686: ENDPARMS
1.119     www      1687:     }
1.120     www      1688:     $line.="</form></tr>";
1.8       www      1689:     return $line;
                   1690: }
                   1691: 
1.27      www      1692: # ---------------------------------------------------------------- tie the hash
                   1693: 
                   1694: sub tiehash {
1.136     albertel 1695:     my ($mode)=@_;
1.27      www      1696:     $hashtied=0;
1.174     albertel 1697:     if ($env{'request.course.fn'}) {
1.136     albertel 1698: 	if ($mode eq 'write') {
1.174     albertel 1699: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1700: 		    &GDBM_WRCREAT(),0640)) {
                   1701:                 $hashtied=2;
                   1702: 	    }
                   1703: 	} else {
1.174     albertel 1704: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1705: 		    &GDBM_READER(),0640)) {
1.27      www      1706:                 $hashtied=1;
1.136     albertel 1707: 	    }
                   1708: 	}
1.27      www      1709:     }    
                   1710: }
                   1711: 
                   1712: sub untiehash {
                   1713:     if ($hashtied) { untie %hash; }
                   1714:     $hashtied=0;
1.221     albertel 1715:     return OK;
1.27      www      1716: }
                   1717: 
1.29      www      1718: # --------------------------------------------------------------- check on this
                   1719: 
                   1720: sub checkonthis {
                   1721:     my ($r,$url,$level,$title)=@_;
1.228     www      1722:     $url=&unescape($url);
1.29      www      1723:     $alreadyseen{$url}=1;
                   1724:     $r->rflush();
1.41      www      1725:     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108     albertel 1726:        $r->print("\n<br />");
1.29      www      1727:        for (my $i=0;$i<=$level*5;$i++) {
                   1728:            $r->print('&nbsp;');
                   1729:        }
                   1730:        $r->print('<a href="'.$url.'" target="cat">'.
                   1731: 		 ($title?$title:$url).'</a> ');
                   1732:        if ($url=~/^\/res\//) {
                   1733: 	  my $result=&Apache::lonnet::repcopy(
                   1734:                               &Apache::lonnet::filelocation('',$url));
1.172     raeburn  1735:           if ($result eq 'ok') {
1.87      www      1736:              $r->print('<font color="green">'.&mt('ok').'</font>');
1.29      www      1737:              $r->rflush();
1.34      www      1738:              &Apache::lonnet::countacc($url);
                   1739:              $url=~/\.(\w+)$/;
                   1740:              if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
                   1741: 		 $r->print('<br />');
                   1742:                  $r->rflush();
                   1743:                  for (my $i=0;$i<=$level*5;$i++) {
                   1744:                      $r->print('&nbsp;');
                   1745:                  }
1.84      www      1746:                  $r->print('- '.&mt('Rendering').': ');
1.170     www      1747: 		 my ($errorcount,$warningcount)=split(/:/,
                   1748: 	       &Apache::lonnet::ssi_body($url,
1.173     albertel 1749: 			       ('grade_target'=>'web',
                   1750: 				'return_only_error_and_warning_counts' => 1)));
1.170     www      1751:                  if (($errorcount) ||
                   1752:                      ($warningcount)) {
                   1753: 		     if ($errorcount) {
1.98      www      1754:                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170     www      1755: 			  $errorcount.' '.
1.87      www      1756: 				  &mt('error(s)').'</b></font> ');
1.34      www      1757:                      }
1.170     www      1758: 		     if ($warningcount) {
1.34      www      1759:                         $r->print('<font color="blue">'.
1.170     www      1760: 			  $warningcount.' '.
1.84      www      1761: 				  &mt('warning(s)').'</font>');
1.34      www      1762:                      }
                   1763:                  } else {
1.87      www      1764:                      $r->print('<font color="green">'.&mt('ok').'</font>');
1.34      www      1765:                  }
                   1766:                  $r->rflush();
                   1767:              }
1.29      www      1768: 	     my $dependencies=
                   1769:                 &Apache::lonnet::metadata($url,'dependencies');
                   1770:              foreach (split(/\,/,$dependencies)) {
                   1771: 		 if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
                   1772:                     &checkonthis($r,$_,$level+1);
                   1773:                  }
                   1774:              }
1.172     raeburn  1775:           } elsif ($result eq 'unavailable') {
1.84      www      1776:              $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172     raeburn  1777:           } elsif ($result eq 'not_found') {
1.100     www      1778: 	      unless ($url=~/\$/) {
                   1779: 		  $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
                   1780: 	      } else {
                   1781: 		  $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
                   1782: 	      }
1.29      www      1783:           } else {
1.84      www      1784:              $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29      www      1785:           }
                   1786:       }
                   1787:    }
                   1788: }
                   1789: 
1.1       www      1790: 
1.75      www      1791: #
1.208     albertel 1792: # ----------------------------------------------------------------- List Symbs
                   1793: # 
                   1794: sub list_symbs {
1.224     albertel 1795:     my ($r) = @_;
                   1796: 
                   1797:     $r->print(&Apache::loncommon::start_page('Symb List'));
                   1798:     my $navmap = Apache::lonnavmaps::navmap->new();
                   1799:     $r->print("<pre>\n");
                   1800:     foreach my $res ($navmap->retrieveResources()) {
                   1801: 	$r->print($res->compTitle()."\t".$res->symb()."\n");
                   1802:     }
                   1803:     $r->print("\n</pre>\n");
                   1804:     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208     albertel 1805: }
                   1806: 
                   1807: 
                   1808: #
1.75      www      1809: # -------------------------------------------------------------- Verify Content
                   1810: # 
                   1811: sub verifycontent {
1.224     albertel 1812:     my ($r) = @_;
1.230     albertel 1813:     my $type = &Apache::loncommon::course_type();
1.26      www      1814:    my $loaderror=&Apache::lonnet::overloaderror($r);
                   1815:    if ($loaderror) { return $loaderror; }
1.229     raeburn  1816:    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.27      www      1817:    $hashtied=0;
1.30      www      1818:    undef %alreadyseen;
                   1819:    %alreadyseen=();
1.27      www      1820:    &tiehash();
                   1821:    foreach (keys %hash) {
1.140     www      1822:        if ($hash{$_}=~/\.(page|sequence)$/) {
1.228     www      1823: 	   if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140     www      1824: 	       $r->print('<hr /><font color="red">'.
1.230     albertel 1825: 			 &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228     www      1826: 			 &unescape($hash{$_}).'</font><br />'.
1.140     www      1827: 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
                   1828: 	   }
                   1829:        }
1.228     www      1830:        if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29      www      1831:            &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27      www      1832:        }
                   1833:    }
                   1834:    &untiehash();
1.108     albertel 1835:    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
                   1836: 	     &mt('Return to DOCS').'</a>');
1.75      www      1837: }
                   1838: 
1.192     www      1839: 
1.75      www      1840: # -------------------------------------------------------------- Check Versions
                   1841: 
1.192     www      1842: sub devalidateversioncache {
                   1843:     my $src=shift;
                   1844:     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
                   1845: 					  &Apache::lonnet::clutter($src));
                   1846: }
                   1847: 
1.75      www      1848: sub checkversions {
1.224     albertel 1849:     my ($r) = @_;
1.230     albertel 1850:     my $type = &Apache::loncommon::course_type();
1.229     raeburn  1851:     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.89      www      1852:     my $header='';
                   1853:     my $startsel='';
                   1854:     my $monthsel='';
                   1855:     my $weeksel='';
                   1856:     my $daysel='';
                   1857:     my $allsel='';
                   1858:     my %changes=();
                   1859:     my $starttime=0;
1.91      www      1860:     my $haschanged=0;
1.92      www      1861:     my %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 1862: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1863: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.92      www      1864: 
                   1865:     $hashtied=0;
                   1866:     &tiehash();
                   1867:     my %newsetversions=();
1.174     albertel 1868:     if ($env{'form.setmostrecent'}) {
1.91      www      1869: 	$haschanged=1;
1.92      www      1870: 	foreach (keys %hash) {
                   1871: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      1872: 		$newsetversions{$1}='mostrecent';
1.192     www      1873:                 &devalidateversioncache($1);
1.92      www      1874: 	    }
                   1875: 	}
1.174     albertel 1876:     } elsif ($env{'form.setcurrent'}) {
1.91      www      1877: 	$haschanged=1;
1.92      www      1878: 	foreach (keys %hash) {
                   1879: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      1880: 		my $getvers=&Apache::lonnet::getversion($1);
                   1881: 		if ($getvers>0) {
                   1882: 		    $newsetversions{$1}=$getvers;
1.192     www      1883: 		    &devalidateversioncache($1);
1.93      www      1884: 		}
1.92      www      1885: 	    }
                   1886: 	}
1.174     albertel 1887:     } elsif ($env{'form.setversions'}) {
1.91      www      1888: 	$haschanged=1;
1.174     albertel 1889: 	foreach (keys %env) {
1.92      www      1890: 	    if ($_=~/^form\.set_version_(.+)$/) {
                   1891: 		my $src=$1;
1.174     albertel 1892: 		if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
                   1893: 		    $newsetversions{$src}=$env{$_};
1.192     www      1894: 		    &devalidateversioncache($src);
1.92      www      1895: 		}
                   1896: 	    }
                   1897: 	}
1.91      www      1898:     }
                   1899:     if ($haschanged) {
1.92      www      1900:         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174     albertel 1901: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1902: 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
1.92      www      1903: 	    $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
                   1904: 	} else {
                   1905: 	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
                   1906: 	}
1.136     albertel 1907: 	&mark_hash_old();
1.91      www      1908:     }
1.136     albertel 1909:     &changewarning($r,'');
1.174     albertel 1910:     if ($env{'form.timerange'} eq 'all') {
1.89      www      1911: # show all documents
1.230     albertel 1912: 	$header=&mt('All Documents in '.$type);
1.91      www      1913: 	$allsel=1;
1.90      www      1914: 	foreach (keys %hash) {
                   1915: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
                   1916: 		my $src=$1;
                   1917: 		$changes{$src}=1;
                   1918: 	    }
                   1919: 	}
1.89      www      1920:     } else {
                   1921: # show documents which changed
                   1922: 	%changes=&Apache::lonnet::dump
1.174     albertel 1923: 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                   1924:                      $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      1925: 	my $firstkey=(keys %changes)[0];
                   1926: 	unless ($firstkey=~/^error\:/) {
1.174     albertel 1927: 	    unless ($env{'form.timerange'}) {
                   1928: 		$env{'form.timerange'}=604800;
1.89      www      1929: 	    }
1.174     albertel 1930: 	    my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89      www      1931: 		.&mt('seconds');
1.174     albertel 1932: 	    if ($env{'form.timerange'}==-1) {
1.89      www      1933: 		$seltext='since start of course';
                   1934: 		$startsel='selected';
1.174     albertel 1935: 		$env{'form.timerange'}=time;
1.89      www      1936: 	    }
1.174     albertel 1937: 	    $starttime=time-$env{'form.timerange'};
                   1938: 	    if ($env{'form.timerange'}==2592000) {
1.89      www      1939: 		$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1940: 		$monthsel='selected';
1.174     albertel 1941: 	    } elsif ($env{'form.timerange'}==604800) {
1.89      www      1942: 		$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1943: 		$weeksel='selected';
1.174     albertel 1944: 	    } elsif ($env{'form.timerange'}==86400) {
1.89      www      1945: 		$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   1946: 		$daysel='selected';
                   1947: 	    }
                   1948: 	    $header=&mt('Content changed').' '.$seltext;
                   1949: 	} else {
                   1950: 	    $header=&mt('No content modifications yet.');
                   1951: 	}
                   1952:     }
1.92      www      1953:     %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 1954: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1955: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      1956:     my %lt=&Apache::lonlocal::texthash
1.229     raeburn  1957: 	      ('st' => 'Version changes since start of '.$type,
1.88      www      1958: 	       'lm' => 'Version changes since last Month',
                   1959: 	       'lw' => 'Version changes since last Week',
                   1960: 	       'sy' => 'Version changes since Yesterday',
1.91      www      1961:                'al' => 'All Resources (possibly large output)',
1.88      www      1962: 	       'sd' => 'Display',
1.84      www      1963: 	       'fi' => 'File',
                   1964: 	       'md' => 'Modification Date',
1.87      www      1965:                'mr' => 'Most recently published Version',
1.229     raeburn  1966: 	       've' => 'Version used in '.$type,
                   1967:                'vu' => 'Set Version to be used in '.$type,
                   1968: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91      www      1969: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
                   1970: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84      www      1971: 	       'di' => 'Differences');
1.89      www      1972:     $r->print(<<ENDHEADERS);
1.31      www      1973: <form action="/adm/coursedocs" method="post">
1.91      www      1974: <input type="hidden" name="versions" value="1" />
                   1975: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
                   1976: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31      www      1977: <select name="timerange">
1.88      www      1978: <option value='all' $allsel>$lt{'al'}</option>
1.84      www      1979: <option value="-1" $startsel>$lt{'st'}</option>
                   1980: <option value="2592000" $monthsel>$lt{'lm'}</option>
                   1981: <option value="604800" $weeksel>$lt{'lw'}</option>
                   1982: <option value="86400" $daysel>$lt{'sy'}</option>
1.31      www      1983: </select>
1.91      www      1984: <input type="submit" name="display" value="$lt{'sd'}" />
1.89      www      1985: <h3>$header</h3>
1.91      www      1986: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103     matthew  1987: <table border="0">
1.31      www      1988: ENDHEADERS
1.91      www      1989:     foreach (sort keys %changes) {
1.89      www      1990: 	if ($changes{$_}>$starttime) {
                   1991: 	    my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
                   1992: 	    my $currentversion=&Apache::lonnet::getversion($_);
1.93      www      1993: 	    if ($currentversion<0) {
                   1994: 		$currentversion=&mt('Could not be determined.');
                   1995: 	    }
1.89      www      1996: 	    my $linkurl=&Apache::lonnet::clutter($_);
                   1997: 	    $r->print(
1.103     matthew  1998: 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91      www      1999: 		      &Apache::lonnet::gettitle($linkurl).
1.103     matthew  2000:                       '</b></font></td></tr>'.
                   2001:                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                   2002:                       '<td colspan="4">'.
                   2003:                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.
                   2004: 		      '</a></td></tr>'.
                   2005:                       '<tr><td></td>'.
                   2006:                       '<td title="'.$lt{'md'}.'">'.
1.102     matthew  2007: 		      &Apache::lonlocal::locallocaltime(
                   2008:                            &Apache::lonnet::metadata($root.'.'.$extension,
                   2009:                                                      'lastrevisiondate')
                   2010:                                                         ).
1.103     matthew  2011:                       '</td>'.
                   2012:                       '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
                   2013:                       '<font size="+1">'.$currentversion.'</font>'.
                   2014:                       '</nobr></td>'.
1.229     raeburn  2015:                       '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103     matthew  2016:                       '<font size="+1">');
1.87      www      2017: # Used in course
1.89      www      2018: 	    my $usedversion=$hash{'version_'.$linkurl};
1.93      www      2019: 	    if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89      www      2020: 		$r->print($usedversion);
                   2021: 	    } else {
                   2022: 		$r->print($currentversion);
                   2023: 	    }
1.103     matthew  2024: 	    $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
                   2025:                       '<nobr>Use: ');
1.87      www      2026: # Set version
1.92      www      2027: 	    $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89      www      2028: 						      'set_version_'.$linkurl,
1.136     albertel 2029: 						      ('select_form_order' =>
                   2030: 						       ['',1..$currentversion,'mostrecent'],
                   2031: 						       '' => '',
1.93      www      2032: 						       'mostrecent' => 'most recent',
1.89      www      2033: 						       map {$_,$_} (1..$currentversion))));
1.103     matthew  2034: 	    $r->print('</nobr></td></tr><tr><td></td>');
1.89      www      2035: 	    my $lastold=1;
                   2036: 	    for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                   2037: 		my $url=$root.'.'.$prevvers.'.'.$extension;
                   2038: 		if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
                   2039: 		    $starttime) {
                   2040: 		    $lastold=$prevvers;
                   2041: 		}
                   2042: 	    }
1.103     matthew  2043:             # 
                   2044:             # Code to figure out how many version entries should go in
                   2045:             # each of the four columns
                   2046:             my $entries_per_col = 0;
                   2047:             my $num_entries = ($currentversion-$lastold);
                   2048:             if ($num_entries % 4 == 0) {
                   2049:                 $entries_per_col = $num_entries/4;
                   2050:             } else {
                   2051:                 $entries_per_col = $num_entries/4 + 1;
                   2052:             }
                   2053:             my $entries_count = 0;
                   2054:             $r->print('<td valign="top"><font size="-2">'); 
                   2055:             my $cols_output = 1;
1.32      www      2056:             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89      www      2057: 		my $url=$root.'.'.$prevvers.'.'.$extension;
1.103     matthew  2058: 		$r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91      www      2059: 			  '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103     matthew  2060: 			  &Apache::lonlocal::locallocaltime(
                   2061:                                 &Apache::lonnet::metadata($url,
                   2062:                                                           'lastrevisiondate')
                   2063:                                                             ).
1.91      www      2064: 			  ')');
1.89      www      2065: 		if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33      www      2066:                     $r->print(' <a href="/adm/diff?filename='.
1.89      www      2067: 			      &Apache::lonnet::clutter($root.'.'.$extension).
                   2068: 			      '&versionone='.$prevvers.
                   2069: 			      '">'.&mt('Diffs').'</a>');
                   2070: 		}
1.103     matthew  2071: 		$r->print('</nobr><br />');
                   2072:                 if (++$entries_count % $entries_per_col == 0) {
                   2073:                     $r->print('</font></td>');
                   2074:                     if ($cols_output != 4) {
                   2075:                         $r->print('<td valign="top"><font size="-2">');
                   2076:                         $cols_output++;
                   2077:                     }
                   2078:                 }
1.89      www      2079: 	    }
1.103     matthew  2080:             while($cols_output++ < 4) {
                   2081:                 $r->print('</font></td><td><font>')
                   2082:             }
                   2083: 	    $r->print('</font></td></tr>'."\n");
1.89      www      2084: 	}
                   2085:     }
1.92      www      2086:     $r->print('</table></form>');
1.89      www      2087:     $r->print('<h1>'.&mt('Done').'.</h1>');
                   2088: 
                   2089:     &untiehash();
1.75      www      2090: }
                   2091: 
1.136     albertel 2092: sub mark_hash_old {
                   2093:     my $retie_hash=0;
                   2094:     if ($hashtied) {
                   2095: 	$retie_hash=1;
                   2096: 	&untiehash();
                   2097:     }
                   2098:     &tiehash('write');
                   2099:     $hash{'old'}=1;
                   2100:     &untiehash();
                   2101:     if ($retie_hash) { &tiehash(); }
                   2102: }
                   2103: 
                   2104: sub is_hash_old {
                   2105:     my $untie_hash=0;
                   2106:     if (!$hashtied) {
                   2107: 	$untie_hash=1;
                   2108: 	&tiehash();
                   2109:     }
                   2110:     my $return=$hash{'old'};
                   2111:     if ($untie_hash) { &untiehash(); }
                   2112:     return $return;
                   2113: }
                   2114: 
1.91      www      2115: sub changewarning {
1.177     albertel 2116:     my ($r,$postexec,$message,$url)=@_;
1.136     albertel 2117:     if (!&is_hash_old()) { return; }
1.150     albertel 2118:     my $pathvar='folderpath';
1.228     www      2119:     my $path=&escape($env{'form.folderpath'});
1.177     albertel 2120:     if (!defined($url)) {
                   2121: 	if (defined($env{'form.pagepath'})) {
                   2122: 	    $pathvar='pagepath';
1.228     www      2123: 	    $path=&escape($env{'form.pagepath'});
                   2124: 	    $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
1.177     albertel 2125: 	}
                   2126: 	$url='/adm/coursedocs?'.$pathvar.'='.$path;
                   2127:     }
1.230     albertel 2128:     my $course_type = &Apache::loncommon::course_type();
1.177     albertel 2129:     if (!defined($message)) {
                   2130: 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150     albertel 2131:     }
1.185     www      2132:     $r->print("\n\n".
                   2133: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
                   2134: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177     albertel 2135: '<input type="hidden" name="orgurl" value="'.$url.
1.117     albertel 2136: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177     albertel 2137: &mt($message,' <input type="hidden" name="'.
                   2138:     $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230     albertel 2139:     &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185     www      2140: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91      www      2141: }
                   2142: 
1.75      www      2143: # ================================================================ Main Handler
                   2144: sub handler {
                   2145:     my $r = shift;
1.82      www      2146:     &Apache::loncommon::content_type($r,'text/html');
1.75      www      2147:     $r->send_http_header;
                   2148:     return OK if $r->header_only;
1.230     albertel 2149:     my $type = &Apache::loncommon::course_type();
1.75      www      2150: 
                   2151: # --------------------------------------------- Initialize help topics for this
1.209     albertel 2152:     foreach ('Adding_Course_Doc','Main_Course_Documents',
                   2153: 	     'Adding_External_Resource','Navigate_Content',
                   2154: 	     'Adding_Folders','Docs_Overview', 'Load_Map',
                   2155: 	     'Supplemental','Score_Upload_Form','Adding_Pages',
                   2156: 	     'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                   2157: 	     'Check_Resource_Versions','Verify_Content') {
                   2158: 	$help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
                   2159:     }
1.75      www      2160:     # Composite help files
                   2161:     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
                   2162: 		    'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
                   2163:     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
                   2164: 		    'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86      albertel 2165:     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
                   2166: 		    'Option_Response_Simple');
1.75      www      2167:     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
                   2168: 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
                   2169:     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
                   2170: 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
                   2171:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2172: 
1.209     albertel 2173: # does this user have privileges to modify docs
                   2174:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2175: 
                   2176:   if ($allowed && $env{'form.verify'}) {
1.75      www      2177:       &verifycontent($r);
1.209     albertel 2178:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.208     albertel 2179:       &list_symbs($r);
1.209     albertel 2180:   } elsif ($allowed && $env{'form.versions'}) {
1.75      www      2181:       &checkversions($r);
1.209     albertel 2182:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75      www      2183:       &dumpcourse($r);
1.209     albertel 2184:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.138     raeburn  2185:       &exportcourse($r);
1.26      www      2186:   } else {
1.7       www      2187: # is this a standard course?
                   2188: 
1.174     albertel 2189:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2190:     my $forcestandard = 0;
1.15      www      2191:     my $forcesupplement;
                   2192:     my $script='';
1.19      www      2193:     my $showdoc=0;
1.142     raeburn  2194:     my $containertag;
                   2195:     my $uploadtag;
1.15      www      2196:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2197: 					    ['folderpath','pagepath',
                   2198: 					     'pagesymb','markedcopy_url',
                   2199: 					     'markedcopy_title']);
1.174     albertel 2200:     if ($env{'form.folderpath'}) {
                   2201: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2202: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2203: 	$env{'form.folder'}=pop(@folderpath);
                   2204:     }
                   2205:     if ($env{'form.pagepath'}) {
                   2206:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2207:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2208:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2209:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2210: 	    '<input type="hidden" name="pagesymb" value="" />';
1.174     albertel 2211:         $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
                   2212: 	    '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142     raeburn  2213:     }
1.21      www      2214:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2215:        $showdoc='/'.$1;
1.21      www      2216:     }
                   2217:     unless ($showdoc) { # got called from remote
1.237     albertel 2218:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2219:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2220:            $forcestandard = 1;
                   2221:        } 
1.174     albertel 2222:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2223: 
1.15      www      2224:        if ($allowed) { 
                   2225:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2226:          $script=&Apache::lonratedt::editscript('simple'); 
                   2227:        }
                   2228:     } else { # got called in sequence from course
                   2229:        $allowed=0;
1.3       www      2230:     }
1.4       www      2231: 
                   2232: # get course data
1.174     albertel 2233:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2234:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2235: 
1.225     albertel 2236: # get personal data 
1.174     albertel 2237:     my $uname=$env{'user.name'};
                   2238:     my $udom=$env{'user.domain'};
1.228     www      2239:     my $plainname=&escape(
1.14      www      2240:                      &Apache::loncommon::plainname($uname,$udom));
                   2241: 
1.8       www      2242: # graphics settings
1.4       www      2243: 
1.176     albertel 2244:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2245: 
1.224     albertel 2246:     if ($allowed) {
                   2247: 	$script .= &editing_js($udom,$uname);
1.171     www      2248:     }
1.42      www      2249: # -------------------------------------------------------------------- Body tag
1.224     albertel 2250:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229     raeburn  2251:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225     albertel 2252: 					     {'force_register' => $showdoc,}).
1.233     albertel 2253: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2254:   
1.188     raeburn  2255:   my %allfiles = ();
                   2256:   my %codebase = ();
                   2257:   my ($upload_result,$upload_output);
                   2258:   if ($allowed) {
                   2259:       if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
                   2260: # Process file upload - phase one - upload and parse primary file.  
1.190     albertel 2261:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2262: 						$coursedom,\%allfiles,
1.194     raeburn  2263: 						\%codebase,$1);
1.188     raeburn  2264:           if ($upload_result eq 'phasetwo') {
                   2265:               $r->print($upload_output);
                   2266:           }
                   2267:       } elsif ($env{'form.phasetwo'}) {
                   2268:           my %newname = ();
                   2269:           my %origname = ();
                   2270:           my %attribs = ();
                   2271:           my $updateflag = 0;
                   2272:           my $residx = $env{'form.newidx'};
1.228     www      2273:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2274: # Process file upload - phase two - gather secondary files.
                   2275:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2276:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2277:                   my $javacodebase;
                   2278:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2279:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2280:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2281:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2282:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2283:                   }
                   2284:                   my @attributes = ();
                   2285:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                   2286:                       @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                   2287:                   } else {
                   2288:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2289:                   }
                   2290:                   foreach (@attributes) {
1.228     www      2291:                       push(@{$attribs{$i}},&unescape($_));
1.188     raeburn  2292:                   }
                   2293:                   if ($javacodebase) {
                   2294:                       $codebase{$i} = $javacodebase;
                   2295:                       $codebase{$i} =~ s#/$##;
                   2296:                       $updateflag = 1;
                   2297:                   }
                   2298:               }
                   2299:               unless ($newname{$i} eq $origname{$i}) {
                   2300:                   $updateflag = 1;
                   2301:               }
                   2302:           }
                   2303: # Process file upload - phase three - modify primary file
                   2304:           if ($updateflag) {
                   2305:               my ($content,$rtncode);
                   2306:               my $updateflag = 0;
                   2307:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2308:               if ($getstatus eq 'ok') {
                   2309:                   foreach my $item (keys %newname) {
                   2310:                       if ($newname{$item} ne $origname{$item}) {
                   2311:                           my $attrib_regexp = '';
                   2312:                           if (@{$attribs{$item}} > 1) {
                   2313:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2314:                           } else {
                   2315:                               $attrib_regexp = $attribs{$item}[0];
                   2316:                           }
                   2317:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2318:                           } 
                   2319:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2320:                       }
                   2321:                       if (exists($codebase{$item})) {
1.224     albertel 2322:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2323:                       }
                   2324:                   }
                   2325: # Save edited file.
                   2326:                   my $saveresult;
                   2327:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2328:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2329:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2330:               } else {
                   2331:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2332:               }
                   2333:           }
                   2334:       }
                   2335:   }
                   2336: 
                   2337:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2338: # -----------------------------------------------------------------------------
                   2339:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2340:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2341:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2342:                 'impp' => 'Import a document',
                   2343:                 'pubd' => 'Published documents',
1.181     www      2344: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2345:                 'spec' => 'Special documents',
                   2346:                 'upld' => 'Upload Document',
                   2347:                 'srch' => 'Search',
                   2348:                 'impo' => 'Import',
1.232     www      2349: 		'book' => 'Import Bookmarks',
1.81      www      2350:                 'selm' => 'Select Map',
                   2351:                 'load' => 'Load Map',
1.186     www      2352:                 'reco' => 'Recover Deleted Resources',
1.81      www      2353:                 'newf' => 'New Folder',
1.142     raeburn  2354:                 'newp' => 'New Composite Page',
1.81      www      2355:                 'extr' => 'External Resource',
                   2356:                 'syll' => 'Syllabus',
                   2357:                 'navc' => 'Navigate Contents',
                   2358:                 'sipa' => 'Simple Page',
                   2359:                 'sipr' => 'Simple Problem',
1.219     www      2360:                 'drbx' => 'Drop Box',
1.81      www      2361:                 'scuf' => 'Score Upload Form',
                   2362:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2363:                 'mypi' => 'My Personal Info',
1.101     www      2364: 		'abou' => 'About User',
1.110     raeburn  2365:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2366:                 'file' =>  'File',
                   2367:                 'title' => 'Title',
1.188     raeburn  2368:                 'comment' => 'Comment',
                   2369:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2370: 					  );
                   2371: # -----------------------------------------------------------------------------
1.42      www      2372:     if ($allowed) {
1.74      www      2373:        my $dumpbut=&dumpbutton();
1.138     raeburn  2374:        my $exportbut=&exportbutton();
1.88      www      2375:        my %lt=&Apache::lonlocal::texthash(
                   2376: 					 'vc' => 'Verify Content',
                   2377: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2378: 					 'ls' => 'List Symbs',
1.88      www      2379: 					  );
1.118     albertel 2380: 
1.174     albertel 2381:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2382:        if (!$folderpath) {
1.174     albertel 2383: 	   if ($env{'form.folder'} eq '' ||
                   2384: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2385: 	       $folderpath='default&'.
1.230     albertel 2386: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2387: 	   }
                   2388:        }
1.174     albertel 2389:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2390:            $containertag = '<input type="hidden" name="folderpath" value="" />';
                   2391:            $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
                   2392:        }
                   2393: 
1.42      www      2394:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2395: <form name="renameform" method="post" action="/adm/coursedocs">
                   2396: <input type="hidden" name="title" />
                   2397: <input type="hidden" name="cmd" />
1.168     www      2398: <input type="hidden" name="markcopy" />
1.142     raeburn  2399: $containertag
1.36      www      2400: </form>
1.39      www      2401: <form name="simpleedit" method="post" action="/adm/coursedocs">
                   2402: <input type=hidden name="importdetail" value="">
1.142     raeburn  2403: $uploadtag
1.39      www      2404: </form>
1.26      www      2405: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74      www      2406: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
                   2407: <tr><td bgcolor="#DDDDCC">
1.130     www      2408: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74      www      2409: </td><td bgcolor="#DDDDCC">
1.130     www      2410:     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74      www      2411: $dumpbut
1.138     raeburn  2412: $exportbut
1.218     albertel 2413: </td><td bgcolor="#DDDDCC">
1.208     albertel 2414:     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.218     albertel 2415: </td></tr></table>
1.25      www      2416: </form>
                   2417: ENDCOURSEVERIFY
1.74      www      2418:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2419: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2420:     }
1.17      www      2421: # --------------------------------------------------------- Standard documents
1.43      www      2422:     $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7       www      2423:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116     albertel 2424: 	$r->print('<tr><td bgcolor="#BBBBBB">');
                   2425: #  '<h2>'.&mt('Main Course Documents').
                   2426: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2427:        my $folder=$env{'form.folder'};
1.117     albertel 2428:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2429:            $folder='default';
1.230     albertel 2430: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112     raeburn  2431:        }
1.51      www      2432:        my $postexec='';
                   2433:        if ($folder eq 'default') {
                   2434: 	   $r->print('<script>this.window.name="loncapaclient";</script>');
                   2435:        } else {
1.117     albertel 2436:            #$postexec='self.close();';
1.51      www      2437:        }
1.40      www      2438:        $hadchanges=0;
1.188     raeburn  2439:        &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40      www      2440:        if ($hadchanges) {
1.136     albertel 2441: 	   &mark_hash_old()
1.40      www      2442:        }
1.136     albertel 2443:        &changewarning($r,$postexec);
1.16      www      2444:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2445:                      '.sequence';
1.142     raeburn  2446:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2447:                      '.page';
1.186     www      2448: 	my $container='sequence';
                   2449: 	if ($env{'form.pagepath'}) {
                   2450: 	    $container='page';
                   2451: 	}
                   2452: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2453:        $r->print(<<ENDFORM);
1.43      www      2454: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2455: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
                   2456: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
                   2457: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11      www      2458: </tr>
1.16      www      2459: <tr><td bgcolor="#DDDDDD">
1.96      sakharuk 2460: $lt{'file'}:<br />
1.182     albertel 2461: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2462: <input type="file" name="uploaddoc" size="40">
1.8       www      2463: <br />
1.96      sakharuk 2464: $lt{'title'}:<br />
1.11      www      2465: <input type="text" size="50" name="comment">
1.142     raeburn  2466: $uploadtag
1.10      www      2467: <input type="hidden" name="cmd" value="upload_default">
1.188     raeburn  2468: <br />
                   2469: <nobr>
1.190     albertel 2470: <label>$lt{'parse'}?
1.188     raeburn  2471: <input type="checkbox" name="parserflag" />
1.190     albertel 2472: </label>
1.188     raeburn  2473: </nobr>
                   2474: <br />
                   2475: <br />
1.129     albertel 2476: <nobr>
1.81      www      2477: <input type="submit" value="$lt{'upld'}">
1.60      albertel 2478:  $help{'Uploading_From_Harddrive'}
1.58      albertel 2479: </nobr>
1.60      albertel 2480: </form>
1.11      www      2481: </td>
1.16      www      2482: <td bgcolor="#DDDDDD">
1.39      www      2483: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2484: $lt{'pubd'}<br />
1.142     raeburn  2485: $uploadtag
1.232     www      2486: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
                   2487: <br />
1.58      albertel 2488: <nobr>
1.232     www      2489: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2490: $help{'Importing_LON-CAPA_Resource'}
                   2491: </nobr>
1.232     www      2492: <br />
                   2493: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59      www      2494: <p>
                   2495: <hr />
1.181     www      2496: $lt{'copm'}<br />
                   2497: <input type="text" size="40" name="importmap"><br />
1.68      bowersj2 2498: <nobr><input type=button 
1.52      www      2499: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81      www      2500: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68      bowersj2 2501: $help{'Load_Map'}</nobr>
1.59      www      2502: </p>
1.52      www      2503: </form>
1.186     www      2504: <hr />
                   2505: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2506: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2507: </form>
1.142     raeburn  2508: ENDFORM
1.174     albertel 2509:        unless ($env{'form.pagepath'}) {
1.168     www      2510: 	   $r->print(<<ENDFORM);
                   2511: <hr />
                   2512: <form action="/adm/coursedocs" method="post" name="newext">
                   2513: $uploadtag
                   2514: <input type=hidden name="importdetail" value="">
                   2515: <nobr>
                   2516: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2517: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
                   2518: </nobr>
                   2519: </form>
1.214     www      2520: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2521: <input type="hidden" name="folder" value="$folder" />
                   2522: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2523: </nobr>
                   2524: </form>
                   2525: ENDFORM
                   2526:        }
                   2527:        $r->print('</td><td bgcolor="#DDDDDD">');
1.174     albertel 2528:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2529:            $r->print(<<ENDFORM);
1.214     www      2530: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174     albertel 2531: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13      www      2532: <input type=hidden name="importdetail" value="">
1.58      albertel 2533: <nobr>
1.16      www      2534: <input name="newfolder" type="button"
                   2535: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2536: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58      albertel 2537: </nobr>
1.11      www      2538: </form>
1.214     www      2539: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174     albertel 2540: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142     raeburn  2541: <input type=hidden name="importdetail" value="">
                   2542: <nobr>
                   2543: <input name="newpage" type="button"
                   2544: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2545: value="$lt{'newp'}" />$help{'Adding_Pages'}
                   2546: </nobr>
                   2547: </form>
1.214     www      2548: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2549: $uploadtag
1.14      www      2550: <input type=hidden name="importdetail" 
                   2551: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2552: <nobr>
1.81      www      2553: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2554:  $help{'Syllabus'}
1.58      albertel 2555: </nobr>
                   2556: </form>
1.214     www      2557: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2558: $uploadtag
1.15      www      2559: <input type=hidden name="importdetail" 
                   2560: value="Navigate Content=/adm/navmaps">
1.58      albertel 2561: <nobr>
1.81      www      2562: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2563: $help{'Navigate_Content'}
1.58      albertel 2564: </nobr>
1.22      www      2565: </form>
1.214     www      2566: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2567: $uploadtag
1.22      www      2568: <input type=hidden name="importdetail" value="">
1.58      albertel 2569: <nobr>
1.81      www      2570: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2571: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58      albertel 2572: </nobr>
1.55      www      2573: </form>
1.214     www      2574: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2575: $uploadtag
1.55      www      2576: <input type=hidden name="importdetail" value="">
1.58      albertel 2577: <nobr>
1.81      www      2578: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2579: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62      www      2580: </nobr>
                   2581: </form>
1.219     www      2582: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2583: $uploadtag      
                   2584: <input type=hidden name="importdetail" value="">
                   2585: <nobr>          
                   2586: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   2587: onClick="javascript:makedropbox();" />
                   2588: </nobr>         
                   2589: </form> 
1.214     www      2590: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2591: $uploadtag
1.62      www      2592: <input type=hidden name="importdetail" value="">
                   2593: <nobr>
1.81      www      2594: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      2595: onClick="javascript:makeexamupload();" />
1.66      bowersj2 2596: $help{'Score_Upload_Form'}
1.58      albertel 2597: </nobr>
1.22      www      2598: </form>
1.214     www      2599: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  2600: $uploadtag
1.22      www      2601: <input type=hidden name="importdetail" value="">
1.58      albertel 2602: <nobr>
1.81      www      2603: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      2604: onClick="javascript:makebulboard();" />
1.65      bowersj2 2605: $help{'Bulletin Board'}
1.58      albertel 2606: </nobr>
                   2607: </form>
1.214     www      2608: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  2609: $uploadtag
1.14      www      2610: <input type=hidden name="importdetail" 
                   2611: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2612: <nobr>
1.81      www      2613: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2614: $help{'My Personal Info'}
1.101     www      2615: </nobr>
                   2616: </form>
1.214     www      2617: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  2618: $uploadtag
1.101     www      2619: <input type=hidden name="importdetail" value="">
                   2620: <nobr>
                   2621: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   2622: onClick="javascript:makeabout();" />
1.110     raeburn  2623: </nobr>
1.182     albertel 2624: </form>
1.142     raeburn  2625: ENDFORM
                   2626:        }
1.174     albertel 2627:        if ($env{'form.pagepath'}) {
1.142     raeburn  2628:            $r->print(<<ENDBLOCK);
                   2629: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   2630: $uploadtag
                   2631: <input type=hidden name="importdetail" value="">
                   2632: <nobr>
                   2633: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   2634: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
                   2635: </nobr>
                   2636: </form>
1.214     www      2637: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2638: $uploadtag
                   2639: <input type=hidden name="importdetail" value="">
                   2640: <nobr>
                   2641: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   2642: onClick="javascript:makeexamupload();" />
                   2643: $help{'Score_Upload_Form'}
                   2644: </nobr>
1.182     albertel 2645: </form>
1.142     raeburn  2646: ENDBLOCK
                   2647:        }
                   2648:        $r->print('</td></tr>'."\n".
                   2649: '</table>');
1.24      www      2650:        $r->print('</td></tr>');
1.7       www      2651:     }
                   2652: # ----------------------------------------------------- Supplemental documents
                   2653:     if (!$forcestandard) {
1.116     albertel 2654:        $r->print('<tr><td bgcolor="#BBBBBB">');
                   2655: # '<h2>'.&mt('Supplemental Course Documents').
                   2656: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 2657:        my $folder=$env{'form.folder'};
1.117     albertel 2658:        unless ($folder=~/^supplemental/) {
1.116     albertel 2659: 	   $folder='supplemental';
1.117     albertel 2660:        }
                   2661:        if ($folder =~ /^supplemental$/ &&
1.174     albertel 2662: 	   $env{'form.folderpath'} =~ /^default\&/) {
                   2663: 	   $env{'form.folderpath'}='supplemental&'.
1.230     albertel 2664: 	       &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 2665:        }
1.7       www      2666:        &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8       www      2667:        if ($allowed) {
1.17      www      2668:        my $folderseq=
                   2669:                   '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   2670:                      '.sequence';
                   2671: 
1.8       www      2672:           $r->print(<<ENDSUPFORM);
1.43      www      2673: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2674: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
                   2675: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17      www      2676: </tr>
                   2677: <tr><td bgcolor="#DDDDDD">
1.10      www      2678: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2679: <input type="file" name="uploaddoc" size="40">
1.196     raeburn  2680: <br />
                   2681: <br />
                   2682: <nobr>
                   2683: <label>$lt{'parse'}?
                   2684: <input type="checkbox" name="parserflag" />
                   2685: </label>
                   2686: </nobr>
                   2687: <br /><br />
                   2688: $lt{'comment'}:<br />
1.4       www      2689: <textarea cols=50 rows=4 name='comment'>
                   2690: </textarea>
1.115     albertel 2691: <br />
1.174     albertel 2692: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10      www      2693: <input type="hidden" name="cmd" value="upload_supplemental">
1.58      albertel 2694: <nobr>
1.81      www      2695: <input type="submit" value="$lt{'upld'}">
1.58      albertel 2696:  $help{'Uploading_From_Harddrive'}
                   2697: </nobr>
                   2698: </form>
1.17      www      2699: </td>
                   2700: <td bgcolor="#DDDDDD">
1.18      www      2701: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174     albertel 2702: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2703: <input type=hidden name="importdetail" value="">
1.58      albertel 2704: <nobr>
1.17      www      2705: <input name="newfolder" type="button"
                   2706: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2707: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58      albertel 2708: </nobr>
1.17      www      2709: </form>
1.214     www      2710: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174     albertel 2711: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2712: <input type=hidden name="importdetail" value="">
1.58      albertel 2713: <nobr>
1.18      www      2714: <input name="newext" type="button" 
                   2715: onClick="javascript:makenewext('supnewext');"
1.81      www      2716: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58      albertel 2717: </nobr>
1.17      www      2718: </form>
1.214     www      2719: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174     albertel 2720: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2721: <input type=hidden name="importdetail" 
                   2722: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2723: <nobr>
1.81      www      2724: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 2725: $help{'Syllabus'}
1.58      albertel 2726: </nobr>
                   2727: </form>
1.214     www      2728: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174     albertel 2729: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2730: <input type=hidden name="importdetail" 
                   2731: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2732: <nobr>
1.81      www      2733: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2734: $help{'My Personal Info'}
1.58      albertel 2735: </nobr>
                   2736: </form>
1.17      www      2737: </td></tr>
1.24      www      2738: </table></td></tr>
1.8       www      2739: ENDSUPFORM
                   2740:        }
1.7       www      2741:     }
1.18      www      2742:     if ($allowed) {
1.182     albertel 2743: 	$r->print('<form method="POST" name="extimport" action="/adm/coursedocs"><input type="hidden" name="title" /><input type="hidden" name="url" /><input type="hidden" name="useform" /></form>');
1.18      www      2744:     }
1.24      www      2745:     $r->print('</table>');
1.19      www      2746:   } else {
1.188     raeburn  2747:       unless ($upload_result eq 'phasetwo') {
1.19      www      2748: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  2749:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 2750: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81      www      2751: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188     raeburn  2752:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
                   2753:       }
1.19      www      2754:   }
1.26      www      2755:  }
1.224     albertel 2756:  $r->print(&Apache::loncommon::end_page());
1.26      www      2757:  return OK;
1.1       www      2758: } 
                   2759: 
1.224     albertel 2760: 
                   2761: sub editing_js {
                   2762:     my ($udom,$uname) = @_;
                   2763:     my $now = time();
                   2764: 
                   2765:     return <<ENDNEWSCRIPT;
                   2766: function makenewfolder(targetform,folderseq) {
                   2767:     var foldername=prompt('Name of New Folder','New Folder');
                   2768:     if (foldername) {
1.236     albertel 2769:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 2770:         targetform.submit();
                   2771:     }
                   2772: }
                   2773: 
                   2774: function makenewpage(targetform,folderseq) {
                   2775:     var pagename=prompt('Name of New Page','New Page');
                   2776:     if (pagename) {
1.236     albertel 2777:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 2778:         targetform.submit();
                   2779:     }
                   2780: }
                   2781: 
                   2782: function makenewext(targetname) {
                   2783:     this.document.forms.extimport.useform.value=targetname;
                   2784:     window.open('/adm/rat/extpickframe.html');
                   2785: }
                   2786: 
                   2787: function makeexamupload() {
                   2788:    var title=prompt('Listed Title for the Uploaded Score');
                   2789:    if (title) { 
                   2790:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 2791: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 2792:     this.document.forms.newexamupload.submit();
                   2793:    }
                   2794: }
                   2795: 
                   2796: function makesmppage() {
                   2797:    var title=prompt('Listed Title for the Page');
                   2798:    if (title) { 
                   2799:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 2800: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 2801:     this.document.forms.newsmppg.submit();
                   2802:    }
                   2803: }
                   2804: 
                   2805: function makesmpproblem() {
                   2806:    var title=prompt('Listed Title for the Problem');
                   2807:    if (title) { 
                   2808:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 2809: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 2810:     this.document.forms.newsmpproblem.submit();
                   2811:    }
                   2812: }
                   2813: 
                   2814: function makedropbox() {
                   2815:    var title=prompt('Listed Title for the Drop Box');
                   2816:    if (title) { 
                   2817:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 2818:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 2819:     this.document.forms.newdropbox.submit();
                   2820:    }
                   2821: }
                   2822: 
                   2823: function makebulboard() {
                   2824:    var title=prompt('Listed Title for the Bulletin Board');
                   2825:    if (title) {
                   2826:     this.document.forms.newbul.importdetail.value=
1.236     albertel 2827: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 2828:     this.document.forms.newbul.submit();
                   2829:    }
                   2830: }
                   2831: 
                   2832: function makeabout() {
1.236     albertel 2833:    var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224     albertel 2834:    if (user) {
                   2835:        var comp=new Array();
1.236     albertel 2836:        comp=user.split(':');
1.224     albertel 2837:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   2838: 	   if ((comp[0]) && (comp[1])) {
                   2839: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.236     albertel 2840: 		   'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 2841: 	       this.document.forms.newaboutsomeone.submit();
                   2842: 	   } else {
1.236     albertel 2843:                alert("Not a valid user:domain");
1.224     albertel 2844:            }
                   2845:        } else {
1.236     albertel 2846:            alert("Please enter both user and domain in the format user:domain"); 
1.224     albertel 2847:        }
                   2848:    }
                   2849: }
                   2850: 
                   2851: function makeims() {
                   2852:     var caller = document.forms.ims.folder.value;
                   2853:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   2854:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   2855:     newWindow.location.href = newlocation;
                   2856: }
                   2857: 
                   2858: 
                   2859: function finishpick() {
                   2860:     var title=this.document.forms.extimport.title.value;
                   2861:     var url=this.document.forms.extimport.url.value;
                   2862:     var form=this.document.forms.extimport.useform.value;
                   2863:     eval
                   2864:      ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
                   2865:     '";this.document.forms.'+form+'.submit();');
                   2866: }
                   2867: 
                   2868: function changename(folderpath,index,oldtitle,container,pagesymb) {
                   2869:     var title=prompt('New Title',oldtitle);
                   2870:     if (title) {
                   2871: 	this.document.forms.renameform.title.value=title;
                   2872: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   2873:         if (container == 'sequence') {
                   2874: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   2875:         }
                   2876:         if (container == 'page') {
                   2877:             this.document.forms.renameform.pagepath.value=folderpath;
                   2878:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2879:         }
                   2880:         this.document.forms.renameform.submit();
                   2881:     }
                   2882: }
                   2883: 
                   2884: function removeres(folderpath,index,oldtitle,container,pagesymb) {
                   2885:     if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
                   2886: 	this.document.forms.renameform.cmd.value='del_'+index;
                   2887:         if (container == 'sequence') {
                   2888:             this.document.forms.renameform.folderpath.value=folderpath;
                   2889:         }
                   2890:         if (container == 'page') {
                   2891:             this.document.forms.renameform.pagepath.value=folderpath;
                   2892:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2893:         }
                   2894:         this.document.forms.renameform.submit();
                   2895:     }
                   2896: }
                   2897: 
                   2898: function cutres(folderpath,index,oldtitle,container,pagesymb) {
                   2899:     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
                   2900: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   2901: 	this.document.forms.renameform.markcopy.value=index;
                   2902:         if (container == 'sequence') {
                   2903:             this.document.forms.renameform.folderpath.value=folderpath;
                   2904:         }
                   2905:         if (container == 'page') {
                   2906:             this.document.forms.renameform.pagepath.value=folderpath;
                   2907:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   2908:         }
                   2909:         this.document.forms.renameform.submit();
                   2910:     }
                   2911: }
                   2912: 
                   2913: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
                   2914:     this.document.forms.renameform.markcopy.value=index;
                   2915:     if (container == 'sequence') {
                   2916: 	this.document.forms.renameform.folderpath.value=folderpath;
                   2917:     }
                   2918:     if (container == 'page') {
                   2919: 	this.document.forms.renameform.pagepath.value=folderpath;
                   2920: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   2921:     }
                   2922:     this.document.forms.renameform.submit();
                   2923: }
                   2924: 
                   2925: ENDNEWSCRIPT
                   2926: }
1.1       www      2927: 1;
                   2928: __END__

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