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

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

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