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

1.1       www         1: # The LearningOnline Network
1.2       www         2: # Documents
1.1       www         3: #
1.255   ! raeburn     4: # $Id: londocs.pm,v 1.254 2006/11/20 17:45:11 albertel 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_res'}=$oldresources[$parmidx];
                   1031:            foreach my $parm (keys %parmaction) {
                   1032:               $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
                   1033:               $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
                   1034:            }
                   1035:         }
                   1036:         my $maxidx=$#oldresources;
1.248     albertel 1037:         if ($#LONCAPA::map::resources>$#oldresources) {
                   1038:            $maxidx=$#LONCAPA::map::resources;
1.247     www      1039:         }
                   1040:         for (my $idx=0; $idx<=$maxidx; $idx++) {
                   1041:            if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) {
                   1042:               $storehash{'before_resources_'.$idx}=$oldresources[$idx];
                   1043:               $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx];
1.249     www      1044:               $changedflag=1;
1.247     www      1045:            }
                   1046:            if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) {
1.252     www      1047:               $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]];
                   1048:               $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.249     www      1049:               $changedflag=1;
1.247     www      1050:            }
                   1051:         }
1.251     www      1052: 	$storehash{'maxidx'}=$maxidx;
1.249     www      1053:         if ($changedflag) { &log_docs(\%storehash); }
1.247     www      1054:     }
                   1055: }
                   1056: 
                   1057: 
                   1058: #
                   1059: # Docs Change Log
                   1060: #
                   1061: sub docs_change_log {
                   1062:     my ($r)=@_;
                   1063:     $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
                   1064:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
1.254     albertel 1065: 
1.247     www      1066:     my %docslog=&Apache::lonnet::dump('nohist_docslog',
                   1067:                                       $env{'course.'.$env{'request.course.id'}.'.domain'},
                   1068:                                       $env{'course.'.$env{'request.course.id'}.'.num'});
1.254     albertel 1069: 
1.247     www      1070:     if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
1.254     albertel 1071: 
1.247     www      1072:     $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
                   1073:               '<input type="hidden" name="docslog" value="1" />');
1.254     albertel 1074: 
1.247     www      1075:     my %saveable_parameters = ('show' => 'scalar',);
                   1076:     &Apache::loncommon::store_course_settings('docs_log',
                   1077:                                               \%saveable_parameters);
                   1078:     &Apache::loncommon::restore_course_settings('docs_log',
                   1079:                                                 \%saveable_parameters);
                   1080:     if (!$env{'form.show'}) { $env{'form.show'}=10; }
1.254     albertel 1081:     my %lt=('hiddenresource' => 'Resources hidden',
                   1082: 	    'encrypturl'     => 'URL hidden',
                   1083: 	    'randompick'     => 'Randomly pick',
                   1084: 	    'set'            => 'set to',
                   1085: 	    'del'            => 'deleted');
                   1086: 
1.247     www      1087:     my $countselect =
                   1088:         &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
                   1089:                                     (&mt('all'),10,20,50,100,1000,10000));
1.254     albertel 1090: 
1.247     www      1091:     $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
                   1092:               '<input type="submit" value="'.&mt('Display').'" /></form>');
                   1093:     $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
1.251     www      1094:               '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
                   1095:               &mt('After').'</th>'.
1.247     www      1096:               &Apache::loncommon::end_data_table_header_row());
                   1097:     my $shown=0;
                   1098:     foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
                   1099:         my @changes=keys(%{$docslog{$id}{'logentry'}});
                   1100:         my $count = 0;
                   1101:         my $time =
                   1102:             &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
                   1103:         my $plainname =
                   1104:             &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},
                   1105:                                           $docslog{$id}{'exe_udom'});
                   1106:         my $about_me_link =
                   1107:             &Apache::loncommon::aboutmewrapper($plainname,
                   1108:                                                $docslog{$id}{'exe_uname'},
                   1109:                                                $docslog{$id}{'exe_udom'});
                   1110:         my $send_msg_link='';
                   1111:         if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'})
                   1112:              || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
                   1113:             $send_msg_link ='<br />'.
                   1114:                 &Apache::loncommon::messagewrapper(&mt('Send message'),
                   1115:                                                    $docslog{$id}{'exe_uname'},
                   1116:                                                    $docslog{$id}{'exe_udom'});
                   1117:         }
                   1118:         $r->print(&Apache::loncommon::start_data_table_row());
                   1119:         $r->print('<td>'.$time.'</td>
                   1120:                        <td>'.$about_me_link.
                   1121:                   '<br /><tt>'.$docslog{$id}{'exe_uname'}.
                   1122:                                   ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
1.249     www      1123:                   $send_msg_link.'</td><td>'.
1.251     www      1124:                   $docslog{$id}{'logentry'}{'folder'}.'</td><td>');
                   1125: # Before
                   1126: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1127: 	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
                   1128: 	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
                   1129: 	    if ($oldname ne $newname) {
1.252     www      1130: 		$r->print(&LONCAPA::map::qtescape($oldname));
1.251     www      1131: 	    }
                   1132: 	}
1.252     www      1133: 	$r->print('<ul>');
                   1134: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1135:             if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {
                   1136: 		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>');
                   1137: 	    }
                   1138: 	}
                   1139: 	$r->print('</ul>');
1.251     www      1140: # After
                   1141:         $r->print('</td><td>');
                   1142: 
                   1143: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1144: 	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
                   1145: 	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
                   1146: 	    if ($oldname ne $newname) {
1.252     www      1147: 		$r->print(&LONCAPA::map::qtescape($newname));
1.251     www      1148: 	    }
                   1149: 	}        
1.252     www      1150: 	$r->print('<ul>');
                   1151: 	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
                   1152:             if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {
                   1153: 		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>');
                   1154: 	    }
                   1155: 	}
                   1156: 	$r->print('</ul>');
                   1157: 	if ($docslog{$id}{'logentry'}{'parameter_res'}) {
                   1158: 	    $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
1.253     www      1159: 	    foreach my $parameter ('randompick','hiddenresource','encrypturl') {
1.252     www      1160: 		if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
1.254     albertel 1161: 		    $r->print('<li>'.
                   1162: 			      &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
                   1163: 				  $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
                   1164: 			      .'</li>');
1.252     www      1165: 		}
                   1166: 	    }
                   1167: 	    $r->print('</ul>');
                   1168: 	}
1.251     www      1169: # End
                   1170:         $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.247     www      1171:         $shown++;
                   1172:         if (!($env{'form.show'} eq &mt('all')
                   1173:               || $shown<=$env{'form.show'})) { last; }
                   1174:     }
                   1175:     $r->print(&Apache::loncommon::end_data_table());
                   1176:     $r->print(&Apache::loncommon::end_page());
                   1177: }
                   1178: 
1.7       www      1179: sub editor {
1.188     raeburn  1180:     my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_;
1.10      www      1181:     my $errtext='';
                   1182:     my $fatal=0;
1.142     raeburn  1183:     my $container='sequence';
1.174     albertel 1184:     if ($env{'form.pagepath'}) {
1.142     raeburn  1185:         $container='page';
                   1186:     }
1.10      www      1187:     ($errtext,$fatal)=
1.142     raeburn  1188:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1189:     if ($#LONCAPA::map::order<1) {
                   1190: 	my $idx=&LONCAPA::map::getresidx();
1.178     www      1191: 	if ($idx<=0) { $idx=1; }
1.245     albertel 1192:        	$LONCAPA::map::order[0]=$idx;
                   1193:         $LONCAPA::map::resources[$idx]='';
1.17      www      1194:     }
1.174     albertel 1195:     if (defined($env{'form.markcopy'})) {
1.168     www      1196: # Mark for copying
1.245     albertel 1197: 	my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
1.174     albertel 1198: 	$env{'form.markedcopy_title'}=$title;
                   1199: 	$env{'form.markedcopy_url'}=$url;
1.168     www      1200:     }
1.251     www      1201:     my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain)=&breadcrumbs($folder);
1.242     www      1202:     $r->print($breadcrumbtrail);
1.7       www      1203:     if ($fatal) {
                   1204: 	   $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1205:     } else {
                   1206: # ------------------------------------------------------------ Process commands
1.121     www      1207: 
1.16      www      1208: # ---------------- if they are for this folder and user allowed to make changes
1.174     albertel 1209: 	if (($allowed) && ($env{'form.folder'} eq $folder)) {
1.123     www      1210: # set parameters and change order
1.247     www      1211:             &snapshotbefore();
                   1212: 	    if ($env{'form.changeparms'}) {
1.174     albertel 1213: 		my $idx=$env{'form.setparms'};
1.123     www      1214: # set parameters
1.174     albertel 1215: 		if ($env{'form.randpick_'.$idx}) {
1.245     albertel 1216: 		    &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
1.247     www      1217:                     &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
1.121     www      1218: 		} else {
1.245     albertel 1219: 		    &LONCAPA::map::delparameter($idx,'parameter_randompick');
1.247     www      1220:                     &remember_parms($idx,'randompick','del');
1.121     www      1221: 		}
1.174     albertel 1222: 		if ($env{'form.hidprs_'.$idx}) {
1.245     albertel 1223: 		    &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
1.247     www      1224:                     &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
                   1225:  		} else {
1.245     albertel 1226: 		    &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
1.247     www      1227:                     &remember_parms($idx,'hiddenresource','del');
                   1228:  		}
1.174     albertel 1229: 		if ($env{'form.encprs_'.$idx}) {
1.245     albertel 1230: 		    &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
1.247     www      1231:                     &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
                   1232:  		} else {
1.245     albertel 1233: 		    &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
1.247     www      1234:                     &remember_parms($idx,'encrypturl','del');
                   1235:  		}
1.250     www      1236: # store the changed version
                   1237: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1238: 		if ($fatal) {
                   1239: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1240: 		    return;
                   1241: 		}
1.247     www      1242: 	    }
1.121     www      1243: 
1.247     www      1244: 	    if ($env{'form.newpos'}) {
1.123     www      1245: # change order
1.247     www      1246: 		my $newpos=$env{'form.newpos'}-1;
                   1247: 		my $currentpos=$env{'form.currentpos'}-1;
                   1248: 		my $i;
                   1249: 		my @neworder=();
                   1250: 		if ($newpos>$currentpos) {
1.125     www      1251: # moving stuff up
1.247     www      1252: 		    for ($i=0;$i<$currentpos;$i++) {
                   1253: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1254: 		    }
                   1255: 		    for ($i=$currentpos;$i<$newpos;$i++) {
                   1256: 			$neworder[$i]=$LONCAPA::map::order[$i+1];
                   1257: 		    }
                   1258: 		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
                   1259: 		    for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1260: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1261: 		    }
                   1262: 		} else {
1.125     www      1263: # moving stuff down
1.247     www      1264: 		    for ($i=0;$i<$newpos;$i++) {
                   1265: 			$neworder[$i]=$LONCAPA::map::order[$i];
                   1266: 		    }
                   1267: 		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
                   1268: 		    for ($i=$newpos+1;$i<$currentpos+1;$i++) {
                   1269: 			$neworder[$i]=$LONCAPA::map::order[$i-1];
                   1270: 		    }
                   1271: 		    for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
                   1272: 			$neworder[$i]=$LONCAPA::map::order[$i];
1.125     www      1273: 		    }
1.124     www      1274: 		}
1.247     www      1275: 		@LONCAPA::map::order=@neworder;
1.124     www      1276: # store the changed version
1.142     raeburn  1277: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
1.124     www      1278: 		if ($fatal) {
                   1279: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1280: 		    return;
1.123     www      1281: 		}
1.247     www      1282: 	    }
1.124     www      1283: 		
1.174     albertel 1284: 	    if ($env{'form.pastemarked'}) {
1.168     www      1285: # paste resource to end of list
1.174     albertel 1286:                 my $url=$env{'form.markedcopy_url'};
                   1287: 		my $title=$env{'form.markedcopy_title'};
1.168     www      1288: # Maps need to be copied first
                   1289: 		if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) {
                   1290: 		    $title=&mt('Copy of').' '.$title;
                   1291:                     my $newid=$$.time;
                   1292: 		    $url=~/^(.+)\.(\w+)$/;
                   1293: 		    my $newurl=$1.$newid.'.'.$2;
                   1294: 		    my $storefn=$newurl;
                   1295:                     $storefn=~s/^\/\w+\/\w+\/\w+\///;
1.244     albertel 1296: 		    &Apache::lonclonecourse::writefile
1.174     albertel 1297: 			($env{'request.course.id'},$storefn,
1.168     www      1298: 			 &Apache::lonnet::getfile($url));
                   1299: 		    $url=$newurl;
                   1300: 		}
                   1301: 		$title=~s/\</\&lt\;/g;
                   1302: 		$title=~s/\>/\&gt\;/g;
                   1303: 		$title=~s/\:/\&colon;/g;
                   1304: 		my $ext='false';
                   1305: 		if ($url=~/^http\:\/\//) { $ext='true'; }
                   1306: 		$url=~s/\:/\&colon;/g;
                   1307: # Now insert the URL at the bottom
1.245     albertel 1308:                 my $newidx=&LONCAPA::map::getresidx($url);
                   1309: 		$LONCAPA::map::resources[$newidx]=
1.168     www      1310: 		    $title.':'.$url.':'.$ext.':normal:res';
1.245     albertel 1311: 		$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
1.168     www      1312: # Store the result
                   1313: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
                   1314: 		if ($fatal) {
                   1315: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1316: 		    return;
                   1317: 		}
1.123     www      1318: 
1.168     www      1319: 	    }
1.188     raeburn  1320:             $r->print($upload_output);
1.174     albertel 1321: 	    if ($env{'form.cmd'}) {
                   1322:                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
1.10      www      1323:                 if ($cmd eq 'del') {
1.245     albertel 1324: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.187     www      1325: 		    if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
1.206     albertel 1326: 			($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
1.187     www      1327: 			&Apache::lonnet::removeuploadedurl($url);
                   1328: 		    } else {
1.245     albertel 1329: 			&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
1.128     albertel 1330: 		    }
1.245     albertel 1331: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1332:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.10      www      1333:                     }
1.245     albertel 1334:                     $#LONCAPA::map::order--;
1.171     www      1335:                 } elsif ($cmd eq 'cut') {
1.245     albertel 1336: 		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
                   1337: 		    &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
                   1338: 		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
                   1339:                         $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
1.171     www      1340:                     }
1.245     albertel 1341:                     $#LONCAPA::map::order--;
1.10      www      1342:                 } elsif ($cmd eq 'up') {
1.245     albertel 1343: 		  if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
                   1344:                     my $i=$LONCAPA::map::order[$idx-1];
                   1345:                     $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx];
                   1346:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1347: 		   }
1.10      www      1348:                 } elsif ($cmd eq 'down') {
1.245     albertel 1349: 		   if (defined($LONCAPA::map::order[$idx+1])) {
                   1350:                     my $i=$LONCAPA::map::order[$idx+1];
                   1351:                     $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
                   1352:                     $LONCAPA::map::order[$idx] = $i;
1.38      www      1353: 		   }
1.36      www      1354:                 } elsif ($cmd eq 'rename') {
1.245     albertel 1355:                     my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
1.36      www      1356:                     my ($rtitle,@rrest)=split(/\:/,
1.245     albertel 1357:                        $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
1.38      www      1358:                     my $comment=
1.174     albertel 1359:                      &HTML::Entities::decode($env{'form.title'});
1.36      www      1360:                     $comment=~s/\</\&lt\;/g;
                   1361:                     $comment=~s/\>/\&gt\;/g;
                   1362:                     $comment=~s/\:/\&colon;/g;
1.144     albertel 1363: 		    if ($comment=~/\S/) {
1.245     albertel 1364: 			$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
                   1365: 			    $comment.':'.join(':',@rrest);
1.144     albertel 1366: 		    }
1.238     www      1367: # Devalidate title cache
1.240     www      1368:                     my $renamed_url=$rrest[0];
                   1369: # Has the &colon;-escaping
                   1370:                     $renamed_url=~s/\&colon\;/\:/g;
                   1371: 		    &Apache::lonnet::devalidate_title_cache($renamed_url);
1.10      www      1372:                 }
                   1373: # Store the changed version
1.104     albertel 1374: 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1375: 					    $folder.'.'.$container);
1.104     albertel 1376: 		if ($fatal) {
                   1377: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1378: 		    return;
                   1379: 		}
1.8       www      1380:             }
1.11      www      1381: # Group import/search
1.174     albertel 1382: 	    if ($env{'form.importdetail'}) {
1.73      bowersj2 1383: 		my @imports;
1.243     www      1384: #		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
1.174     albertel 1385: 		foreach (split(/\&/,$env{'form.importdetail'})) {
1.73      bowersj2 1386: 		    if (defined($_)) {
                   1387: 			my ($name,$url)=split(/\=/,$_);
1.228     www      1388: 			$name=&unescape($name);
                   1389: 			$url=&unescape($url);
1.73      bowersj2 1390: 			push @imports, $name, $url;
                   1391: 		    }
                   1392: 		}
1.11      www      1393: # Store the changed version
1.249     www      1394: 		($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
1.142     raeburn  1395: 					       $container,'londocs',@imports);
1.104     albertel 1396: 		if ($fatal) {
                   1397: 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1398: 		    return;
                   1399: 		}
1.11      www      1400:             }
1.53      www      1401: # Loading a complete map
1.223     www      1402: 	   if ($env{'form.loadmap'}) {
                   1403:                if ($env{'form.importmap'}=~/\w/) {
                   1404: 	          foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
                   1405: 		      my ($title,$url,$ext,$type)=split(/\:/,$_);
1.245     albertel 1406:                       my $idx=&LONCAPA::map::getresidx($url);
                   1407:                       $LONCAPA::map::resources[$idx]=$_;
                   1408:                       $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
1.223     www      1409: 	          }
1.53      www      1410: # Store the changed version
1.223     www      1411:   	          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
1.142     raeburn  1412: 					   $folder.'.'.$container);
1.223     www      1413: 	          if ($fatal) {
                   1414: 		      $r->print('<p><font color="red">'.$errtext.'</font></p>');
                   1415: 		      return;
                   1416: 	          }
                   1417:                } else {
                   1418:                    $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
                   1419:                }
1.53      www      1420:            }
1.251     www      1421:            &log_differences($plain);
1.16      www      1422:        }
                   1423: # ---------------------------------------------------------------- End commands
1.7       www      1424: # ---------------------------------------------------------------- Print screen
1.10      www      1425:         my $idx=0;
1.148     www      1426: 	my $shown=0;
1.242     www      1427:         if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
                   1428:            $r->print('<p>'.&mt('Parameters').':<ul>'.
                   1429:                      ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
                   1430:                      ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
                   1431:                      ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
                   1432:                      '</ul></p>');
                   1433:         }                                                                                                     
                   1434:         if ($randompick>=0) {
                   1435:            $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>');
                   1436:         }
1.10      www      1437:         $r->print('<table>');
1.245     albertel 1438:         foreach (@LONCAPA::map::order) {
                   1439:            my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
1.246     raeburn  1440: 	   $name=&LONCAPA::map::qtescape($name);
                   1441: 	   $url=&LONCAPA::map::qtescape($url);
1.10      www      1442:            unless ($name) {  $name=(split(/\//,$url))[-1]; }
1.148     www      1443:            unless ($name) { $idx++; next; }
1.112     raeburn  1444:            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
1.10      www      1445:            $idx++;
1.148     www      1446: 	   $shown++;
1.10      www      1447:         }
1.148     www      1448: 	unless ($shown) {
1.131     www      1449: 	    $r->print('<tr><td>'.&mt('Currently no documents.').'</td></tr>');
                   1450: 	}
1.168     www      1451:         $r->print("\n</table>\n");
1.174     albertel 1452: 	if ($env{'form.markedcopy_url'}) {
1.168     www      1453: 	    $r->print(<<ENDPASTE);
                   1454: <p><form name="pasteform" action="/adm/coursedocs" method="post">
1.174     albertel 1455: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1456: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.168     www      1457: ENDPASTE
                   1458:             $r->print(
                   1459: 	   '<input type="submit" name="pastemarked" value="'.&mt('Paste').
                   1460: 		      '" /> '.&Apache::loncommon::filedescription(
1.174     albertel 1461: 		(split(/\./,$env{'form.markedcopy_url'}))[-1]).': '.
                   1462: 		      $env{'form.markedcopy_title'});
1.168     www      1463:             if ($container eq 'page') {
                   1464: 		$r->print(<<PAGEINFO);
1.174     albertel 1465: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1466: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
1.168     www      1467: PAGEINFO
                   1468:             } else {
                   1469: 		$r->print(<<FOLDERINFO);
1.174     albertel 1470: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.168     www      1471: FOLDERINFO
                   1472: 	    }
                   1473: 	    $r->print('</form></p>');
                   1474: 	}
1.7       www      1475:     }
                   1476: }
1.1       www      1477: 
1.188     raeburn  1478: sub process_file_upload {
1.194     raeburn  1479:     my ($upload_output,$coursenum,$coursedom,$allfiles,$codebase,$uploadcmd) = @_;
1.188     raeburn  1480: # upload a file, if present
                   1481:     my $parseaction;
1.190     albertel 1482:    if ($env{'form.parserflag'}) {
1.188     raeburn  1483:         $parseaction = 'parse';
                   1484:     }
                   1485:     my $phase_status;
                   1486:     my $folder=$env{'form.folder'};
1.194     raeburn  1487:     if ($folder eq '') {
1.188     raeburn  1488:         $folder='default';
                   1489:     }
1.194     raeburn  1490:     if ( ($folder=~/^$uploadcmd/) || ($uploadcmd eq 'default') ) {
1.188     raeburn  1491:         my $errtext='';
                   1492:         my $fatal=0;
                   1493:         my $container='sequence';
                   1494:         if ($env{'form.pagepath'}) {
                   1495:             $container='page';
                   1496:         }
                   1497:         ($errtext,$fatal)=
                   1498:               &mapread($coursenum,$coursedom,$folder.'.'.$container);
1.245     albertel 1499:         if ($#LONCAPA::map::order<1) {
                   1500:             $LONCAPA::map::order[0]=1;
                   1501:             $LONCAPA::map::resources[1]='';
1.188     raeburn  1502:         }
                   1503:         if ($fatal) {
                   1504:             return 'failed';
                   1505:         }
                   1506:         my $destination = 'docs/';
1.194     raeburn  1507:         if ($folder =~ /^supplemental/) {
                   1508:             $destination = 'supplemental/';
                   1509:         }
                   1510:         if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1511:             $destination .= 'default/';
1.194     raeburn  1512:         } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
                   1513:             $destination .=  $2.'/';
1.188     raeburn  1514:         }
                   1515: # this is for a course, not a user, so set coursedoc flag
                   1516: # probably the only place in the system where this should be "1"
1.245     albertel 1517:         my $newidx=&LONCAPA::map::getresidx();
1.188     raeburn  1518:         $destination .= $newidx;
1.190     albertel 1519:         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
                   1520: 						$parseaction,$allfiles,
                   1521: 						$codebase);
1.188     raeburn  1522:         my $ext='false';
                   1523:         if ($url=~/^http\:\/\//) { $ext='true'; }
                   1524:         $url=~s/\:/\&colon;/g;
                   1525:         my $comment=$env{'form.comment'};
                   1526:         $comment=~s/\</\&lt\;/g;
                   1527:         $comment=~s/\>/\&gt\;/g;
                   1528:         $comment=~s/\:/\&colon;/g;
                   1529:         if ($folder=~/^supplemental/) {
                   1530:               $comment=time.'___&&&___'.$env{'user.name'}.'___&&&___'.
                   1531:                   $env{'user.domain'}.'___&&&___'.$comment;
                   1532:         }
                   1533: 
1.245     albertel 1534:         $LONCAPA::map::resources[$newidx]=
                   1535: 	    $comment.':'.$url.':'.$ext.':normal:res';
                   1536:         $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
1.190     albertel 1537:         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
                   1538: 				    $folder.'.'.$container);
1.188     raeburn  1539:         if ($fatal) {
                   1540:             $$upload_output .= '<p><font color="red">'.$errtext.'</font></p>';
                   1541:             return 'failed';
                   1542:         } else {
                   1543:             if ($parseaction eq 'parse') {
1.190     albertel 1544:                 my $total_embedded = keys(%{$allfiles});
1.188     raeburn  1545:                 if ($total_embedded > 0) {
                   1546:                     my $num = 0;
                   1547:                     $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.<br />
                   1548:    <form name="upload_embedded" action="/adm/coursedocs"
                   1549:                   method="post" enctype="multipart/form-data">
                   1550:    <input type="hidden" name="folderpath" value="'.$env{'form.folderpath'}.'" />   <input type="hidden" name="cmd" value="upload_embedded" />
                   1551:    <input type="hidden" name="newidx" value="'.$newidx.'" />
1.228     www      1552:    <input type="hidden" name="primaryurl" value="'.&escape($url).'" />
1.188     raeburn  1553:    <input type="hidden" name="phasetwo" value="'.$total_embedded.'" />';
                   1554:                     $$upload_output .= '<b>Upload embedded files</b>:<br />
                   1555:    <table>';
1.190     albertel 1556:                     foreach my $embed_file (keys(%{$allfiles})) {
1.188     raeburn  1557:                         $$upload_output .= '<tr><td>'.$embed_file.
1.190     albertel 1558:           '<input name="embedded_item_'.$num.'" type="file" />
1.228     www      1559:            <input name="embedded_orig_'.$num.'" type="hidden" value="'.&escape($embed_file).'" />';
1.188     raeburn  1560:                         my $attrib;
                   1561:                         if (@{$$allfiles{$embed_file}} > 1) {
                   1562:                             $attrib = join(':',@{$$allfiles{$embed_file}});
                   1563:                         } else {
                   1564:                             $attrib = $$allfiles{$embed_file}[0];
                   1565:                         }
                   1566:                         $$upload_output .=
                   1567:            '<input name="embedded_attrib_'.$num.'" type="hidden" value="'.$attrib.'" />';
                   1568:                         if (exists($$codebase{$embed_file})) {
                   1569:                             $$upload_output .= 
1.228     www      1570:           '<input name="codebase_'.$num.'" type="hidden" value="'.&escape($$codebase{$embed_file}).'" />';
1.188     raeburn  1571:                         }
                   1572:                         $$upload_output .= '</td></tr>';
                   1573:                         $num ++;
                   1574:                     }
                   1575:                     $phase_status = 'phasetwo';
                   1576:                     $$upload_output .= '</table><br />
                   1577:    <input type ="submit" value="Complete upload" />
                   1578:    </form>';
                   1579:                 } else {
                   1580:                     $$upload_output .= 'No embedded items identified<br />';
                   1581:                 }
                   1582:             }
                   1583:         }
                   1584:     }
                   1585:     return $phase_status;
                   1586: }
                   1587: 
                   1588: sub process_secondary_uploads {
                   1589:     my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_;
                   1590:     my $folder=$env{'form.folder'};
                   1591:     my $destination = 'docs/';
1.195     raeburn  1592:     if ($folder =~ /^supplemental/) {
                   1593:         $destination = 'supplemental/';
                   1594:     }
                   1595:     if (($folder eq 'default') || ($folder eq 'supplemental')) {
1.188     raeburn  1596:         $destination .= 'default/';
1.195     raeburn  1597:     } elsif ($folder =~ /^(default|supplemental)_(\d+)$/) {
1.217     raeburn  1598:         $destination .=  $2.'/';
1.188     raeburn  1599:     }
                   1600:     $destination .= $newidx;
                   1601:     my ($url,$filename);
                   1602:     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
                   1603:     ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
                   1604:     return $filename;
                   1605: }
                   1606: 
1.8       www      1607: # --------------------------------------------------------------- An entry line
                   1608: 
                   1609: sub entryline {
1.112     raeburn  1610:     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_;
1.38      www      1611:     $title=~s/\&colon\;/\:/g;
                   1612:     $title=&HTML::Entities::encode(&HTML::Entities::decode(
1.228     www      1613:      &unescape($title)),'"<>&\'');
1.38      www      1614:     my $renametitle=$title;
                   1615:     my $foldertitle=$title;
1.142     raeburn  1616:     my $pagetitle=$title;
1.245     albertel 1617:     my $orderidx=$LONCAPA::map::order[$index];
1.109     albertel 1618:     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
                   1619: 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
                   1620: 	$renametitle=$4;
                   1621: 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
                   1622: 	    &Apache::loncommon::plainname($2,$3).': <br />'.
                   1623: 	    $foldertitle;
                   1624:     }
1.222     albertel 1625:     $renametitle=~s/\\/\\\\/g;
1.38      www      1626:     $renametitle=~s/\&quot\;/\\\"/g;
1.8       www      1627:     my $line='<tr>';
                   1628: # Edit commands
1.142     raeburn  1629:     my $container;
1.120     www      1630:     my $folderpath;
1.174     albertel 1631:     if ($env{'form.folderpath'}) {
1.142     raeburn  1632:         $container = 'sequence';
1.228     www      1633: 	$folderpath=&escape($env{'form.folderpath'});
1.174     albertel 1634: 	# $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"');
1.120     www      1635:     }
1.156     albertel 1636:     my ($pagepath,$pagesymb);
1.174     albertel 1637:     if ($env{'form.pagepath'}) {
1.142     raeburn  1638:         $container = 'page';
1.228     www      1639:         $pagepath=&escape($env{'form.pagepath'});
                   1640:         $pagesymb=&escape($env{'form.pagesymb'});
1.142     raeburn  1641:     }
1.168     www      1642:     my $cpinfo='';
1.174     albertel 1643:     if ($env{'form.markedcopy_url'}) {
1.168     www      1644:        $cpinfo='&markedcopy_url='.
1.228     www      1645:                &escape($env{'form.markedcopy_url'}).
1.168     www      1646:                '&markedcopy_title='.
1.228     www      1647:                &escape($env{'form.markedcopy_title'});
1.168     www      1648:     }
1.109     albertel 1649:     if ($allowed) {
1.123     www      1650: 	my $incindex=$index+1;
                   1651: 	my $selectbox='';
1.168     www      1652: 	if (($folder!~/^supplemental/) &&
1.245     albertel 1653: 	    ($#LONCAPA::map::order>0) && 
1.168     www      1654: 	    ((split(/\:/,
1.245     albertel 1655: 	     $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] 
1.168     www      1656: 	     ne '') && 
                   1657: 	    ((split(/\:/,
1.245     albertel 1658: 	     $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1] 
1.168     www      1659: 	     ne '')) {
1.123     www      1660: 	    $selectbox=
1.124     www      1661: 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
1.123     www      1662: 		'<select name="newpos" onChange="this.form.submit()">';
1.245     albertel 1663: 	    for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
1.123     www      1664: 		if ($i==$incindex) {
                   1665: 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
                   1666: 		} else {
                   1667: 		    $selectbox.='<option value="'.$i.'">'.$i.'</option>';
                   1668: 		}
                   1669: 	    }
                   1670: 	    $selectbox.='</select>';
                   1671: 	}
1.119     www      1672: 	my %lt=&Apache::lonlocal::texthash(
                   1673:                 'up' => 'Move Up',
1.109     albertel 1674: 		'dw' => 'Move Down',
                   1675: 		'rm' => 'Remove',
1.171     www      1676:                 'ct' => 'Cut',
1.168     www      1677: 		'rn' => 'Rename',
                   1678: 		'cp' => 'Copy');
1.211     www      1679: 	my $nocopy=0;
                   1680:         if ($url=~/\.(page|sequence)$/) {
                   1681: 	    foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) {
                   1682: 		my ($title,$url,$ext,$type)=split(/\:/,$_);
                   1683: 		if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) {
                   1684: 		    $nocopy=1;
                   1685: 		    last;
                   1686: 		}
                   1687: 	    }
                   1688: 	}
                   1689:         my $copylink='&nbsp;';
1.174     albertel 1690:         if ($env{'form.pagepath'}) {
1.211     www      1691:            unless ($nocopy) {
                   1692:                $copylink=(<<ENDCOPY);
                   1693: <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1694: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1695: ENDCOPY
                   1696:             }
1.142     raeburn  1697:             $line.=(<<END);
                   1698: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1699: <input type="hidden" name="pagepath" value="$env{'form.pagepath'}" />
                   1700: <input type="hidden" name="pagesymb" value="$env{'form.pagesymb'}" />
                   1701: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1702: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.142     raeburn  1703: <input type="hidden" name="setparms" value="$orderidx" />
1.247     www      1704: <input type="hidden" name="changeparms" value="0" />
1.142     raeburn  1705: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1706: <tr><td bgcolor="#DDDDDD">
1.168     www      1707: <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1708: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
                   1709: <tr><td bgcolor="#DDDDDD">
1.168     www      1710: <a href='/adm/coursedocs?cmd=down_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
1.142     raeburn  1711: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
                   1712: </table></td>
                   1713: <td>$selectbox
                   1714: </td><td bgcolor="#DDDDDD">
1.156     albertel 1715: <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.142     raeburn  1716: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1717: <a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
                   1718: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.213     albertel 1719: <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
1.168     www      1720: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1721: $copylink
1.142     raeburn  1722: END
                   1723:         } else {
1.211     www      1724:            unless ($nocopy) {
                   1725:                $copylink=(<<ENDCOPY);
                   1726: <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
                   1727: <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
                   1728: ENDCOPY
                   1729:             }
1.142     raeburn  1730:             $line.=(<<END); 
1.121     www      1731: <form name="entry_$index" action="/adm/coursedocs" method="post">
1.174     albertel 1732: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
                   1733: <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
                   1734: <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
1.122     www      1735: <input type="hidden" name="setparms" value="$orderidx" />
1.247     www      1736: <input type="hidden" name="changeparms" value="0" />
1.54      www      1737: <td><table border='0' cellspacing='2' cellpadding='0'>
                   1738: <tr><td bgcolor="#DDDDDD">
1.168     www      1739: <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1740: <img src="${iconpath}move_up.gif" alt='$lt{'up'}' border='0' /></a></td></tr>
1.54      www      1741: <tr><td bgcolor="#DDDDDD">
1.168     www      1742: <a href='/adm/coursedocs?cmd=down_$index&folderpath=$folderpath$cpinfo'>
1.90      www      1743: <img src="${iconpath}move_down.gif" alt='$lt{'dw'}' border='0' /></a></td></tr>
1.123     www      1744: </table></td>
                   1745: <td>$selectbox
                   1746: </td><td bgcolor="#DDDDDD">
1.142     raeburn  1747: <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
1.90      www      1748: <font size="-2" color="#990000">$lt{'rm'}</font></a>
1.171     www      1749: <a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
                   1750: <font size="-2" color="#550044">$lt{'ct'}</font></a>
1.142     raeburn  1751: <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
1.168     www      1752: <font size="-2" color="#009900">$lt{'rn'}</font></a>
1.211     www      1753: $copylink
1.8       www      1754: END
1.142     raeburn  1755:         }
1.8       www      1756:     }
1.16      www      1757: # Figure out what kind of a resource this is
                   1758:     my ($extension)=($url=~/\.(\w+)$/);
                   1759:     my $uploaded=($url=~/^\/*uploaded\//);
1.97      albertel 1760:     my $icon=&Apache::loncommon::icon($url);
1.17      www      1761:     my $isfolder=0;
1.142     raeburn  1762:     my $ispage=0;
1.114     albertel 1763:     my $folderarg;
1.142     raeburn  1764:     my $pagearg;
                   1765:     my $pagefile;
1.16      www      1766:     if ($uploaded) {
1.135     albertel 1767: 	if ($extension eq 'sequence') {
                   1768: 	    $icon=$iconpath.'/folder_closed.gif';
                   1769: 	    $url=~/$coursenum\/([\/\w]+)\.sequence$/;
                   1770: 	    $url='/adm/coursedocs?';
                   1771: 	    $folderarg=$1;
                   1772: 	    $isfolder=1;
1.142     raeburn  1773:         } elsif ($extension eq 'page') {
                   1774:             $icon=$iconpath.'/page.gif';
                   1775:             $url=~/$coursenum\/([\/\w]+)\.page$/;
                   1776:             $pagearg=$1;
                   1777:             $url='/adm/coursedocs?';
                   1778:             $ispage=1;
1.135     albertel 1779: 	} else {
                   1780: 	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
                   1781: 	}
1.16      www      1782:     }
1.215     albertel 1783:     $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-;
1.142     raeburn  1784:     if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) {
1.113     albertel 1785: 	my $symb=&Apache::lonnet::symbclean(
1.50      www      1786:           &Apache::lonnet::declutter('uploaded/'.
1.174     albertel 1787:            $env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1788:            $env{'course.'.$env{'request.course.id'}.'.num'}.'/'.$folder.
1.50      www      1789:            '.sequence').
                   1790:            '___'.$residx.'___'.
1.113     albertel 1791: 	   &Apache::lonnet::declutter($url));
                   1792: 	(undef,undef,$url)=&Apache::lonnet::decode_symb($symb);
                   1793: 	$url=&Apache::lonnet::clutter($url);
1.127     albertel 1794: 	if ($url=~/^\/*uploaded\//) {
                   1795: 	    $url=~/\.(\w+)$/;
                   1796: 	    my $embstyle=&Apache::loncommon::fileembstyle($1);
                   1797: 	    if (($embstyle eq 'img') || ($embstyle eq 'emb')) {
                   1798: 		$url='/adm/wrapper'.$url;
                   1799: 	    } elsif ($embstyle eq 'ssi') {
                   1800: 		#do nothing with these
                   1801: 	    } elsif ($url!~/\.(sequence|page)$/) {
                   1802: 		$url='/adm/coursedocs/showdoc'.$url;
                   1803: 	    }
1.145     albertel 1804: 	} elsif ($url=~m|^/ext/|) { 
                   1805: 	    $url='/adm/wrapper'.$url;
1.127     albertel 1806: 	}
1.241     www      1807:         if (&Apache::lonnet::symbverify($symb,$url)) {
                   1808: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
                   1809:         } else {
                   1810:             $url='';
                   1811:         }
1.152     albertel 1812: 	if ($container eq 'page') {
1.174     albertel 1813: 	    my $symb=$env{'form.pagesymb'};
1.152     albertel 1814: 	    	    
                   1815: 	    $url=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($symb))[2]);
1.228     www      1816: 	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
1.152     albertel 1817: 	}
1.50      www      1818:     }
1.120     www      1819:     my $parameterset='&nbsp;';
1.216     albertel 1820:     if ($isfolder || $extension eq 'sequence') {
1.228     www      1821: 	my $foldername=&escape($foldertitle);
1.174     albertel 1822: 	my $folderpath=$env{'form.folderpath'};
1.114     albertel 1823: 	if ($folderpath) { $folderpath.='&' };
1.242     www      1824: # Append randompick number, hidden, and encrypted with ":" to foldername, 
                   1825: # so it gets transferred between levels
1.245     albertel 1826: 	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
1.242     www      1827:                                               'parameter_randompick'))[0]
1.245     albertel 1828:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1829:                                               'parameter_hiddenresource'))[0]=~/^yes$/i)
1.245     albertel 1830:                                                .':'.((&LONCAPA::map::getparameter($orderidx,
1.242     www      1831:                                               'parameter_encrypturl'))[0]=~/^yes$/i);
1.228     www      1832: 	$url.='folderpath='.&escape($folderpath).$cpinfo;
1.147     matthew  1833: 	$parameterset='<label>'.&mt('Randomly Pick: ').
1.247     www      1834: 	    '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.
1.245     albertel 1835: 	    (&LONCAPA::map::getparameter($orderidx,
1.147     matthew  1836:                                               'parameter_randompick'))[0].
1.165     www      1837:                                               '" />'.
                   1838: '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
1.147     matthew  1839:        
1.114     albertel 1840:     }
1.142     raeburn  1841:     if ($ispage) {
1.228     www      1842:         my $pagename=&escape($pagetitle);
1.142     raeburn  1843:         my $pagepath;
1.174     albertel 1844:         my $folderpath=$env{'form.folderpath'};
1.142     raeburn  1845:         if ($folderpath) { $pagepath = $folderpath.'&' };
                   1846:         $pagepath.=$pagearg.'&'.$pagename;
1.174     albertel 1847: 	my $symb=$env{'form.pagesymb'};
1.152     albertel 1848: 	if (!$symb) {
                   1849: 	    my $path='uploaded/'.
1.174     albertel 1850: 		$env{'course.'.$env{'request.course.id'}.'.domain'}.'/'.
                   1851: 		$env{'course.'.$env{'request.course.id'}.'.num'}.'/';
1.152     albertel 1852: 	    $symb=&Apache::lonnet::encode_symb($path.$folder.'.sequence',
                   1853: 					       $residx,
                   1854: 					       $path.$pagearg.'.page');
                   1855: 	}
1.228     www      1856: 	$url.='pagepath='.&escape($pagepath).
                   1857: 	    '&pagesymb='.&escape($symb).$cpinfo;
1.142     raeburn  1858:     }
1.113     albertel 1859:     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
                   1860: 	'" border="0"></a></td>'.
1.241     www      1861:         "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
                   1862:         ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
1.120     www      1863:     if (($allowed) && ($folder!~/^supplemental/)) {
                   1864:  	my %lt=&Apache::lonlocal::texthash(
                   1865:  			      'hd' => 'Hidden',
1.165     www      1866:  			      'ec' => 'URL hidden');
1.122     www      1867: 	my $enctext=
1.245     albertel 1868: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
1.122     www      1869: 	my $hidtext=
1.245     albertel 1870: 	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
1.120     www      1871: 	$line.=(<<ENDPARMS);
                   1872: <td bgcolor="#BBBBFF"><font size='-2'>
1.247     www      1873: <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 1874: <td bgcolor="#BBBBFF"><font size='-2'>
1.247     www      1875: <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      1876: <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
                   1877: ENDPARMS
1.119     www      1878:     }
1.120     www      1879:     $line.="</form></tr>";
1.8       www      1880:     return $line;
                   1881: }
                   1882: 
1.27      www      1883: # ---------------------------------------------------------------- tie the hash
                   1884: 
                   1885: sub tiehash {
1.136     albertel 1886:     my ($mode)=@_;
1.27      www      1887:     $hashtied=0;
1.174     albertel 1888:     if ($env{'request.course.fn'}) {
1.136     albertel 1889: 	if ($mode eq 'write') {
1.174     albertel 1890: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1891: 		    &GDBM_WRCREAT(),0640)) {
                   1892:                 $hashtied=2;
                   1893: 	    }
                   1894: 	} else {
1.174     albertel 1895: 	    if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
1.136     albertel 1896: 		    &GDBM_READER(),0640)) {
1.27      www      1897:                 $hashtied=1;
1.136     albertel 1898: 	    }
                   1899: 	}
1.27      www      1900:     }    
                   1901: }
                   1902: 
                   1903: sub untiehash {
                   1904:     if ($hashtied) { untie %hash; }
                   1905:     $hashtied=0;
1.221     albertel 1906:     return OK;
1.27      www      1907: }
                   1908: 
1.29      www      1909: # --------------------------------------------------------------- check on this
                   1910: 
                   1911: sub checkonthis {
                   1912:     my ($r,$url,$level,$title)=@_;
1.228     www      1913:     $url=&unescape($url);
1.29      www      1914:     $alreadyseen{$url}=1;
                   1915:     $r->rflush();
1.41      www      1916:     if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) {
1.108     albertel 1917:        $r->print("\n<br />");
1.29      www      1918:        for (my $i=0;$i<=$level*5;$i++) {
                   1919:            $r->print('&nbsp;');
                   1920:        }
                   1921:        $r->print('<a href="'.$url.'" target="cat">'.
                   1922: 		 ($title?$title:$url).'</a> ');
                   1923:        if ($url=~/^\/res\//) {
                   1924: 	  my $result=&Apache::lonnet::repcopy(
                   1925:                               &Apache::lonnet::filelocation('',$url));
1.172     raeburn  1926:           if ($result eq 'ok') {
1.87      www      1927:              $r->print('<font color="green">'.&mt('ok').'</font>');
1.29      www      1928:              $r->rflush();
1.34      www      1929:              &Apache::lonnet::countacc($url);
                   1930:              $url=~/\.(\w+)$/;
                   1931:              if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
                   1932: 		 $r->print('<br />');
                   1933:                  $r->rflush();
                   1934:                  for (my $i=0;$i<=$level*5;$i++) {
                   1935:                      $r->print('&nbsp;');
                   1936:                  }
1.84      www      1937:                  $r->print('- '.&mt('Rendering').': ');
1.170     www      1938: 		 my ($errorcount,$warningcount)=split(/:/,
                   1939: 	       &Apache::lonnet::ssi_body($url,
1.173     albertel 1940: 			       ('grade_target'=>'web',
                   1941: 				'return_only_error_and_warning_counts' => 1)));
1.170     www      1942:                  if (($errorcount) ||
                   1943:                      ($warningcount)) {
                   1944: 		     if ($errorcount) {
1.98      www      1945:                         $r->print('<img src="/adm/lonMisc/bomb.gif" /><font color="red"><b>'.
1.170     www      1946: 			  $errorcount.' '.
1.87      www      1947: 				  &mt('error(s)').'</b></font> ');
1.34      www      1948:                      }
1.170     www      1949: 		     if ($warningcount) {
1.34      www      1950:                         $r->print('<font color="blue">'.
1.170     www      1951: 			  $warningcount.' '.
1.84      www      1952: 				  &mt('warning(s)').'</font>');
1.34      www      1953:                      }
                   1954:                  } else {
1.87      www      1955:                      $r->print('<font color="green">'.&mt('ok').'</font>');
1.34      www      1956:                  }
                   1957:                  $r->rflush();
                   1958:              }
1.29      www      1959: 	     my $dependencies=
                   1960:                 &Apache::lonnet::metadata($url,'dependencies');
                   1961:              foreach (split(/\,/,$dependencies)) {
                   1962: 		 if (($_=~/^\/res\//) && (!$alreadyseen{$_})) {
                   1963:                     &checkonthis($r,$_,$level+1);
                   1964:                  }
                   1965:              }
1.172     raeburn  1966:           } elsif ($result eq 'unavailable') {
1.84      www      1967:              $r->print('<font color="red"><b>'.&mt('connection down').'</b></font>');
1.172     raeburn  1968:           } elsif ($result eq 'not_found') {
1.100     www      1969: 	      unless ($url=~/\$/) {
                   1970: 		  $r->print('<font color="red"><b>'.&mt('not found').'</b></font>');
                   1971: 	      } else {
                   1972: 		  $r->print('<font color="yellow"><b>'.&mt('unable to verify variable URL').'</b></font>');
                   1973: 	      }
1.29      www      1974:           } else {
1.84      www      1975:              $r->print('<font color="red"><b>'.&mt('access denied').'</b></font>');
1.29      www      1976:           }
                   1977:       }
                   1978:    }
                   1979: }
                   1980: 
1.1       www      1981: 
1.75      www      1982: #
1.208     albertel 1983: # ----------------------------------------------------------------- List Symbs
                   1984: # 
                   1985: sub list_symbs {
1.224     albertel 1986:     my ($r) = @_;
                   1987: 
                   1988:     $r->print(&Apache::loncommon::start_page('Symb List'));
                   1989:     my $navmap = Apache::lonnavmaps::navmap->new();
                   1990:     $r->print("<pre>\n");
                   1991:     foreach my $res ($navmap->retrieveResources()) {
                   1992: 	$r->print($res->compTitle()."\t".$res->symb()."\n");
                   1993:     }
                   1994:     $r->print("\n</pre>\n");
                   1995:     $r->print('<a href="/adm/coursedocs">'.&mt('Return to DOCS').'</a>');
1.208     albertel 1996: }
                   1997: 
                   1998: 
                   1999: #
1.75      www      2000: # -------------------------------------------------------------- Verify Content
                   2001: # 
                   2002: sub verifycontent {
1.224     albertel 2003:     my ($r) = @_;
1.230     albertel 2004:     my $type = &Apache::loncommon::course_type();
1.26      www      2005:    my $loaderror=&Apache::lonnet::overloaderror($r);
                   2006:    if ($loaderror) { return $loaderror; }
1.229     raeburn  2007:    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
1.27      www      2008:    $hashtied=0;
1.30      www      2009:    undef %alreadyseen;
                   2010:    %alreadyseen=();
1.27      www      2011:    &tiehash();
                   2012:    foreach (keys %hash) {
1.140     www      2013:        if ($hash{$_}=~/\.(page|sequence)$/) {
1.228     www      2014: 	   if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) {
1.140     www      2015: 	       $r->print('<hr /><font color="red">'.
1.230     albertel 2016: 			 &mt('The following sequence or page is included more than once in your '.$type.': ').
1.228     www      2017: 			 &unescape($hash{$_}).'</font><br />'.
1.140     www      2018: 			 &mt('Note that grading records for problems included in this sequence or folder will overlap.<hr />'));
                   2019: 	   }
                   2020:        }
1.228     www      2021:        if (($_=~/^src\_(.+)$/) && (!$alreadyseen{&unescape($hash{$_})})) {
1.29      www      2022:            &checkonthis($r,$hash{$_},0,$hash{'title_'.$1});
1.27      www      2023:        }
                   2024:    }
                   2025:    &untiehash();
1.108     albertel 2026:    $r->print('<h1>'.&mt('Done').'.</h1>'.'<a href="/adm/coursedocs">'.
                   2027: 	     &mt('Return to DOCS').'</a>');
1.75      www      2028: }
                   2029: 
1.192     www      2030: 
1.75      www      2031: # -------------------------------------------------------------- Check Versions
                   2032: 
1.192     www      2033: sub devalidateversioncache {
                   2034:     my $src=shift;
                   2035:     &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'.
                   2036: 					  &Apache::lonnet::clutter($src));
                   2037: }
                   2038: 
1.75      www      2039: sub checkversions {
1.224     albertel 2040:     my ($r) = @_;
1.230     albertel 2041:     my $type = &Apache::loncommon::course_type();
1.229     raeburn  2042:     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
1.89      www      2043:     my $header='';
                   2044:     my $startsel='';
                   2045:     my $monthsel='';
                   2046:     my $weeksel='';
                   2047:     my $daysel='';
                   2048:     my $allsel='';
                   2049:     my %changes=();
                   2050:     my $starttime=0;
1.91      www      2051:     my $haschanged=0;
1.92      www      2052:     my %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2053: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2054: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.92      www      2055: 
                   2056:     $hashtied=0;
                   2057:     &tiehash();
                   2058:     my %newsetversions=();
1.174     albertel 2059:     if ($env{'form.setmostrecent'}) {
1.91      www      2060: 	$haschanged=1;
1.92      www      2061: 	foreach (keys %hash) {
                   2062: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      2063: 		$newsetversions{$1}='mostrecent';
1.192     www      2064:                 &devalidateversioncache($1);
1.92      www      2065: 	    }
                   2066: 	}
1.174     albertel 2067:     } elsif ($env{'form.setcurrent'}) {
1.91      www      2068: 	$haschanged=1;
1.92      www      2069: 	foreach (keys %hash) {
                   2070: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
1.93      www      2071: 		my $getvers=&Apache::lonnet::getversion($1);
                   2072: 		if ($getvers>0) {
                   2073: 		    $newsetversions{$1}=$getvers;
1.192     www      2074: 		    &devalidateversioncache($1);
1.93      www      2075: 		}
1.92      www      2076: 	    }
                   2077: 	}
1.174     albertel 2078:     } elsif ($env{'form.setversions'}) {
1.91      www      2079: 	$haschanged=1;
1.174     albertel 2080: 	foreach (keys %env) {
1.92      www      2081: 	    if ($_=~/^form\.set_version_(.+)$/) {
                   2082: 		my $src=$1;
1.174     albertel 2083: 		if (($env{$_}) && ($env{$_} ne $setversions{$src})) {
                   2084: 		    $newsetversions{$src}=$env{$_};
1.192     www      2085: 		    &devalidateversioncache($src);
1.92      www      2086: 		}
                   2087: 	    }
                   2088: 	}
1.91      www      2089:     }
                   2090:     if ($haschanged) {
1.92      www      2091:         if (&Apache::lonnet::put('resourceversions',\%newsetversions,
1.174     albertel 2092: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2093: 			  $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {		
1.92      www      2094: 	    $r->print('<h1>'.&mt('Your Version Settings have been Stored').'</h1>');
                   2095: 	} else {
                   2096: 	    $r->print('<h1><font color="red">'.&mt('An Error Occured while Attempting to Store your Version Settings').'</font></h1>');
                   2097: 	}
1.136     albertel 2098: 	&mark_hash_old();
1.91      www      2099:     }
1.136     albertel 2100:     &changewarning($r,'');
1.174     albertel 2101:     if ($env{'form.timerange'} eq 'all') {
1.89      www      2102: # show all documents
1.230     albertel 2103: 	$header=&mt('All Documents in '.$type);
1.91      www      2104: 	$allsel=1;
1.90      www      2105: 	foreach (keys %hash) {
                   2106: 	    if ($_=~/^ids\_(\/res\/.+)$/) {
                   2107: 		my $src=$1;
                   2108: 		$changes{$src}=1;
                   2109: 	    }
                   2110: 	}
1.89      www      2111:     } else {
                   2112: # show documents which changed
                   2113: 	%changes=&Apache::lonnet::dump
1.174     albertel 2114: 	 ('versionupdate',$env{'course.'.$env{'request.course.id'}.'.domain'},
                   2115:                      $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      2116: 	my $firstkey=(keys %changes)[0];
                   2117: 	unless ($firstkey=~/^error\:/) {
1.174     albertel 2118: 	    unless ($env{'form.timerange'}) {
                   2119: 		$env{'form.timerange'}=604800;
1.89      www      2120: 	    }
1.174     albertel 2121: 	    my $seltext=&mt('during the last').' '.$env{'form.timerange'}.' '
1.89      www      2122: 		.&mt('seconds');
1.174     albertel 2123: 	    if ($env{'form.timerange'}==-1) {
1.89      www      2124: 		$seltext='since start of course';
                   2125: 		$startsel='selected';
1.174     albertel 2126: 		$env{'form.timerange'}=time;
1.89      www      2127: 	    }
1.174     albertel 2128: 	    $starttime=time-$env{'form.timerange'};
                   2129: 	    if ($env{'form.timerange'}==2592000) {
1.89      www      2130: 		$seltext=&mt('during the last month').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2131: 		$monthsel='selected';
1.174     albertel 2132: 	    } elsif ($env{'form.timerange'}==604800) {
1.89      www      2133: 		$seltext=&mt('during the last week').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2134: 		$weeksel='selected';
1.174     albertel 2135: 	    } elsif ($env{'form.timerange'}==86400) {
1.89      www      2136: 		$seltext=&mt('since yesterday').' ('.&Apache::lonlocal::locallocaltime($starttime).')';
                   2137: 		$daysel='selected';
                   2138: 	    }
                   2139: 	    $header=&mt('Content changed').' '.$seltext;
                   2140: 	} else {
                   2141: 	    $header=&mt('No content modifications yet.');
                   2142: 	}
                   2143:     }
1.92      www      2144:     %setversions=&Apache::lonnet::dump('resourceversions',
1.174     albertel 2145: 			  $env{'course.'.$env{'request.course.id'}.'.domain'},
                   2146: 			  $env{'course.'.$env{'request.course.id'}.'.num'});
1.89      www      2147:     my %lt=&Apache::lonlocal::texthash
1.229     raeburn  2148: 	      ('st' => 'Version changes since start of '.$type,
1.88      www      2149: 	       'lm' => 'Version changes since last Month',
                   2150: 	       'lw' => 'Version changes since last Week',
                   2151: 	       'sy' => 'Version changes since Yesterday',
1.91      www      2152:                'al' => 'All Resources (possibly large output)',
1.88      www      2153: 	       'sd' => 'Display',
1.84      www      2154: 	       'fi' => 'File',
                   2155: 	       'md' => 'Modification Date',
1.87      www      2156:                'mr' => 'Most recently published Version',
1.229     raeburn  2157: 	       've' => 'Version used in '.$type,
                   2158:                'vu' => 'Set Version to be used in '.$type,
                   2159: 'sv' => 'Set Versions to be used in '.$type.' according to Selections below',
1.91      www      2160: 'sm' => 'Keep all Resources up-to-date with most recent Versions (default)',
                   2161: 'sc' => 'Set all Resource Versions to current Version (Fix Versions)',
1.84      www      2162: 	       'di' => 'Differences');
1.89      www      2163:     $r->print(<<ENDHEADERS);
1.31      www      2164: <form action="/adm/coursedocs" method="post">
1.91      www      2165: <input type="hidden" name="versions" value="1" />
                   2166: <input type="submit" name="setmostrecent" value="$lt{'sm'}" />
                   2167: <input type="submit" name="setcurrent" value="$lt{'sc'}" /><hr />
1.31      www      2168: <select name="timerange">
1.88      www      2169: <option value='all' $allsel>$lt{'al'}</option>
1.84      www      2170: <option value="-1" $startsel>$lt{'st'}</option>
                   2171: <option value="2592000" $monthsel>$lt{'lm'}</option>
                   2172: <option value="604800" $weeksel>$lt{'lw'}</option>
                   2173: <option value="86400" $daysel>$lt{'sy'}</option>
1.31      www      2174: </select>
1.91      www      2175: <input type="submit" name="display" value="$lt{'sd'}" />
1.89      www      2176: <h3>$header</h3>
1.91      www      2177: <input type="submit" name="setversions" value="$lt{'sv'}" />
1.103     matthew  2178: <table border="0">
1.31      www      2179: ENDHEADERS
1.91      www      2180:     foreach (sort keys %changes) {
1.89      www      2181: 	if ($changes{$_}>$starttime) {
                   2182: 	    my ($root,$extension)=($_=~/^(.*)\.(\w+)$/);
                   2183: 	    my $currentversion=&Apache::lonnet::getversion($_);
1.93      www      2184: 	    if ($currentversion<0) {
                   2185: 		$currentversion=&mt('Could not be determined.');
                   2186: 	    }
1.89      www      2187: 	    my $linkurl=&Apache::lonnet::clutter($_);
                   2188: 	    $r->print(
1.103     matthew  2189: 		      '<tr><td colspan="5"><br /><br /><font size="+1"><b>'.
1.91      www      2190: 		      &Apache::lonnet::gettitle($linkurl).
1.103     matthew  2191:                       '</b></font></td></tr>'.
                   2192:                       '<tr><td>&nbsp;&nbsp;&nbsp;</td>'.
                   2193:                       '<td colspan="4">'.
                   2194:                       '<a href="'.$linkurl.'" target="cat">'.$linkurl.
                   2195: 		      '</a></td></tr>'.
                   2196:                       '<tr><td></td>'.
                   2197:                       '<td title="'.$lt{'md'}.'">'.
1.102     matthew  2198: 		      &Apache::lonlocal::locallocaltime(
                   2199:                            &Apache::lonnet::metadata($root.'.'.$extension,
                   2200:                                                      'lastrevisiondate')
                   2201:                                                         ).
1.103     matthew  2202:                       '</td>'.
                   2203:                       '<td title="'.$lt{'mr'}.'"><nobr>Most Recent: '.
                   2204:                       '<font size="+1">'.$currentversion.'</font>'.
                   2205:                       '</nobr></td>'.
1.229     raeburn  2206:                       '<td title="'.$lt{'ve'}.'"><nobr>In '.$type.': '.
1.103     matthew  2207:                       '<font size="+1">');
1.87      www      2208: # Used in course
1.89      www      2209: 	    my $usedversion=$hash{'version_'.$linkurl};
1.93      www      2210: 	    if (($usedversion) && ($usedversion ne 'mostrecent')) {
1.89      www      2211: 		$r->print($usedversion);
                   2212: 	    } else {
                   2213: 		$r->print($currentversion);
                   2214: 	    }
1.103     matthew  2215: 	    $r->print('</font></nobr></td><td title="'.$lt{'vu'}.'">'.
                   2216:                       '<nobr>Use: ');
1.87      www      2217: # Set version
1.92      www      2218: 	    $r->print(&Apache::loncommon::select_form($setversions{$linkurl},
1.89      www      2219: 						      'set_version_'.$linkurl,
1.136     albertel 2220: 						      ('select_form_order' =>
                   2221: 						       ['',1..$currentversion,'mostrecent'],
                   2222: 						       '' => '',
1.93      www      2223: 						       'mostrecent' => 'most recent',
1.89      www      2224: 						       map {$_,$_} (1..$currentversion))));
1.103     matthew  2225: 	    $r->print('</nobr></td></tr><tr><td></td>');
1.89      www      2226: 	    my $lastold=1;
                   2227: 	    for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) {
                   2228: 		my $url=$root.'.'.$prevvers.'.'.$extension;
                   2229: 		if (&Apache::lonnet::metadata($url,'lastrevisiondate')<
                   2230: 		    $starttime) {
                   2231: 		    $lastold=$prevvers;
                   2232: 		}
                   2233: 	    }
1.103     matthew  2234:             # 
                   2235:             # Code to figure out how many version entries should go in
                   2236:             # each of the four columns
                   2237:             my $entries_per_col = 0;
                   2238:             my $num_entries = ($currentversion-$lastold);
                   2239:             if ($num_entries % 4 == 0) {
                   2240:                 $entries_per_col = $num_entries/4;
                   2241:             } else {
                   2242:                 $entries_per_col = $num_entries/4 + 1;
                   2243:             }
                   2244:             my $entries_count = 0;
                   2245:             $r->print('<td valign="top"><font size="-2">'); 
                   2246:             my $cols_output = 1;
1.32      www      2247:             for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) {
1.89      www      2248: 		my $url=$root.'.'.$prevvers.'.'.$extension;
1.103     matthew  2249: 		$r->print('<nobr><a href="'.&Apache::lonnet::clutter($url).
1.91      www      2250: 			  '">'.&mt('Version').' '.$prevvers.'</a> ('.
1.103     matthew  2251: 			  &Apache::lonlocal::locallocaltime(
                   2252:                                 &Apache::lonnet::metadata($url,
                   2253:                                                           'lastrevisiondate')
                   2254:                                                             ).
1.91      www      2255: 			  ')');
1.89      www      2256: 		if (&Apache::loncommon::fileembstyle($extension) eq 'ssi') {
1.33      www      2257:                     $r->print(' <a href="/adm/diff?filename='.
1.89      www      2258: 			      &Apache::lonnet::clutter($root.'.'.$extension).
                   2259: 			      '&versionone='.$prevvers.
                   2260: 			      '">'.&mt('Diffs').'</a>');
                   2261: 		}
1.103     matthew  2262: 		$r->print('</nobr><br />');
                   2263:                 if (++$entries_count % $entries_per_col == 0) {
                   2264:                     $r->print('</font></td>');
                   2265:                     if ($cols_output != 4) {
                   2266:                         $r->print('<td valign="top"><font size="-2">');
                   2267:                         $cols_output++;
                   2268:                     }
                   2269:                 }
1.89      www      2270: 	    }
1.103     matthew  2271:             while($cols_output++ < 4) {
                   2272:                 $r->print('</font></td><td><font>')
                   2273:             }
                   2274: 	    $r->print('</font></td></tr>'."\n");
1.89      www      2275: 	}
                   2276:     }
1.92      www      2277:     $r->print('</table></form>');
1.89      www      2278:     $r->print('<h1>'.&mt('Done').'.</h1>');
                   2279: 
                   2280:     &untiehash();
1.75      www      2281: }
                   2282: 
1.136     albertel 2283: sub mark_hash_old {
                   2284:     my $retie_hash=0;
                   2285:     if ($hashtied) {
                   2286: 	$retie_hash=1;
                   2287: 	&untiehash();
                   2288:     }
                   2289:     &tiehash('write');
                   2290:     $hash{'old'}=1;
                   2291:     &untiehash();
                   2292:     if ($retie_hash) { &tiehash(); }
                   2293: }
                   2294: 
                   2295: sub is_hash_old {
                   2296:     my $untie_hash=0;
                   2297:     if (!$hashtied) {
                   2298: 	$untie_hash=1;
                   2299: 	&tiehash();
                   2300:     }
                   2301:     my $return=$hash{'old'};
                   2302:     if ($untie_hash) { &untiehash(); }
                   2303:     return $return;
                   2304: }
                   2305: 
1.91      www      2306: sub changewarning {
1.177     albertel 2307:     my ($r,$postexec,$message,$url)=@_;
1.136     albertel 2308:     if (!&is_hash_old()) { return; }
1.150     albertel 2309:     my $pathvar='folderpath';
1.228     www      2310:     my $path=&escape($env{'form.folderpath'});
1.177     albertel 2311:     if (!defined($url)) {
                   2312: 	if (defined($env{'form.pagepath'})) {
                   2313: 	    $pathvar='pagepath';
1.228     www      2314: 	    $path=&escape($env{'form.pagepath'});
                   2315: 	    $path.='&amp;pagesymb='.&escape($env{'form.pagesymb'});
1.177     albertel 2316: 	}
                   2317: 	$url='/adm/coursedocs?'.$pathvar.'='.$path;
                   2318:     }
1.230     albertel 2319:     my $course_type = &Apache::loncommon::course_type();
1.177     albertel 2320:     if (!defined($message)) {
                   2321: 	$message='Changes will become active for your current session after [_1], or the next time you log in.';
1.150     albertel 2322:     }
1.185     www      2323:     $r->print("\n\n".
                   2324: '<script>function reinit(tf) { tf.submit();'.$postexec.' }</script>'."\n". 
                   2325: '<form name="reinitform" method="post" action="/adm/roles" target="loncapaclient">'.
1.177     albertel 2326: '<input type="hidden" name="orgurl" value="'.$url.
1.117     albertel 2327: '" /><input type="hidden" name="selectrole" value="1" /><h3><font color="red">'.
1.177     albertel 2328: &mt($message,' <input type="hidden" name="'.
                   2329:     $env{'request.role'}.'" value="1" /><input type="button" value="'.
1.230     albertel 2330:     &mt('re-initializing '.$course_type).'" onClick="reinit(this.form)" />').
1.185     www      2331: $help{'Caching'}.'</font></h3></form>'."\n\n");
1.91      www      2332: }
                   2333: 
1.75      www      2334: # ================================================================ Main Handler
                   2335: sub handler {
                   2336:     my $r = shift;
1.82      www      2337:     &Apache::loncommon::content_type($r,'text/html');
1.75      www      2338:     $r->send_http_header;
                   2339:     return OK if $r->header_only;
1.230     albertel 2340:     my $type = &Apache::loncommon::course_type();
1.75      www      2341: 
                   2342: # --------------------------------------------- Initialize help topics for this
1.209     albertel 2343:     foreach ('Adding_Course_Doc','Main_Course_Documents',
                   2344: 	     'Adding_External_Resource','Navigate_Content',
                   2345: 	     'Adding_Folders','Docs_Overview', 'Load_Map',
                   2346: 	     'Supplemental','Score_Upload_Form','Adding_Pages',
                   2347: 	     'Importing_LON-CAPA_Resource','Uploading_From_Harddrive',
                   2348: 	     'Check_Resource_Versions','Verify_Content') {
                   2349: 	$help{$_}=&Apache::loncommon::help_open_topic('Docs_'.$_);
                   2350:     }
1.75      www      2351:     # Composite help files
                   2352:     $help{'Syllabus'} = &Apache::loncommon::help_open_topic(
                   2353: 		    'Docs_About_Syllabus,Docs_Editing_Templated_Pages');
                   2354:     $help{'Simple Page'} = &Apache::loncommon::help_open_topic(
                   2355: 		    'Docs_About_Simple_Page,Docs_Editing_Templated_Pages');
1.86      albertel 2356:     $help{'Simple Problem'} = &Apache::loncommon::help_open_topic(
                   2357: 		    'Option_Response_Simple');
1.75      www      2358:     $help{'Bulletin Board'} = &Apache::loncommon::help_open_topic(
                   2359: 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
                   2360:     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
                   2361: 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
1.255   ! raeburn  2362:     $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
1.75      www      2363:     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
1.142     raeburn  2364: 
1.209     albertel 2365: # does this user have privileges to modify docs
                   2366:     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                   2367: 
                   2368:   if ($allowed && $env{'form.verify'}) {
1.75      www      2369:       &verifycontent($r);
1.209     albertel 2370:   } elsif ($allowed && $env{'form.listsymbs'}) {
1.208     albertel 2371:       &list_symbs($r);
1.247     www      2372:   } elsif ($allowed && $env{'form.docslog'}) {
                   2373:       &docs_change_log($r);
1.209     albertel 2374:   } elsif ($allowed && $env{'form.versions'}) {
1.75      www      2375:       &checkversions($r);
1.209     albertel 2376:   } elsif ($allowed && $env{'form.dumpcourse'}) {
1.75      www      2377:       &dumpcourse($r);
1.209     albertel 2378:   } elsif ($allowed && $env{'form.exportcourse'}) {
1.138     raeburn  2379:       &exportcourse($r);
1.26      www      2380:   } else {
1.7       www      2381: # is this a standard course?
                   2382: 
1.174     albertel 2383:     my $standard=($env{'request.course.uri'}=~/^\/uploaded\//);
1.155     raeburn  2384:     my $forcestandard = 0;
1.15      www      2385:     my $forcesupplement;
                   2386:     my $script='';
1.19      www      2387:     my $showdoc=0;
1.142     raeburn  2388:     my $containertag;
                   2389:     my $uploadtag;
1.15      www      2390:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.224     albertel 2391: 					    ['folderpath','pagepath',
                   2392: 					     'pagesymb','markedcopy_url',
                   2393: 					     'markedcopy_title']);
1.174     albertel 2394:     if ($env{'form.folderpath'}) {
                   2395: 	my (@folderpath)=split('&',$env{'form.folderpath'});
1.228     www      2396: 	$env{'form.foldername'}=&unescape(pop(@folderpath));
1.174     albertel 2397: 	$env{'form.folder'}=pop(@folderpath);
                   2398:     }
                   2399:     if ($env{'form.pagepath'}) {
                   2400:         my (@pagepath)=split('&',$env{'form.pagepath'});
1.228     www      2401:         $env{'form.pagename'}=&unescape(pop(@pagepath));
1.174     albertel 2402:         $env{'form.folder'}=pop(@pagepath);
1.156     albertel 2403:         $containertag = '<input type="hidden" name="pagepath" value="" />'.
                   2404: 	    '<input type="hidden" name="pagesymb" value="" />';
1.174     albertel 2405:         $uploadtag = '<input type="hidden" name="pagepath" value="'.$env{'form.pagepath'}.'" />'.
                   2406: 	    '<input type="hidden" name="pagesymb" value="'.$env{'form.pagesymb'}.'" />';
1.142     raeburn  2407:     }
1.21      www      2408:     if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) {
1.127     albertel 2409:        $showdoc='/'.$1;
1.21      www      2410:     }
                   2411:     unless ($showdoc) { # got called from remote
1.237     albertel 2412:        if (($env{'form.folder'}=~/^(?:group|default)_/) || 
1.209     albertel 2413:           ($env{'form.folder'} =~ m:^\d+/(pages|sequences)/:)) {
1.155     raeburn  2414:            $forcestandard = 1;
                   2415:        } 
1.174     albertel 2416:        $forcesupplement=($env{'form.folder'}=~/^supplemental_/);
1.7       www      2417: 
1.15      www      2418:        if ($allowed) { 
                   2419:          &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['cmd']);
                   2420:          $script=&Apache::lonratedt::editscript('simple'); 
                   2421:        }
                   2422:     } else { # got called in sequence from course
                   2423:        $allowed=0;
1.3       www      2424:     }
1.4       www      2425: 
                   2426: # get course data
1.174     albertel 2427:     my $coursenum=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2428:     my $coursedom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.4       www      2429: 
1.225     albertel 2430: # get personal data 
1.174     albertel 2431:     my $uname=$env{'user.name'};
                   2432:     my $udom=$env{'user.domain'};
1.245     albertel 2433:     my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
1.14      www      2434: 
1.8       www      2435: # graphics settings
1.4       www      2436: 
1.176     albertel 2437:     $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
1.8       www      2438: 
1.224     albertel 2439:     if ($allowed) {
                   2440: 	$script .= &editing_js($udom,$uname);
1.171     www      2441:     }
1.42      www      2442: # -------------------------------------------------------------------- Body tag
1.224     albertel 2443:     $script = '<script type="text/javascript">'."\n".$script."\n".'</script>';
1.229     raeburn  2444:     $r->print(&Apache::loncommon::start_page("$type Documents", $script,
1.225     albertel 2445: 					     {'force_register' => $showdoc,}).
1.233     albertel 2446: 	      &Apache::loncommon::help_open_menu('','',273,'RAT'));
1.224     albertel 2447:   
1.188     raeburn  2448:   my %allfiles = ();
                   2449:   my %codebase = ();
                   2450:   my ($upload_result,$upload_output);
                   2451:   if ($allowed) {
                   2452:       if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
                   2453: # Process file upload - phase one - upload and parse primary file.  
1.190     albertel 2454:           $upload_result = &process_file_upload(\$upload_output,$coursenum,
                   2455: 						$coursedom,\%allfiles,
1.194     raeburn  2456: 						\%codebase,$1);
1.188     raeburn  2457:           if ($upload_result eq 'phasetwo') {
                   2458:               $r->print($upload_output);
                   2459:           }
                   2460:       } elsif ($env{'form.phasetwo'}) {
                   2461:           my %newname = ();
                   2462:           my %origname = ();
                   2463:           my %attribs = ();
                   2464:           my $updateflag = 0;
                   2465:           my $residx = $env{'form.newidx'};
1.228     www      2466:           my $primary_url = &unescape($env{'form.primaryurl'});
1.188     raeburn  2467: # Process file upload - phase two - gather secondary files.
                   2468:           for (my $i=0; $i<$env{'form.phasetwo'}; $i++) {
                   2469:               if ($env{'form.embedded_item_'.$i.'.filename'}) {
                   2470:                   my $javacodebase;
                   2471:                   $newname{$i} = &process_secondary_uploads(\$upload_output,$coursedom,$coursenum,'embedded_item_',$i,$residx);
1.228     www      2472:                   $origname{$i} = &unescape($env{'form.embedded_orig_'.$i});
1.188     raeburn  2473:                   if (exists($env{'form.embedded_codebase_'.$i})) {
1.228     www      2474:                       $javacodebase =  &unescape($env{'form.embedded_codebase_'.$i});  
1.188     raeburn  2475:                       $origname{$i} =~ s#^\Q$javacodebase\E/##; 
                   2476:                   }
                   2477:                   my @attributes = ();
                   2478:                   if ($env{'form.embedded_attrib_'.$i} =~ /:/) {
                   2479:                       @attributes = split/:/,$env{'form.embedded_attrib_'.$i};
                   2480:                   } else {
                   2481:                       @attributes = ($env{'form.embedded_attrib_'.$i});
                   2482:                   }
                   2483:                   foreach (@attributes) {
1.228     www      2484:                       push(@{$attribs{$i}},&unescape($_));
1.188     raeburn  2485:                   }
                   2486:                   if ($javacodebase) {
                   2487:                       $codebase{$i} = $javacodebase;
                   2488:                       $codebase{$i} =~ s#/$##;
                   2489:                       $updateflag = 1;
                   2490:                   }
                   2491:               }
                   2492:               unless ($newname{$i} eq $origname{$i}) {
                   2493:                   $updateflag = 1;
                   2494:               }
                   2495:           }
                   2496: # Process file upload - phase three - modify primary file
                   2497:           if ($updateflag) {
                   2498:               my ($content,$rtncode);
                   2499:               my $updateflag = 0;
                   2500:               my $getstatus = &Apache::lonnet::getuploaded('GET',$primary_url,$coursedom,$coursenum,\$content,\$rtncode);
                   2501:               if ($getstatus eq 'ok') {
                   2502:                   foreach my $item (keys %newname) {
                   2503:                       if ($newname{$item} ne $origname{$item}) {
                   2504:                           my $attrib_regexp = '';
                   2505:                           if (@{$attribs{$item}} > 1) {
                   2506:                               $attrib_regexp = join('|',@{$attribs{$item}});
                   2507:                           } else {
                   2508:                               $attrib_regexp = $attribs{$item}[0];
                   2509:                           }
                   2510:                           if ($content =~ m#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#) {
                   2511:                           } 
                   2512:                           $content =~ s#($attrib_regexp\s*=\s*['"]?)\Q$origname{$item}\E(['"]?)#$1$newname{$item}$2#gi; 
                   2513:                       }
                   2514:                       if (exists($codebase{$item})) {
1.224     albertel 2515:                           $content =~ s/(codebase\s*=\s*["']?)\Q$codebase{$item}\E(["']?)/$1.$2/i; #' stupid emacs
1.188     raeburn  2516:                       }
                   2517:                   }
                   2518: # Save edited file.
                   2519:                   my $saveresult;
                   2520:                   my $docuname=$env{'course.'.$env{'request.course.id'}.'.num'};
                   2521:                   my $docudom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.191     raeburn  2522:                   my $url = &Apache::lonnet::store_edited_file($primary_url,$content,$docudom,$docuname,\$saveresult);
1.188     raeburn  2523:               } else {
                   2524:                   &Apache::lonnet::logthis('retrieval of uploaded file - '.$primary_url.' - for editing, failed: '.$getstatus); 
                   2525:               }
                   2526:           }
                   2527:       }
                   2528:   }
                   2529: 
                   2530:   unless ($showdoc ||  $upload_result eq 'phasetwo') {
1.81      www      2531: # -----------------------------------------------------------------------------
                   2532:        my %lt=&Apache::lonlocal::texthash(
1.229     raeburn  2533:                 'uplm' => 'Upload a new main '.lc($type).' document',
                   2534:                 'upls' => 'Upload a new supplemental '.lc($type).' document',
1.168     www      2535:                 'impp' => 'Import a document',
                   2536:                 'pubd' => 'Published documents',
1.181     www      2537: 		'copm' => 'All documents out of a published map into this folder',
1.81      www      2538:                 'spec' => 'Special documents',
                   2539:                 'upld' => 'Upload Document',
                   2540:                 'srch' => 'Search',
                   2541:                 'impo' => 'Import',
1.232     www      2542: 		'book' => 'Import Bookmarks',
1.81      www      2543:                 'selm' => 'Select Map',
                   2544:                 'load' => 'Load Map',
1.186     www      2545:                 'reco' => 'Recover Deleted Resources',
1.81      www      2546:                 'newf' => 'New Folder',
1.142     raeburn  2547:                 'newp' => 'New Composite Page',
1.81      www      2548:                 'extr' => 'External Resource',
                   2549:                 'syll' => 'Syllabus',
                   2550:                 'navc' => 'Navigate Contents',
                   2551:                 'sipa' => 'Simple Page',
                   2552:                 'sipr' => 'Simple Problem',
1.219     www      2553:                 'drbx' => 'Drop Box',
1.81      www      2554:                 'scuf' => 'Score Upload Form',
                   2555:                 'bull' => 'Bulletin Board',
1.96      sakharuk 2556:                 'mypi' => 'My Personal Info',
1.255   ! raeburn  2557:                 'grpo' => 'Group Files',
1.101     www      2558: 		'abou' => 'About User',
1.110     raeburn  2559:                 'imsf' => 'Import IMS package',
1.96      sakharuk 2560:                 'file' =>  'File',
                   2561:                 'title' => 'Title',
1.188     raeburn  2562:                 'comment' => 'Comment',
                   2563:                 'parse' => 'If HTML file, upload embedded images/multimedia files'
1.81      www      2564: 					  );
                   2565: # -----------------------------------------------------------------------------
1.42      www      2566:     if ($allowed) {
1.74      www      2567:        my $dumpbut=&dumpbutton();
1.138     raeburn  2568:        my $exportbut=&exportbutton();
1.88      www      2569:        my %lt=&Apache::lonlocal::texthash(
                   2570: 					 'vc' => 'Verify Content',
                   2571: 					 'cv' => 'Check/Set Resource Versions',
1.208     albertel 2572: 					 'ls' => 'List Symbs',
1.247     www      2573:                                          'sl' => 'Show Log'
1.88      www      2574: 					  );
1.118     albertel 2575: 
1.174     albertel 2576:        my $folderpath=$env{'form.folderpath'};
1.118     albertel 2577:        if (!$folderpath) {
1.174     albertel 2578: 	   if ($env{'form.folder'} eq '' ||
                   2579: 	       $env{'form.folder'} eq 'supplemental') {
1.118     albertel 2580: 	       $folderpath='default&'.
1.230     albertel 2581: 		   &escape(&mt('Main '.$type.' Documents'));
1.118     albertel 2582: 	   }
                   2583:        }
1.174     albertel 2584:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2585:            $containertag = '<input type="hidden" name="folderpath" value="" />';
                   2586:            $uploadtag = '<input type="hidden" name="folderpath" value="'.$folderpath.'" />';
                   2587:        }
                   2588: 
1.42      www      2589:        $r->print(<<ENDCOURSEVERIFY);
1.36      www      2590: <form name="renameform" method="post" action="/adm/coursedocs">
                   2591: <input type="hidden" name="title" />
                   2592: <input type="hidden" name="cmd" />
1.168     www      2593: <input type="hidden" name="markcopy" />
1.142     raeburn  2594: $containertag
1.36      www      2595: </form>
1.39      www      2596: <form name="simpleedit" method="post" action="/adm/coursedocs">
                   2597: <input type=hidden name="importdetail" value="">
1.142     raeburn  2598: $uploadtag
1.39      www      2599: </form>
1.26      www      2600: <form action="/adm/coursedocs" method="post" name="courseverify">
1.74      www      2601: <table bgcolor="#AAAAAA" width="100%" cellspacing="4" cellpadding="4">
                   2602: <tr><td bgcolor="#DDDDCC">
1.130     www      2603: <input type="submit" name="verify" value="$lt{'vc'}" />$help{'Verify_Content'}
1.74      www      2604: </td><td bgcolor="#DDDDCC">
1.130     www      2605:     <input type="submit" name="versions" value="$lt{'cv'}" />$help{'Check_Resource_Versions'}
1.74      www      2606: $dumpbut
1.138     raeburn  2607: $exportbut
1.218     albertel 2608: </td><td bgcolor="#DDDDCC">
1.208     albertel 2609:     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
1.247     www      2610: </td><td bgcolor="#DDDDCC">
                   2611:     <input type="submit" name="docslog" value="$lt{'sl'}" />
1.218     albertel 2612: </td></tr></table>
1.25      www      2613: </form>
                   2614: ENDCOURSEVERIFY
1.74      www      2615:        $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc',
1.230     albertel 2616: 		     &mt('Editing the Table of Contents for your '.$type)));
1.25      www      2617:     }
1.17      www      2618: # --------------------------------------------------------- Standard documents
1.43      www      2619:     $r->print('<table border=2 cellspacing=4 cellpadding=4>');
1.7       www      2620:     if (($standard) && ($allowed) && (!$forcesupplement)) {
1.116     albertel 2621: 	$r->print('<tr><td bgcolor="#BBBBBB">');
                   2622: #  '<h2>'.&mt('Main Course Documents').
                   2623: #  ($allowed?' '.$help{'Main_Course_Documents'}:'').'</h2>');
1.174     albertel 2624:        my $folder=$env{'form.folder'};
1.117     albertel 2625:        if ($folder eq '' || $folder eq 'supplemental') {
1.112     raeburn  2626:            $folder='default';
1.230     albertel 2627: 	   $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents'));
1.112     raeburn  2628:        }
1.51      www      2629:        my $postexec='';
                   2630:        if ($folder eq 'default') {
                   2631: 	   $r->print('<script>this.window.name="loncapaclient";</script>');
                   2632:        } else {
1.117     albertel 2633:            #$postexec='self.close();';
1.51      www      2634:        }
1.40      www      2635:        $hadchanges=0;
1.188     raeburn  2636:        &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output);
1.40      www      2637:        if ($hadchanges) {
1.136     albertel 2638: 	   &mark_hash_old()
1.40      www      2639:        }
1.136     albertel 2640:        &changewarning($r,$postexec);
1.16      www      2641:        my $folderseq='/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2642:                      '.sequence';
1.142     raeburn  2643:        my $pageseq = '/uploaded/'.$coursedom.'/'.$coursenum.'/default_'.time.
                   2644:                      '.page';
1.186     www      2645: 	my $container='sequence';
                   2646: 	if ($env{'form.pagepath'}) {
                   2647: 	    $container='page';
                   2648: 	}
                   2649: 	my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container;
1.8       www      2650:        $r->print(<<ENDFORM);
1.43      www      2651: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2652: <th bgcolor="#DDDDDD">$lt{'uplm'}</th>
                   2653: <th bgcolor="#DDDDDD">$lt{'impp'}</th>
                   2654: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.11      www      2655: </tr>
1.16      www      2656: <tr><td bgcolor="#DDDDDD">
1.96      sakharuk 2657: $lt{'file'}:<br />
1.182     albertel 2658: <form name="uploaddocument" action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2659: <input type="file" name="uploaddoc" size="40">
1.8       www      2660: <br />
1.96      sakharuk 2661: $lt{'title'}:<br />
1.11      www      2662: <input type="text" size="50" name="comment">
1.142     raeburn  2663: $uploadtag
1.10      www      2664: <input type="hidden" name="cmd" value="upload_default">
1.188     raeburn  2665: <br />
                   2666: <nobr>
1.190     albertel 2667: <label>$lt{'parse'}?
1.188     raeburn  2668: <input type="checkbox" name="parserflag" />
1.190     albertel 2669: </label>
1.188     raeburn  2670: </nobr>
                   2671: <br />
                   2672: <br />
1.129     albertel 2673: <nobr>
1.81      www      2674: <input type="submit" value="$lt{'upld'}">
1.60      albertel 2675:  $help{'Uploading_From_Harddrive'}
1.58      albertel 2676: </nobr>
1.60      albertel 2677: </form>
1.11      www      2678: </td>
1.16      www      2679: <td bgcolor="#DDDDDD">
1.39      www      2680: <form action="/adm/coursedocs" method="post" name="simpleeditdefault">
1.168     www      2681: $lt{'pubd'}<br />
1.142     raeburn  2682: $uploadtag
1.232     www      2683: <input type=button onClick="javascript:groupsearch()" value="$lt{'srch'}" />
                   2684: <br />
1.58      albertel 2685: <nobr>
1.232     www      2686: <input type=button onClick="javascript:groupimport();" value="$lt{'impo'}" />
1.58      albertel 2687: $help{'Importing_LON-CAPA_Resource'}
                   2688: </nobr>
1.232     www      2689: <br />
                   2690: <input type=button onClick="javascript:groupopen(0,1,1);" value="$lt{'book'}" />
1.59      www      2691: <p>
                   2692: <hr />
1.181     www      2693: $lt{'copm'}<br />
                   2694: <input type="text" size="40" name="importmap"><br />
1.68      bowersj2 2695: <nobr><input type=button 
1.52      www      2696: onClick="javascript:openbrowser('simpleeditdefault','importmap','sequence,page','')"
1.81      www      2697: value="$lt{'selm'}"> <input type="submit" name="loadmap" value="$lt{'load'}">
1.68      bowersj2 2698: $help{'Load_Map'}</nobr>
1.59      www      2699: </p>
1.52      www      2700: </form>
1.186     www      2701: <hr />
                   2702: <form action="/adm/groupsort" method="post" name="recover">
1.232     www      2703: <input type="button" name="recovermap" onClick="javascript:groupopen('$readfile',1,0)" value="$lt{'reco'}" />
1.186     www      2704: </form>
1.142     raeburn  2705: ENDFORM
1.174     albertel 2706:        unless ($env{'form.pagepath'}) {
1.168     www      2707: 	   $r->print(<<ENDFORM);
                   2708: <hr />
                   2709: <form action="/adm/coursedocs" method="post" name="newext">
                   2710: $uploadtag
                   2711: <input type=hidden name="importdetail" value="">
                   2712: <nobr>
                   2713: <input name="newext" type="button" onClick="javascript:makenewext('newext');"
                   2714: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
                   2715: </nobr>
                   2716: </form>
1.214     www      2717: <br /><form action="/adm/imsimportdocs" method="post" name="ims">
1.168     www      2718: <input type="hidden" name="folder" value="$folder" />
                   2719: <input name="imsimport" type="button" value="$lt{'imsf'}" onClick="javascript:makeims();" />
                   2720: </nobr>
                   2721: </form>
                   2722: ENDFORM
                   2723:        }
                   2724:        $r->print('</td><td bgcolor="#DDDDDD">');
1.174     albertel 2725:        unless ($env{'form.pagepath'}) {
1.142     raeburn  2726:            $r->print(<<ENDFORM);
1.214     www      2727: <br /><form action="/adm/coursedocs" method="post" name="newfolder">
1.174     albertel 2728: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.13      www      2729: <input type=hidden name="importdetail" value="">
1.58      albertel 2730: <nobr>
1.16      www      2731: <input name="newfolder" type="button"
                   2732: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2733: value="$lt{'newf'}" />$help{'Adding_Folders'}
1.58      albertel 2734: </nobr>
1.11      www      2735: </form>
1.214     www      2736: <br /><form action="/adm/coursedocs" method="post" name="newpage">
1.174     albertel 2737: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.142     raeburn  2738: <input type=hidden name="importdetail" value="">
                   2739: <nobr>
                   2740: <input name="newpage" type="button"
                   2741: onClick="javascript:makenewpage(this.form,'$pageseq');"
                   2742: value="$lt{'newp'}" />$help{'Adding_Pages'}
                   2743: </nobr>
                   2744: </form>
1.214     www      2745: <br /><form action="/adm/coursedocs" method="post" name="newsyl">
1.142     raeburn  2746: $uploadtag
1.14      www      2747: <input type=hidden name="importdetail" 
                   2748: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2749: <nobr>
1.81      www      2750: <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
1.65      bowersj2 2751:  $help{'Syllabus'}
1.58      albertel 2752: </nobr>
                   2753: </form>
1.214     www      2754: <br /><form action="/adm/coursedocs" method="post" name="newnav">
1.142     raeburn  2755: $uploadtag
1.15      www      2756: <input type=hidden name="importdetail" 
                   2757: value="Navigate Content=/adm/navmaps">
1.58      albertel 2758: <nobr>
1.81      www      2759: <input name="newnav" type="submit" value="$lt{'navc'}" />
1.47      www      2760: $help{'Navigate_Content'}
1.58      albertel 2761: </nobr>
1.22      www      2762: </form>
1.214     www      2763: <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
1.142     raeburn  2764: $uploadtag
1.22      www      2765: <input type=hidden name="importdetail" value="">
1.58      albertel 2766: <nobr>
1.81      www      2767: <input name="newsmppg" type="button" value="$lt{'sipa'}"
1.65      bowersj2 2768: onClick="javascript:makesmppage();" /> $help{'Simple Page'}
1.58      albertel 2769: </nobr>
1.55      www      2770: </form>
1.214     www      2771: <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
1.142     raeburn  2772: $uploadtag
1.55      www      2773: <input type=hidden name="importdetail" value="">
1.58      albertel 2774: <nobr>
1.81      www      2775: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
1.65      bowersj2 2776: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
1.62      www      2777: </nobr>
                   2778: </form>
1.219     www      2779: <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
                   2780: $uploadtag      
                   2781: <input type=hidden name="importdetail" value="">
                   2782: <nobr>          
                   2783: <input name="newdropbox" type="button" value="$lt{'drbx'}"
                   2784: onClick="javascript:makedropbox();" />
                   2785: </nobr>         
                   2786: </form> 
1.214     www      2787: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2788: $uploadtag
1.62      www      2789: <input type=hidden name="importdetail" value="">
                   2790: <nobr>
1.81      www      2791: <input name="newexamupload" type="button" value="$lt{'scuf'}"
1.62      www      2792: onClick="javascript:makeexamupload();" />
1.66      bowersj2 2793: $help{'Score_Upload_Form'}
1.58      albertel 2794: </nobr>
1.22      www      2795: </form>
1.214     www      2796: <br /><form action="/adm/coursedocs" method="post" name="newbul">
1.142     raeburn  2797: $uploadtag
1.22      www      2798: <input type=hidden name="importdetail" value="">
1.58      albertel 2799: <nobr>
1.81      www      2800: <input name="newbulletin" type="button" value="$lt{'bull'}"
1.22      www      2801: onClick="javascript:makebulboard();" />
1.65      bowersj2 2802: $help{'Bulletin Board'}
1.58      albertel 2803: </nobr>
                   2804: </form>
1.214     www      2805: <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
1.142     raeburn  2806: $uploadtag
1.14      www      2807: <input type=hidden name="importdetail" 
                   2808: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2809: <nobr>
1.81      www      2810: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2811: $help{'My Personal Info'}
1.101     www      2812: </nobr>
                   2813: </form>
1.214     www      2814: <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
1.142     raeburn  2815: $uploadtag
1.101     www      2816: <input type=hidden name="importdetail" value="">
                   2817: <nobr>
                   2818: <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
                   2819: onClick="javascript:makeabout();" />
1.110     raeburn  2820: </nobr>
1.182     albertel 2821: </form>
1.255   ! raeburn  2822: <br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
        !          2823: $uploadtag
        !          2824: <input type=hidden name="importdetail"
        !          2825: value="Group Files=/adm/$coursedom/$coursenum/aboutme">
        !          2826: <nobr>
        !          2827: <input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
        !          2828: $help{'Group Files'}
        !          2829: </nobr>
        !          2830: </form>
1.142     raeburn  2831: ENDFORM
                   2832:        }
1.174     albertel 2833:        if ($env{'form.pagepath'}) {
1.142     raeburn  2834:            $r->print(<<ENDBLOCK);
                   2835: <form action="/adm/coursedocs" method="post" name="newsmpproblem">
                   2836: $uploadtag
                   2837: <input type=hidden name="importdetail" value="">
                   2838: <nobr>
                   2839: <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
                   2840: onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
                   2841: </nobr>
                   2842: </form>
1.214     www      2843: <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
1.142     raeburn  2844: $uploadtag
                   2845: <input type=hidden name="importdetail" value="">
                   2846: <nobr>
                   2847: <input name="newexamupload" type="button" value="$lt{'scuf'}"
                   2848: onClick="javascript:makeexamupload();" />
                   2849: $help{'Score_Upload_Form'}
                   2850: </nobr>
1.182     albertel 2851: </form>
1.142     raeburn  2852: ENDBLOCK
                   2853:        }
                   2854:        $r->print('</td></tr>'."\n".
                   2855: '</table>');
1.24      www      2856:        $r->print('</td></tr>');
1.7       www      2857:     }
                   2858: # ----------------------------------------------------- Supplemental documents
                   2859:     if (!$forcestandard) {
1.116     albertel 2860:        $r->print('<tr><td bgcolor="#BBBBBB">');
                   2861: # '<h2>'.&mt('Supplemental Course Documents').
                   2862: #  ($allowed?' '.$help{'Supplemental'}:'').'</h2>');
1.174     albertel 2863:        my $folder=$env{'form.folder'};
1.117     albertel 2864:        unless ($folder=~/^supplemental/) {
1.116     albertel 2865: 	   $folder='supplemental';
1.117     albertel 2866:        }
                   2867:        if ($folder =~ /^supplemental$/ &&
1.174     albertel 2868: 	   $env{'form.folderpath'} =~ /^default\&/) {
                   2869: 	   $env{'form.folderpath'}='supplemental&'.
1.230     albertel 2870: 	       &escape(&mt('Supplemental '.$type.' Documents'));
1.116     albertel 2871:        }
1.7       www      2872:        &editor($r,$coursenum,$coursedom,$folder,$allowed);
1.8       www      2873:        if ($allowed) {
1.17      www      2874:        my $folderseq=
                   2875:                   '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time.
                   2876:                      '.sequence';
                   2877: 
1.8       www      2878:           $r->print(<<ENDSUPFORM);
1.43      www      2879: <table cellspacing=4 cellpadding=4><tr>
1.81      www      2880: <th bgcolor="#DDDDDD">$lt{'upls'}</th>
                   2881: <th bgcolor="#DDDDDD">$lt{'spec'}</th>
1.17      www      2882: </tr>
                   2883: <tr><td bgcolor="#DDDDDD">
1.10      www      2884: <form action="/adm/coursedocs" method="post" enctype="multipart/form-data">
1.59      www      2885: <input type="file" name="uploaddoc" size="40">
1.196     raeburn  2886: <br />
                   2887: <br />
                   2888: <nobr>
                   2889: <label>$lt{'parse'}?
                   2890: <input type="checkbox" name="parserflag" />
                   2891: </label>
                   2892: </nobr>
                   2893: <br /><br />
                   2894: $lt{'comment'}:<br />
1.4       www      2895: <textarea cols=50 rows=4 name='comment'>
                   2896: </textarea>
1.115     albertel 2897: <br />
1.174     albertel 2898: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.10      www      2899: <input type="hidden" name="cmd" value="upload_supplemental">
1.58      albertel 2900: <nobr>
1.81      www      2901: <input type="submit" value="$lt{'upld'}">
1.58      albertel 2902:  $help{'Uploading_From_Harddrive'}
                   2903: </nobr>
                   2904: </form>
1.17      www      2905: </td>
                   2906: <td bgcolor="#DDDDDD">
1.18      www      2907: <form action="/adm/coursedocs" method="post" name="supnewfolder">
1.174     albertel 2908: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2909: <input type=hidden name="importdetail" value="">
1.58      albertel 2910: <nobr>
1.17      www      2911: <input name="newfolder" type="button"
                   2912: onClick="javascript:makenewfolder(this.form,'$folderseq');"
1.81      www      2913: value="$lt{'newf'}" /> $help{'Adding_Folders'}
1.58      albertel 2914: </nobr>
1.17      www      2915: </form>
1.214     www      2916: <br /><form action="/adm/coursedocs" method="post" name="supnewext">
1.174     albertel 2917: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2918: <input type=hidden name="importdetail" value="">
1.58      albertel 2919: <nobr>
1.18      www      2920: <input name="newext" type="button" 
                   2921: onClick="javascript:makenewext('supnewext');"
1.81      www      2922: value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
1.58      albertel 2923: </nobr>
1.17      www      2924: </form>
1.214     www      2925: <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
1.174     albertel 2926: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2927: <input type=hidden name="importdetail" 
                   2928: value="Syllabus=/public/$coursedom/$coursenum/syllabus">
1.58      albertel 2929: <nobr>
1.81      www      2930: <input name="newsyl" type="submit" value="$lt{'syll'}" />
1.65      bowersj2 2931: $help{'Syllabus'}
1.58      albertel 2932: </nobr>
                   2933: </form>
1.214     www      2934: <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
1.174     albertel 2935: <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
1.17      www      2936: <input type=hidden name="importdetail" 
                   2937: value="$plainname=/adm/$udom/$uname/aboutme">
1.58      albertel 2938: <nobr>
1.81      www      2939: <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
1.65      bowersj2 2940: $help{'My Personal Info'}
1.58      albertel 2941: </nobr>
                   2942: </form>
1.17      www      2943: </td></tr>
1.24      www      2944: </table></td></tr>
1.8       www      2945: ENDSUPFORM
                   2946:        }
1.7       www      2947:     }
1.18      www      2948:     if ($allowed) {
1.182     albertel 2949: 	$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      2950:     }
1.24      www      2951:     $r->print('</table>');
1.19      www      2952:   } else {
1.188     raeburn  2953:       unless ($upload_result eq 'phasetwo') {
1.19      www      2954: # -------------------------------------------------------- This is showdoc mode
1.188     raeburn  2955:           $r->print("<h1>".&mt('Uploaded Document').' - '.
1.141     albertel 2956: 		&Apache::lonnet::gettitle($r->uri).'</h1><p>'.
1.81      www      2957: &mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."</p><p><table>".
1.188     raeburn  2958:           &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'</table></p>');
                   2959:       }
1.19      www      2960:   }
1.26      www      2961:  }
1.224     albertel 2962:  $r->print(&Apache::loncommon::end_page());
1.26      www      2963:  return OK;
1.1       www      2964: } 
                   2965: 
1.224     albertel 2966: 
                   2967: sub editing_js {
                   2968:     my ($udom,$uname) = @_;
                   2969:     my $now = time();
                   2970: 
                   2971:     return <<ENDNEWSCRIPT;
                   2972: function makenewfolder(targetform,folderseq) {
                   2973:     var foldername=prompt('Name of New Folder','New Folder');
                   2974:     if (foldername) {
1.236     albertel 2975:        targetform.importdetail.value=escape(foldername)+"="+folderseq;
1.224     albertel 2976:         targetform.submit();
                   2977:     }
                   2978: }
                   2979: 
                   2980: function makenewpage(targetform,folderseq) {
                   2981:     var pagename=prompt('Name of New Page','New Page');
                   2982:     if (pagename) {
1.236     albertel 2983:         targetform.importdetail.value=escape(pagename)+"="+folderseq;
1.224     albertel 2984:         targetform.submit();
                   2985:     }
                   2986: }
                   2987: 
                   2988: function makenewext(targetname) {
                   2989:     this.document.forms.extimport.useform.value=targetname;
                   2990:     window.open('/adm/rat/extpickframe.html');
                   2991: }
                   2992: 
                   2993: function makeexamupload() {
                   2994:    var title=prompt('Listed Title for the Uploaded Score');
                   2995:    if (title) { 
                   2996:     this.document.forms.newexamupload.importdetail.value=
1.236     albertel 2997: 	escape(title)+'=/res/lib/templates/examupload.problem';
1.224     albertel 2998:     this.document.forms.newexamupload.submit();
                   2999:    }
                   3000: }
                   3001: 
                   3002: function makesmppage() {
                   3003:    var title=prompt('Listed Title for the Page');
                   3004:    if (title) { 
                   3005:     this.document.forms.newsmppg.importdetail.value=
1.236     albertel 3006: 	escape(title)+'=/adm/$udom/$uname/$now/smppg';
1.224     albertel 3007:     this.document.forms.newsmppg.submit();
                   3008:    }
                   3009: }
                   3010: 
                   3011: function makesmpproblem() {
                   3012:    var title=prompt('Listed Title for the Problem');
                   3013:    if (title) { 
                   3014:     this.document.forms.newsmpproblem.importdetail.value=
1.236     albertel 3015: 	escape(title)+'=/res/lib/templates/simpleproblem.problem';
1.224     albertel 3016:     this.document.forms.newsmpproblem.submit();
                   3017:    }
                   3018: }
                   3019: 
                   3020: function makedropbox() {
                   3021:    var title=prompt('Listed Title for the Drop Box');
                   3022:    if (title) { 
                   3023:     this.document.forms.newdropbox.importdetail.value=
1.236     albertel 3024:         escape(title)+'=/res/lib/templates/DropBox.problem';
1.224     albertel 3025:     this.document.forms.newdropbox.submit();
                   3026:    }
                   3027: }
                   3028: 
                   3029: function makebulboard() {
                   3030:    var title=prompt('Listed Title for the Bulletin Board');
                   3031:    if (title) {
                   3032:     this.document.forms.newbul.importdetail.value=
1.236     albertel 3033: 	escape(title)+'=/adm/$udom/$uname/$now/bulletinboard';
1.224     albertel 3034:     this.document.forms.newbul.submit();
                   3035:    }
                   3036: }
                   3037: 
                   3038: function makeabout() {
1.236     albertel 3039:    var user=prompt("Enter user:domain for User's 'About Me' Page");
1.224     albertel 3040:    if (user) {
                   3041:        var comp=new Array();
1.236     albertel 3042:        comp=user.split(':');
1.224     albertel 3043:        if ((typeof(comp[0])!=undefined) && (typeof(comp[1])!=undefined)) {
                   3044: 	   if ((comp[0]) && (comp[1])) {
                   3045: 	       this.document.forms.newaboutsomeone.importdetail.value=
1.236     albertel 3046: 		   'About '+escape(user)+'=/adm/'+comp[1]+'/'+comp[0]+'/aboutme';
1.224     albertel 3047: 	       this.document.forms.newaboutsomeone.submit();
                   3048: 	   } else {
1.236     albertel 3049:                alert("Not a valid user:domain");
1.224     albertel 3050:            }
                   3051:        } else {
1.236     albertel 3052:            alert("Please enter both user and domain in the format user:domain"); 
1.224     albertel 3053:        }
                   3054:    }
                   3055: }
                   3056: 
                   3057: function makeims() {
                   3058:     var caller = document.forms.ims.folder.value;
                   3059:     var newlocation = "/adm/imsimportdocs?folder="+caller+"&phase=one";
                   3060:     newWindow = window.open("","IMSimport","HEIGHT=700,WIDTH=750,scrollbars=yes");
                   3061:     newWindow.location.href = newlocation;
                   3062: }
                   3063: 
                   3064: 
                   3065: function finishpick() {
                   3066:     var title=this.document.forms.extimport.title.value;
                   3067:     var url=this.document.forms.extimport.url.value;
                   3068:     var form=this.document.forms.extimport.useform.value;
                   3069:     eval
                   3070:      ('this.document.forms.'+form+'.importdetail.value="'+title+'='+url+
                   3071:     '";this.document.forms.'+form+'.submit();');
                   3072: }
                   3073: 
                   3074: function changename(folderpath,index,oldtitle,container,pagesymb) {
                   3075:     var title=prompt('New Title',oldtitle);
                   3076:     if (title) {
                   3077: 	this.document.forms.renameform.title.value=title;
                   3078: 	this.document.forms.renameform.cmd.value='rename_'+index;
                   3079:         if (container == 'sequence') {
                   3080: 	    this.document.forms.renameform.folderpath.value=folderpath;
                   3081:         }
                   3082:         if (container == 'page') {
                   3083:             this.document.forms.renameform.pagepath.value=folderpath;
                   3084:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3085:         }
                   3086:         this.document.forms.renameform.submit();
                   3087:     }
                   3088: }
                   3089: 
                   3090: function removeres(folderpath,index,oldtitle,container,pagesymb) {
                   3091:     if (confirm('WARNING: Removing a resource makes associated grades and scores inaccessible!\\nRemove "'+oldtitle+'"?')) {
                   3092: 	this.document.forms.renameform.cmd.value='del_'+index;
                   3093:         if (container == 'sequence') {
                   3094:             this.document.forms.renameform.folderpath.value=folderpath;
                   3095:         }
                   3096:         if (container == 'page') {
                   3097:             this.document.forms.renameform.pagepath.value=folderpath;
                   3098:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3099:         }
                   3100:         this.document.forms.renameform.submit();
                   3101:     }
                   3102: }
                   3103: 
                   3104: function cutres(folderpath,index,oldtitle,container,pagesymb) {
                   3105:     if (confirm('WARNING: Cutting a resource makes associated grades and scores inaccessible!\\nGrades remain inaccessible if resource is pasted into another folder.\\nCut "'+oldtitle+'"?')) {
                   3106: 	this.document.forms.renameform.cmd.value='cut_'+index;
                   3107: 	this.document.forms.renameform.markcopy.value=index;
                   3108:         if (container == 'sequence') {
                   3109:             this.document.forms.renameform.folderpath.value=folderpath;
                   3110:         }
                   3111:         if (container == 'page') {
                   3112:             this.document.forms.renameform.pagepath.value=folderpath;
                   3113:             this.document.forms.renameform.pagesymb.value=pagesymb;
                   3114:         }
                   3115:         this.document.forms.renameform.submit();
                   3116:     }
                   3117: }
                   3118: 
                   3119: function markcopy(folderpath,index,oldtitle,container,pagesymb) {
                   3120:     this.document.forms.renameform.markcopy.value=index;
                   3121:     if (container == 'sequence') {
                   3122: 	this.document.forms.renameform.folderpath.value=folderpath;
                   3123:     }
                   3124:     if (container == 'page') {
                   3125: 	this.document.forms.renameform.pagepath.value=folderpath;
                   3126: 	this.document.forms.renameform.pagesymb.value=pagesymb;
                   3127:     }
                   3128:     this.document.forms.renameform.submit();
                   3129: }
                   3130: 
                   3131: ENDNEWSCRIPT
                   3132: }
1.1       www      3133: 1;
                   3134: __END__

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